На самом деле хронологически @kozRandBot был создан раньше, чем @kozalo_bot, который мы рассматривали в прошлый раз. При этом он ещё и давно уже опубликован в одном из агрегаторов ботов для Telegram. И, соответственно, я гарантирую постоянство его функционала и работоспособность (по возможности).
Но очень уж мне хотелось рассказать первым именно про огромного бота-комбайна. Разом разобраться как с ним, так и со всем описанием технических моментов. Да, в результате именно это и привело к длительной задержке с публикацией данной серии статей, но зато в итоге всё идёт строго по плану, прямо как и задумывалось.
Технически бот-рандомайзер построен абсолютно на той же платформе, что и предыдущий — тот же Python,
тот же pyTelegramBotAPI, те же расширения из botutils. Даже сервер для веб-хуков и репозиторий общие! Есть ли всё-таки какие-то различия? Да, хотя их и немного. Во-первых, тут есть
тесты! Правда, сейчас они проверяют всего одну специфичную функцию и их запуск никак не автоматизирован,
но хоть что-то. Во-вторых, в отличие от @kozalo_bot'а, @kozRandBot поддерживает и русский, и английский языки, так что
именно тут и используется модуль multilang
, упомянутый в прошлом посте. В целом, этот бот гораздо меньше,
поэтому код получился более аккуратный и структурированный.
Что же умеет бот?
- бросать монетку;
- выдавать случайные числа в определённом диапазоне;
- отвечать «да» или «нет» на односложные вопросы;
- выбирать случайный вариант из списка;
- генерировать пароли указанной длины.
С монеткой всё просто: пишешь боту /coin
(или /flip_coin
) — получаешь ответ.
А вот получать случайные числа можно двумя способами:
/num 100
— вернёт случайное число от 1 до 100;/num 100 1000
— от 100 до 1000.
Случайный односложный ответ он даёт просто на команду /yesno
(или /yes_or_no
) —
после команды можно писать что угодно. Список для выбора случайного варианта можно определить множеством способов:
/list кошки или собаки?
— выдаст либо «кошки», либо «собаки»;/list быть или не быть
— или «быть», или «не быть»;/list красный, белый, синий или зелёный
— выдаст один из перечисленных цветов;/list спать, читать книжку, поиграть, писать код, сходить на свидание
— один из перечисленных вариантов времяпрепровождения;/list армия, унижения, избиения; завод, нищета, провинция; Москва, перспективы, жизнь
— выдаст либо «армия, унижения, избиения», либо «завод, нищета, провинция», либо «Москва, перспективы, жизнь».
Собственно, единственная функция, для которой написаны модульные тесты — это именно функция по парсингу списка и разбиению его на отдельные элементы.
Для генерации паролей используется команда /seq
(или /sequence
,
/password
). В качестве параметра можно указать длину пароля. По умолчанию используется 8 символов. Меньше
6 указать нельзя.
А теперь самое главное: всё это работает и в inline-режиме! Без параметров бот предлагает кинуть монетку или сгенерировать пароль из 8 символов, с одним указанным числом N — пароль будет из N символов, а также добавится вариант с получением случайного числа от 1 до N, с двумя числами N и M, разделёнными пробелом — случайное число будет от N до M. Списки парсятся точно так же, как и в обычном режиме: поддерживаются и запятые, и точки с запятой, и союзы на конце, и вопросительный знак. Но с последним связано важное замечание по поводу функции выдачи ответа «да» или «нет» на односложные вопросы — в inline-режиме такой вопрос обязан заканчиваться на вопросительный знак!
Вот, пожалуй, и всё, что можно сказать о боте. По сравнению с прошлым этот пост получился до безобразия коротким. Проще бот, меньше исторического бэкграунда, меньше технических деталей — удаётся рассказать о нём предельно кратко и лаконично. В следующий раз речь пойдёт про моего самого последнего и молодого бота, который только-только стал юзабельным и начинает свой путь к успеху. Думаю, там рассказ получится подлиннее и с бóльшим количеством технических деталей =)
See ya soon!
Про случайность результатов
In inline mode it doesn't randomize: always chooses second of two items.
Ах да! В отзывах на сайте-агрегаторе был человек, который усомнился в честности и случайности результатов выбора из двух вариантов: у него постоянно выпадало второе значение. Подобные вопросы возникали и у нас в чатиках. Действительно, порой кажется, что последний вариант выпадает чаще. Но на самом деле это не так. В этом можно убедиться как экспериментально, увеличив количество попыток и/или вариантов, так и посмотрев непосредственно на код.
Если же кто-то по-настоящему докажет, что я где-то накосячил, то тогда публично признаю свою неправоту и проставлю разоблачителю бутылочку нормального пива или чашечку чая/кофе с десертом =)
Насчёт нумерации версий в репозитории
Изначально версии, подчёркивая нестабильность и постоянную доработку ботов, нумеровались по формуле
dev/v0.1.X-YYY
, где X обозначал порядковый номер версии, а YYY — первые буквы названий готовых к деплою
ботов (так что "kr" — это сокращение от kozalo_bot и randomizer). Каждый релиз обозначает коммит, который деплоился на сервер.
Изначально предполагалось, что при завершении работы над
следующим ботом, наконец-то выйдет версия v0.2.0-krc
. Но теперь, когда само
дальшейшее существование сайта Congrats.Cf поставлено под вопрос,
стало понятно, что такому сценарию не суждено сбыться. Да и как таковая разработка рандомайзера завершена, а
kozalo_bot'а — заморожена. Таким образом, последний релиз вышел под коротким номером v0.2.0
,
подчеркнув завершение активной стадии разработки и отмену выпуска новых ботов на основе данной платформы.
Ну и, как уже было сказано в прошлом посте, всю информацию о новых изменениях в работе ботов я буду писать в своём telegram-канале, а не в обновлениях к этому посту.
Добавлено 21.11.2018
Вот волна глобальных обновлений добралась и до этого бота. Теперь у него есть отдельный репозиторий, работает он на асинхронной библиотеке AIOGram, а структура inline-обработчиков была переписана по подобию рефакторинга в textUtilsBot'е. Ну и куда же без Докера! Да, запускается он теперь на новом сервере и тоже внутри Docker-контейнера.
Подробнее почитать про всё это можно у меня на канале. Вот, например, пост с кратким обзором на библиотеку AIOGram.
Твитнуть