В наше время крайне популярна подписочная модель монетизации, и у активного пользователя интернета обычно подключено сразу несколько подписок. Сервисы стриминга музыки и видео, магазины видеоигр, приложения, Сбер, Mail.Ru и Вастрик — все хотят получать деньги с потребителя каждый месяц. Я тоже регулярно оплачиваю ряд сервисов и приложений, и мне всегда хотелось как-то это контролировать — считать общую сумму за месяц, переводить суммы в рубли, получать уведомления о приближающейся дате платежа, желательно с доступом к данным со всех своих устройств. Существует много мобильных приложений для учета подписок, но мне не хотелось устанавливать еще одно приложение ради такой несложной функциональности. Приложения показывают рекламу, пытаются собирать информацию о пользователях, постоянно обновляются и расходуют заряд батареи; отображение нескольких строчек текста того не стоит. В принципе, можно было бы вести список подписок в Excel-таблице и синхронизировать ее через Dropbox, но в таком варианте не получилось бы использовать актуальные курсы валют и отправлять уведомления.
Из таких требований родилась идея Telegram-бота для ведения списка подписок. Интерфейсных возможностей для перечисленных целей вполне хватает, и не нужно ставить отдельное приложение, так как мессенджер уже установлен на всех устройствах. В тот момент подобных (рабочих) ботов найти не удалось. Так как идея была больше пожеланием, чем сильной болью, то была отложена в стол, и я вспомнил о ней, только когда выбирал пет-проджект для изучения языка Scala.
Для такой цели проект подошел хорошо, так как был не очень масштабным, но и не совсем игрушечным. Он стал для меня песочницей, в которой я пробовал различные концепции и библиотеки из экосистемы Scala и несколько раз переписывал части кода, когда узнавал что-то новое. Это стало причиной долгой разработки, первые коммиты были сделаны в августе 2019-го года, и только сейчас бот приобрел некоторые законченные очертания первой версии. Получившийся продукт мне очень нравится, с удовольствием им пользуюсь. Надеюсь, что и другим он окажется полезен, особенно сейчас, когда за время самоизоляции и удаленки количество подключенных подписок у многих сильно увеличилось.
Как пользоваться
Функциональность аналогична нескольким приложениям для учета подписок, которые я пробовал. Список моих подписок выглядит так:
В списке отображается, сколько тратится на каждую подписку за неделю/месяц/год, а также общая сумма за период. Для удобства цены переводятся в дефолтную валюту — не забудьте выбрать ее в настройках (кнопка Settings или команда /settings
). Курсы валют обновляются раз в сутки. В квадратных скобках указано, сколько времени осталось до следующего платежа.
На странице подписки находится цена в исходной валюте, периодичность, дата следующего платежа, и сумма, потраченная с даты первого платежа. Периодичность при создании можно не указывать, чтобы отслеживать разовые платежи.
Уведомления включаются отдельно для каждой подписки. Они стали главной проблемой при разработке бота — изначально хотелось сделать гибкую настройку оповещений, отправку сообщений за произвольное количество дней или часов, как в календарях. Но API для Telegram-ботов не позволяет узнать часовой пояс пользователя, а без этого не получится вычислить точное время отправки сообщения. Мне не удалось придумать, как реализовать простой и удобный выбор временной зоны в Telegram-боте, поэтому уведомления отправляются за сутки до даты платежа по времени UTC. Так один пользователь получит сообщение за 23 часа, а другой за час до платежа, это кривое решение, но ничего лучше пока нет, а мне уведомлений с такой точностью хватает.
Создание и редактирование подписок производится в диалоговом режиме, а если вы застряли или не понимаете, что происходит, всегда можно вызвать команду /reset
или /start
, чтобы выйти из диалога.
Бот полностью бесплатный, монетизация не планируется, за потенциальным исключением в виде ссылки для пожертвований.
Технологический стек
Главной целью разработки было попробовать современное функциональное программирование на Scala, IO-монады и концепцию Tagless Final. Это определило стек, бот написан с использованием библиотеки для ФП — Cats Effect, для взаимодействия с базой данных используется doobie. Разработка была интересной, об одном из решений написал отдельный пост в своем блоге: для данных в кнопках инлайн-клавиатур бота используется формат CSV с мапингом в алгебраические типы. Деплоится бот в виде systemd-сервиса с запуском jar-файла на VPS.
Для взаимодействия с Telegram Bot API используется библиотека Telegramium. Это функциональная библиотека на Scala, которую я помогаю разрабатывать, пользователи и контрибуторы приветствуются.
Заключение и ссылки
В итоге бот помог мне сделать вывод, что на подписки уходит не так много денег, и пока что можно на них не экономить. Если не включать в список оплату съемной квартиры, конечно.
На этом все, замечания и пожелания пишите в комментарии или мне в Telegram johnspade. Исходный код бота можно найти на Github.
Еще раз ссылка на добавление бота в Telegram: s10ns_bot
Вообще топ тема! Использовал для этого всякие платные приложения для айфона, но очень быстро забивал на них. В наших европах особенно актуально, тут контракты заключают на год-два и нужно быть вундеркиндом чтобы не проебать момент его разорвать или перейти на более выгодный. Даже целые стартапы вокруг этого пуляют.
Тема! А часовой пояс у юзера можно спрашивать. Пусть город вбивает, дальше через geocoding api Яндекса нормализовать его и определять пояс.
Оч круто :)
Клавиатура с датам - вообще огонь
Удобно, хорошо, спасибо за бота)
Создал платежи с начальной датой на пару лет назад, чтобы видеть, сколько было уплачено. Далее редактирую amount, т.к. с этого месяца изменяется цена. Цена изменилась и пересчиталась для всего предыдущего периода. Было бы здорово иметь возможность отключать пересчет для предыдущего периода при изменении цены.
Бот крутой, буду использовать, спасибо.
По фидбеку: было бы хорошо, если бы на клавиатуре с датой верхняя кнопка с месяцем/годом была не декоративная, а по нажатию показывала бы сначала месяцы, а потом и года, как это происходит в типовых дейтпикерах. А то если первый платеж два года назад, то довольно неудобно листать. Ну и как вторичный вариант просто принимать дату текстом в каком-то формате
Классный бот, спасибо. Нашел его в теме про ежемесячные подписки, заполнил, теперь думаю так ли мне все они нужны 😃
Круто, спасибо за бота
Не мог добавить туда ещё UAH?;)
Не получится сделать чтобы пользователь мог самостоятельно через команду задать свою таймзону (по умолчанию также и оставить как есть) - как нибуть вроде /timezone UTC+6 ?
Где хранятся персональные данные?
Привет, очень круто!
Я правильно понимаю, что свою валюту не зарегистрировать?
Клево. Монетизировать будете?
А можно добавить BYN (беларусскую валюту)?
P.S. бот крутой!
Так вот что народу нужно, бот для отслежиавния подписок, а я дурак думал сообществу пользу принесу, уведомения из Bitbucket в Telegram сделаю, дурак :D
😱 Комментарий удален его автором...