main.dsl 8.72 KB
import "commonReactions/all.dsl";

context {
    input phone: string;
    //input caller: string;

    output cjm: string[] = [];
    output need_ask_name: boolean = true;
    output template_id: number = 1;
    output conversation_start: number = 0;
    output conversation_begin: number = 0;
    output conversation_stop: number = 0;
    output conversation_status: string = "normal";
    output abonent_request: string[] = [];
    output another_phone_number: string = "";
    output phone_suffix: string = "";
}

external function numbers_from_text(text: string): string;
external function dates_from_text(text: string): string;
external function part_of_the_day(): string;
external function array_size(arr: unknown): number;
external function string_trim(one_line: string): string;
external function is_empty(check: unknown): boolean;
external function performed_stage(stages: string[], stage: string): string[];
external function sleep_ms(duration: number): unknown;
external function json_encode(object: unknown): string;
external function time_stamp(): number;
external function math_floor(value: number, presision: number|empty = 0): number;
external function math_round(value: number, presision: number|empty = 0): number;
external function math_ceil(value: number, presision: number|empty = 0): number;
external function phone_human(phone: string): string;
external function last_four(phone: string): string;
external function hours_now(): number;
external function check_mobile_code(phone: string): boolean;
external function countWords(message: string): number;

start node root
{
    do
    {
        set $cjm = external performed_stage($cjm, "root");
        set $conversation_start = external time_stamp();
        goto caller_id;
    }
    transitions
    {
        caller_id: goto caller_id;
    }
}

node caller_id
{
    do
    {
        set $cjm = external performed_stage($cjm, "caller_id");

        #connectSafe($phone);
        #waitForSpeech(1000);

        // Строим приветствие, зависящее от времени суток
        //var part_of_the_day_name = external part_of_the_day();
        var part_of_the_day_name = "day";
        var abonent_greeting = "Здравствуйте";
        if (part_of_the_day_name == "night")
        {
            set abonent_greeting = "Доброй ночи";
        }
        if (part_of_the_day_name == "morning")
        {
            set abonent_greeting = "Доброе утро";
        }
        if (part_of_the_day_name == "day")
        {
            set abonent_greeting = "Добрый день";
        }
        if (part_of_the_day_name == "evening")
        {
            set abonent_greeting = "Добрый вечер";
        }

        // Запоминаем временной штамп перед самой первой репликой
        set $conversation_begin = external time_stamp();
        #say("greeting");
        wait *;
    }
    transitions
    {
        //end_conversation: goto end_conversation on true;
        canttalkrn: goto cant_talk_rn on #messageHasAnyIntent(["decline", "cant_talk_rn"]) || #messageHasSentiment("negative");
        cantalk: goto can_talk on #messageHasAnyIntent(["accept", "can_talk"]) || #messageHasSentiment("positive");

    }
}
node helpful_pos
{
    do
    {
        //Спасибо за ваше мнение! Поздравляю! Вы были...
        #say("helpful_pos");
        wait*;
    }
    transitions
    {
        positive: goto send_it on #messageHasSentiment("positive") || #messageHasIntent("send_it");
        negative: goto dont_need on #messageHasSentiment("negative");   
    }
}

node helpful_neg //pair2
{
    do
    {
        //Подскажите, пожалуйста, что Вам не понравилось?
        #say("helpful_neg");
        wait*;
    }
    transitions
    {
        understood: goto understood on true;
    }
}

node understood //pair3
{
    do
    {
        //Поняла Вас. Мы постараемся учесть Ваши пожел
        #say("understood");
        wait*;
    }
    transitions
    {
        positive: goto send_it on #messageHasSentiment("positive") || #messageHasIntent("send_it");
        negative: goto dont_need on #messageHasSentiment("negative");
    }
}

node send_it
{
    do
    {
        //Подскажите, а на этом номере есть вотсап?
        #say("have_whatsapp");
        wait*;
    }
    transitions
    {
        positive: goto yes_whatsapp on #messageHasSentiment("positive");
        negative: goto no_whatsapp on #messageHasSentiment("negative") || #messageHasIntent("no_whatsapp");
    }
}

