QuBot: Справочник действий
Действия
Имена всех встроенных действий начинаются с префикса ACTION_. Действие, кроме обязательно поля action: ACTION_NAME, может иметь входные аргументы (некоторые из них обязательны, а некоторые - нет). Кроме этого action может иметь раздел result, где перечисляются возможные результаты его работы, в которых указывается, что необходимо сделать (задать слоты, вывести текст, кнопки и т.п.)
Действия со списками
✒ ACTION_LIST_LENGTH - в аргумент slots записывает длину списка list. Аргумент slots - это объект, состоящий из одного ключа - имени слота типа int, в который помещается длина списка:
STATE: - action: ACTION_LIST_LENGTH list: ORDER slots: { LEN_ORDER } # В слоте LEN_ORDER будет длина спискаДлину списка можно также получить в выражениях следуюшим образом: "{len($ORDER)} элементов".
✒ ACTION_LIST_ADD_ITEM - добавить в список list новый элемент item (оба аргумента обязательные):
STATE: - action: ACTION_LIST_ADD_ITEM list: ORDER # имя слота, содержащего список item: { _ITEM: $ITEM, _AMOUNT: $AMOUNT, _PRICE: $PRICE } # элемент списка объект - action: ACTION_LIST_ADD_ITEM list: ITEMS # имя слота, содержащего список item: "Молоко" # элемент списка - строкаЕсли элементами списка являются объекты (первый пример), то ключи item - это ключи элемента списка, а значения - их значения. Имена ключей могут быть любыми и пересекаться с именами слотов, но лучше этого не делать, используя для ключей элемента, например, символ подчёркивания. Если в данный момент слоты имеют значения: ITEM: "Вино", AMOUNT: 5, PRICE: 200, то в список слота ORDER добавится элемент:
{"_ITEM": "Вино", "_AMOUNT": 5, "_PRICE": 200}
Есть ещё два необязательных аргумента equal и total:
- equal - объект со списком ключей (без значений). Если все они совпадают с ключами в элементе списка и имеют тоже значение, что и в item, то происходит агрегирование, т.е. новый элемент item не добавляется в список, а его слоты, перечисленные в total, прибавляются к существующим значениям.
- total - какие ключи в списке необходимо агрегировать (увеличивать).
STATE: - action: ACTION_LIST_ADD_ITEM list: ORDER item: { _ITEM: "Молоко", _AMOUNT: 1, _PRICE: 10 } equal: { _ITEM, _PRICE } total: { _AMOUNT }
✒ ACTION_LIST_CLEAR - очистит список list. В обязательном аргументе list значением выступает имя слота, который содержит список:
STATE: - action: ACTION_LIST_CLEAR list: ORDER
Можно очистить не все элементы списка, а только те, которые удовлетворяют некоторым условиям. Для этого служат необязательные аргументы bool и equal. Например, следующий вызов удалит все элементы (которые являются объектами), если ключ _PRICE элемента меньше 10:
STATE: - action: ACTION_LIST_CLEAR list: ORDER bool: $_PRICE < 10Аналогично можно удалить все элементы по значению их ключей:
STATE: - action: ACTION_LIST_CLEAR list: ORDER equal: { _PRICE: 10, _COUNT: 3 }Удалятся все элементы в которых _PRICE == 10 и _COUNT == 3. Аргументы bool и equal можно использовать совместно.
✒ ACTION_LIST_LOAD - загрузить список list из файла с именем file (оба аргумента обязательные):
STATE: - action: ACTION_LIST_LOAD list: ORDER # слот типа list в который помещается файл file: "menu.csv" # путь к файлу относительно корня проектаДопустимы yml-файлы (состоящие из списка объектов) и csv-файлы (таблицы) в которых первой строкой должны идти названия ключей, разделённые точкой с запятой (;). Следующие строчки - это значения элементов списка, соответствующие ключам из первой строки (они тоже разделяются точкой с запятой).
✒ ACTION_LIST_REMOVE_ITEM - удалить из списка list элемент или уменьшить значения его ключей. Возможно два несовместные способа удаления. Если задан аргумент index, то удаляется элемент под этим номером (нумерация начинается с 1):
STATE: - action: ACTION_LIST_REMOVE_ITEM list: ORDER # слот типа list в котором удаляем index: 3 # удалить элемент под номером 3
Во втором способе, вместо index передаются два аргумента equal и dec. В equal находятся ключи и значения, которые должны совпасть с аналогичными в элементах списка. В аргумента dec перечисляются ключи элементов списка, и значение на которое их необходимо уменьшить. Если результат вычитания меньше или равный нулю, элемент удаляется:
STATE: - action: ACTION_LIST_REMOVE_ITEM list: ORDER equal: { _ITEM: "Wine"} # если в элементе ест ключ _ITEM со значением "Wine" dec: { _AMOUNT: 2 } # уменьшить _AMOUNT на 2, если он стал 0 - удалить элемент.Если аргумента dec нет, то при совпадении "фильтра" equal, данный элемент сразу удаляется.
✒ ACTION_LIST_SHOW - вывести элементы списка. Аргументы списка:
- list - имя слота, хранящего список;
- page - номер страницы, начиная с которой, надо вывести count элементов (по умолчанию 1);
- count - число элементов на странице (по умолчанию - длина списка).
- empty - содержит визуальный контент, который надо вывести, если список пуст;
- head - содержит визуальный контент, предшествующий списку;
- item - содержит визуальный контент для каждого элемента;
- tail - содержит визуальный контент, следующий за списком;
CUISINE_MENU_STATE: - action: ACTION_LIST_SHOW list: MENU_LIST page: PAGE count: 1 result: empty: - text: "Вы пока ничего не заказали" item: - text: $_NAME - image: $_IMAGE caption: $_DESCR tail: - text: "Вы заказали на $TOT_AMOUNT."В качестве значения $_NAME может быть либо ключи элемента списка, либо глобальные слоты из раздела slots. При подстановке значения, сначала проверяются ключи элемента, а если таких ключей нет, идёт поиск в слотах. Если ни где такой ключ не найден, будет подставлено значение None.
У действия могут быть также необязательные аргументы:
- equal - список ключей и их значений которые должны быть в элементе;
- bool - логическое условие при выполнении которого элемент будет показан;
✒ ACTION_LIST_TOTAL - вычисляет сумму значений по элементам списка. Имеет следующие аргументы:
- list -имя слота, хранящего список;
- total - слоты, в которые необходимо получить результаты вычислений;
- equal - список ключей и их значений которые должны быть в элементе;
- bool - логическое условие при выполнении которого элемент будет показан;
- action: ACTION_LIST_TOTAL list: ORDER total: { TOTAL_SUM: $_AMOUNT * $_PRICE }В слот TOTAL_SUM будет записана сумма произведений значений ключей _AMOUNT и _PRICE по всем элементам списка. При помощи логических условий equal и/или bool можно фильтровать только нужные элементы списка.
✒ ACTION_LIST_EXTRACT - извлечь из списка src в список des элементы, удовлетворяющие условиям equal и/или bool. В необязательный аргумент slots будет записана длина результирующего списка:
- action: ACTION_LIST_EXTRACT src: LIST1 des: LIST2 bool: $_PRICE > 10 slots: { LIST2_COUNT }
✒ ACTION_LIST_GET_ITEM - получить элемент списка.
- list - имя слота, хранящего список;
- index - номер элемента списка (с единицы)
- equal - список ключей и их значений которые должны быть в элементе;
- bool - логическое условие при выполнении которого элемент будет возвращён;
- slots - какие слоты надо заполнить
- action: ACTION_LIST_GET_ITEM list: ORDER index: 5 slots: { PRICE: $_PRICE, AMOUNT: $_AMOUNT }Можно возвращать целиком элемент списка в объект типа dict (см. примеры в Справочнике слотов).
✒ ACTION_LIST_SET_ITEM - установить значение элемента списка.
- list - имя слота, хранящего список;
- index - номер элемента списка (с единицы)
- equal - список ключей и их значений которые должны быть в элементе;
- bool - логическое условие при выполнении которого элемент будет возвращён;
- slots - какие слоты надо изменить
- action: ACTION_LIST_SET_ITEM list: ORDER index: 1 slots: { _AMOUNT: $AMOUNT }
✒ ACTION_LIST_EMPTY - проверяет является ли список list пустым. В блоке return возвращает два значения: true (пустой список) false (если список пустой):
- action: ACTION_LIST_EMPTY list: ORDER result: true: - text: Пустой список false: - text: Не пустой списокПод этими значениями может стоять список с любыми объектами состояния. Пустоту списка можно также проверить в условных объектах if как len($ORDER) == 0.
Прочие действия
✒ ACTION_MESSAGE_SEND - посылка сообщений между двумя ботами или пользователями внутри обного бота. Детали в "Общение ботов".