TdApi.GetChatHistory или как правильно вызвать вывод истории чата?

Ссылка скопирована
1 ответ

По вводным: занимаюсь разработкой своего клиента Telegram под Wear Os
Сейчас ситуация такая: я пере проверял много вариантов как выводить истории чата, но все они не идеальны и не хотят нормально функционировать, чтение документации не дало прояснений.
По вводным: в первом варианте он загружается сообщения по каким то законам хогвартса, когда захочет.
По вводным: во втором он их загружает но по одному при скролле что плохо выглядит.
Сейчас ситуация такая: оставил код на github тк сюда не влезает:
Код

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

В TDLib метод getChatHistory работает не как “дай сразу всю историю”, а как постраничная загрузка вокруг конкретного сообщения. Если при скролле сообщения приходят хаотично или по одному, обычно неправильно выбраны параметры from_message_id, offset и limit, либо запросы запускаются параллельно.

Типовая схема для первого открытия чата: загрузить последние N сообщений:

client.send(TdApi.GetChatHistory(
    chatId,
    0,
    0,
    30,
    false
)) { result ->
    // result as TdApi.Messages
}

client.send(TdApi.GetChatHistory( chatId, 0, 0, 30, false )) { result -> // result as TdApi.Messages }

Для подгрузки старых сообщений берёте минимальный message.id из уже показанных сообщений и передаёте его как fromMessageId:

client.send(TdApi.GetChatHistory(
    chatId,
    oldestMessageId,
    0,
    30,
    false
)) { result ->
    // добавить старые сообщения в начало списка
}

client.send(TdApi.GetChatHistory( chatId, oldestMessageId, 0, 30, false )) { result -> // добавить старые сообщения в начало списка }

Важно не запускать несколько запросов истории одновременно. Сделайте флаг:

var loadingHistory = false
 
fun loadOlder() {
    if (loadingHistory) return
    loadingHistory = true
    // GetChatHistory...
    // в callback: loadingHistory = false
}

var loadingHistory = false fun loadOlder() { if (loadingHistory) return loadingHistory = true // GetChatHistory... // в callback: loadingHistory = false }

Для Wear OS лучше не тянуть огромную историю. Держите локальный список последних сообщений, подгружайте пачками по 20-30 и обновляйте UI через diff, а не пересоздавайте весь список.

Ещё учитывайте, что TDLib асинхронный: порядок callback не обязан совпадать с порядком отправки запросов. Поэтому сортируйте сообщения по id или date, дедуплицируйте по message.id и не добавляйте одно сообщение дважды.

Итог: первый запрос делайте от from_message_id = 0, старую историю грузите от самого старого message id, запросы не параллельте, сообщения дедуплицируйте и сортируйте перед показом.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно