Как управлять состоянием и сценами#
Установка#
Перед началом необходимо установить библиотеку и инициировать бота, подробно этот процесс описан здесь: Как импортировать библиотеку и инициировать своего бота.
Как управлять состоянием пользователя#
По умолчанию в данной библиотеке состояние хранится в карте типа map[string]interface{}{}
. В качестве ключа может быть любая строка в качестве значения, любой объект. Идентификатором состояния является идентификатор чата, то есть у каждого чата будет отдельное состояние. Чтобы управлять состоянием, нужно использовать методы структуры Notification
:
Метод | Описание |
---|---|
ActivateNextScene() | Активирует выбранную сцену. |
GetCurrentScene() | Возвращает текущую сцену. |
GetStateData() | Возвращает данные состояния выбранного чата. |
SetStateData() | Заменяет данные состояния выбранного чата. |
UpdateStateData() | Обновляет данные состояния выбранного чата. |
Вебхуки типа incomingBlock, deviceInfo, stateInstanceChanged не привязаны к чату, поэтому не имеют собственного состояния.
Если вы хотите взаимодействовать с состояниями других чатов, отличных от чата обрабатываемого вебхука, вы можете использовать методы структуры
StateManager
напрямую. МетодыStateManager
делают тоже что и методы структурыNotification
, но они ожидают дополнительный параметрstateId
.
В качестве примера был создан простой бот для имитации регистрации пользователя.
Ссылка на пример: state.go.
package state
import (
"github.com/green-api/whatsapp_chatbot_golang"
)
type StartScene struct {
}
func (s StartScene) Start(bot *whatsapp_chatbot_golang.Bot) {
bot.IncomingMessageHandler(func(notification *whatsapp_chatbot_golang.Notification) {
if notification.Filter(map[string][]string{"text": {"/start"}}) {
notification.AnswerWithText("Привет! Этот бот - пример использования состояния.\nПожалуйста введите логин:")
notification.ActivateNextScene(LoginScene{})
} else {
notification.AnswerWithText("Пожалуйста введите команду /start.")
}
})
}
type LoginScene struct {
}
func (s LoginScene) Start(bot *whatsapp_chatbot_golang.Bot) {
bot.IncomingMessageHandler(func(notification *whatsapp_chatbot_golang.Notification) {
login, err := notification.Text()
if err != nil || len(login) > 12 || len(login) < 6 {
notification.AnswerWithText("Выберите логин от 6 до 12 символов!")
} else {
notification.UpdateStateData(map[string]interface{}{"login": login})
notification.ActivateNextScene(PasswordScene{})
notification.AnswerWithText("Ваш логин " + notification.GetStateData()["login"].(string) + " - успешно сохранен.\nПридумайте пароль:")
}
})
}
type PasswordScene struct {
}
func (s PasswordScene) Start(bot *whatsapp_chatbot_golang.Bot) {
bot.IncomingMessageHandler(func(notification *whatsapp_chatbot_golang.Notification) {
password, err := notification.Text()
if err != nil || len(password) > 16 || len(password) < 8 {
notification.AnswerWithText("Выберите пароль от 8 до 16 символов!")
} else {
notification.UpdateStateData(map[string]interface{}{"password": password})
notification.ActivateNextScene(StartScene{})
notification.AnswerWithText("Успех! Ваш логин: " + notification.GetStateData()["login"].(string) + "\nВаш пароль: " + notification.GetStateData()["password"].(string))
}
})
}
Если вам нужно чтобы при создании нового состояния, оно уже имело некоторые дефолтные значения, необходимо изменить поле InitData
у структуры StateManager
. В стандартной имплементации MapStateManager
это делается так:
package main
import (
"github.com/green-api/whatsapp_chatbot_golang"
"github.com/green-api/whatsapp_chatbot_golang/examples/full"
)
func main() {
bot := whatsapp_chatbot_golang.NewBot("INSTANCE_ID", "TOKEN")
bot.StateManager = whatsapp_chatbot_golang.NewMapStateManager(
map[string]interface{}{
"defaultField1": "defaultValue1",
"defaultField2": "defaultValue2",
"defaultField3": "defaultValue3",
})
bot.SetStartScene(full.StartScene{})
bot.StartReceivingNotifications()
}
Список примеров#
Описание | Ссылка на пример |
---|---|
Как инициализировать обработчик | base.go |
Как инициализировать сцену | baseScene.go |
Сцена "Эхо" | echo.go |
Как получать другие типы уведомлений | event.go |
Как фильтровать входящие сообщения | filter.go |
Как работать с состоянием бота | state.go |
Пример готового чат бота | full.go |