Telegram: @kozRandBot
24.10.2018


На самом деле хронологически @kozRandBot был создан раньше, чем @kozalo_bot, который мы рассматривали в прошлый раз. При этом он ещё и давно уже опубликован в одном из агрегаторов ботов для Telegram. И, соответственно, я гарантирую постоянство его функционала и работоспособность (по возможности).

Но очень уж мне хотелось рассказать первым именно про огромного бота-комбайна. Разом разобраться как с ним, так и со всем описанием технических моментов. Да, в результате именно это и привело к длительной задержке с публикацией данной серии статей, но зато в итоге всё идёт строго по плану, прямо как и задумывалось.

Технически бот-рандомайзер построен абсолютно на той же платформе, что и предыдущий — тот же Python, тот же pyTelegramBotAPI, те же расширения из botutils. Даже сервер для веб-хуков и репозиторий общие! Есть ли всё-таки какие-то различия? Да, хотя их и немного. Во-первых, тут есть тесты! Правда, сейчас они проверяют всего одну специфичную функцию и их запуск никак не автоматизирован, но хоть что-то. Во-вторых, в отличие от @kozalo_bot'а, @kozRandBot поддерживает и русский, и английский языки, так что именно тут и используется модуль multilang, упомянутый в прошлом посте. В целом, этот бот гораздо меньше, поэтому код получился более аккуратный и структурированный.

Что же умеет бот?

  • бросать монетку;
  • выдавать случайные числа в определённом диапазоне;
  • отвечать «да» или «нет» на односложные вопросы;
  • выбирать случайный вариант из списка;
  • генерировать пароли указанной длины.

С монеткой всё просто: пишешь боту /coin (или /flip_coin) — получаешь ответ. А вот получать случайные числа можно двумя способами:

  1. /num 100 — вернёт случайное число от 1 до 100;
  2. /num 100 1000 — от 100 до 1000.

Случайный односложный ответ он даёт просто на команду /yesno (или /yes_or_no) — после команды можно писать что угодно. Список для выбора случайного варианта можно определить множеством способов:

  1. /list кошки или собаки? — выдаст либо «кошки», либо «собаки»;
  2. /list быть или не быть — или «быть», или «не быть»;
  3. /list красный, белый, синий или зелёный — выдаст один из перечисленных цветов;
  4. /list спать, читать книжку, поиграть, писать код, сходить на свидание — один из перечисленных вариантов времяпрепровождения;
  5. /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.
— Alexandr

Ах да! В отзывах на сайте-агрегаторе был человек, который усомнился в честности и случайности результатов выбора из двух вариантов: у него постоянно выпадало второе значение. Подобные вопросы возникали и у нас в чатиках. Действительно, порой кажется, что последний вариант выпадает чаще. Но на самом деле это не так. В этом можно убедиться как экспериментально, увеличив количество попыток и/или вариантов, так и посмотрев непосредственно на код.

Если же кто-то по-настоящему докажет, что я где-то накосячил, то тогда публично признаю свою неправоту и проставлю разоблачителю бутылочку нормального пива или чашечку чая/кофе с десертом =)


Насчёт нумерации версий в репозитории

Изначально версии, подчёркивая нестабильность и постоянную доработку ботов, нумеровались по формуле 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.