Advertisement
tonabini

Channel

Nov 14th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.61 KB | None | 0 0
  1. import inspect
  2. import emoji
  3. import logging
  4. import json
  5.  
  6. from abc import ABC
  7. from typing import Text, Optional, Callable, Awaitable, Dict, Any
  8.  
  9. from rasa.core.channels import InputChannel, UserMessage, OutputChannel
  10. from sanic import response, Blueprint
  11. from sanic.request import Request
  12. from sanic.response import HTTPResponse
  13.  
  14.  
  15. logger = logging.getLogger(__name__)
  16.  
  17. def _give_emoji_free_text(text):
  18.     allchars = [str for str in text]
  19.     emoji_list = [c for c in allchars if c in emoji.UNICODE_EMOJI]
  20.     clean_text = text
  21.     for em in emoji_list:
  22.         clean_text = clean_text.replace(em, '')
  23.     return clean_text.lower()
  24.  
  25.  
  26. def _process_request(req: Request):
  27.     sender_id = req.json.get("sender", None)
  28.     text = req.json.get("message", None)
  29.     text = emoji.emojize(text, use_aliases=True)
  30.     text = _give_emoji_free_text(text)
  31.     message_id = req.json.get("message_id", None)
  32.     return UserMessage(
  33.         sender_id=sender_id,
  34.         text=text,
  35.         message_id=message_id,
  36.         output_channel=CustomOutput()
  37.     )
  38.  
  39.  
  40. class CustomOutput(OutputChannel, ABC):
  41.  
  42.     def __init__(self):
  43.         self.options = None
  44.         self.utter = None
  45.  
  46.     async def send_response(self, recipient_id: Text, message: Dict[Text, Any]) -> None:
  47.         # logger.warn(json.dumps(message, default=lambda o: o.__dict__, sort_keys=True, indent=4))
  48.         self.options = message['custom'] or None
  49.         self.utter = message['text'] or None
  50.  
  51.  
  52. class CustomInput(InputChannel):
  53.  
  54.     @classmethod
  55.     def name(cls) -> Text:
  56.         return "customInput"
  57.  
  58.     def blueprint(self, on_new_message: Callable[[UserMessage], Awaitable[None]]):
  59.         custom_webhook = Blueprint(
  60.             "custom_webhook_{}".format(type(self).__name__),
  61.             inspect.getmodule(self).__name__,
  62.         )
  63.  
  64.         @custom_webhook.route("/", methods=["GET"])
  65.         def health(request: Request) -> HTTPResponse:
  66.             return response.json({"status": "ok"})
  67.  
  68.         @custom_webhook.route("/webhook", methods=["POST"])
  69.         async def receive(request: Request) -> HTTPResponse:
  70.             user_message = _process_request(request)
  71.             # logger.warn(json.dumps(user_message, default=lambda o: o.__dict__, sort_keys=True, indent=4))
  72.             await on_new_message(user_message)
  73.             # logger.warn(json.dumps(user_message, default=lambda o: o.__dict__, sort_keys=True, indent=4))
  74.             return response.json({
  75.                 "utter": user_message.output_channel.utter,
  76.                 "options": user_message.output_channel.options
  77.             })
  78.  
  79.         return custom_webhook
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement