Этот пост бота, которого мы сделали для проведения движухи в чате Клуба.
Пост написали Артемий и Оля. Оля расскажет про идею и операционно-продуктовое, а Артемий про техническое, планы и баги 🙃
Полтора года мы с Аней @Sciannadev проводим челленджи в секретном чате с фотографиями. Раз в 2 недели всем чатом выбираем тему, фотографируем, присылаем фотки в чат, а потом голосуем за самую классную.
Предыстория
Все эти полтора года челленджи проводились руками. У меня было вот так:
- я объявляла тему, тег и сроки челленджа;
- в последний день сохраняла все фотки, загружала в гугл-форму и отправляла в чат для голосования;
- потом подводила итоги: объявляла победителя, выдавала ачивки, меняла обложку чата на фотку-победителя;
- результаты записывались в секретный спредшит, доставшийся в наследство от Ани. Ачивки за победу есть нескольких уровней, так что надо как-то вести учёт побед, чтобы понимать, кому пора выдавать новый уровень;
- дальше голосовалка на выбор новой темы;
- ну и всё по кругу.
Это вроде и не сложно, но требует терпения, времени и планирования. Я уже давно начала выбирать даты челленджей с оглядкой на отпуска и прочие планы, чтобы успевать вовремя собрать чёртову форму для голосования и отправить анонсы.
Идея
Я много ныла про всю эту ручную рутину в чате и просила, чтобы кто-то уже наконец написал бота, ведь кругом одни айтишники же ну!
Виталий @dmitvitalii посоветовал обратиться к Артемию @aapqwhat, который согласился помочь и написать бота.
Дальше я на коленке написала ТЗ: как всё работает сейчас, какие есть корнер-кейсы и где хочется автоматизации.
Что умеет бот
От первого сообщения Оли до релиза бота в чатике прошло 3 месяца и 3 недели. При этом мечтали управиться за 2 недели, ага. Всё по традициям скрама.
Половина времени была потрачена на прокрастинацию и другие учебные проекты. Другая половина на фичи и более-менее симпатичный интерфейс.
В итоге в боте есть базовая голосовалка, регистратор фотографий и админка. Где-то в день релиза ещё добавил лидерборд. И о-о-очень большое количество всяких сообщений для бота: для диалогов админки, где заводятся челленджи, для чата и голосовалки.
Сначала Оля написала серьёзных текстов для сообщений, но во время первого тестирования «в проде» некоторые начали бесить, так что на ходу начали менять на то-то более миленькое и заботливое.
Немножко интерфейса:
Технологии
Стек:
- ТГ Фреймворк для бота Aiogram 3 (потому что умею);
- Библиотека для работы с БД SQLAlchemy (потому что не очень умею);
- PostgreSQL для асинхронности (которую тоже слабо умею!).
Была шальная идея взять что-то безумное в духе фреймворка для тг-ботов на ПЛЮСАХ, но затем я понял что и поддерживать бота придется мне одному до конца времен.
Боты на Aiogram 3 делаются довольно просто. Ты пишешь, на какие события должен реагировать бот, и что в этом случае он делает. Если делать красиво, с кнопочками и меню, выходит сложнее, так как надо продумать структуру что и за чем следует, полностью проверять каждое действие меню и т.д и т.д. Зато классный интерфейс вышел.
SQLAlchemy взял из-за того, что это удобная абстракция, под которой можно без особых проблем менять БД. Поэтому в середине разработки я перееехал с SQLite на PostgreSQL и практически не пострадал.
Еще тестики на pytest и классический докер.
Первый запуск в проде
5 мая заанонсили бота и через бота запустили новый челлендж, а 19 мая запустили голосовалку.
Фотки бот принимал радостно, а вот на голосовалке что-то пошло не так. Зачем Оля решила проводить голосование вечером в пятницу, непонятно до сих пор.
Что пошло не так
Случилось самое неожиданное — бот стал удалять чужие неотправленные голоса в процессе голосования (!).
Все из-за фатального проклятого бага при работе с SQL, который очень хорошо прятался и не высвечивал на тестах, так как тестировал всё я сам с собой и в маленьких чатах на 5 человек.
Все просто: в процессе голосования все лайки юзера сохраняются во временную табличку в БД. Так можно запомнить все лайки и отображать их нормально. И уже после отправления голоса лайки стирались с одной таблицы и попадали в другую, постоянную. Но лайки я стирал просто по айди фотки сразу в этой временной таблице. Поэтому если ты лайкнул фото гор и отправил свой голос, этот лайк сотрёт все чужие промежуточные лайки под этой горой. Бывает и такое.
Поэтому как только мы запустили голосовалку в Вастрик.Фотках — люди стали жаловаться на плавающие лайки.
Старые голоса потёрли, исправил ошибку, залили новое голосование, и я стал ждать новых ошибок. Ошибок не было.
Пока что.
Планы на будущее
В планах расширить админку до такого состояния, чтоб админ мог как угодно работать с челленджами и группами без моих рук в базе.
Ещё хочу переработать таблицы и сделать нормальные тесты для проверки телеграмной логики. Ещё можно переработать логику работы с БД, улучшить дашборды, придумать новые методы для классной статистики... дофига всего можно! Но пока лениво.
Нужны ли какие-то советы или помощь Клуба?
Сеньоры, подскажите! Как вообще писать тесты для такого бота? И где можно посмотреть примеры хороших тестов на pytest? Возьмете ли на стажировку/джуна?
Ну и приходите к нам на челленджи. Это весело! Мы тренируем насмотренность, выпихиваем друг друга из дома, чтобы пофотографировать и отвлечься, подбадриваем и помогаем советом.
Благодарности
- Ане @Sciannadev за то, что ты есть;
- Диме @dskr и Никите @naorlov за поддержку;
- Илье @ifegee за аватарку бота;
- ребятам из лучшего фото-чата просто потому, что вы классные 🖤
Очень люблю такие проекты, которые созданы почесать конкретное место
Как красиво автоматизировано!
А ещё я не знал о существовании чата и челленджей. Очень отзывается. Бегу к вам реинкарнировать себя в фотографии