This document explains how to install WebRTC Kite Chatbot

Created: February 2021

Updated: September 2022

Permalink: https://wildix.atlassian.net/wiki/x/lQLOAQ

Min. WMS version: WMS 5.02

Description

Wildix WebRTC Kite bot SDK is a sample bot. Web developers can work on it to customize it to different scenarios. 

The current implementation can be used out of the box for the following use cases:

Web developers can extend the behavior of the bot to use it in more complicated scenarios, for example, provide predefined options to the WebRTC Kite users from which they can choose, etc.

Web developers can find all the necessary information here: https://github.com/Wildix/kite-xmpp-bot 

This document explains the expected behavior and use cases of the basic implementation (out of the box) and the information on how to install the SDK.

Video Tutorial


https://fast.wistia.com/embed/medias/rvg6pk883k


<script src="https://fast.wistia.com/embed/medias/rvg6pk883k.jsonp" async></script><script src="https://fast.wistia.com/assets/external/E-v1.js" async></script><span class="wistia_embed wistia_async_rvg6pk883k popover=true popoverAnimateThumbnail=true" style="display:inline-block;height:315px;position:relative;width:560px"> </span>


Current implementation

The sample bot has the following behavior:

Prerequisites

WMS configuration

  1. Create a new user for the chatbot with extension 777999 (the extension is fixed, do not modify it) and assign it a Business license. 
  2. Add this user to one or more call groups used for WebRTC Kite

Installation 

  1. Download (and unzip) the SDK from https://github.com/Wildix/kite-xmpp-bot 

    Note: The files should be loaded on a separate server. 


  2. Run the following command from the Terminal/ Command Prompt to install all the required libraries in the file: 

    cd kite-xmpp-bot-master
    npm install


  3. Edit config parameters in the file wbot/app/config.js:

  4. Run the bot using the command: 

    cd app
    node index.js


Customize the behavior of the chatbox 

To customize the behavior of the chatbot, you need to work on the following files in the SDK:

Responder public methods (app/responders/responder.js): 

Practical example

Below you can find an example of chatbox behavior customization.

The simple example provided below serves to help you understand better the different customization scenarios. To customize the behavior of the chatbot you need web developer/ JavaScript knowledge.


Expected behavior:

During working hours, the chatbot should propose options: "Dear username, type "events" to learn about our upcoming events, or type "address" to get our physical address". In case the user types "events", the bot should reply with the list of upcoming events. In case the user types "address", the bot should send the physical address. In case the user types something else, the bot should respond "Sorry, I did not understand you".

Realization:

  1. Modify the content of the file workinghours.txt located in app/responders/staticfiles (e.g.: Type "events" for the information about upcoming events. Type "address" to know our physical address.)
  2. Add the needed static *.txt files to app/responders/staticfiles. These files will be used as responses in case user types "events" or "address" (e.g. events.txt: Here are our upcoming events: Summit 2022; address.txt: Our address is...)
  3. Add address and events with the path to these newly created files to the config.js file located in the app directory
  4. Modify the responder.js file located in the same directory. To realize the scenario described above you need to work on the "say(id, message)" method. Here is an example of the modified file:
'use strict';

const fs = require('fs');

class Responder {

    constructor(config) {
        this._workinghours = config.workinghours;
        this._nonworkinghours = config.nonworkinghours;
        this._address = config.address;
        this._events = config.events;
    }

    hello(id, userdata) {
        return this._processHello(userdata);
    }

    say(id, message) {
        return this._processSay(message);
    }

    bye(id) {
    }

    _processHello(userdata) {
        const filename = this._workingHours() ? this._workinghours : this._nonworkinghours;
        const content = fs.readFileSync(filename).toString();
        return this._processTemplate(userdata, content);
    }
    
    _processSay(message) {
        const address = this._address;
        const events = this._events;
        let content;

        if (message == 'address') {
        content = fs.readFileSync(address).toString();
        }
       
        else if (message == 'events') {
        content = fs.readFileSync(events).toString();
        }

        else {
        content = "sorry, I did not understand you";
        }

        return content;
        }

    _processTemplate(userdata, content) {
        let result = content.replace(/\$username/g, userdata.name);
        if(userdata.email) {
        result = result.replace(/\$useremail/g, userdata.email);
        }
        return result;
    }

    _workingHours() {
        const now = new Date();
        const day = now.getDay();
        const hour = now.getHours();
        return (day < 6) && (hour > 8 && hour < 19);
    }

}

module.exports = Responder;