"Алерты на день рождения" или как я откопал еще один забытый пет-проект
почему...
Однажды я забыл про день рождения своего близкого товарища. Раньше любая соцсеть прислала бы уведомление — но теперь все ушло в Телеграм. У них, конечно, есть встроенные нотифы на день рождения, но там надо добавлять друг друга в контакты, которые потом переполняют телефонную книжку. Или это просто отговорка, чтобы наконец потыкать ТГ-ботов
В любом случае, решил попробовать сделать что-то полу-полезное для десятка людей, которые как и я забыли о бедном Мишеле...
Можно посмотреть итоговую версию тут:
Попытка №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, но это перестраивать с нуля весь слой общения с Телеграмом. Сейчас хотя бы хочется проверить гипотезу, что кому-то это может быть нужным. Энивейс опыт интересный
Ссылочки
Мой сайтик - на правах рекламы наконец пошарю его не только с эйчарами
Всем спасибо за внимание!