Привет, я Влад, и это статья о том, как перемена обстановки повлекла за собой кардинальные изменения в механизме расчета моего бюджета и дальнейшую разработку средства его подсчета.

После возникновения идеи оставалось определиться с типом проекта, а именно, с тем, что он будет из себя представлять (Web-приложение, Мобильное приложение, Бот) и какой функционал необходимо внедрить в первую очередь.

Поиск аналогов и создание информационной базы

Перед разработкой авторского инструмента хотелось посмотреть, есть ли аналоги на похожую тему? И да, их оказалось множество. Были как мобильные приложения, так и огромные системы, не рассчитанные на учет личных средств. Указывать их здесь не буду так как они, при необходимости, находятся крайне просто. Поскольку хотелось какого-то компактного решения, то выбор пал на создание телеграмм-бота.

Выписал тезисы по функциональной составляющей бота которые хотел бы у себя использовать в боте:

  • Актуальные валютные курсы - далее добавление криптовалютных курсов.

  • Конвертация валютных пар. Поддержка арифметических операций (+, *)

  • Ведение бюджета.

  • Учёт расходов.

  • Единая база данных.

  • Локализация на другие языки (Эта опция изначально не
    предусматривалась).

Определившись с основным функционалом, теперь было необходимо разобраться с инструментарием и стеком технологий на котором разрабатывать данного бота.

Выбор технического стека

Выбор пал на любимый мною Nest.JS. Его строгая структура идеально подходит как для маленьких проектов, так и для осуществления возможности масштабирования, что очень пригодится для создания локализации и добавления новых модулей в моём проекте. Для создания единой базы данных использовалась PostgreSQL.

Углубляясь в рутину разработки, необходимо было найти инструменты для разработки под Nest.JS. К счастью, такие нашлись.

Итак, вот список:

  • hypeertech / nestjs-telegraf – этот модуль обеспечивает быстрый и простой способ создания Telegram-ботов и глубокую интеграцию с приложением Nest.JS.

  • toonvanstrijp / nestjs-i18n – библиотека для работы с языками в проекте. Порадовала очень гибкая настройка данного модуля и генерация типов.

  • typeorm / typeorm – ORM библиотека, основной целью которой является возможность писать в функциональном стиле весь код, не переходя на чистый SQL.

Также мной были использованы библиотеки, не нуждающиеся в представлении, такие как: axios – используемая для создания запросов к удаленным API, dotenv – для работы с локальными переменными.

Первым разработанным модулем стал расчет курса валют. Основной проблемой к нему - откуда брать актуальные курсы? Большинство API-источников были либо платными, либо неактуальными. Поэтому, поискав по бесплатным источникам, остановился на fawazahmed0 / currency-api. В качестве API для получения курсов криптовалют был выбран Binance API.

Теперь, когда по инструментам и источникам все известно перейду непосредственно к реализованному функционалу.

Базовая функциональность

рис.1 Экран Приветствия
рис.1 Экран Приветствия

Изначально, при старте бота под капотом происходит запись пользователя его telegram_id, language_code, и в дальнейшем, таким образом, происходит работа с бюджетом текущего пользователя и его расходами, а также с локализацией.

Далее, для начала работы с ботом, нужно выбрать один из доступных пунктов.

Начну с первого пункта - “Ведение бюджета”.

рис.2 Добавление информации в бюджет
рис.2 Добавление информации в бюджет

.Итак, при входе в него будет доступно два подпункта, один из которых - это добавление данных о бюджете, а второй - отображение данных по текущему бюджету. Так как мы только начали работу с ботом, следует ввести изначальные значения. Для этого выбираем пункт «Добавление данных о бюджете». При открытии пункта выйдет краткая справка по его заполнению. В справке четко описаны те значения, которые принимает бот и в случае правильного занесения бот ответит, что «Данные добавлены!» Таким образом можно вводить также дробные значения вплоть до сотых.

