mirror of
https://github.com/openmax-server/server.git
synced 2026-06-12 05:41:42 +03:00
fix(chat history): фикс
This commit is contained in:
@@ -28,17 +28,27 @@ class Tools:
|
|||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
elements = []
|
elements = []
|
||||||
|
|
||||||
|
# Парсер MAX 26.15.3 (defpackage.u6h.Q) ждёт в сообщении следующие
|
||||||
|
# поля. Отсутствие любого ломает разбор msgpack-схемы, и клиент
|
||||||
|
# тихо роняет всю историю чата:
|
||||||
|
# id, cid, chatId, time, type, sender, text, attaches, elements,
|
||||||
|
# link, reactionInfo, updateTime, status, options
|
||||||
|
# Список вытащен дизассемблированием Q() через dexdump.
|
||||||
message = {
|
message = {
|
||||||
"id": row.get("id") if protocol_type == "mobile" else str(row.get("id")),
|
"id": row.get("id") if protocol_type == "mobile" else str(row.get("id")),
|
||||||
"cid": int(row.get("cid") or 0),
|
"cid": int(row.get("cid") or 0),
|
||||||
|
"chatId": int(row.get("chat_id") or 0),
|
||||||
"time": int(row.get("time")),
|
"time": int(row.get("time")),
|
||||||
"type": row.get("type"),
|
"type": row.get("type") or "USER", # ENUM: USER/CHANNEL/CHANNEL_ADMIN/GROUP
|
||||||
"sender": row.get("sender"),
|
"sender": row.get("sender"),
|
||||||
"text": row.get("text") or "",
|
"text": row.get("text") or "",
|
||||||
"attaches": attaches if isinstance(attaches, list) else [],
|
"attaches": attaches if isinstance(attaches, list) else [],
|
||||||
"elements": elements if isinstance(elements, list) else [],
|
"elements": elements if isinstance(elements, list) else [],
|
||||||
"reactionInfo": {},
|
"reactionInfo": {},
|
||||||
"link": {},
|
"link": {},
|
||||||
|
"updateTime": int(row.get("update_time") or row.get("time") or 0),
|
||||||
|
"status": int(row.get("status") or 0),
|
||||||
|
"options": int(row.get("options") or 0),
|
||||||
}
|
}
|
||||||
|
|
||||||
return message
|
return message
|
||||||
|
|||||||
@@ -603,24 +603,11 @@ class AuthProcessors(BaseProcessor):
|
|||||||
username=user.get("username"),
|
username=user.get("username"),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Список ID чатов до того как generate_chats затрёт переменную
|
|
||||||
chat_ids_for_history = list(chats)
|
|
||||||
|
|
||||||
# Генерируем список чатов
|
# Генерируем список чатов
|
||||||
chats = await self.tools.generate_chats(
|
chats = await self.tools.generate_chats(
|
||||||
chats, self.db_pool, user.get("id"), protocol_type=self.type
|
chats, self.db_pool, user.get("id"), protocol_type=self.type
|
||||||
)
|
)
|
||||||
|
|
||||||
# Bootstrap-история: карта {chatId: [messages]}.
|
|
||||||
# Без неё десктопный MAX считает, что локальная история уже
|
|
||||||
# синхронизирована, и не запрашивает CHAT_HISTORY (49).
|
|
||||||
bootstrap_messages = await self.tools.collect_bootstrap_history(
|
|
||||||
chat_ids_for_history,
|
|
||||||
self.db_pool,
|
|
||||||
user.get("id"),
|
|
||||||
protocol_type=self.type,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Генерируем список контактов
|
# Генерируем список контактов
|
||||||
contacts = await self.tools.collect_user_contacts(
|
contacts = await self.tools.collect_user_contacts(
|
||||||
user.get("id"), self.db_pool, self.config.avatar_base_url
|
user.get("id"), self.db_pool, self.config.avatar_base_url
|
||||||
@@ -634,8 +621,8 @@ class AuthProcessors(BaseProcessor):
|
|||||||
payload = {
|
payload = {
|
||||||
"profile": profile,
|
"profile": profile,
|
||||||
"chats": chats,
|
"chats": chats,
|
||||||
"chatMarker": int(time.time() * 1000),
|
"chatMarker": 0,
|
||||||
"messages": bootstrap_messages,
|
"messages": {},
|
||||||
"contacts": contacts,
|
"contacts": contacts,
|
||||||
"presence": presence,
|
"presence": presence,
|
||||||
"config": {
|
"config": {
|
||||||
|
|||||||
@@ -74,9 +74,16 @@ class HistoryProcessors(BaseProcessor):
|
|||||||
# Сортируем сообщения по времени
|
# Сортируем сообщения по времени
|
||||||
messages.sort(key=lambda x: x["time"])
|
messages.sort(key=lambda x: x["time"])
|
||||||
|
|
||||||
# Формируем ответ
|
# Формируем ответ.
|
||||||
|
# Парсер a23 в MAX-клиенте ждёт ВСЕГДА все 5 полей (messages,
|
||||||
|
# forward, backward, pos, total). Если каких-то нет — клиент
|
||||||
|
# бросает соединение и история не отображается.
|
||||||
payload = {
|
payload = {
|
||||||
"messages": messages
|
"messages": messages,
|
||||||
|
"forward": 0, # сколько ещё доступно вперёд
|
||||||
|
"backward": 0, # сколько ещё доступно назад
|
||||||
|
"pos": 0, # позиция курсора
|
||||||
|
"total": len(messages), # всего в чате (примерно)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Собираем пакет
|
# Собираем пакет
|
||||||
|
|||||||
Reference in New Issue
Block a user