DOU Labs: як в Ukad створили Slack-бота для управління проектами

У рубриці DOU Labs ми запрошуємо IT-компанії ділитися досвідом власних цікавих розробок і внутрішніх технологічних ініціатив. Питання і заявки на участь надсилайте на editors@dou.ua .

Challenge. В потоці щоденних завдань програмісти забувають вчасно заповнювати дані по time-reporting. Потрібен простий спосіб нагадувати членам команди про щоденному звіті, який би дозволяв розсилати повідомлення тільки тим, хто забув залогировать час.

Solution. Ми розробили бота на основі Microsoft Bot Framework, який щодня в 11:00 перевіряє, що time report внесено в систему обліку. У противному разі він повідомляє працівника про це особистим повідомленням в корпоративний Slack. Про розробку бота і розповімо у статті.

Реалізація

Ukad slack-бот побудований на Microsoft Bot Framework . Цей фреймворк підходить для різних платформ, не вимагаючи окремої реалізації функціоналу для кожної. Microsoft Bot Frameworks з'єднує всі підходи, дозволяючи розробнику з допомогою одного бота контролювати різні платформи, підключивши Facebook, Skype, Slack і так далі. Всім цим може керувати тільки один інстанси бота, і це одна з головних задач. Крім каналу, який підтримує Microsoft Bot Frameworks ми можемо реалізувати свої власні, створюючи підтримку будь-якого каналу в рамках MBF або підключивши бот на сайті.

Ukad slack-бот реалізує Slack API. Ми допомагаємо працівникам відстежувати робочі години, нагадуючи вводити дані про часу в тайм-трекер, якщо він не заповнений. Зараз ми підключили оповіщення про графіку відпусток та оповіщення для адмінів. Тепер тимлиды можуть планувати проекти, враховуючи інформацію про відсутність/присутність в офісі потрібних співробітників, а адміни вчасно реагувати на нові таски.

Бот створений, щоб спростити життя співробітників, дозволивши декількома кліками миші отримати потрібну інформацію. У майбутньому ми хочемо додати більше функцій, пов'язаних з управлінням проектами, наприклад, інформування про деплое і аптайме проектів. Найчастіше повідомлення про стан проекту автоматично приходять на мейл, але бот-повідомлення в Slack в реальному часі набагато надійніше і зручніше.

Як це працює

У бота є 2 режиму.

1. User ініціював dialog.

З набору слів, які користувач пише боту, використовуючи NLP (natural language processing), бот виокремлює намір, intent. Наприклад, питання про погоду. Бот повинен розпізнати «weather» як intent, «сьогодні» — як сьогоднішнє число.

Бот розуміє, чого хоче користувач, що запускає потрібний діалог і може валідувати дані. Наприклад, ми хочемо отримати від користувача уточнення у вигляді тексту (наприклад, погода в якому місті) або дати користувачеві можливість відповісти на список питань (діалог може представляти собою form fill або quiz).

2. Bot ініціював dialog.

Наша система оповіщення працює за такою моделлю: на API бота подається повідомлення і адресат від нашого сервісу, бот надсилає повідомлення за адресою. В залежності від налаштувань в запиті це може бути одиничний повідомлення або запуск якогось діалогу.

Що під капотом

MS Bot Framework має 2 реалізації: З# і Node.js. У цьому кейсі був обраний Node.js з-за його гнучкості. Діалоги всередині бота — це готові функції. Якщо ви хочете змінювати саму топологію діалогів і архітектуру бота в C#, вам буде потрібно використовувати reflection. В Node.js це робиться набагато простіше. Вкрай вигідною виходить архітектура «1 бот — багато сценаріїв», коли ми конструюємо якийсь універсальний бот і при старті з API задаємо його структуру.

Бот повинен бути підключений до каналу взаємодії з користувачем (FB, Slack, Skype, Web application тощо). Для цього у MS Bot Framework є інтерфейс IConnector. Ми могли б скористатися реалізацією Microsoft і підключити Azure Connector, який може агрегувати повідомлення від всіх підключених каналів і надсилати на API вашого бота. Але ми пішли шляхом самурая і реалізували свій Slack Сonnector. Це нам дало більше функцій, ніж у реалізації Slack API від MS. Також Azure Connector не безкоштовний і тарифікується за кількістю повідомлень, а наш бот — ні.

Після підключення каналів необхідно розмістити бот. Ми повинні звідкись брати повідомлення і кудись відправляти.

Класична схема — коли у нас є API в інтернеті, куди нам надсилають повідомлення, а за іншою адресою ми вже відправляємо відповіді. У Azure є спеціальний контейнер для Bot Framework, де ми можемо розмістити додаток і отримати endpoint, однак можна зробити те ж саме у себе на сервері. Наша реалізація складається з Slack RTM client. Це сокет, по якому ми отримуємо повідомлення, а відправляємо їх через Slack Web API.

Після цього потрібно визначитися, зберігати стан діалогів і, якщо так, то як довго. Діалоги можна зберігати в пам'яті, а можна в БД. Є стандартні для реалізації Cosmos DB і оперативної пам'яті. Однак найкраще написати свою реалізацію інтерфейсу IBotStorage для вашої улюбленої БД (існує всього три методу). Ми зробили під NoSQL.

Далі залишається тільки наповнювати додаток логікою, для чого Bot Framework надає величезну кількість інструментів. Ми створили API, через який наші внутрішні сервіси розсилають повідомлення співробітникам. Реалізується Bot ініціював dialog сценарій, який описаний вище. Також створені intent діалоги, які реалізують User ініціював dialog сценарій і викликаються в залежності від введення користувача.

Основний Stack технологій: Node.js, MS Bot Framework, Typescript, NeDB, Slack SDK, DialogFlow.

Висновок

Бот — це досить гнучка система, яка може бути як монолітної, маючи в собі всю бізнес-логіку, так і бути легким клієнтом, черпаючи структуру з API, що генерується з допомогою CMS. При цьому це досить дешева технологія, що не вимагає участі великої команди розробників за умови монолітної архітектури або готової CMS. Єдиний потік введення/виводу робить систему не вимогливою до ресурсів. Бот допомагає зробити інтерфейс дружелюбніше, виконує промо-завдання, переймає задачі консультантів, роблячи робочий процес більш зручним.

Опубліковано: 20/09/18 @ 10:00
Розділ Різне

Рекомендуємо:

Туторіал з налаштування Rails-додатків на Amazon EC2 з Chef. Частина 1
Кейс: від 0 до 25000 чоловік в місяць для сайту клініки лазерної медицини
Будуємо сильну команду: від 0 до 100
Як провести Discovery на новому проекті: конкретні кроки і приклади
Python дайджест #17: Python reaches Tiobe index TOP 3