Стенгазета
Jan. 12th, 2023 09:12 pmПридумал тут себе вместо скринсейвера сделать такую вот живую газету, где в реальном времени показываются сразу несколько телеграм каналов:
У некоторых каналов по отдельной колонке, еще несколько делят меж собой одну.
Это по сути отдельный телеграм-клиент. Для создания таких клиентов на произвольных языках у телеграма есть интересная библиотека tdlib. Исходники ее на С++ лежат на гитхабе, собиралась она у меня 25 минут, получился .so файл на 30 мегов, включающий в себя сразу все - сама работает с сетью, занимается всем шифрованием, знает бинарный протокол сообщений, складывает все в sqlite базу. При этом у нее сишный интерфейс, сводящийся к трем функциям:
Создаешь экземпляр клиента, посылаешь ему команды JSONом и ответы получаешь JSONом. Даже "закрыть клиент" нет отдельной функции - это тоже делается посылкой JSON сообщения. Весь телеграм-специфичный API там в структуре этих сообщений, и хотя документация на сайте оставляет желать, разобраться можно. Что несколько неожиданно: оно работает не по принципу вопрос-ответ, а просто из td_receive на тебя льется поток сообщений, некоторые из них - ответы на твои запросы, а большинство - водопад данных с серверов: обновления информации о пользователях, о группах, сообщения из чатов, реакции на них и т.д.
Свою программу я писал на Racket, там чтобы эту библиотеку загрузить и использовать достаточно
после этого можно
где process-msg получает на вход сообщение в виде уже рэкетового дерева, представленного хэшем, где ключи - символы, а значения - числа, строки, списки и другие такие хэши.
Для создания GUI в стандартной библиотеке все есть и довольно несложно, все на объектах и посылке им сообщений. На все приложение ушло около сотни строк. Такой вот recreational programming. Cейчас там много моих деталей захардкожено, если превращать в программу для публики надо будет как минимум сделать диалоги (или настройки) для логина и выбора каналов, станет кода побольше.
У некоторых каналов по отдельной колонке, еще несколько делят меж собой одну.
Это по сути отдельный телеграм-клиент. Для создания таких клиентов на произвольных языках у телеграма есть интересная библиотека tdlib. Исходники ее на С++ лежат на гитхабе, собиралась она у меня 25 минут, получился .so файл на 30 мегов, включающий в себя сразу все - сама работает с сетью, занимается всем шифрованием, знает бинарный протокол сообщений, складывает все в sqlite базу. При этом у нее сишный интерфейс, сводящийся к трем функциям:
int td_create_client_id(); void td_send(int client_id, const char *request); const char *td_receive(double timeout);
Создаешь экземпляр клиента, посылаешь ему команды JSONом и ответы получаешь JSONом. Даже "закрыть клиент" нет отдельной функции - это тоже делается посылкой JSON сообщения. Весь телеграм-специфичный API там в структуре этих сообщений, и хотя документация на сайте оставляет желать, разобраться можно. Что несколько неожиданно: оно работает не по принципу вопрос-ответ, а просто из td_receive на тебя льется поток сообщений, некоторые из них - ответы на твои запросы, а большинство - водопад данных с серверов: обновления информации о пользователях, о группах, сообщения из чатов, реакции на них и т.д.
Свою программу я писал на Racket, там чтобы эту библиотеку загрузить и использовать достаточно
(define-ffi-definer define-td (ffi-lib "/home/dee/prog/td/tdlib/lib/libtdjson")) (define-td td_create_client_id (_fun -> _int)) (define-td td_send (_fun _int _string -> _void)) (define-td td_receive (_fun _double -> _string))
после этого можно
(define (on-timer) (define s (td_receive 0.01)) (when s (define msg (string->jsexpr s)) (log (format "~s" msg)) (process-msg msg)))
где process-msg получает на вход сообщение в виде уже рэкетового дерева, представленного хэшем, где ключи - символы, а значения - числа, строки, списки и другие такие хэши.
Для создания GUI в стандартной библиотеке все есть и довольно несложно, все на объектах и посылке им сообщений. На все приложение ушло около сотни строк. Такой вот recreational programming. Cейчас там много моих деталей захардкожено, если превращать в программу для публики надо будет как минимум сделать диалоги (или настройки) для логина и выбора каналов, станет кода побольше.