QudBot: Справочник слотов


Типы слотов

Все данные хранятся в слотах, которые являются парами ключ-значение. Ключ - это имя слота. Его значение может иметь различные типы:

Слоты объявляются в разделе slots (он находится на корневом уровне файла проекта, там же, где и раздел states). У каждого слота обязательно надо указывать его тип (type) и можно, при необходимости, начальное значение (value):

slots:
    NAME: 
        type:  str                # тип слота строка
        
    COUNT:
        type:  int                # тип - целое число
        value: 5                  # начальное значение
Если value не указан, то для str это будет пустая строка "", для int, float - 0, в для list пустой список [].

В результате работы (например, при попытке вытащить из строки ввода информацию), значение слота может оказаться равным None (не определено). Это можно использовать в условных операторах (if: $NAME == None).


Предопределённые слоты

Предопределённые слоты:


Категориальные слоты

Значением категориального слота (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}