Я делаю клиент для 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).
Все оказалось просто.
В упомянутом ранее примере из официального репозитория как раз используются обновления, т.е. не нужно "пинговать" сервер на пример новых событий. Их обработчик указывается при создании клиента:
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.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости