Skip to content

Instantly share code, notes, and snippets.

@lazychaser
Last active March 14, 2017 12:08
Show Gist options
  • Save lazychaser/9e97e0d15bace0a9c69b4040cf208010 to your computer and use it in GitHub Desktop.
Save lazychaser/9e97e0d15bace0a9c69b4040cf208010 to your computer and use it in GitHub Desktop.

Бот состоит из шагов и переменных. Когда нужно активировать бота для конкретного номера, начинается сессия.

Переменные

Переменные передаются во время создания сессии и закрепляются за ней. Их можно изменять во время работы сессии. Переменные можно подставлять в сообщения (см. описание шагов). На данном этапе доступны две переменные: minPrice и maxPrice.

Шаги

Шаги -- это действия. На каждом шаге можно отправить сообщение, задать возможные ответы на сообщения, задать таймеры.

Шаг является финальным, если у него нет сообщений и таймеров. При переходе на финальный шаг, сессия завершается. Если при этом шаг целевой, то на почту отправляется уведомление с данными по объявлению.

В скрипте обязателен шаг start -- это начальный шаг.

Сообщения

Шаг может отправлять сообщения. В шаге указывается либо одно сообщение, либо несколько. Если указано несколько сообщений, то продавцу будет отправляться случайное.

В сообщении можно подставлять переменные сессии, а также стандартные подстановки, которые работают для кампаний.

Пример: Могу вупить ваш [model] за $minPrice, договоримся?. Здесь $minPrice -- это переменная minPrice, а [model] -- это стандартная подстановка.

Ответы

Если задано сообщение, то можно задать список возможных ответов. Ответ -- это условие перехода на другой шаг. Список возможных ответов приходит на почту, когда продавец отвечает на наше сообщение.

Ответ может быть распознаваемым и статическим.

Распознаваемый ответ может быть автоматически распознан по специальному алгоритму. Статический ответ можно только выбрать из уведомления.

Когда выбирается какой-то тип ответа, то входящему сообщению присваивается этот тип ответа и в дальнейшем эта база может быть использована для настраивания алгоритма распознания ответов.

Для шага можно указать контекст распознавания. По-умолчанию это идентификатор шага. Можно назначить другой контекст для того случая, когда на разных шагах может быть один контекст.

Таймеры

Таймер позволяет оставаться на текущем шаге определенное время, если не было перехода через ответ. Для таймера можно указать шаг, на который нужно перейти, если таймер сработает. Если шаг не указан, то сессия завершится по истечению таймера.

Есть два таймера: таймер no_answer и wait. Первый срабатывает в том случае, если на сообщение не было ответа. Второй срабатывает в любом случае.

Если на шаге было отправлено сообщение, то таймеры отсчитываются от даты отправки сообщения, иначе от даты перехода на шаг.

Примеры таймеров:

# ждать 7 дней, после завершить
wait: 7 days

# перейти на шаг other_step, если не было ответа 1 день
no_answer:
  for: 1 day
  step: other_step

Другое

Если для шага указаны ответы, но нет таймеров, и никакой ответ не был выбран в течении одного дня, то сессия завершается.

Схема

# Переменные
variables:
  <Id>: <string> название переменной

# Шаги
steps:
  <Id>:
    title: <string> заголовок шага (смысл действия)
    
    message: <string>|<string[]> сообщение для отправки либо массив сообщений
    
    context: <Id> контекст распознавания
    
    target: <bool> указать true если шаг целевой
    
    answers:
      <Id>: <Answer>
      
    no_answer: <Time>|<Timer> таймер если не было ответов
    
    wait: <Timer> таймер основной

Типы данных:

<Id> = <string[a-z0-9_]> идентификатор

<Time> = строка времени, например 1 day или 10 hours

<Timer> = <Object> таймер с переходом на другой шаг
  *for: <Time>
  step: <Id> следующий шаг
  
<Answer> = <Object> Возможный тип ответа
  title: <string> заголовок ответа
  *type: (meaning|static) тип
  *step: <Id> следущий шаг
# Список внешних переменных
# Их можно подставлять в тексте с префиксом $, например $price
variables:
minPrice: Минимальная цена
maxPrice: Максимальная цена
# Список всех шагов
# Обязательно должен быть шаг start -- это начальный шаг
steps:
# Самое первое действие
start:
# Заголовок шага для статистики
title: Отправить смс с предложением цены
# Сообщение, которое будет отправлено
message:
- Подбираю себе [model], мой бюджет до $maxPrice Договоримся?
- Можем выкупить ваш [model] уже сегодня за $minPrice, интересно?
# Список ответов шага
answers:
# Распознан позитивный ответ
positive: # идентификатор ответа
title: Согласен # заголовок ответа
type: meaning
step: notify # следующий шаг
negative:
title: Не согласен
type: meaning
step: ask_to_think
wants_price:
title: Предлагает минимальную цену
type: meaning
step: say_max_price
sold:
title: Продано
type: meaning
step: ask_sold_price
# Это статический шаг, будет отображаться менеджеру при необходимости
# выбрать след шаг
continue:
title: Продолжить отправку сообщений
type: static
step: start_after_delay
# начать скрипт сначала если не было ответа 10 дней
# если ответ был, но действия не последовало, то сессия завершится ошибкой
# закоментировал чтобы бот не бесконечно отправлял сообщения
#no_answer:
# for: 10 days
# step: start
# Это целевой шаг, если скрипт достигает его, то отправляется уведомление
notify:
title: Отправить данные по авто
target: true # шаг является целевым
ask_sold_price:
message: За сколько продали, если не секрет?
# Подождать 1 день и завершить скрипт
wait: 1 day
ask_to_think:
title: Попросить подумать над предложением
message:
- Цену мы вам сказали, если что звоните!
- Подумайте и тогда звоните!
answers:
ready:
title: Готов продать
type: meaning
step: notify
# ждать неделю независимо от ответа (и был ли он) и закончить скрипт
wait: 1 week
# На данном этапе отправится сообщение и сессия завершится
# Так как нет обработчиков ответов и таймеров
say_max_price:
title: Озвучить свою максимальную цену
message: Могу максимум дать $maxPrice, если будет интересно, то пишите.
# Это пустой шаг и он ничего не делает, просто ждет 10 дней и начинает скрипт
# заново
start_after_delay:
title: Подождать 10 дней и начать скрипт заново
wait:
for: 10 days
step: start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment