Interactive bots: Create a thesaurus bot.
This commit is contained in:
parent
72486f6371
commit
0e26a0bb3b
90
contrib_bots/lib/thesaurus.py
Normal file
90
contrib_bots/lib/thesaurus.py
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
# See zulip/contrib_bots/lib/readme.md for instructions on running this code.
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
try:
|
||||||
|
from PyDictionary import PyDictionary as Dictionary
|
||||||
|
except ImportError:
|
||||||
|
logging.error("Dependency Missing!")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
#Uses Python's Dictionary module
|
||||||
|
# pip install PyDictionary
|
||||||
|
|
||||||
|
def get_clean_response(m, method):
|
||||||
|
try:
|
||||||
|
response = method(m)
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception(e)
|
||||||
|
return e
|
||||||
|
if isinstance(response, str):
|
||||||
|
return response
|
||||||
|
elif isinstance(response, list):
|
||||||
|
return ', '.join(response)
|
||||||
|
|
||||||
|
def get_thesaurus_result(original_content):
|
||||||
|
search_keyword = original_content.strip().split(' ', 1)[1]
|
||||||
|
if search_keyword == 'help':
|
||||||
|
help_message = "To use this bot, start messages with either \
|
||||||
|
@synonym (to get the synonyms of a given word) \
|
||||||
|
or @antonym (to get the antonyms of a given word). \
|
||||||
|
Phrases are not accepted so only use single words \
|
||||||
|
to search. For example you could search '@synonym hello' \
|
||||||
|
or '@antonym goodbye'."
|
||||||
|
return help_message
|
||||||
|
elif original_content.startswith('@synonym'):
|
||||||
|
result = get_clean_response(search_keyword, method = Dictionary.synonym)
|
||||||
|
return result
|
||||||
|
elif original_content.startswith('@antonym'):
|
||||||
|
result = get_clean_response(search_keyword, method = Dictionary.antonym)
|
||||||
|
return result
|
||||||
|
|
||||||
|
class ThesaurusHandler(object):
|
||||||
|
'''
|
||||||
|
This plugin allows users to enter a word in zulip
|
||||||
|
and get synonyms, and antonyms, for that word sent
|
||||||
|
back to the context (stream or private) in which
|
||||||
|
it was sent. It looks for messages starting with
|
||||||
|
@synonym or @antonym.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def usage(self):
|
||||||
|
return '''
|
||||||
|
This plugin will allow users to get both synonyms
|
||||||
|
and antonyms for a given word from zulip. To use this
|
||||||
|
plugin, users need to install the PyDictionary module
|
||||||
|
using 'pip install PyDictionary'.Use '@synonym help' or
|
||||||
|
'@antonym help' for more usage information. Users should
|
||||||
|
preface messages with @synonym or @antonym.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def triage_message(self, message, client):
|
||||||
|
# return True if we want to (possibly) respond to this message
|
||||||
|
|
||||||
|
original_content = message['content']
|
||||||
|
|
||||||
|
is_thesaurus = (original_content.startswith('@synonym') or
|
||||||
|
original_content.startswith('@antonym'))
|
||||||
|
|
||||||
|
return is_thesaurus
|
||||||
|
|
||||||
|
def handle_message(self, message, client, state_handler):
|
||||||
|
original_content = message['content']
|
||||||
|
original_sender = message['sender_email']
|
||||||
|
new_content = get_thesaurus_result(original_content)
|
||||||
|
|
||||||
|
if message['type'] == 'private':
|
||||||
|
client.send_message(dict(
|
||||||
|
type='private',
|
||||||
|
to=original_sender,
|
||||||
|
content=new_content,
|
||||||
|
))
|
||||||
|
else:
|
||||||
|
client.send_message(dict(
|
||||||
|
type=message['type'],
|
||||||
|
to=message['display_recipient'],
|
||||||
|
subject=message['subject'],
|
||||||
|
content=new_content,
|
||||||
|
))
|
||||||
|
|
||||||
|
handler_class = ThesaurusHandler
|
Loading…
Reference in a new issue