Бот

Описание инициализации и обработчиков в боте, реализованном с помощью фреймворка aiogram -

python_runner_bot.bot.CMD_HELP = BotCommand(command='help', description='Usage hints')

Описание команды для отображения помощи

python_runner_bot.bot.CMD_RUN = BotCommand(command='run', description='Run in group chats')

Описание команды запуска кода

python_runner_bot.bot.CMD_SET_LANG = BotCommand(command='set_lang', description='Switch locale')

Описание команды для смены локали

python_runner_bot.bot.CMD_SET_PYTHON = BotCommand(command='set_python', description='Change Python version')

Описание команды для смены используемой версии Python

python_runner_bot.bot.CMD_TEST = BotCommand(command='test', description='Check run overhead')

Описание команды для проверки оверхеда

python_runner_bot.bot.add_user_if_not_exist(message: Message)

Проверка наличия пользователя в базе данных и его добавление при необходимости. Первоначально было частью обработчика команды «/start», но позднее вынесено в отдельную функцию и теперь используется во всех обработчиках.

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

Причина вынесения в отдельную функцию: в сценарии личного использования бота Telegram начинает с запуска посредством команды «/start» и поведение бота соответствует запланированному. Однако при использовании в групповых чатах их участники не проходят через этап «старта» бота, вследствие чего информация о пользователях не добавлялась в БД. Это в свою очередь приводило к тому, что в обработчики отдавались значения настроек «по умолчанию», а изменить их не представлялось возможным т.к. нельзя обновить значение в БД, которого еще нет.

async python_runner_bot.bot.change_locale(message: Message) None

Обработчик для «/set_lang» - команды смены локализации для пользователя. Аргумент команды - код локализации, присутствующий среди представленных локализаций.

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

Команда является одним из типов сущностей, которые могут присутствовать в сообщении и aiogram в типе Message предоставляет информацию о присутствующих сущностях, в т.ч. позиция с которой сущность начинается и сколько символов занимает. За счет данной информации и извлекается аргумент команды.

async python_runner_bot.bot.change_python(message: Message) None

Обработчик для «/set_python» - команды смены используемой по умолчанию версии Python Аргумент команды - номер версии Python, присутствующий среди указанных в модуле констант версий.

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

Команда является одним из типов сущностей, которые могут присутствовать в сообщении и aiogram в типе Message предоставляет информацию о присутствующих сущностях, в т.ч. позиция с которой сущность начинается и сколько символов занимает. За счет данной информации и извлекается аргумент команды.

async python_runner_bot.bot.check_overhead(message: Message)

Обработчик для «/test» - команды запуска тестового контейнера с замером времени старта и остановки

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

async python_runner_bot.bot.command_start_handler(message: Message) None

Обработчик для «/start» - команды запуска

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

python_runner_bot.bot.dp = <Dispatcher '0x7fc18003a530'>

Все обработчики должны быть закреплены за объектом Router или Dispatcher (прим. от aiogram)

python_runner_bot.bot.exec_limit = <asyncio.locks.Semaphore object at 0x7fc1800a83a0 [unlocked, value:5]>

Семафор для ограничения количества одновременно запускаемых контейнеров

python_runner_bot.bot.extract_code(message: Message) str | None

Простой обработчик сообщения, призванный извлечь код из текста сообщения. Ищет первую (предполагается, что она единственная) сущность типа «pre» (форматированный код), а при отсутствии таковой - кодом считается все сообщение после предварительного исключения из него команд бота.

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

Форматированный код, как и команда, является одним из типов сущностей, которые могут присутствовать в сообщении и aiogram в типе Message предоставляет информацию о присутствующих сущностях, в т.ч. позиция с которой сущность начинается и сколько символов занимает. За счет данной информации извлекается содержимое блока кода, либо исключение команды из результата.

async python_runner_bot.bot.main() None

Асинхронная функция старта. Предварительно инициирует: - загрузку локализаций в память - подготовку базы данных - подготовку набора образов Docker (проверка наличия и загрузка при отсутствии таковых)

Далее отправляет к Telegram список поддерживаемых ботом команд, после чего запускает самого бота в работу по механизму «long polling» - периодический опрос серверов Telegram на предмет сообщений для бота.

Фреймворк aiogram имеет предопределенный обработчик для сигнала остановки (SIGINT), в результате которого завершается опрос серверов Telegram на предмет сообщений для бота и выполняются следующие инструкции - в частности, закрытие БД.

async python_runner_bot.bot.process_code_message(message: Message) None

Обработчик для «/run» - команды запуска указанного в сообщении кода. Команда предназначена для использования в групповых чатах. Аргумент команды - код на языке Python. Вместе с тем, является обработчиком для сообщений напрямую от пользователя (в «личном» чате). В таком случае весь текст сообщения практически считается кодом.

В процессе работы вызывает функцию extract_code, которая призвана выделить из сообщения код.

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

Команда является одним из типов сущностей, которые могут присутствовать в сообщении и aiogram в типе Message предоставляет информацию о присутствующих сущностях, в т.ч. позиция с которой сущность начинается и сколько символов занимает. За счет данной информации и извлекается аргумент команды.

async python_runner_bot.bot.send_usage_hint(message: Message) None

Обработчик для «/help» - команды вызова справки по использованию бота

Параметры:

message (aiogram.types.Message) – Полученное ботом сообщение

python_runner_bot.bot.start()

Синхронная функция, запускающая работу бота. Задает уровень логгирования и производит запуск асинхронной функции старта

python_runner_bot.bot.СMD_START = BotCommand(command='start', description='Start using bot')

Описание команды старта бота