main.dsl 4.04 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 = 3;
    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 = "";
}

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 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();

        #sayText(abonent_greeting, options: {speed: 1.15});
        #say("dont_understand_question");
        wait *;
    }
    transitions
    {
        end_conversation: goto end_conversation on true;
    }
    onexit
    {
        end_conversation: do
        {
            var abonent_say = #getMessageText();
            set $abonent_request = external performed_stage($abonent_request, abonent_say);
        }
    }
}

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;
    }
}