Exemple #1
0
    def test_image(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<image>http://servusai.com/aiml.png</image>")

        self.assertEquals(mock_console._response, '<img src="http://servusai.com/aiml.png" />')
Exemple #2
0
    def test_delay(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<delay><seconds>0</seconds></delay>")

        self.assertEquals(mock_console._response, '<div class="delay">...</div>')
Exemple #3
0
    def test_postback_button(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<button><text>Hello</text><postback>HELLO</postback></button>")

        self.assertEquals(mock_console._response, '<a class="postback" postback="HELLO" href="#">Hello</a>')
Exemple #4
0
    def test_link(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<link><text>Hello</text><url>http://click.me</url></link>")

        self.assertEquals(mock_console._response, '<a href="http://click.me">Hello</a>')
Exemple #5
0
    def test_create_postback_url(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        postback = renderer.create_postback_url()
        self.assertIsNotNone(postback)
        self.assertEquals(postback, "#")
Exemple #6
0
    def test_text_only(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "Hello world")

        self.assertEquals(mock_console._response, "Hello world")
Exemple #7
0
    def test_location(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<location />")

        self.assertEquals(mock_console._response, "")
Exemple #8
0
    def test_olist(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<olist><item>Item1</item><item>Item2</item></olist>")

        self.assertEquals(mock_console._response, "<ol><li>Item1</li><li>Item2</li></ol>")
Exemple #9
0
    def test_split(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<split />")

        self.assertEquals(mock_console._response, "<br />")
Exemple #10
0
    def test_carousel(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<carousel><card><image>http://servusai.com/aiml.png</image><title>Servusai</title><subtitle>Home of ProgramY</subtitle><button><text>Hello</text><url>http://click.me</url></button></card></carousel>")

        self.assertEquals(mock_console._response, '<div class="carousel"><div class="card" ><img src="http://servusai.com/aiml.png" /><h1>Servusai</h1><h2>Home of ProgramY</h2><a href="http://click.me">Hello</a></div></div>')
Exemple #11
0
    def test_reply_without_postback(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<reply><text>Hello</text></reply>")

        self.assertEquals(mock_console._response, '<a class="postback" postback="Hello" href="#">Hello</a>')
Exemple #12
0
    def test_video(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<video>http://servusai.com/aiml.mov</video>")

        self.assertEquals(mock_console._response, """<video src="http://servusai.com/aiml.mov">
Sorry, your browser doesn't support embedded videos, 
but don't worry, you can <a href="http://servusai.com/aiml.mov">download it</a>
and watch it with your favorite video player!
</video>""")
Exemple #13
0
    def test_postback_button(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render(
            "testuser",
            "<button><text>Hello</text><postback>HELLO</postback></button>")

        self.assertEquals(
            mock_console._response,
            '<a class="postback" postback="HELLO" href="#">Hello</a>')
Exemple #14
0
    def test_video(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser", "<video>http://servusai.com/aiml.mov</video>")

        self.assertEqual(mock_console._response, """<video class="programy" src="http://servusai.com/aiml.mov">
Sorry, your browser doesn't support embedded videos, 
but don't worry, you can <a href="http://servusai.com/aiml.mov">download it</a>
and watch it with your favorite video player!
</video>""")
    def test_carousel(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        texts1 = '<carousel><card><image>http://servusai.com/aiml.png</image><title>Servusai</title><subtitle>Home of ProgramY</subtitle>' + \
            '<button><text>Hello</text><url>http://click.me</url></button></card></carousel>'
        renderer.render("testuser", texts1)

        texts2 = '<div class="carousel"><div class="card" ><img src="http://servusai.com/aiml.png" /><h1>Servusai</h1>' + \
            '<h2>Home of ProgramY</h2><a href="http://click.me">Hello</a></div></div>'
        self.assertEqual(mock_console._response, texts2)
    def test_video(self):
        mock_console = MockHtmlBotClient()
        renderer = HtmlRenderer(mock_console)
        self.assertIsNotNone(renderer)

        renderer.render("testuser",
                        "<video>http://servusai.com/aiml.mov</video>")

        texts = '<video src="http://servusai.com/aiml.mov">\n' + \
            "Sorry, your browser doesn't support embedded videos, \n" + \
            "but don't worry, you can " + '<a href="http://servusai.com/aiml.mov">download it</a>\n' + \
            'and watch it with your favorite video player!\n' + \
            '</video>'
        self.assertEqual(mock_console._response, texts)
Exemple #17
0
 def get_default_renderer(self):
     return HtmlRenderer()
Exemple #18
0
 def __init__(self, argument_parser=None):
     FlaskRestBotClient.__init__(self, "WebChat", argument_parser)
     # Enter you API keys, here, alternatively store in a db or file and load at startup
     # This is an exmaple, and therefore not suitable for production
     self._api_keys = []
     self._renderer = HtmlRenderer()
Exemple #19
0
class WebChatBotClient(FlaskRestBotClient):
    def __init__(self, argument_parser=None):
        FlaskRestBotClient.__init__(self, "WebChat", argument_parser)
        # Enter you API keys, here, alternatively store in a db or file and load at startup
        # This is an exmaple, and therefore not suitable for production
        self._api_keys = []
        self._renderer = HtmlRenderer()

    def get_description(self):
        return 'ProgramY AIML2.0 Webchat Client'

    def get_client_configuration(self):
        return WebChatConfiguration()

    def is_apikey_valid(self, apikey):
        return bool(apikey in self._api_keys)

    def get_api_key(self, request):
        if 'api_key' in request.args:
            return request.args['api_key']
        return None

    def unauthorised_access_response(self, error_code=401):
        return make_response(jsonify({'error': 'Unauthorized access'}),
                             error_code)

    def check_api_key(self, request):
        if self.configuration.client_configuration.use_api_keys is True:
            api_key = self.get_api_key(request)
            if api_key is None:
                YLogger.error(
                    self, "Unauthorised access - api required but missing")
                return self.unauthorised_access_response()

            if self.is_apikey_valid(api_key) is False:
                YLogger.error(self, "'Unauthorised access - invalid api key")
                return self.unauthorised_access_response()

        return None

    def get_question(self, request):
        if 'question' in request.args:
            return request.args['question']
        return None

    def get_userid(self, request):
        userid = request.cookies.get(
            self.configuration.client_configuration.cookie_id)
        if userid is None:
            userid = str(uuid.uuid4().hex)
            YLogger.debug(self, "Setting userid cookie to :%s" % userid)
        else:
            YLogger.debug(self, "Found userid cookie : %s" % userid)
        return userid

    def get_userid_cookie_expirary_date(self, duration):
        expire_date = datetime.datetime.now()
        expire_date = expire_date + datetime.timedelta(days=duration)
        return expire_date

    def create_success_response_data(self, question, answer):
        return {"question": question, "answer": answer}

    def get_default_response(self, client_context):
        return client_context.bot.default_response

    def create_error_response_data(self, client_context, question, error):
        return {
            "question": question,
            "answer": self.get_default_response(client_context),
            "error": error
        }

    def create_response(self, response_data, userid, userid_expire_date):
        response = jsonify({'response': response_data})
        response.set_cookie(self.configuration.client_configuration.cookie_id,
                            userid,
                            expires=userid_expire_date)
        return response

    def get_answer(self, client_context, question):
        if question == 'YINITIALQUESTION':
            answer = client_context.bot.get_initial_question(client_context)
        else:
            answer = client_context.bot.ask_question(client_context,
                                                     question,
                                                     responselogger=self)
        return answer

    def receive_message(self, request):

        api_key_response = self.check_api_key(request)
        if api_key_response is not None:
            return api_key_response

        question = self.get_question(request)
        if question is None:
            YLogger.error(self, "'question' missing from request")
            abort(400)

        userid = self.get_userid(request)

        userid_expire_date = self.get_userid_cookie_expirary_date(
            self.configuration.client_configuration.cookie_expires)

        client_context = self.create_client_context(userid)
        try:
            answer = self.get_answer(client_context, question)
            rendered = self._renderer.render(client_context, answer)
            response_data = self.create_success_response_data(
                question, rendered)

        except Exception as excep:
            YLogger.exception(self, excep)
            response_data = self.create_error_response_data(
                client_context, question, str(excep))

        return self.create_response(response_data, userid, userid_expire_date)

    def get_rest_question(self, rest_request):
        if 'question' not in rest_request.args or rest_request.args[
                'question'] is None:
            YLogger.error(self, "'question' missing from request")
            abort(400)
        return rest_request.args['question']

    def get_rest_userid(self, rest_request):
        if 'userid' not in rest_request.args or rest_request.args[
                'userid'] is None:
            YLogger.error(self, "'userid' missing from request")
            abort(400)
        return rest_request.args['userid']

    def dump_request(self, request):
        if request.method == 'POST':
            YLogger.debug(self, str(request))
        elif request.method == 'GET':
            YLogger.debug(self, str(request))
        else:
            YLogger.debug(
                self,
                "restsclient.dump_request(), only GET and POST supported!")

    def process_rest_request(self, request):
        question = "Unknown"
        userid = "Unknown"
        try:
            response, status = self.verify_api_key_usage(request)
            if response is not None:
                return response, status

            question = self.get_rest_question(request)
            userid = self.get_rest_userid(request)

            answer = self.ask_question(userid, question)

            return self.format_success_response(userid, question, answer), 200

        except Exception as excep:

            return self.format_error_response(userid, question,
                                              str(excep)), 500

    def response_rest_message(self, request):
        response_data, status = self.process_rest_request(request)
        if self.configuration.client_configuration.debug is True:
            self.dump_request(request)
            YLogger.debug(
                self, "restclient response data:{}".format({
                    'response': response_data,
                    'status': status
                }))

        return make_response(
            jsonify({
                'response': response_data,
                'status': status
            }))
Exemple #20
0
 def get_default_renderer(self, callback=True):
     return HtmlRenderer()