機械翻訳について

Genesysで発信コールを行う

次のフロー図は、エージェントがFusionアプリケーションからアウトバウンド・コールを開始した後に実行される一連の操作を示しています:

次のフロー図は、エージェントがFusionアプリケーションからアウトバウンド・コールを開始した後に実行される一連の操作を示しています:

アウトバウンド・コール・フロー。

  1. エージェントが電話番号をクリックしてFusionアプリケーションからアウトバウンド・コールを開始すると、onOutgoingEventイベントが起動されます。
  2. メディア・ツールバー・アプリケーションのonOutgoingEventイベント・リスナーは、このイベントを受信し、アウトバウンド・コールを開始するようにマイクロサービスに通知します。
  3. マイクロサービスは、PSDKを使用してコールを行うためのリクエストを作成してコールを開始します。
  4. リクエストが成功すると、EventRingingイベントがGenesysから起動され、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。
  5. RequestMakeCall リクエストが成功すると、EventRingingメッセージがGenesysからマイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。
  6. EventEstablishedメッセージがメディア・ツールバー・アプリケーションによって受信されると、newCommEventアクションによってFusionアプリケーションが通知されます。
  7. Fusionアプリケーションは、newCommEventアクションの受信時にダイヤル・パネルを表示します。

エージェントはFusionアプリケーションからアウトバウンド・コールを開始

エージェントは、電話番号をクリックしてFusionアプリケーションからアウトバウンド・コールを開始し、onOutgoingEvent イベントを起動します。

ジェネシスにコールを開始するよう通知

メディア・ツールバー・アプリケーションのonOutgoingEventイベント・リスナーは、このイベントを受信し、アウトバウンド・コールを開始するようにマイクロサービスに通知します。 次の例に示すように、makeOutboundCall ファンクションを更新して、コールを開始するようにマイクロサービスに通知できます:

public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "makeCall",
            "toNumber": phoneNumber,
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }

マイクロサービスによるコール開始リクエストの作成

マイクロサービスは、PSDKを使用して、com.genesyslab.platform.voice.protocol.tserver.requests.party.RequestMakeCallリクエスト・クラスを使用してコールを行うためのリクエストを作成します。 リクエストが成功すると、EventRingingメッセージが受信され、顧客が応答すると、EventEstablishedメッセージがマイクロサービスによって受信されます。

マイクロサービスはEventRingingメッセージを受信

アウトバウンド・コールを開始するリクエストが成功すると、GenesysサーバーはEventRingingメッセージで応答し、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播します。

メディア・ツールバー・アプリケーションからnewCommEventをコール

マイクロサービスからEventRinging メッセージを受信したら、次の例に示すように、integrationEventsHandler.tsファイルの関数incomingCallHandlerを実行して、newCommEvent アクションをコールできます:

public webSocketOnMessage(event: MessageEvent): void {
        const jsonMessage = JSON.parse(event.data);
        console.log(jsonMessage);
        if (jsonMessage.eventName === "EventRegistered") {
            // Genesys notifies that the agent is ready
            this.integrationEventsHandler.makeAgentAvailable();
        } else if (jsonMessage.eventName === "EventRinging") {
            // Show incoming call notification
            this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventEstablished") {
            // Genesys notifies that the call is accepted
            this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventReleased") {
            // Genesys notifies that the call is disconnected
            this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
        }
        console.log("Message is received");
    }

Fusionアプリケーションは、ダイヤル・パネルを表示

newCommEventアクションを受信すると、Fusionアプリケーションによってダイヤル通知が表示されます。

完全なコード

アウトバウンド・コールを開始するためのvendorHandler.tsファイルの完全なコードを次に示します:

import { ICtiVendorHandler } from './ICtiVendorHandler';
import { IntegrationEventsHandler } from '../integrationEventsHandler';
 
export class VendorHandler implements ICtiVendorHandler {
    public static connectionId: string;
    private static REST_ENDPOINT_URL: string = 'http://localhost:8087/genesys/events';
    private static WS_ENDPOINT_URL: string = 'ws://localhost:8087/genesysWs';
    private integrationEventsHandler: IntegrationEventsHandler;
 
    constructor(integrationEventsHandler: IntegrationEventsHandler) {
        this.integrationEventsHandler = integrationEventsHandler;
    }
 
    public async webSocketOnOpenHandler(): Promise<void> {
        console.log("WebSocket opened");
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "initialize"
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public webSocketErrorHandler(error: any): void {
        console.log("WebSocket error", error);
    }
    public webSocketCloseHandler(event: Event): void {
        console.log("WebSocket is closed", event);
    }
 
    public webSocketOnMessage(event: MessageEvent): void {
        const jsonMessage = JSON.parse(event.data);
        console.log(jsonMessage);
        if (jsonMessage.eventName === "EventRegistered") {
            // Genesys notifies that the agent is ready
            this.integrationEventsHandler.makeAgentAvailable();
        } else if (jsonMessage.eventName === "EventRinging") {
            // Show incoming call notification
            this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventEstablished") {
            // Genesys notifies that the call is accepted
            this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventReleased") {
            // Genesys notifies that the call is disconnected
            this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
        }
        console.log("Message is received");
    }
    public async makeAgentAvailable(): Promise<void> {
        let webSocket: WebSocket = new WebSocket(`${VendorHandler.WS_ENDPOINT_URL}`);
        webSocket.onopen = this.webSocketOnOpenHandler.bind(this);
        webSocket.onmessage = this.webSocketOnMessage.bind(this);
        webSocket.onclose = this.webSocketCloseHandler.bind(this);
        webSocket.onerror = this.webSocketErrorHandler.bind(this);
    }
 
    public async makeAgentUnavailable(): Promise<void> {
        // TODO: call the vendor specific api to make the agent available
    }
    public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "makeCall",
            "toNumber": phoneNumber,
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public async acceptCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Accept",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public async rejectCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public async hangupCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
}

進捗の確認

これらのステップが終了したら、OJETサーバーを使用してアプリケーションを起動し、Fusionアプリケーションにサインインします。 メディア・ツールバーを開き、「エージェント可用性」ボタンをクリックしてエージェントをコールに使用できるようにします。 発信コールを開始するには、Fusionアプリケーションから担当者を開き、発信コールを開始する電話番号をクリックします。