Created
September 8, 2016 16:09
-
-
Save malles/b78d9c1de57237b7a95b92a049f4dca0 to your computer and use it in GitHub Desktop.
Events for Hangupsbot (copy of tl;dr plugin)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import plugins | |
def _initialise(bot): | |
plugins.register_user_command(["events"]) | |
bot.register_shared("plugin_events_shared", tldr_shared) | |
def events(bot, event, *args): | |
message = tldr_base(bot, event.conv_id, list(args)) | |
yield from bot.coro_send_message(event.conv_id, message) | |
def tldr_shared(bot, args): | |
""" | |
Shares events functionality with other plugins | |
:param bot: hangouts bot | |
:param args: a dictionary which holds arguments. | |
Must contain 'params' (events command parameters) and 'conv_id' (Hangouts conv_id) | |
:return: | |
""" | |
if not isinstance(args, dict): | |
raise TypeError("args must be a dictionary") | |
if 'params' not in args: | |
raise KeyError("'params' key missing in args") | |
if 'conv_id' not in args: | |
raise KeyError("'conv_id' key missing in args") | |
params = args['params'] | |
conv_id = args['conv_id'] | |
return tldr_base(bot, conv_id, params) | |
def tldr_base(bot, conv_id, parameters): | |
"""Adds a short message to a list saved for the conversation using: | |
/bot events <message> | |
All TLDRs can be retrieved by /bot events, single events with /bot events <number> | |
All TLDRs can be deleted using /bot events clear, single events with /bot events clear <number> | |
Single TLDRs can be edited using /bot events edit <number> <new_message>""" | |
# parameters = list(args) | |
if not bot.memory.exists(['events']): | |
bot.memory.set_by_path(['events'], {}) | |
if not bot.memory.exists(['events', conv_id]): | |
bot.memory.set_by_path(['events', conv_id], {}) | |
conv_tldr = bot.memory.get_by_path(['events', conv_id]) | |
display = False | |
if not parameters: | |
display = True | |
elif len(parameters) == 1 and parameters[0].isdigit(): | |
display = int(parameters[0]) - 1 | |
if display is not False: | |
# Display all messages or a specific message | |
html = [] | |
for num, timestamp in enumerate(sorted(conv_tldr, key=float)): | |
if display is True or display == num: | |
html.append(_("{}. {} <b>{} ago</b>").format(str(num + 1), | |
conv_tldr[timestamp], | |
_time_ago(float(timestamp)))) | |
if len(html) == 0: | |
html.append(_("Event not found")) | |
else: | |
html.insert(0, _("<b>Event ({} stored):</b>").format(len(conv_tldr))) | |
message = _("\n".join(html)) | |
return message | |
if parameters[0] == "clear": | |
if len(parameters) == 2 and parameters[1].isdigit(): | |
sorted_keys = sorted(list(conv_tldr.keys()), key=float) | |
key_index = int(parameters[1]) - 1 | |
if key_index < 0 or key_index >= len(sorted_keys): | |
message = _("Event #{} not found").format(parameters[1]) | |
else: | |
popped_tldr = conv_tldr.pop(sorted_keys[key_index]) | |
bot.memory.set_by_path(['events', conv_id], conv_tldr) | |
message = _('Event #{} removed - "{}"').format(parameters[1], popped_tldr) | |
else: | |
bot.memory.set_by_path(['events', conv_id], {}) | |
message = _("All events cleared") | |
return message | |
elif parameters[0] == "edit": | |
if len(parameters) > 2 and parameters[1].isdigit(): | |
sorted_keys = sorted(list(conv_tldr.keys()), key=float) | |
key_index = int(parameters[1]) - 1 | |
if key_index < 0 or key_index >= len(sorted_keys): | |
message = _("Event #{} not found").format(parameters[1]) | |
else: | |
edited_tldr = conv_tldr[sorted_keys[key_index]] | |
events = ' '.join(parameters[2:len(parameters)]) | |
conv_tldr[sorted_keys[key_index]] = events | |
bot.memory.set_by_path(['events', conv_id], conv_tldr) | |
message = _('Event #{} edited - "{}" -> "{}"').format(parameters[1], edited_tldr, events) | |
else: | |
message = _('Unknown Command at "events edit"') | |
return message | |
elif parameters[0]: ## need a better looking solution here | |
events = ' '.join(parameters) | |
if events: | |
# Add message to list | |
conv_tldr[str(time.time())] = events | |
bot.memory.set_by_path(['events', conv_id], conv_tldr) | |
message = _('<em>{}</em> added to events. Count: {}').format(events, len(conv_tldr)) | |
return message | |
bot.memory.save() | |
def _time_ago(timestamp): | |
time_difference = time.time() - timestamp | |
if time_difference < 60: # seconds | |
return _("{}s").format(int(time_difference)) | |
elif time_difference < 60 * 60: # minutes | |
return _("{}m").format(int(time_difference / 60)) | |
elif time_difference < 60 * 60 * 24: # hours | |
return _("{}h").format(int(time_difference / (60 * 60))) | |
else: | |
return _("{}d").format(int(time_difference / (60 * 60 * 24))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment