time_marker.py 2.96 KB
Newer Older
louiz’'s avatar
louiz’ committed
1
"""
mathieui's avatar
mathieui committed
2 3 4
Display the time between two messages.

Helps you identify the times of a conversation.  For example
louiz’'s avatar
louiz’ committed
5
if you disable the timestamps, and remove the join/quit notifications in a
6 7
chatroom, 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.
louiz’'s avatar
louiz’ committed
8 9 10 11 12 13

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.
mathieui's avatar
mathieui committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Configuration
-------------

You can configure the minimum delay between two messages, to display the time marker, in seconds. The default is 10 minutes (aka 600 seconds).

.. code-block:: ini

    [time_marker]
    delay = 600

Usage
-----

Messages like “2 hours, 25 minutes passed…” are automatically displayed into the converstation. You don’t need to (and can’t) do anything.

louiz’'s avatar
louiz’ committed
30 31
"""

32
from poezio.plugin import BasePlugin
louiz’'s avatar
louiz’ committed
33
from datetime import datetime, timedelta
34
from poezio.ui.types import InfoMessage
louiz’'s avatar
louiz’ committed
35

mathieui's avatar
mathieui committed
36

louiz’'s avatar
louiz’ committed
37 38
class Plugin(BasePlugin):
    def init(self):
39
        self.api.add_event_handler("muc_msg", self.on_muc_msg)
40
        # Dict of MucTab.jid.bare: last_message date, so we don’t have to
louiz’'s avatar
louiz’ committed
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
        # 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]

70 71
        last_message_date = self.last_messages.get(tab.jid.bare)
        self.last_messages[tab.jid.bare] = datetime.now()
louiz’'s avatar
louiz’ committed
72 73 74
        if last_message_date:
            delta = datetime.now() - last_message_date
            if delta >= timedelta(0, self.config.get('delay', 900)):
mathieui's avatar
mathieui committed
75
                tab.add_message(
76 77
                    InfoMessage("%s passed…" % (format_timedelta(delta), ))
                )