Skip to content

Commit e9f6e8a

Browse files
committed
revamp factoids.py; allow for both server-wide and per-channel factoids
1 parent 3c6eb6f commit e9f6e8a

File tree

1 file changed

+72
-21
lines changed

1 file changed

+72
-21
lines changed

modules/factoids.py

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,88 @@
33
import re
44
from src import ModuleManager, utils
55

6-
REGEX_FACTOID = re.compile("{!factoid ([^}]+)}", re.I)
6+
REGEX_FACTOID = re.compile("{!([^}]+)}", re.I)
77

88
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
1221

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")
1436
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"
2542
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)
2758
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+
3079

3180
@utils.hook("command.regex")
3281
@utils.kwarg("ignore_action", False)
3382
@utils.kwarg("command", "factoid")
3483
@utils.kwarg("pattern", REGEX_FACTOID)
3584
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)
3888
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

Comments
 (0)