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

context {
    input phone: string;
    input caller: string;
    input waiting: number;
    input about_abonent: string[];
    input about_fields: 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 abonent_name: string = "";
    output company_name: string = "";
    output phone_suffix: string = "";
    output timer: string = "";
    output max_dialog_duration: number = 120000;
    output conversation_result: 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 is_empty(check: unknown): boolean;
external function sleep_ms(duration: number): unknown;
external function json_encode(object: unknown): string;
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
    {
        $cjm.push("root");
        set $conversation_start = #getCurrentTime();
        goto caller_id;
    }
    transitions
    {
        caller_id: goto caller_id;
    }
}

block SkipMessagesBlock():boolean
{
    start node root
    {
        do
        {
            return true;
        }
    }
}
preprocessor digression timer_control // препроцессор с проверкой истечения таймера
{
    conditions
    {
        on true priority 100000;
    }    
    do
    {
       
        if(#isTimerExpired($timer)){
            set $conversation_result = "автоответчик";
            goto do_before_exit;
        
        }
        return;
    }
    transitions
    {
        do_before_exit: goto do_before_exit;

    }
}

node caller_id
{
    do
    {
        $cjm.push("caller_id");

        #connectSafe($phone);
        #waitForSpeech(1000);
        //таймер ограничения длинны рахговора
        set $timer = #startTimer($max_dialog_duration);

        // Строим приветствие, зависящее от времени суток
        var part_of_the_day_name = external part_of_the_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 = "Добрый вечер";
        }
        var after_greeting = " компания Чекбокс! Вы давно не на смены, позвольте задать несколько вопросов: Планируете ли вы с нами дальше сотрудничать?";
        // Запоминаем временной штамп перед самой первой репликой
        set $conversation_begin = #getCurrentTime();

        #sayText(abonent_greeting + after_greeting, options: {speed: 1.15});
        var result = blockcall SkipMessagesBlock();
        wait *;
    }
    transitions
    {
        yes: goto yes on #messageHasAnyIntent(["accept"]);
        no: goto no on #messageHasAnyIntent(["decline"]);
        idk: goto idk on #messageHasAnyIntent(["not_know"]);
    }
}

node yes {
    do{
        #sayText("Отлично. Скажите, пожалуйста, когда вы готовы выйти на смену?");
        wait *;
    }
    transitions
    {
        questions: goto questions on true;
    }
}

node questions
{
    do
    {
       #sayText("Остались ли у вас вопросы?");
       wait *;
    }
    transitions
    {
        end_conversation: goto end_conversation on #messageHasAnyIntent(["decline"]);
        end_conversation2: goto end_conversation2 on #messageHasAnyIntent(["accept"]); 

    }
}

node end_conversation
{
    do
    {
        $cjm.push("end_conversation");
        #say("end_conversation");
    }
    transitions
    {
        do_before_exit: goto do_before_exit on true;
    }
}
node end_conversation2
{
    do
    {
        $cjm.push("end_conversation2");
        #say("end_conversation2");
    }
    transitions
    {
        do_before_exit: goto do_before_exit on true;
    }
}

node no {
    do
    {
         #sayText("Могли бы вы уточнить причину?");
        wait *;
    }
    transitions
    {
        resume: goto resume on true;
    }
}

node resume {
      do
    {
         #sayText("Спасибо, за обратную связь. Информацию приняли. Остались у вас вопросы?");
         wait *;
    }
    transitions
    {
        end_conversation: goto end_conversation on #messageHasAnyIntent(["decline"]);
        end_conversation2: goto end_conversation2 on #messageHasAnyIntent(["accept"]); 
    }
}

node idk {
     do
    {
         #sayText("Хорошо, перезвоним вам позже");
    }
    transitions
    {
        do_before_exit: goto do_before_exit on true;
    } 
}

node do_before_exit
{
   do
    {
        $cjm.push("do_before_exit");
        set $conversation_stop = #getCurrentTime();
         exit;
    }
   transitions
     {

    }
 }

/*digression @exit_dig
{
    conditions { on true tags: onclosed; }
    do
    {
        $cjm.push("@exit_dig");
        set $conversation_status = "broken";
        goto do_before_exit;
    }
    transitions
    {
        do_before_exit: goto do_before_exit;
    }
}*/

global digression @exit_dig_global
{
    conditions { on true tags: onclosed; }
    do
    {
        $cjm.push("@exit_dig");
        set $conversation_status = "broken";
        set $conversation_stop = #getCurrentTime();
        //if($conversation_status == "broken" && $conversation_result == ""){set $conversation_result = "сбросил трубку";}
        //if($conversation_result == ""){set $conversation_result = "непредвиденное завершение";}
        exit;
    }
}