Telegram API получить список чатов

134
18 апреля 2019, 12:10

Я делаю клиент для Telegram на Java с использованием официальной библиотеки TDLib, т.е. ее binding'а для Java. Пример, скопированный в мой проект из официального репозитория библиотеки, работает без нареканий.

Задача состоит в том, чтобы отслеживать появление новых чатов (например, кто-то пользователей создал новый групповой чат на N-человек и пригласил в него меня в том числе). Реализовать это несложно. Достаточно в цикле делать запрос вида (или по расписанию с использованием аннотации @Scheduled в Spring):

client.send(new TdApi.GetChats(
            offsetOrder, 
            offsetChatId, 
            limit - chatList.size()), 
            () -> { ... });

Но мне хотелось бы не опрашивать сервер на предмет появления новых чатов, а получать уведомления о таких событиях, что-нибудь наподобие:

client.subscribe(EventType.NewChat, () -> { ... } , () -> { ... });

Я пробовал искать подходящие методы в Java-классах, но безуспешно (потому что Javadoc-ов равно как и нормально названных параметров нет - все же это binding к библиотеке, написанной на C). В собственно нативном классе Client я не нашел упоминания о получении уведомлений.

Подскажите, пожалуйста, возможно ли это в принципе? И в каком направлении копать?

P.S. Просьба не пинать сильно. Я гуглил на эту тему. Но основном результаты о Telegram Bot API. У меня же задача сделать именно клиента (который будет работать на сервере и складывать активность Telegram в БД PostgreSQL).

Answer 1

Все оказалось просто.

В упомянутом ранее примере из официального репозитория как раз используются обновления, т.е. не нужно "пинговать" сервер на пример новых событий. Их обработчик указывается при создании клиента:

    client = Client.create(new TelegramService.UpdatesHandler(), null, null);

В UpdatesHandler'e уже был код, который следит за появлением нового чата:

    @Override
    public void onResult(TdApi.Object object) {
        switch (object.getConstructor()) {
            // ...
            case TdApi.UpdateNewChat.CONSTRUCTOR: {
                TdApi.UpdateNewChat updateNewChat = (TdApi.UpdateNewChat) object;
                TdApi.Chat chat = updateNewChat.chat;
                synchronized (chat) {
                    chats.put(chat.id, chat);
                    long order = chat.order;
                    chat.order = 0;
                    setChatOrder(chat, order);
                }
                break;
            }
        // ...

Можно также обрабатывать другие события, например, следить за входящими сообщениями:

            case TdApi.UpdateNewMessage.CONSTRUCTOR:
                System.out.println(">>> TdApi.UpdateNewMessage.CONSTRUCTOR()");
                break;

Более подробно об этом написано в документации в разделе Handling updates.

READ ALSO
Проверить что bean был создан и не null

Проверить что bean был создан и не null

Есть ли какой способ проверить что бин был создан? с помощью аннотации а не простым if

160
Где покупается лицензия на шрифт?

Где покупается лицензия на шрифт?

Скажите, пожалуйста

174
Почему при выводе на печать не срабатывают стили css?

Почему при выводе на печать не срабатывают стили css?

Проблема в том, что от сюда http://siteru/css/table

171
случайные картинки на сайте [закрыт]

случайные картинки на сайте [закрыт]

Подскажите пожалуйста с помощью чего и как сделать такоеЗадание чтоб на сайте при нажатии на кнопку показало одну из 3 случайных картинок,...

136