JBot Framework — LEGO для построения ботов.
JBot — это приложение с весенней загрузкой, которое позволяет Slack (скоро появятся Facebook и Twitter) за несколько минут. Он предоставляет весь стандартный код, необходимый для того, чтобы вы могли сразу же оживить своего бота .
Вы можете начать общаться со своим ботом всего за четыре простых шага:
- Клонировать этот проект
$ git clone [email protected]:ramswaroop/jbot.git
и$ cd jbot/jbot-example
. - Создайте бот Slack и получите свой токен Slack.
- Вставьте токен в файл application.properties .
- Запустите приложение, запустив его
JBotApplication
в IDE или через командную строку$ mvn spring-boot:run
.
Вот и все.
Зачем использовать JBot для Slack?
- Предоставляет вам весь стандартный код, который обрабатывает основные веб-сокеты и другие сложности.
- Поддерживает несколько дополнительных событий в дополнение ко всем событиям, поддерживаемым Slack RTM API , что значительно упрощает вашу работу.
- Прием и отправка сообщений так же просты, как определение
controller
метода и вызоваreply()
, вам не нужно вручную анализировать какие-либо события или кодировать сообщения вручную перед отправкой. - Функция общения в JBot делает разговор с вашим ботом легким.
- Хорошо протестирован с юнит-тестами.
Основное использование
Основная функция бота — получать и отвечать на сообщения. С этим комплектом получать сообщения так же просто, как написать простой контроллер и ответить на него, вызвав reply()
метод, как показано ниже:
@Controller(events = EventType.MESSAGE)
public void onReceiveDM(WebSocketSession session, Event event) {
reply(session, event, new Message("Hi, I am a Slack Bot!"));
}
Весь код для вашего бота идет в классе SlackBot, который расширяет Bot из основного пакета. Вы можете иметь столько ботов, сколько захотите, просто сделайте класс расширяющим класс ботов, и он получит все возможности слабого бота.
Создание слабой интеграции с JBot
Вы можете интегрировать свои сервисы в Slack любым из следующих способов:
И Botkit в настоящее время поддерживает:
- Пользователи бота через API Slack Real Time Messaging (RTM) .
- Команды Slack Slash .
- Slack Webhooks .
Боты взаимодействуют со Slack через RTM API или технически через веб-сокеты. Команды Рассечение не ничего , но GET
и POST
вызовы для вашего приложения. Наконец, веб-хуки могут быть двух типов: входящие и исходящие. Входящие веб-заезды — это то, где вы извлекаетеPOST
данные извне (т. Е. Свое приложение) в Slack, а исходящие веб-зацепки — это то, где отбрасывают POST
данные в конечную точку, указанную вами.
Настройка вашего приложения
Сначала необходимо вставить свои токены / URL-адреса в файл application.properties:
slackBotToken=xoxb-50014434-slacktokenx29U9X1bQ
slashCommandToken=X73Fv3tokenx242CdpEq
slackIncomingWebhookUrl=https://hooks.slack.com/services/T02WEBHOOKURLV7oOYvPiHL7y6
Основной пакет содержит все JBot кода. Вы можете создавать пакеты вне core
пакета и размещать там свой код. Сделать
- Slack Bot ⇒ Расширить класс бота.
- Обработчик команд косой черты ⇒ Аннотируйте свой класс с помощью Spring
@Controller
и получите метод с требуемым@RequestMapping
путем, получающий набор параметров запроса, как показано в примере. - Slack Incoming Webhook ⇒ Просто
POST
позвоните в RichMessage всякий раз, когда вы хотите что-то сообщить своим пользователям Slack. - Slack Outgoing Webhook ⇒ То же, что и обработчик команд Slash.
Получение сообщений
Для ботов , вы получите сообщение как события . Почти для всех действий Slack запускает соответствующее событие для него. К сожалению, он не генерирует соответствующие события, когда кто-то напрямую отправляет сообщение боту (прямое сообщение) или упоминает бота на канале (например @bot
). Он просто генерирует событие типа message
для всех отправленных сообщений (непосредственно боту и каналам, в которых бот является участником).
Но угадайте, что вы сейчас в нужном месте — BotKit справится с этим за вас. Он поддерживает три дополнительные мероприятия EventType.DIRECT_MESSAGE
, EventType.DIRECT_MENTION
и EventType.ACK
в дополнении ко всем поддерживаемым в настоящее время гача событий . Первые два события говорят сами за себя, но EventType.ACK
это не что иное, как событие подтверждения, которое подтверждает доставку ранее отправленного сообщения.
Чтобы получать и анализировать слабые бот-события, вам нужно иметь следующее:
@Controller(events = {EventType.DIRECT_MENTION, EventType.DIRECT_MESSAGE})
public void onReceiveDM(WebSocketSession session, Event event) {
if (event.getText().contains("hi")) {
reply(session, event, new Message("Hi, I am " + slackService.getCurrentUser().getName()));
}
}
Здесь вы делаете аннотацию метода с аннотацией @Controller и передаете массив событий той аннотации, которую вы хотите прослушать. По умолчанию ваш контроллер будет прослушивать EventType.MESSAGE
события, если вы не укажете явные события.
Вы также можете добавить регулярные выражения к аннотации @Controller, например:
@Controller(events = EventType.MESSAGE, pattern = "([a-zA-Z ]{1,})(\\d+)([a-zA-Z ]{1,})")
public void onReceiveMessage(WebSocketSession session, Event event, Matcher matcher) {
reply(session, event, new Message("First group: " + matcher.group(0) + "\n" +
"Second group: " + matcher.group(1) + "\n" +
"Third group: " + matcher.group(2) + "\n" +
"Fourth group: " + matcher.group(3)));
}
При желании вы можете использовать matcher
в качестве формального параметра в методе, если хотите работать со значениями, отправленными пользователем. Но следите за порядком параметров, как показано выше.
Отправка сообщений
В ботах вы можете использовать reply()
метод, определенный в классе ботов , для отправки сообщений в Slack. Вам просто нужно установить текст, который вы хотите отправить в сообщении, и все остальное будет заботиться BotKit. Но вы можете установить другие поля, если хотите, например, id
в сообщении.
Вот пример:
@Controller(events = EventType.MESSAGE)
public void onReceiveMessage(WebSocketSession session, Event event) {
reply(session, event, new Message("Hi, this is a message!"));
}
Под капотом отправленное сообщение — не что иное, как json, как показано ниже:
{
"id": 1,
"type": "message",
"channel": "C024BE91L",
"text": "Hi, this is a message!"
}
ПРИМЕЧАНИЕ. Event , Message и RichMessage являются общими классами. Не всегда все атрибуты, присутствующие в них, будут иметь значения. Другими словами, Slack отправляет разные ответы на разные события .
Диалоги
Это самая замечательная особенность BotKit — с этим вы можете буквально поговорить со своим ботом и поговорить. Ниже приведен пример того, как ваш бот назначает встречу для вашей команды, задавая простые вопросы один за другим.
/**
* Conversation feature of Botkit. This method is the starting point of the conversation (as it
* calls {@link Bot#startConversation(Event, String)} within it. You can chain methods which will be invoked
* one after the other leading to a conversation. You can chain methods with {@link Controller#next()} by
* specifying the method name to chain with.
*
* @param session
* @param event
*/
@Controller(pattern = "(setup meeting)", next = "confirmTiming")
public void setupMeeting(WebSocketSession session, Event event) {
startConversation(event, "confirmTiming"); // start conversation
reply(session, event, new Message("Cool! At what time (ex. 15:30) do you want me to set up the meeting?"));
}
Вы можете начать разговор, позвонив startConversation(event, nextMethodName)
в свой контроллер. Вы можете передать событие и имя следующего метода контроллера.
/**
* This method is chained with {@link SlackBot#setupMeeting(WebSocketSession, Event)}.
*
* @param session
* @param event
*/
@Controller(next = "askTimeForMeeting")
public void confirmTiming(WebSocketSession session, Event event) {
reply(session, event, new Message("Your meeting is set at " + event.getText() +
". Would you like to repeat it tomorrow?"));
nextConversation(event); // jump to next question in conversation
}
This is your next method in the conversation. After your desired work is done, do not forget to call nextConversation(event)
to jump to the next method. You can specify the next method to call in next attribute of the Controller annotation.
/**
* This method is chained with {@link SlackBot#confirmTiming(WebSocketSession, Event)}.
*
* @param session
* @param event
*/
@Controller(next = "askWhetherToRepeat")
public void askTimeForMeeting(WebSocketSession session, Event event) {
if (event.getText().contains("yes")) {
reply(session, event, new Message("Okay. Would you like me to set a reminder for you?"));
nextConversation(event); // jump to next question in conversation
} else {
reply(session, event, new Message("No problem. You can always schedule one with 'setup meeting' command."));
stopConversation(event); // stop conversation only if user says no
}
}
/**
* This method is chained with {@link SlackBot#askTimeForMeeting(WebSocketSession, Event)}.
*
* @param session
* @param event
*/
@Controller
public void askWhetherToRepeat(WebSocketSession session, Event event) {
if (event.getText().contains("yes")) {
reply(session, event, new Message("Great! I will remind you tomorrow before the meeting."));
} else {
reply(session, event, new Message("Oh! my boss is smart enough to remind himself :)"));
}
stopConversation(event); // stop conversation
}
To end the conversation, call stopConversation(event)
inside your controller method.
NOTE:
- Only the first method in a conversation can define a
pattern
. Apattern
attribute in theController
annotation has no effect for rest of the methods in a conversation. - The first method in the conversation doesn’t need to call
nextConversation(event)
, but the rest of the methods do need to.
Deploy to the Cloud
BotKit is Heroku-ready. To deploy, you need to perform the below simple steps:
- Clone this project
$ git clone [email protected]:ramswaroop/jbot.git
and$ cd jbot/jbot-example
. - Get your Slack bot token or slash command token or incoming webhook URL.
- Paste the above tokens/URLs in the application.properties file.
- Download Toolbelt for your system.
$ heroku login
— Log into Heroku.$ heroku create
— Create an app on Heroku.$ git push heroku master
— Push your code to Heroku.$ heroku ps:scale web=1
— Start your application.
This is just the tip of the iceberg. To explore/contribute/complain/donate, please visit JBot on GitHub or view the latest documentation on my blog.