Привет, я Влад, и это статья о том, как перемена обстановки повлекла за собой кардинальные изменения в механизме расчета моего бюджета и дальнейшую разработку средства его подсчета.
После возникновения идеи оставалось определиться с типом проекта, а именно, с тем, что он будет из себя представлять (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.
Теперь, когда по инструментам и источникам все известно перейду непосредственно к реализованному функционалу.
Базовая функциональность
Изначально, при старте бота под капотом происходит запись пользователя его telegram_id, language_code, и в дальнейшем, таким образом, происходит работа с бюджетом текущего пользователя и его расходами, а также с локализацией.
Далее, для начала работы с ботом, нужно выбрать один из доступных пунктов.
Начну с первого пункта - “Ведение бюджета”.
.Итак, при входе в него будет доступно два подпункта, один из которых - это добавление данных о бюджете, а второй - отображение данных по текущему бюджету. Так как мы только начали работу с ботом, следует ввести изначальные значения. Для этого выбираем пункт «Добавление данных о бюджете». При открытии пункта выйдет краткая справка по его заполнению. В справке четко описаны те значения, которые принимает бот и в случае правильного занесения бот ответит, что «Данные добавлены!» Таким образом можно вводить также дробные значения вплоть до сотых.
Далее, для проверки введенного значения, можно воспользоваться пунктами:
Ведение бюджета --> Отображение бюджета. В итоге, есть возможность получить краткую справку о текущем бюджете.
И да, валюты могут быть абсолютно любыми лишь бы подходили под формат 3-4 буквы в верхнем регистре. И если вы введете новые значения по уже добавленной валюте, то произойдет перезапись данных по ней. Таким нехитрым образом обошли аналогичный пункт по своей функциональности с внесением доходов, ибо считаю данную функциональность в боте излишней.
Теперь, когда данные о бюджете введены можно начинать добавлять информацию по расходам. Здесь все аналогично, за исключением формата вводимых данных. Так как расходы необходимо делить по категориям, одним из решений стало добавление групп расходов в одноименную таблицу.
«Функционал внесение расходов»
При нажатии на пункт Учёт расходов --> Добавление расходов появляется справочная информация по категориям и формат вводимых данных. Здесь по аналогии заносим данные по формату, описанному в примере. При удачной попытке бот ответит, что «Данные добавлены!» При занесении происходит соотношение валюты в бюджете с валютой расходов и, при отсутствии данных по валюте в бюджете, бот ответит, что данных в текущей валюте нет, либо если данные есть, но сумма расхода не может превышать сумму занесенного бюджета.
Функционал "Получение или расчет суммы курсов валют".
При нажатии на пункт в выпадающем меню следует выбрать главную валюту, относительно которой будут производиться дальнейшие расчеты. Далее появится подменю, где сверху будет указана текущая валюта для расчета и несколько подпунктов.
“Курсы валют” здесь можно получить курсы по всем перекрёстным парам либо получить курсы только по текущей валюте. Также, после введения основной валюты, можно сразу вводить суммы. И да, чтобы выйти из этого режима, необходимо нажать соответствующую кнопку. Специально для 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.