Здравствуйте Друзья!
По роду деятельности приходится немного писать на PowerShell. В результате родился Телеграм бот и на этом языке.
Это шаблон или "рыба". Начинка уже зависит от вашей фантазии. Проектировался для больших нагрузок, реализована многопоточная обработка сообщений.
Но через -AsJob мы не пошли. Всё сделано на Runspaces.
Вот здесь сравниваются два этих подхода, Runspaces реально быстрее.
Ближе к делу. Давайте посмотрим как это работает, постараюсь коротко.
Скрипт Create-Runspace.ps1 создаёт четыре пространства исполнения. По одному для каждого обработчика:
psGetUpdate - получает сообщения
psMssageHandler - обрабатывает текстовые сообщения
psCallbackHandler - обрабатывает нажатия на кнопки
psInlineHandler - обрабатывает инлайн-запросы
Папка pbScriptBlocks содержит код с логикой каждого.
psGetUpdate получает обновления и кладёт их в потокобезопасные hashtable. Для каждого типа сообщений своя таблица. Через них потоки взаимодействуют друг с другом. Так же есть общие таблицы для отладки и логов.
#очередь сообщений типа Message
$queueMessageHash = [hashtable]::Synchronized(@{})
#очередь сообщений типа Inline
$queueInlineHash = [hashtable]::Synchronized(@{})
Поток psInlineHandler для каждого сообщения создает дочернее пространство исполнения. Максимальное количество определено в настройках в виде параметра inlineRunspacesMax.
Остальные обработчики дочерних потоков не создают, но можно сделать по аналогии.
Все настройки хранятся в BotSettings.json, для его создания есть скрипт BotSettings.ps1, там нужно прописать ваши данные и запустить.
Обработчики это бесконечные циклы, которые считывают из таблицы queueCommandsHash флаг остановки.
Такие флаги устанавливаются в конце скрипта Create-Runspace.ps1.
$queueCommandsHash['inlineNonStop']=$false
Поэтому поставьте точку останова на строке 143. Иначе бот запустит потоки и тут же их остановит.
Функция Get-Runspaces удаляет потоки из памяти. Её честно скомуниздил в интернете и немного адаптировал.
Логи обработчиков сохраняются в таблицу queueDebugHash, в конце выгружаются в одноименный файл json.
При старте, прилетит такая форма.
При нажатии на кнопки формы, в консоли увидите примерно такую картину.
Если нажать на Users, то в меню получим список пользователей. Работает поиск, набирайте имя на английском и он будет фильтровать результат.
В InlineHandler.ps1 это прописано в качестве примера и имеет комментарий.
# Пример использования - удалить
Задумывался, как бот управления инфраструктурой.
По самой структуре замысел должен быть примерно понятен.
Есть форма для DNS, можно вызвать руками.
Шаблон получился вполне универсальным.
Можно еще сделать отдельный поток для отправки сообщений, но это уже сами, кому надо...
Код опубликован здесь. Всем добра!
Sanctuary_s
Как насчет выложить на https://github.com? Никто не будет читать код с Google Drive.
BrookXVII Автор
"колхоз - дело добровольное"