Боты
August 6, 2020

Бот с расписанием шаттлов

Иллюстрация — Илья Казаков

После 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.

Подписывайтесь на мой канал, Twitter и Instagram.