|
3 | 3 | import re |
4 | 4 | from src import ModuleManager, utils |
5 | 5 |
|
6 | | -REGEX_FACTOID = re.compile("{!factoid ([^}]+)}", re.I) |
| 6 | +REGEX_FACTOID = re.compile("{!([^}]+)}", re.I) |
7 | 7 |
|
8 | 8 | class Module(ModuleManager.BaseModule): |
9 | | - def _get_factoid(self, server, factoid): |
10 | | - name = factoid.lower().strip() |
11 | | - return name, server.get_setting("factoid-%s" % name, None) |
| 9 | + def _get_factoid(self, targets, factoid): |
| 10 | + setting = "factoid-%s" % factoid |
| 11 | + for target_type, target in targets: |
| 12 | + value = target.get_setting(setting, None) |
| 13 | + if not value == None: |
| 14 | + return target_type, value |
| 15 | + return None |
| 16 | + def _all_factoids(self, target): |
| 17 | + factoids = {} |
| 18 | + for factoid, value in target.find_settings(prefix="factoid-"): |
| 19 | + factoids[factoid.replace("factoid-", "", 1)] = value |
| 20 | + return factoids |
12 | 21 |
|
13 | | - @utils.hook("received.command.factoid", min_args=1) |
| 22 | + def _set_factoid(self, target, factoid, value): |
| 23 | + target.set_setting("factoid-%s" % factoid, value) |
| 24 | + def _del_factoid(self, target, factoid): |
| 25 | + target.del_setting("factoid-%s" % factoid) |
| 26 | + |
| 27 | + @utils.hook("received.command.factoid", permission="factoid") |
| 28 | + @utils.hook("received.command.cfactoid", require_mode="o", |
| 29 | + require_access="low,factoid") |
| 30 | + @utils.kwarg("help", "Set or get a factoid") |
| 31 | + |
| 32 | + @utils.spec("!'list") |
| 33 | + @utils.spec("!'get !<name>wordlower") |
| 34 | + @utils.spec("!'add !<name>wordlower !<value>string") |
| 35 | + @utils.spec("!'remove !<name>wordlower") |
14 | 36 | def factoid(self, event): |
15 | | - """ |
16 | | - :help: Set/get a factoid |
17 | | - :usage: <key> [= value] |
18 | | - """ |
19 | | - if "=" in event["args"]: |
20 | | - key, _, value = event["args"].partition("=") |
21 | | - factoid = key.lower().strip() |
22 | | - event["server"].set_setting("factoid-%s" % factoid, value.strip()) |
23 | | - |
24 | | - event["stdout"].write("Set factoid '%s'" % factoid) |
| 37 | + factoid = event["spec"].get(1, None) |
| 38 | + |
| 39 | + if event["command"] == "cfactoid": |
| 40 | + target = event["target"] |
| 41 | + target_desc = "channel" |
25 | 42 | else: |
26 | | - name, value = self._get_factoid(event["server"], event["args"]) |
| 43 | + target = event["server"] |
| 44 | + target_desc = "server" |
| 45 | + |
| 46 | + exists = False |
| 47 | + if not factoid == None: |
| 48 | + exists = not self._get_factoid([["", target]], factoid) == None |
| 49 | + |
| 50 | + if event["spec"][0] == "list": |
| 51 | + all_factoids = self._all_factoids(target) |
| 52 | + event["stdout"].write("Available %s factoids: %s" |
| 53 | + % (target_desc, ", ".join(sorted(all_factoids.keys())))) |
| 54 | + |
| 55 | + elif event["spec"][0] == "get": |
| 56 | + targets = [["server", event["server"]], ["channel", event["target"]]] |
| 57 | + value = self._get_factoid(targets, factoid) |
27 | 58 | if value == None: |
28 | | - raise utils.EventError("Unknown factoid '%s'" % name) |
29 | | - event["stdout"].write("%s: %s" % (name, value)) |
| 59 | + raise utils.EventError("Unknown %s factoid '%s'" % factoid) |
| 60 | + target_desc, value = value |
| 61 | + event["stdout"].write("%s: %s" % (factoid, value)) |
| 62 | + |
| 63 | + elif event["spec"][0] == "add": |
| 64 | + if exists: |
| 65 | + raise utils.EventError("%s factoid '%s' already exists" |
| 66 | + % (target_desc.title(), factoid)) |
| 67 | + self._set_factoid(target, factoid, event["spec"][2]) |
| 68 | + event["stdout"].write("Set %s factoid '%s'" |
| 69 | + % (target_desc, factoid)) |
| 70 | + |
| 71 | + elif event["spec"][0] == "remove": |
| 72 | + if not exists: |
| 73 | + raise utils.EventError("%s factoid '%s' doesn't exist" |
| 74 | + % (target_desc.title(), factoid)) |
| 75 | + self._del_factoid(target, factoid) |
| 76 | + event["stdout"].write("Removed %s factoid '%s'" |
| 77 | + % (target_desc, factoid)) |
| 78 | + |
30 | 79 |
|
31 | 80 | @utils.hook("command.regex") |
32 | 81 | @utils.kwarg("ignore_action", False) |
33 | 82 | @utils.kwarg("command", "factoid") |
34 | 83 | @utils.kwarg("pattern", REGEX_FACTOID) |
35 | 84 | def channel_message(self, event): |
36 | | - name, value = self._get_factoid(event["server"], |
37 | | - event["match"].group(1)) |
| 85 | + targets = [["server", event["server"]], ["channel", event["target"]]] |
| 86 | + factoid = event["match"].group(1) |
| 87 | + value = self._get_factoid(targets, factoid) |
38 | 88 | if not value == None: |
39 | | - event["stdout"].write("%s: %s" % (name, value)) |
| 89 | + target_desc, value = value |
| 90 | + event["stdout"].write("%s: %s" % (factoid, value)) |
0 commit comments