Статьи

Как мы использовали Slack, Scala и Play для автоматизации нашего заказа на обед

Автоматизируйте все вещи! Slack косая черта команды на помощь

Каждый день в полдень запускаются заказы на обед. Все места, где мы заказываем нашу еду из службы поддержки онлайн, НО это единственное место, которое нам нравится, которое принимает заказы только по телефону или электронной почте. Местный ресторан домашней кухни с меню, которое меняется каждую неделю. В какой-то момент мы устали собирать все заказы вручную, поэтому решили автоматизировать этот процесс через Slack с помощью спонтанного хакатона. В этом посте мы расскажем, как мы натолкнулись на команды слэка, и как их можно настроить так, чтобы они делали что угодно.

Так что же такое команды Slack slash?

Команды Slash позволяют вам подключаться к другим сервисам, а ваш Slack напоминает командную строку. Или клиент IRC, если вы в этом. Любое сообщение, начинающееся с «/», может выполнить предварительно настроенную команду. Кроме того, команды Slash содержат данные о контексте, из которого они отправлены, а также могут содержать дополнительный текст. Например, если вы используете интеграцию Giphy, команда write / giphy feed me отправит запрос, содержащий это сообщение, на сервер Giphy, который будет искать случайный связанный GIF, и вернет его в своем ответе.

Еще одна хорошая готовая команда, которая поставляется из коробки - это / shrug ¯ \ _ (ツ) _ / ¯

Еще одна хорошая готовая команда, которая поставляется из коробки — это / shrug ¯ \ _ (ツ) _ / ¯

Как вы можете настроить его?

Короче говоря, все, что нам нужно было сделать, это настроить новую команду через страницу настроек Slack. Это супер просто. Этого достаточно, чтобы он отправлял HTTP-запрос на предварительно определенный внешний URL-адрес всякий раз, когда команда вводится в приложении. Затем мы создали новый бэкэнд, который отвечает за получение этих HTTP-запросов и ответ на них. Вот более длинная история, не обязательно в фактическом порядке событий 🙂

Шаг № 1: Назовите вашу команду через страницу конфигурации

Талу это название того ресторана, который нам нравится

Талу это название того ресторана, который нам нравится

Шаг № 2: Настройте команду

На следующем экране вам нужно будет настроить URL-адрес серверной части и дать вашей команде slash собственное имя, пользовательский значок и описание:

настройки

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

полезная нагрузка

Шаг № 3: Постройте бэкэнд для команды слеш

Этот шаг немного длиннее, чем, скажем … имя вашей команды! Поскольку нам здесь очень нравится Scala, в Takipi мы решили использовать Play Framework через активатор Typesafe . Для начала мы создали новый проект play-scala, набрав activator new. Полное описание новой структуры проекта можно найти в документации Play. Все, что нам нужно было сделать — это изменить два файла:

  1. Файл conf / routs отвечает за отображение входящих HTTP-запросов на действия в бэкэнд-контроллере. Мы добавили следующую строку:
    POST / talu контроллеры.Application.talu
  2. app / controllers / Application.scala — это место для определения реальных действий.

Вот как мы определили поддерживаемые команды:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Application extends Controller {
 
...
 
 val slashCommandForm = Form(
    tuple(
      "command" -> text,
      "text" -> text
    )
  )
 
  def talu = Action { implicit request =>
    val (command, text) = slashCommandForm.bindFromRequest.get
     
    val subCommand = text.split(" ")(0)
    val param = text.substring(text.indexOf(" ") + 1)
 
    subCommand match {
      case "add" =>      Ok(add param)
      case "remove" =>   Ok(remove param)
      case "clear" =>    Ok(clear)
      case "list" =>     Ok(list)
      case "send" =>     Ok(send)
      case _ =>          Ok("Bad Request :[")
    }
  }
 
....
 
}

А вот как мы справляемся с добавлением блюда к заказу:

1
2
3
4
5
6
def add(dish : String) : String = {
    val count = globals.orders getOrElseUpdate (dish, 0)
    globals.orders += (dish -> (count+1))
 
    return (dish + " added.")
}

Шаг № 4: Заверните это

Создайте дистрибутив приложения Play, запустив: activator dist. Новый дистрибутив создан под целевой / универсальный

Шаг № 5: Развертывание!

Мы решили использовать бесплатный аккаунт Boxfuse, который идеально подходил для этой цели . Сверхбыстрая установка приложения Play на экземпляр AWS (конечно же, также требуется учетная запись AWS). Без накладных расходов все обычные настройки и настройки. Если вы хотите поближе познакомиться с тем, как ваше приложение ведет себя в работе, вы также можете подключить его к агенту Takipi, чтобы исключить любые догадки при возникновении исключений или ошибок журнала.

И вот результаты

/talu add tom yum soup :ramen:

рамэн

/talu list

список

/talu send

ordersent

Последние мысли

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