docs: сессия 2026-08-29 (вечер) — каналы/папки TG в рostере (WALKTHROUGH §12.9), подтверждение причины 'миллиона приглашений' (always_invite_when_adding_bookmarks), фикс диагностики рostera (сырой IQ)

This commit is contained in:
2026-08-30 08:00:25 +00:00
parent 498d79e6df
commit 4655d82f6e
3 changed files with 56 additions and 0 deletions
+44
View File
@@ -607,6 +607,50 @@ docker exec icq-prosody prosodyctl list 2>/dev/null # зарегистриро
- **Решение**: собрать свой образ из исходников 0.12.6 (Dockerfile на базе
prosody/prosody:0.11.9 + tar.gz 0.12.6). См. STATUS.md «Сборка Prosody 0.12».
### 12.9 Каналы и папки Telegram в рostере (2026-08-29 вечер)
**Вопрос пользователя**: «как найти каналы из Телеграм в рostере? а ещё папки были в телеге — как вытащить?»
**Ответ (проверено) — каналов в рostере XMPP НЕТ, и это нормально:**
- XMPP-рostер (`jabber:iq:roster`) — это **только личные контакты**: 1602 записи,
все вида `число@telegram.nixg.ru` (пример: `1646170373@telegram.nixg.ru` = «Наталья Рыбий»).
Контактов с префиксом `group-` в рostере — **0**.
- Каналы/группы живут **отдельно**, в БД моста (таблица `room` в slidge.sqlite):
**91 канал** (`muc_type='CHANNEL'`, jid_localpart `group-<id>`) + **40** групп/прочих.
- В XMPP каналы должны показываться как **закладки комнат (XEP-0402 bookmarks)**
→ в Pidgin «Комнаты → Закладки», откуда заходят. **Сейчас bookmarks сломаны**
из-за mod_privilege-стаба (XEP-0356 не пересылает MDS/pubsub-запросы), поэтому
слайдж вместо закладок шлёт **приглашения** в каждую комнату — «миллион запросов».
- **Обходной путь сейчас**: Pidgin → Комнаты → Присоединиться → адрес
`group-<id>@telegram.nixg.ru`, ник `estorozhenko` (пример `group-1001698123474@telegram.nixg.ru`).
Полный список каналов: `SELECT jid_localpart, name FROM room WHERE muc_type='CHANNEL'` в БД моста.
- **Папки Telegram**: слайдж **не поддерживает** (`session.py:292`, обработчик
`DialogPeerFolder` — `# TODO: investigate what that is; return`). В XMPP аналога
«папок чатов» нет (рostер плоский). Pyrogram `get_folders()` (`messages.GetDialogFilters`)
технически умеет читать папки, но отдельный MTProto-клиент на той же сессии
выкинет работающий мост → вариант только «остановить мост на 30 сек, прочитать,
запустить». Практической ценности нет — в XMPP-клиенте папки всё равно некуда вывести.
**Диагностика рostера (полезный навык, не повторять ошибку):**
- Признак «контакты пропали»: клиент (slixmpp/Pidgin) показывает пусто.
**Проверять НЕ через `bot.roster`/`roster_update`** (slixmpp читает свой кэш и
событие срабатывает раньше полного ответа — ложно показывает 1 контакт), а
**сырым IQ**: `bot.make_iq_get(queryxmlns='jabber:iq:roster').send()` →
`.findall('.//{jabber:iq:roster}item')`. Верифицировано: вернул **1602 item'а**.
- Рostер-файл: `/var/lib/prosody/nixg%2eru/roster/estorozhenko.dat` (445 КБ, 1602 записи,
версия 1607) — читается через `datamanager.load("estorozhenko","nixg.ru","roster")`
только при установленном `data_path` (вне Prosody-контекста он nil → ложный ENOENT).
- Debug-логирование mod_privilege: добавить `debug = ".../prosody.log"` в блок `log`
конфига (временно; после отладки вернуть) — в логе видно `Entity is privileged`
на обоих хостах, `load_roster: asked for` / `save_roster: saving roster (all contacts)`.
- Замечание: каталог данных называется `nixg%2eru` (URL-кодирование точки), а не `nixg.ru` —
`ls /var/lib/prosody/nixg.ru` даёт «No such file» — это норма, не ошибка.
**Причина «миллиона приглашений» подтверждена**: в БД моста `user_account.preferences`
JSON содержит `"always_invite_when_adding_bookmarks": true` — слайдж шлёт приглашение
на каждую группу при синхронизации. Кандидат на `false`, когда bookmarks заработают
(после апгрейда 0.12). Пока слайдж-стаб не чинит bookmarks, приглашения — единственный
способ «увидеть» каналы, их можно игнорировать в Pidgin.
## 13. TODO (следующие шаги)
- [x] ~~OMEMO (XEP-0384)~~ — ВЫПОЛНЕНО: раздел 9; скрипт scripts/omemo_check.py.
- [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. venv уже создан (/opt/icq/.venv: aiohttp, slixmpp).