aboutsummaryrefslogtreecommitdiff
path: root/modules/badges.py
blob: a6d76ee5a1d849122bdb32f04de6c4f9df6d9ae1 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#--depends-on commands

import datetime, re
from src import ModuleManager, utils

RE_HUMAN_FORMAT = re.compile(r"(\d\d\d\d)-(\d?\d)-(\d?\d)")
HUMAN_FORMAT_HELP = "year-month-day (e.g. 2018-12-29)"

class Module(ModuleManager.BaseModule):
    def on_load(self):
        self.exports.add("command-spec.marginstring", self._marginstring_spec)
    def _marginstring_spec(self, server, channel, user, args):
        if len(args) > 1:
            new_args = args[:-1]
            return " ".join(new_args), len(new_args)
        else:
            return None, 1

    def _round_up_day(self, dt: datetime.datetime):
        return dt.date()+datetime.timedelta(days=1)
    def _days_since(self, now: datetime.date, dt: datetime.datetime):
        return (now-dt.date()).days

    def _get_badges(self, user):
        return user.get_setting("badges", {})
    def _set_badges(self, user, badges):
        user.set_setting("badges", badges)
    def _del_badges(self, user):
        user.del_setting("badges")

    @utils.hook("received.command.badge")
    @utils.kwarg("help", "List, add and remove badges")
    @utils.spec("!'list ?<nickname>ouser")
    @utils.spec("!'add !<name>marginstring !'now,today")
    @utils.spec("!'add !<name>marginstring !date")
    @utils.spec("!'remove !<name>string")
    def badge(self, event):
        if event["spec"][0] == "list":
            target = event["spec"][1] or event["user"]
            badges = self._get_badges(target)
            if not badges:
                raise utils.EventError("%s has no badges" % target.nickname)

            now = self._round_up_day(utils.datetime.utcnow())

            outs = []
            for name in sorted(badges.keys()):
                dt = utils.datetime.parse.iso8601(badges[name])
                days_since = self._days_since(now, dt)
                human = utils.datetime.format.date_human(dt)
                outs.append("%s on day %d (%s)"
                    % (name, days_since, human))
            event["stdout"].write("badges for %s: %s"
                % (target.nickname, ", ".join(outs)))

        else:
            badges = self._get_badges(event["user"])
            if event["spec"][0] == "add":
                if event["spec"][2] in ["now", "today"]:
                    dt = utils.datetime.utcnow()
                else:
                    dt = event["spec"][2]
                badges[event["spec"][1]] = utils.datetime.format.iso8601(dt)
                human = utils.datetime.format.date_human(dt)
                event["stdout"].write("%s: added badge %s (%s)"
                    % (event["user"].nickname, event["spec"][1], human))

            elif event["spec"][0] == "remove":
                if not event["spec"][1] in badges:
                    raise utils.EventError("%s: you don't have a '%s' badge"
                        % (event["user"].nickname, event["spec"][1]))

                human = utils.datetime.format.date_human(
                    utils.datetime.parse.iso8601(badges.pop(event["spec"][1])))
                event["stdout"].write("%s: removed badge '%s' (%s)"
                    % (event["user"].nickname, event["spec"][1], human))
            self._set_badges(event["user"], badges)

    @utils.hook("received.command.badgeclear")
    @utils.kwarg("help", "Clear a user's badges")
    @utils.kwarg("permission", "badge-clear")
    @utils.spec("!<nickname>ouser")
    def badgeclear(self, event):
        if self._get_badges(event["spec"][0]):
            self._del_badges(event["spec"][0])
            event["stdout"].write("Cleared badges for %s"
                % event["spec"][0].nickname)
        else:
            event["stderr"].write("%s has no badges"
                % event["spec"][0].nickname)