Далее, для проверки введенного значения, можно воспользоваться пунктами:

Ведение бюджета --> Отображение бюджета. В итоге, есть возможность получить краткую справку о текущем бюджете.

И да, валюты могут быть абсолютно любыми лишь бы подходили под формат 3-4 буквы в верхнем регистре. И если вы введете новые значения по уже добавленной валюте, то произойдет перезапись данных по ней. Таким нехитрым образом обошли аналогичный пункт по своей функциональности с внесением доходов, ибо считаю данную функциональность в боте излишней.

рис.3 Справка по текущему бюджету
рис.3 Справка по текущему бюджету

Теперь, когда данные о бюджете введены можно начинать добавлять информацию по расходам. Здесь все аналогично, за исключением формата вводимых данных. Так как расходы необходимо делить по категориям, одним из решений стало добавление групп расходов в одноименную таблицу.

«Функционал внесение расходов»

При нажатии на пункт Учёт расходов --> Добавление расходов появляется справочная информация по категориям и формат вводимых данных. Здесь по аналогии заносим данные по формату, описанному в примере. При удачной попытке бот ответит, что «Данные добавлены!» При занесении происходит соотношение валюты в бюджете с валютой расходов и, при отсутствии данных по валюте в бюджете, бот ответит, что данных в текущей валюте нет, либо если данные есть, но сумма расхода не может превышать сумму занесенного бюджета.

рис.4 Примеры ошибок.
рис.4 Примеры ошибок.

Функционал "Получение или расчет суммы курсов валют".

рис.5 Выбор основной валюты
рис.5 Выбор основной валюты

При нажатии на пункт в выпадающем меню следует выбрать главную валюту, относительно которой будут производиться дальнейшие расчеты. Далее появится подменю, где сверху будет указана текущая валюта для расчета и несколько подпунктов.

“Курсы валют” здесь можно получить курсы по всем перекрёстным парам либо получить курсы только по текущей валюте. Также, после введения основной валюты, можно сразу вводить суммы. И да, чтобы выйти из этого режима, необходимо нажать соответствующую кнопку. Специально для USD есть отдельная конвертация на USDT и популярные криптовалюты.

Отдельно хотелось отметить работу с локализацией. По умолчанию, при входе в бот, на сторонние языки ставится английский помимо русского. Для переключения между языками есть отдельная команда в меню
/lang.

Развертывание экземпляра бота

Развертывание бота происходит максимально просто. Вначале нужно проверить установлена ли на компьютере Node.js. Если нет, то по ссылке https://nodejs.org/en вы можете скачать версию для вашей операционной системы. Затем поставить глобально пакет yarn командой: npm I –g yarn. 

После этого нужно склонировать репозиторий командой git clone в нужный вам каталог, затем произвести установку всех зависимостей командой yarn install.

Далее, создать файл .env - путем копирования подобного файла в котором ввести данный вам токен бота (процесс создания бота через BotFather здесь описывать не стану), также данные по вашей учетной записи в PostgresSQL её хостинг адрес и основную БД, куда и будут записываться все данные бота.

После этого можно создать сценарий для записи бота в Докер контейнер, либо следовать путем, которым пошел я - запустить бота через демон процесс pm2 (для запуска через pm2 необходимо выполнить команду npm I –g pm2). Для этого выполним последовательно команды: yarn build и pm2 start “yarn start:prod”. Таким образом, вы только что запустили свой экземпляр бота.

Дальнейшее развитие

В целом, основной функционал создан. Из того что не хватает, я могу отметить, редактирование категорий, но так как их довольно много уже изначально, я не считаю это большой проблемой. Также аналогичной функциональности не хватает в расходах, но это уже, по моему мнению, лишнее. Если будут какие-то предложения помимо сказанного, готов это обсудить в комментариях.

Исходники

Сам телеграмм бот доступен по ссылке или @fixexpencebot.

Исходный код находится по ссылке

Комментарии (0)