Бот с расписанием шаттлов
После Avito, я перешёл в «Ренессанс здоровье» по приглашению своего давнего товарища Лёши Кожевникова.
У «Ренессанса» ходят собственные автобусы от метро до офиса и обратно. Это шаттлы, которые не отображаются в приложениях типа «Яндекс.Транспорт». А расписание их движения присылает HR в виде JPEG.
Такой формат показался мне неудобным и я решил упростить процесс восприятия информации.
Так появился Telegram-бот Shuttles (@ShuttlesRobot), о котором пойдёт рассказ.
Что умеет бот
Сначала нужно понять, почему бот полезнее, чем JPEG.
Бот умеет показывать время прибытия ближайшего автобуса и минуты до него. Например, «Через 30 минут в 7:30».
Он также умеет склонять слово «минут». Например, «Через 30 минут» или «Через 32 минуты».
Ещё бот определяет текущий день недели. Это нужно для того, чтобы напоминать, что в пятницу сокращённое расписание движения. А по выходным автобусы не ходят вовсе.
Текущая функциональность — MVP. И у меня в backlog уже есть идеи, как сделать бота удобнее и дружелюбнее.
Реализация
Я не планировал публиковать код этого проекта, ограничившись рассказом. Но затем понял, что ещё никогда не писал так много математики. И было бы здорово, чтобы более опытные ребята могли мне что-нибудь подсказать.
Если у вас есть замечания или предложения, вы смело можете их мне озвучить (@boboshko).
Бот
Основой для бота служит Telegraf. На данный момент, это единственная подключаемая библиотека в проекте. Чтобы понимать, как с ней работать, можно почитать документацию или посмотреть примеры.
Расчёт времени
Все операции со временем и определение текущего дня недели происходят в файле timeCalculation.js
. Я не буду полностью рассказывать о том, как происходят вычисления (в коде есть комментарии), а только затрону способ решения главной проблемы — получении массива с нужными значениями timestamp
.
Расписание хранится файле schedule.json
в формате матрицы. Каждый массив представляет из себя последовательность чисел. Например, [21, 25, 0, 0]
— это 21:25:00:00
. Такой формат времени обусловлен тем, что функция setHours
для объекта Date
принимает аргументы в таком формате и помогает сохранить читаемость расписания для человека в schedule.json
.
Чтобы дальше было удобнее работать со временем, его нужно перевести в timestamp
. И setHours
помогает с этим справиться, возвращая timestamp
в часовом поясе UTC (минус три часа по Москве). В дальнейшем, для корректного отображения времени в интерфейсе пользователя, эту разницу нужно будет компенсировать вручную.
Но не всё так просто с timestamp
. Например, 21:25 UTC
текущего дня — это 1591478700
. А следующего — 1591565100
. Следовательно, нужно рассчитывать значения timestamp
для всего расписания, каждый раз, когда нужно произвести остальные вычисления.
За это отвечает функция convertTime
. Результатом её работы будет массив outArray
, в котором хранится всё расписание на день в timestamp
.
Скорее всего, это не самый элегантный способ хранения времени. Расскажите мне, если знаете, как лучше (@boboshko).
Ну и вообще, буду рад, если кто-нибудь захочется присоединиться к разработке проекта.
Принцип разработки
Влад Самойлов, с которым я познакомился в Avito, рассказал мне об атомарном подходе в разработке.
Атомарный подход — это когда ты декомпозируешь большую задачу на более мелкие и выполняешь их последовательно. Этим методом я воспользовался, когда писал математику.
Я разбил все нужные действия для подсчёта времени на небольшии функции, в конце объединив их все в одну большую. А результат её выполнения экспортирую в файл с обработчиками бота.
Хочу поблагодарить Влада за совет и то, что он помогает мне с кодом, время от времени. Спасибо!
Что бы хотелось
Хотелось бы аналитику. В 2017-м для её сбора, я пользовался сервисом Botan от «Яндекса». Но сервис закрыли в 2018-м году. Я искал ему замену и сумел найти Chatbase. Но подключить его не вышло.
Ещё нужно понять, как читабельно выводить сразу всё расписание на день. Я пока не придумал хорошего варианта.
Расскажите мне, если можете помочь мне с этими вопросами.
Как добавить свои шаттлы
Вы можете добавить расписание своих автобусов в @ShuttlesRobot, если они курсируют между двух точек. Это бесплатно.
От вас нужно только их расписание. После чего, вы и ваши товарищи смогут пользоваться ботом.
Присылать сюда (@boboshko).
Если у вас остались вопросы, вы можете их задать в чате канала: @codeque.