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}