thedeemon: (Default)
Придумал тут себе вместо скринсейвера сделать такую вот живую газету, где в реальном времени показываются сразу несколько телеграм каналов:

У некоторых каналов по отдельной колонке, еще несколько делят меж собой одну.

Это по сути отдельный телеграм-клиент. Для создания таких клиентов на произвольных языках у телеграма есть интересная библиотека 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ейчас там много моих деталей захардкожено, если превращать в программу для публики надо будет как минимум сделать диалоги (или настройки) для логина и выбора каналов, станет кода побольше.

Profile

thedeemon: (Default)
Dmitry Popov

July 2025

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930 31  

Syndicate

RSS Atom

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 11th, 2025 08:36 am
Powered by Dreamwidth Studios