QudBot: Справочник слотов
Типы слотов
Все данные хранятся в слотах, которые являются парами ключ-значение. Ключ - это имя слота. Его значение может иметь различные типы:
- int - целое число;
- float - вещественное число с плавающей точкой;
- str - строка;
- bool - логическое значение;
- list - список (массив);
- dict - словарь, состоящий из ключей и значений;
- categorical - множество заранее заданных значений;
- email - адрес электронной почты;
- http - web-адрес;
- phone - номер телефона;
- date - дата;
- time - время;
Слоты объявляются в разделе slots (он находится на корневом уровне файла проекта, там же, где и раздел states). У каждого слота обязательно надо указывать его тип (type) и можно, при необходимости, начальное значение (value):
slots: NAME: type: str # тип слота строка COUNT: type: int # тип - целое число value: 5 # начальное значениеЕсли value не указан, то для str это будет пустая строка "", для int, float - 0, в для list пустой список [].
В результате работы (например, при попытке вытащить из строки ввода информацию), значение слота может оказаться равным None (не определено). Это можно использовать в условных операторах (if: $NAME == None).
Предопределённые слоты
Предопределённые слоты:
CURRENT_STATE | (type: str) | - имя текущего состояния |
LANGUAGE | (type: str) | - имя текущего языка |
INPUT_VALUE | (type: str) | - текст из последнего ввода в строке input |
BUTTON_ID | (type: int) | - номер последней нажатой кнопки (с единицы) |
BUTTON_NAME | (type: str) | - надпись на последней нажатой кнопке |
NLU_INTENT | (type: str) | - последнее распознанное намерение |
USER_ID | (type: str) | - идентификатор пользователя бота |
FRIENDS_ID | (type: list) | - список друзей (от которых можно принимать сообщения) |
MESSAGES | (type: list) | - список сообщений |
Категориальные слоты
Значением категориального слота (categorical) является один из определённых в разделе values ключей:
slots: ITEM: type: categorical value: Milk # начальное значение values: # возможнные значения: Milk: Молоко Wine: ru: Вино en: WineТакой слот внутри состояния задаётся обычным образом: slots: { ITEM: Milk }. Для получения значения в текстах можно использовать знак доллара: "Это $ITEM", где на место $ITEM будет подставлено текущее значение value. Можно также обратиться к конкретному значению (не зависимо от текущего value), используя точку между именем слота и именем его возможного значения: "Это $ITEM.Milk". Таким образом можно создавать строковые ресурсы для мультиязычных интерфейсов.
В слотах строкового типа также можно использовать несколько языков.
Слоты типа dict
К значениям ключей слотов типа dict можно обращаться аналогично категориальным слотам через точку. Но теперь возможно не только чтение, но и запись значений и они могут быть любого элементарного типа.
slots: DICT: type: dict value: { I: 5, F: 7.5, S: "string" }Значение DICT, выглядит объектом (в фигурных скобках), а значение $DICT.I даёт значение ключа I:
# SCR_MAIN: - text: "$DICT" # {'I': 5, 'F': 7.5, 'S': 'string'} - text: "$DICT.I, $DICT.F, $DICT.S" # 5, 7.5, stringАналогично, при помощи slots, устанавливаются значения:
# - slots: # сеттеры (установить значения ключей) DICT.I: 1 DICT.F: "2**4" DICT.S: "Маша {round(1/3, 3)}" - text: "$DICT.I, $DICT.F, $DICT.S" # 1, 16, Маша 0.333Если устанавливаемое значение является строкой, результат зависит от типа предыдущего значения. Так как DICT.F был вещественным, строка "2**4" вычисляется и результат будет снова вещественным числом. Значение DICT.S было строкой и строкой останется (в фигурных скобках произойдут вычисления).
Слот dict можно также поменять "налету":
# - slots: DICT: { A: 1, B: 2} - text: "$DICT" # {'A': 1, 'B': 2}
Получение объектов из списка
Пусть есть список, элементы которого являются объектами (пары ключ-значение). Например:
slots: LIST: type: list value: - { X: 1, Y: 3} - { X: 2, Y: 2} - { X: 3, Y: 1}При помощи действия ACTION_LIST_GET_ITEM можно записать некоторый элемент списка в слот типа dict:
# - action: ACTION_LIST_GET_ITEM # получить объект из списка list: LIST index: 2 # элемент под номер 2 (с единицы) slots: { DICT } - text: $DICT # {'X': 2, 'Y': 2}Обратим внимание, что в аргументе slots приведено только имя слота DICT без значения ключа элемента списка. Это означает, что в него нужно записать второй элемент списка целиком как объект. С этим объектом можно далее работать:
# - slots: DICT.X: 137 # поменяет и значение в спискеЧтобы эти изменения сказались на списке, необходимо вызвать ACTION_LIST_GET_ITEM:
# - action: ACTION_LIST_SET_ITEM # записать объект в список list: LIST index: 2 # элемент под номер 2 (с единицы) slots: { DICT }Теперь во втором элементе списка ключ X будет иметь значение 137.
Аналогично можно записать элемент списка в слот DICT по условию:
# - action: ACTION_LIST_GET_ITEM list: LIST equal: { Y: 1} # ключ Y элемента списка должен быть равен 1 slots: { DICT } - text: "$DICT" # {'X': 3, 'Y': 1}