diff options
-rw-r--r-- | plugins/time_marker.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/plugins/time_marker.py b/plugins/time_marker.py new file mode 100644 index 00000000..02917533 --- /dev/null +++ b/plugins/time_marker.py @@ -0,0 +1,57 @@ +""" +A plugin that helps you identify the times of a conversation. For example +if you disable the timestamps, and remove the join/quit notifications in a +MUC, you can’t really distinguish when a conversation stopped and when a new +one started, because you don’t have a visual separation between the two. + +This plugin displays a message in the conversation indicating the time that +passed between two messages, if the time is bigger than X minutes +(configurable, of course. Default is 15 minutes). This way you know how many time elapsed between +them, letting you understand more easily what is going on without any visual +clutter. +""" + +from plugin import BasePlugin +from datetime import datetime, timedelta + +class Plugin(BasePlugin): + def init(self): + self.add_event_handler("muc_msg", self.on_muc_msg) + # Dict of MucTab.name: last_message date, so we don’t have to + # retrieve the messages of the given muc to look for the last + # message’s date each time. Also, now that I think about it, the + # date of the message is not event kept in the Message object, so… + self.last_messages = {} + + def on_muc_msg(self, message, tab): + def format_timedelta(delta): + """ + Return a string of the form D days, H hours, M minutes, S + seconds. If the number of total minutes is bigger than 10, we + usually don’t care anymore about the number of seconds, so we + don’t display it. Same thing if the number of days is bigger + than one, we don’t display the minutes either. + """ + days = delta.days + hours = delta.seconds // 3600 + minutes = delta.seconds // 60 % 60 + seconds = delta.seconds % 60 + res = '' + if days > 0: + res = "%s days, " % days + if hours > 0: + res += "%s hours, " % hours + if days == 0 and minutes != 0: + res += "%s minutes, " % minutes + if delta.total_seconds() < 600: + res += "%s seconds, " % seconds + return res[:-2] + + last_message_date = self.last_messages.get(tab.get_name()) + self.last_messages[tab.get_name()] = datetime.now() + if last_message_date: + delta = datetime.now() - last_message_date + if delta >= timedelta(0, self.config.get('delay', 900)): + tab.add_message("%s passed…" % (format_timedelta(delta),)) + + |