node dont_need
{
    do
    {
        //почему отказываетесь
        #say("why_reject");
        wait*;
    }
    transitions
    {
        negative: goto thanks_bye_2 on #messageHasSentiment("negative") || #messageHasIntent("not_interested");
    }
}

node thanks_bye_2
{
    do
    {
        //Благодарю за уделенное время. Всего доброго.
        #say("thanks_for_time_2");
        goto do_before_exit;
    }
    transitions
    {
        do_before_exit: goto do_before_exit;
    }
}

node yes_whatsapp
{
    do
    {
        //Отлично. Сейчас отправлю Вам промокод. Всего доброго до свидания.
        #say("gonna_send_code");
    }
    transitions
    {
        end_conversation: goto end_conversation;
    }
}

node no_whatsapp
{
    do
    {
        //Продиктуйте, пожалуйста данные, куда я могу отпр промокод
        #sayText("give_contacts");
        wait*;
    }
    transitions
    {
        thanks_bye: goto thanks_bye on true;
    }
        onexit
    {
        thanks_bye: do
        {
        var contact = #getMessageText();
        set $another_phone_number = external numbers_from_text(contact); 
        }
    }
}

node thanks_bye
{
    do
    {
        //Благодарю за уделенное время. Всего доброго.
        #say("thanks_bye");
        
    }
    transitions
    {
        end_conversation: goto end_conversation;
    }
}

node can_talk //могу говорить
{
    do
    {
        //вы недавно посетили вебинар...
        #say("how_helpful");
        wait*;

    }
    transitions
    {
        positive: goto helpful_pos on #messageHasSentiment("positive");
        negative: goto helpful_neg on #messageHasSentiment("negative");
        didnt_whatc: goto not_present on #messageHasIntent("ididnt_watch");
    }
}

node not_present // Давайте проведем бесплатный Зум, где вы за полчаса
{
    do
    {
        
        #say("free_zoom");
        wait*;

    }
    transitions
    {
        positive: goto zoom_positive on #messageHasSentiment("positive");
        negative: goto zoom_negitive on #messageHasSentiment("negative");
    }
}

node zoom_positive // Ожидайте звонка. Всего доброго, до свидания!
{
    do
    {
        
        #say("zoom_positive");
        goto do_before_exit;

    }
    transitions
    {
        do_before_exit: goto do_before_exit;
    }
}

node zoom_negitive // Подскажите, пожалуйста, а что Вас смущает?
{
    do
    {
        
        #say("zoom_negative");
        wait*;

    }
    transitions
    {
        retry: goto retry on true;
    }
}

node retry // За полчаса мы можем показать вам точки роста вашей карточки.
{
    do
    {
        
        #say("retry");
        wait*;

    }
    transitions
    {
        positive: goto zoom_positive on #messageHasSentiment("positive");
        negative: goto thanks_bye_2 on #messageHasSentiment("negative");
    }
}

node cant_talk_rn //не могу говорить
{
    do
    {
        //благодарю досвидания (в самом начале)
        #say("thanks_for_time");
    }
    transitions
    {
        end_conversation: goto end_conversation;
    }
}
node end_conversation
{
    do
    {
        set $cjm = external performed_stage($cjm, "end_conversation");
        #say("end_conversation");
        goto do_before_exit;
    }
    transitions
    {
        do_before_exit: goto do_before_exit;
    }
}

node do_before_exit
{
    do
    {
        set $cjm = external performed_stage($cjm, "do_before_exit");
        set $conversation_stop = external time_stamp();
        exit;
    }
    transitions
    {
    }
}

digression @exit_dig
{
    conditions { on true tags: onclosed; }
    do
    {
        set $cjm = external performed_stage($cjm, "@exit_dig");
        set $conversation_status = "broken";
        goto do_before_exit;
    }
    transitions
    {
        do_before_exit: goto do_before_exit;
    }
}