58 lines
2.1 KiB
Python
58 lines
2.1 KiB
Python
# See readme.md for instructions on running this code.
|
|
import logging
|
|
from urllib import parse
|
|
import json
|
|
|
|
import apiai
|
|
|
|
from typing import Dict, Any, List
|
|
|
|
help_message = '''DialogFlow bot
|
|
This bot will interact with dialogflow bots.
|
|
Simply send this bot a message, and it will respond depending on the configured bot's behaviour.
|
|
'''
|
|
|
|
def get_bot_result(message_content: str, config: Dict[str, str], sender_id: str) -> str:
|
|
if message_content.strip() == '' or message_content.strip() == 'help':
|
|
return config['bot_info']
|
|
ai = apiai.ApiAI(config['key'])
|
|
try:
|
|
request = ai.text_request()
|
|
request.session_id = sender_id
|
|
request.query = message_content
|
|
response = request.getresponse()
|
|
res_str = response.read().decode('utf8', 'ignore')
|
|
res_json = json.loads(res_str)
|
|
if res_json['status']['errorType'] != 'success' and 'result' not in res_json.keys():
|
|
return 'Error {}: {}.'.format(res_json['status']['code'], res_json['status']['errorDetails'])
|
|
if res_json['result']['fulfillment']['speech'] == '':
|
|
if 'alternateResult' in res_json.keys():
|
|
if res_json['alternateResult']['fulfillment']['speech'] != '':
|
|
return res_json['alternateResult']['fulfillment']['speech']
|
|
return 'Error. No result.'
|
|
return res_json['result']['fulfillment']['speech']
|
|
except Exception as e:
|
|
logging.exception(str(e))
|
|
return 'Error. {}.'.format(str(e))
|
|
|
|
class DialogFlowHandler(object):
|
|
'''
|
|
This plugin allows users to easily add their own
|
|
DialogFlow bots to zulip
|
|
'''
|
|
|
|
def initialize(self, bot_handler: Any) -> None:
|
|
self.config_info = bot_handler.get_config_info('dialogflow')
|
|
|
|
def usage(self) -> str:
|
|
return '''
|
|
This plugin will allow users to easily add their own
|
|
DialogFlow bots to zulip
|
|
'''
|
|
|
|
def handle_message(self, message: Dict[str, str], bot_handler: Any) -> None:
|
|
result = get_bot_result(message['content'], self.config_info, message['sender_id'])
|
|
bot_handler.send_reply(message, result)
|
|
|
|
handler_class = DialogFlowHandler
|