Skip to content

Instantly share code, notes, and snippets.

@malles
Created September 8, 2016 16:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save malles/b78d9c1de57237b7a95b92a049f4dca0 to your computer and use it in GitHub Desktop.
Save malles/b78d9c1de57237b7a95b92a049f4dca0 to your computer and use it in GitHub Desktop.
Events for Hangupsbot (copy of tl;dr plugin)
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