"Алерты на день рождения" или как я откопал еще один забытый пет-проект

почему...

Однажды я забыл про день рождения своего близкого товарища. Раньше любая соцсеть прислала бы уведомление — но теперь все ушло в Телеграм. У них, конечно, есть встроенные нотифы на день рождения, но там надо добавлять друг друга в контакты, которые потом переполняют телефонную книжку. Или это просто отговорка, чтобы наконец потыкать ТГ-ботов

В любом случае, решил попробовать сделать что-то полу-полезное для десятка людей, которые как и я забыли о бедном Мишеле...

Можно посмотреть итоговую версию тут:

Попытка №1

Решение напросилось сразу — микро-соцсеть внутри телеги с единой целью — напоминать о днях рождения

Первая итерация больше сходила на таск-трекер — юзер добавляет своих знакомых по @тегу и указывает их дату рождения, а бот раз в сутки в 12 ночи проходится по всем зарегистрированным пользователям и ищет у каждого в их "мини-заметках" людей с днем рождения сегодня

Да кому вообще нужен трекер задач? Изначально же хотели мини-соцсеть. Давайте добавим сюда друзей, а не просто "у моего товарища день рождения 26 апреля". Юзер зарегался — его можно добавить в друзья, и указанная им дата рождения сразу синхронизируется. Теперь у нас таск-трекер с коллабом!

Представим, что у меня есть целая компания друзей, я уже доволен. С кем-то я общаюсь лучше, с кем-то хуже (даже на уровне, что у меня их в друзьях нет нигде), но поздравить-то надо всех. Организуемся в одну единую группу — добавились один раз и получаем алерты о каждом своем товарище без нужды добавлять десяток людей

Ну и шедулинг стоит починить — сейчас бот просто сканирует в фиксированное время всех подряд. Сменим на нормальный шедулинг — будем создавать задачу "уведомить всех следящих" в указанную дату (для зарегистрированного юзера все его фолловеры, а указанных незарегистрированных держим отдельно с одним следящим — тем, кто добавил). Через простой Job Scheduler (на самом деле не очень) получается корректная рассылка - есть день рождения = уведомим по нему, а не старый формат есть юзер = смотрим, можно ли уведомить

Временные проблемы

Возникает небольшая проблема — у меня часовой пояс GMT+3, бот функционирует на GMT. Мои друзья получат нотифай о дне рождения, когда у меня будет 3 ночи. Не классно, пусть у каждого юзера будет своя таймзона, которую он может в любой момент настроить.

А если не хочется получать алерты в ночь? Я, конечно, ни разу не видел людей, которые спят в 12 ночи, но вдруг. Поставим еще каждому юзеру возможность получать нотифай заранее — за указанное количество часов

Вот теперь все. Бот имеет функциональность дружбы, добавления не-участников и объединения в группы. Кинул друзьям, потыкали — вроде прикольно. Но как-то там и забылось, да и за VPS платить было лень

Return of the king

Спустя 7 месяцев я решил посмотреть на свои старые репо. Испугался монолитного набора костылей, пошел доделывать свое портфолио. Но не сдаваться же мне, вернулся все-таки с целью порефакторить. И остался тут часов на 100 примерно...

Во-первых, надо разделить несколько тысяч строк неструктурированного кода по слоям модулей — отдельно Телеграм, отдельно обработки всяких нотифаев-шедулеров и внутренней кухни, отдельно БД с ее вечными миграциями. В техничности особо не буду углубляться, просто сделал проект, который наконец можно нормально масштабировать, не пытаясь выкопать забытый костыль в недрах уже давно забытой кодбазы. Но все равно проект ощущается слишком "собранным в гараже прототипом"

Лучшее, что можно сделать с проектом, если не уверен в нем — попросить людей вокруг потыкаться. Мне предложили классную идею с отложками — раньше мы просто в какой-то момент нотифаили о дне рождения, а потом "ну сказали и сказали, пока". Цели в этом будто бы никакой. А ЕСЛИ мы будем предупреждать о дне рождения за несколько дней, условную недельку — люди успеют подготовиться. И потом уже кидаем им алерт в сам день рождения, чтобы точно не забыли

