0

[WIP] Partial bot skeleton, non-functional though

This commit is contained in:
eleksir
2024-02-09 19:40:54 +03:00
parent ea4652cefa
commit 9eac899a5c
1460 changed files with 625051 additions and 492 deletions

88
README
View File

@@ -1,86 +1,28 @@
aleesa-irc-go
aleesa-telegram-go
-----------------------------------------------------------------------------------------------------------------------
Сервис для aleesa-bot, работающий с протоколом IRC. С основными сервисами бота работает по протоколу Redis pubsub.
Сервис для aleesa-bot-go, работающий с мессенджером Telegram.
С остальными сервисами aleesa-bot работает по протоколу Redis pub-sub.
Механика работы
-----------------------------------------------------------------------------------------------------------------------
Сервис подписан на pub-sub redis-канал irc. В этот канал пишут остальные сервисы aleesa-bot-а ответ на запросы этого
сервиса.
Сервис подписан на pub-sub redis-канал telegram. В этот канал пишут остальные сервисы aleesa-bot-а ответ на запросы
этого сервиса.
Формат протокола общения по redis pub-sub - см README от aleesa-misc-go.
Как это собрать?
-----------------------------------------------------------------------------------------------------------------------
Понадобится golang версии 1.18 или более новая (на предыдущих версиях возможно собирётся, но я не тестировал).
go.mod и go.sum актуальны для 1.18.
Сам процесс сборки простой, достаточно запустить:
make
и через некоторое время мы получаем бинарник aleesa-irc-go. Это и есть наше приложение.
Формат протокола общения по redis pub-sub - см README от aleesa-misc.
Как это запустить?
-----------------------------------------------------------------------------------------------------------------------
Приложение тестировалось на alpine linux x86_64 3.16, но должно работать на любом (более свежем) linux-е.
Вначале нам потребуется собрать бинарник самого сервиса. Для чего просто запускаем команду:
make
После создания data/config.json из data/config_sample.json, можно запускать приложение.
Если всё хорошо, то после создания data/config.json из data/config_sample.json и можно запускать приложение.
Предполагается, что конфиг написан в формате human json (https://hjson.github.io), который допускает коментарии и
некоторые другие вольности в форматировании json-а. Конфиг ищется последовательно по следующим путям по принципу "кто
первый того и тапки":
~/.aleesa-irc-go.json
~/aleesa-irc-go.json
/etc/aleesa-irc-go.json
data/config.json
В каталоге contrib находится скрипт для alpine linux, системы инициализации openrc. Этот скрипт достаточно положить В
/etc/init.d/aleesa-telegram-go сконфигурить сервис по инструкции выше и после этого сервис запускается командой:
service aleesa-telegram-go start
В каталоге contrib находится скрипт для alpine linux, системы инициализации openrc. Этот скрипт достаточно положить в
/etc/init.d/aleesa-irc-go. После чего скопировать бинарник в каталог /var/lib/aleesa-irc-go, положить конфиг в одну
из дефолтных локаций (тестировалась /var/lib/aleesa-irc-go/data/config.json) и после этого сервис запускается
командой:
service aleesa-irc-go start
В автозагрузку его можно прописать через команду:
rc-update add aleesa-irc-go default
Nota Bene
-----------------------------------------------------------------------------------------------------------------------
По механике, в процессе работы мы форкаем горутинки на каждое входящее сообщение, особо не контроллируя этот процесс.
Предполагается, что на это приложение не будет большой нагрузки - ограничения irc не должны дать возможности развить
достаточно большой message rate, чтобы об это споткнуться.
Формально, более удачным было бы иметь автоматический пул воркеров-горутинок и раскидывать им через channel-ы
сообщения. Внутри каждой горутинки можно было бы повиcнуть в бесконечном цикле на канале входящих сообщений и так и
работать. Но на практике оно того не стОит.
Nota Bene #2
-----------------------------------------------------------------------------------------------------------------------
Go не поддерживает системный вызов fork() из-за чего демонизация программ на гошке средствами самой гошки - это в
некотором роде проблема. Решается она с помощью утилиты daemonize (https://github.com/bmc/daemonize).
Соответствено, если для запуска этой программы предполагается использовать возможности демонизации, то можно
воспользоваться этой программой.
В alpine linux есть средства openrc для супервайзинга foreground-сервисов.
Nota Bene #3
-----------------------------------------------------------------------------------------------------------------------
К сожалению, в боте не подразумевается функциональность invite-ов. Это можно сделать только явно указав список каналов,
на которые бот должен зайти.
Причина банальна - слишком жёсткие ограничения у многих irc-сетей на количество сообщений в единицу времени, а по
механике в большинстве случаев ограничение работает не client-client или client-channel, а глобально, client-server
(за исключением случаев, когда на канале у бота есть +v или +o), что позволяет абузить клиента, то есть в данном случае,
бота.
Сообщения об invite-ах пишутся в лог с уровнем info.
Special Thanks
-----------------------------------------------------------------------------------------------------------------------
https://github.com/akyoto/cache за "простой" кэш, из которого я сделал collection.go
в автозагрузку его можно прописать через команду:
rc-update add aleesa-telegram-go default