mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# See readme-yoda-bot.md for instructions on running this code.
 | 
						|
 | 
						|
"""
 | 
						|
This bot uses the python library `unirest` which is not a
 | 
						|
dependency of Zulip. To use this module, you will have to
 | 
						|
install it in your local machine. In your terminal, enter
 | 
						|
the following command:
 | 
						|
    $ sudo pip install unirest --upgrade
 | 
						|
Note:
 | 
						|
    * You might have to use `pip3` if you are using python 3.
 | 
						|
    * The install command would also download any dependency
 | 
						|
      required by `unirest`.
 | 
						|
"""
 | 
						|
 | 
						|
from __future__ import print_function
 | 
						|
import os
 | 
						|
import logging
 | 
						|
import ssl
 | 
						|
import sys
 | 
						|
 | 
						|
try:
 | 
						|
    import unirest
 | 
						|
except ImportError:
 | 
						|
    logging.error("Dependency missing!!\n%s" % (__doc__))
 | 
						|
    sys.exit(0)
 | 
						|
 | 
						|
 | 
						|
HELP_MESSAGE = '''
 | 
						|
            This bot allows users to translate a sentence into
 | 
						|
            'Yoda speak'.
 | 
						|
            Users should preface messages with '@yoda'.
 | 
						|
 | 
						|
            Before running this, make sure to get a Mashape Api token.
 | 
						|
            Instructions are in the 'readme-yoda-bot.md' file.
 | 
						|
            Store it in the 'yoda_api_key.txt' file.
 | 
						|
            The 'yoda_api_key.txt' file should be located at '~/yoda_api_key.txt'.
 | 
						|
            Example input:
 | 
						|
            @yoda You will learn how to speak like me someday.
 | 
						|
            '''
 | 
						|
 | 
						|
 | 
						|
class ApiKeyError(Exception):
 | 
						|
    '''raise this when there is an error with the Mashape Api Key'''
 | 
						|
 | 
						|
 | 
						|
class YodaSpeakHandler(object):
 | 
						|
    '''
 | 
						|
    This bot will allow users to translate a sentence into 'Yoda speak'.
 | 
						|
    It looks for messages starting with '@yoda'.
 | 
						|
    '''
 | 
						|
 | 
						|
    def usage(self):
 | 
						|
        return '''
 | 
						|
            This bot will allow users to translate a sentence into
 | 
						|
            'Yoda speak'.
 | 
						|
            Users should preface messages with '@yoda'.
 | 
						|
 | 
						|
            Before running this, make sure to get a Mashape Api token.
 | 
						|
            Instructions are in the 'readme-yoda-bot.md' file.
 | 
						|
            Store it in the 'yoda_api_key.txt' file.
 | 
						|
            The 'yoda_api_key.txt' file should be located at '~/yoda_api_key.txt'.
 | 
						|
            Example input:
 | 
						|
            @yoda You will learn how to speak like me someday.
 | 
						|
            '''
 | 
						|
 | 
						|
    def triage_message(self, message):
 | 
						|
        # return True iff we want to (possibly) response to this message
 | 
						|
 | 
						|
        original_content = message['content']
 | 
						|
 | 
						|
        return original_content.startswith('@yoda')
 | 
						|
 | 
						|
    def handle_message(self, message, client, state_handler):
 | 
						|
        original_content = message['content']
 | 
						|
        stream = message['display_recipient']
 | 
						|
        subject = message['subject']
 | 
						|
 | 
						|
        # this handles the message if its starts with @yoda
 | 
						|
        if original_content.startswith('@yoda'):
 | 
						|
            handle_input(client, original_content, stream, subject)
 | 
						|
 | 
						|
handler_class = YodaSpeakHandler
 | 
						|
 | 
						|
 | 
						|
def send_to_yoda_api(sentence, api_key):
 | 
						|
    # function for sending sentence to api
 | 
						|
 | 
						|
    response = unirest.get("https://yoda.p.mashape.com/yoda?sentence=" + sentence,
 | 
						|
                           headers={
 | 
						|
                               "X-Mashape-Key": api_key,
 | 
						|
                               "Accept": "text/plain"
 | 
						|
                           }
 | 
						|
                           )
 | 
						|
 | 
						|
    if response.code == 200:
 | 
						|
        return response.body
 | 
						|
    if response.code == 403:
 | 
						|
        raise ApiKeyError
 | 
						|
    else:
 | 
						|
        error_message = response.body['message']
 | 
						|
        logging.error(error_message)
 | 
						|
        error_code = response.code
 | 
						|
        error_message = error_message + 'Error code: ' + error_code +\
 | 
						|
            ' Did you follow the instructions in the `readme-yoda-bot.md` file?'
 | 
						|
        return error_message
 | 
						|
 | 
						|
 | 
						|
def format_input(original_content):
 | 
						|
    # replaces the '@yoda' with nothing, so that '@yoda' doesn't get sent to the api
 | 
						|
    message_content = original_content.replace('@yoda', '')
 | 
						|
    # gets rid of whitespace around the edges, so that they aren't a problem in the future
 | 
						|
    message_content = message_content.strip()
 | 
						|
    # replaces all spaces with '+' to be in the format the api requires
 | 
						|
    sentence = message_content.replace(' ', '+')
 | 
						|
    return sentence
 | 
						|
 | 
						|
 | 
						|
def handle_input(client, original_content, stream, subject):
 | 
						|
 | 
						|
    if is_help(original_content):
 | 
						|
        send_message(client, HELP_MESSAGE, stream, subject)
 | 
						|
 | 
						|
    else:
 | 
						|
        sentence = format_input(original_content)
 | 
						|
        try:
 | 
						|
            reply_message = send_to_yoda_api(sentence, get_api_key())
 | 
						|
 | 
						|
        except ssl.SSLError or TypeError:
 | 
						|
            reply_message = 'The service is temporarily unavailable, please try again.'
 | 
						|
            logging.error(reply_message)
 | 
						|
 | 
						|
        except ApiKeyError:
 | 
						|
            reply_message = 'Invalid Api Key. Did you follow the instructions in the ' \
 | 
						|
                            '`readme-yoda-bot.md` file?'
 | 
						|
            logging.error(reply_message)
 | 
						|
 | 
						|
        send_message(client, reply_message, stream, subject)
 | 
						|
 | 
						|
 | 
						|
def get_api_key():
 | 
						|
    # function for getting Mashape api key
 | 
						|
    home = os.path.expanduser('~')
 | 
						|
    with open(home + '/yoda_api_key.txt') as api_key_file:
 | 
						|
        api_key = api_key_file.read().strip()
 | 
						|
    return api_key
 | 
						|
 | 
						|
 | 
						|
def send_message(client, message, stream, subject):
 | 
						|
    # function for sending a message
 | 
						|
    client.send_message(dict(
 | 
						|
        type='stream',
 | 
						|
        to=stream,
 | 
						|
        subject=subject,
 | 
						|
        content=message
 | 
						|
    ))
 | 
						|
 | 
						|
 | 
						|
def is_help(original_content):
 | 
						|
    # replaces the '@yoda' with nothing, so that '@yoda' doesn't get sent to the api
 | 
						|
    message_content = original_content.replace('@yoda', '')
 | 
						|
    # gets rid of whitespace around the edges, so that they aren't a problem in the future
 | 
						|
    message_content = message_content.strip()
 | 
						|
    if message_content == 'help':
 | 
						|
        return True
 | 
						|
    else:
 | 
						|
        return False
 |