Что еще люди делают в дни рождения? Подарки дарят, конечно же! Если у нас есть централизованная точка дней рождения, должна быть и централизованная точка подарков. Добавил вишлисты в очень простой реализацией — юзер составляет список, что хочет (может еще и прикрепить ссылку и цену по возможности) — а остальные могут посмотреть этот список

В этот момент я задумался, что этот пет начинает выглядеть как проект. Значит настало время его локализовать — вот это был абсолютный ад. Накатить i18n — задача несложная, но проблема ТГ ботов в том, что все мои клавиатурные движения являются обработкой текстов, которые отсылаются при нажатии на эту кнопку. Пришлось заколебаться как с новой "общей" регуляркой на все языки, так и в принципе с вытаскиванием каждой строки в отдельный ключ. В какой-то момент я наконец решил подключить чатгпт (да, я все еще не умею пользоваться ЛЛМками для кодинга) — проект уже получился настолько большим, что за одно сообщение он не кушался. Но ключи относительно разумно получились, сразу и локализацию на английском накатал. Еще и в рамках бота можно локализовать всякие энтри-сообщения, сделал РУ/EN версии

Вот теперь это проект, который можно шарить хоть на весь мир!
Вот теперь это проект, который можно шарить хоть на весь мир!

Оверинжиниринг

Конечно, я не могу просто сделать "ок продукт", и начну закапываться в "хочу сделать чтоб классно". Решил тут вспомнить свою любовь к внешним консолькам управления и наконец поделать известный всем, кроме меня, CI/CD

Админка оказалась довольно простой — прикрепил немножко аналитики (очень базовые статистики по группам и юзерам), логи ошибок, массовый броадкаст и, конечно же, мою AZ-5

Вечная любовь к кнопке "выключить все" - с моего первого жс-сайтика
Вечная любовь к кнопке "выключить все" - с моего первого жс-сайтика

Деплоймент оказался несложным, но тут уже заслуга чатгпт, который объяснил мне, как настроить GH Actions на заливку по SSH при изменении ветки. Решил как взрослый программист иметь прод и стейдж ветки, которые будут держаться двумя инстансами бота, чтобы не ломать людям рандомный опыт кликания по клавиатуре в приложении

"Алерты на день рождения" или как я откопал еще один забытый пет-проект

Опенсорс

Я легитимно не знаю, насколько мой код окей в принципе. Из этого пошло желание показать его всем, кому это может быть интересно. Залил на гитхаб, наклепал красивые readme и правила контрибута (просто попросил не ломать ничего, объяснил кратко как работает проект, надеюсь хватит). Я в принципе редко видел что-то такое в опенсорсе, будет моим небольшим позорным пятном, на которое может посмотреть кто угодно

Как разбогатеть с этого

Это вопрос, который я сам себе задаю. Чтобы продукт был популярным, нужно привлечь юзеров. Чтобы привлечь юзеров, нужна реклама. А на рекламу нужны деньги, которые моя студенческая еврейская душа не желает отдавать. Затоооо я узнал, что ТГ боты могут получать донаты звездочками — на них можно и рекламу спонсировать (в любом случае, пока не разобрался, как их выводить, точно от $10 надо насобирать). Вроде даже есть внутренний обмен — ты звезды телеграму, а он тебе рекламу. А еще можно делать всякие бесплатные рекламные ходы — например писать про свои проекты на форумах в ожидании, что хотя бы десяток юзеров перейдет

А куда дальше?

Да кто его знает. Это моя очередная обсессия, которую я хочу помейнтейнить только на основании того, что стыдно бросать свой первый опенсорс средне-нормального размера. Очевидно, надо починить десятки багов, которые я все еще не откопал. Думал посмотреть в сторону TMA, но это перестраивать с нуля весь слой общения с Телеграмом. Сейчас хотя бы хочется проверить гипотезу, что кому-то это может быть нужным. Энивейс опыт интересный

Ссылочки

Мой сайтик - на правах рекламы наконец пошарю его не только с эйчарами

Всем спасибо за внимание!

2
1 комментарий