Перейти к содержанию

Как управлять состоянием и сценами#

Установка#

Перед началом необходимо установить библиотеку и инициировать бота, подробно этот процесс описан здесь: Как импортировать библиотеку и инициировать своего бота.

Как управлять состоянием пользователя#

По умолчанию в данной библиотеке состояние хранится в карте типа 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