Pull to refresh

Telegram API демон — склеиваем последовательные сообщения

Reading time3 min
Views18K

Пиши мысль в одном сообщении


Я из тех людей, которые пишут мысль в мессенджерах по одному предложению. Это создает некоторые неудобства при чтении этого потока мысли так как последовательные сообщения быстро занимают свободное место по вертикали. Особенно это заметно в групповых чатах — уведомления отключены и для просмотра обсуждения приходится проматывать чат, если кто то пишет подобным образом.

Хватит это терпеть!


Переучивать себя я не собираюсь — не считаю это проблемой того кто пишет, ему так удобно — переучить миллионы людей сложнее чем научить одну программу. Сообщения должен склеивать сам клиент, чтобы было удобно всем, хотя бы опционально. От команды Telegram я этого так и не дождался — так что решил проблему при помощи небольшого клиента — демона на Python и решил поделиться с сообществом исходниками.
Подробности, исходники и описание под катом.

Как это работает


Одно из основных достоинств Telegram — действительно быстрая синхронизация между разными клиентами. Открытый API позволяет создавать свои клиенты и уже написано много альтернативных. Писать полноценный клиент я не вижу никакого смысла — синхронизация позволяет создавать небольшие сервисы, расширяющие возможности сразу всех клиентов на всех платформах. Ранее я рассказывал как можно увеличить лимит загрузки файлов ботом с 50МБ до 1.5ГБ, создавать каналы и другие возможности не доступные через Bot API.

На сервере 24/7 работает авторизованный демон, который синхронизируется с другими клиентами — получает как входящие сообщения, так и исходящие, которые отправляются мной с других клиентов. Если пауза между двумя последовательными исходящими сообщениями менее 30с — первое сообщение редактируется через API — к нему добавляется текст второго сообщения, а второе сообщение удаляется. За счет быстрой синхронизации это происходит практически мгновенно.

Небольшое видео в работе




Неплохо бы также было отключать оповещение от одного и того же человека в чате, если интервал между его сообщениями небольшой и сообщения не прочитаны, но это уже через API не сделать — так что будем ждать это от разработчиков Telegram.
UPD Подумал и понял что можно — просто мьютить чат на время, если идет поток сообщений от одного человека, но это уже должен и получатель пользоваться таким демоном

Inline переводчик


Заодно встроил переводчик — тоже считаю что это должно быть в самом клиенте. Использовать инлайн ботов неудобно по ряду причин, но основная из них: я хочу получить переведенный текст в строку ввода, а не отправить его в чат без возможности редактирования.
Как правило нужно вспомнить какое то слово/фразу, а не все предложение(зачастую переведенное криво).

Единственный способ синхронизировать вводимый текст между клиентами без отправки сообщения — это черновики. К сожалению черновик создается при переходе из чата в список чатов, но все равно такой костыль оказывается удобнее и быстрее использования приложения google translator, копирования вставки.

В конце строки добавляем код языка



Свайпом вправо переходим в список чатов



Заходим обратно — получаем переведенную строку



Язык переводимой строки определяется автоматически, для перевода используется google.

Поддерживаемые языки
supported_langs = {'Afrikaans': 'af', 'Irish': 'ga', 'Albanian': 'sq', 'Italian': 'it', 'Arabic': 'ar',
                   'Japanese': 'ja', 'Azerbaijani': 'az', 'Kannada': 'kn', 'Basque': 'eu', 'Korean': 'ko',
                   'Bengali': 'bn', 'Latin': 'la', 'Belarusian': 'be', 'Latvian': 'lv', 'Bulgarian': 'bg',
                   'Lithuanian': 'lt', 'Catalan': 'ca', 'Macedonian': 'mk', 'Chinese Simplified': 'zh-CN',
                   'Malay': 'ms', 'Chinese Traditional': 'zh-TW', 'Maltese': 'mt', 'Croatian': 'hr', 'Norwegian': 'no',
                   'Czech': 'cs', 'Persian': 'fa', 'Danish': 'da', 'Polish': 'pl', 'Dutch': 'nl', 'Portuguese': 'pt',
                   'English': 'en', 'Romanian': 'ro', 'Esperanto': 'eo', 'Russian': 'ru', 'Estonian': 'et',
                   'Serbian': 'sr', 'Filipino': 'tl', 'Slovak': 'sk', 'Finnish': 'fi', 'Slovenian': 'sl',
                   'French': 'fr', 'Spanish': 'es', 'Galician': 'gl', 'Swahili': 'sw', 'Georgian': 'ka',
                   'Swedish': 'sv', 'German': 'de', 'Tamil': 'ta', 'Greek': 'el', 'Telugu': 'te', 'Gujarati': 'gu',
                   'Thai': 'th', 'Haitian Creole': 'ht', 'Turkish': 'tr', 'Hebrew': 'iw', 'Ukrainian': 'uk',
                   'Hindi': 'hi', 'Urdu': 'ur', 'Hungarian': 'hu', 'Vietnamese': 'vi', 'Icelandic': 'is',
                   'Welsh': 'cy', 'Indonesian': 'id', 'Yiddish': 'yi'}


Исходники на Python AsyncIO


Гитхаб
Также добавил в репозиторий скомпилированные исполняемые файлы для linux и windows — запускать можно и на домашнем ПК, но для 24/7 работы лучше использовать VDS.

Для доступа к API используется последняя версия библиотеки telethon.

Если у кого то есть желание улучшить проект — велкам.

Подкинуть идею, обсудить и задать вопросы можно в комментарии или в телеграм в инфо профиля.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+6
Comments104

Articles

Change theme settings