diff --git a/config.json.example b/config.json.example index 5b5ad70..1a764e8 100644 --- a/config.json.example +++ b/config.json.example @@ -46,6 +46,11 @@ "reply": "{target} captured {num} things : {things}", "empty_reply": "{target} did not capture anything yet!" }, + "capturegive": { + "commands": ["give"], + "content_regex": "my (?P\\S+) to (?P\\S+)", + "no_such_thing_reply": "You don't have such {thing}." + }, "common": { "command_suffix": "please", "handling_conditions": { diff --git a/edmond/plugins/capture_give.py b/edmond/plugins/capture_give.py new file mode 100644 index 0000000..f1d86dd --- /dev/null +++ b/edmond/plugins/capture_give.py @@ -0,0 +1,69 @@ +import re +import time + +from edmond.plugin import Plugin + + +class CaptureGivePlugin(Plugin): + + REQUIRED_CONFIGS = ["commands", "content_regex", "no_such_thing_reply"] + + def __init__(self, bot): + super().__init__(bot) + self._content_re = None + + @property + def content_re(self): + if self._content_re is None: + self._content_re = re.compile(self.config["content_regex"]) + return self._content_re + + def on_welcome(self, _): + if not self.bot.get_plugin("capture"): + self.bot.log_w("Capture plugin is not available.") + self.is_ready = False + + def on_pubmsg(self, event): + if not self.should_handle_command(event.arguments[0]): + return False + + # "give" command. + if self.command.ident == self.config["commands"][0]: + content = self.command.raw[len(self.command.match):].strip() + match = self.content_re.match(content) + if not match: + return False + groups = match.groupdict() + if any(k not in groups for k in ("thing", "person")): + return False + thing = groups["thing"] + person = groups["person"] + + # Check the sender has the thing they attempt to give. + collections = self.get_storage_value( + "collections", + default={}, + ns="capture" + ) + source = event.source.nick + source_collection = collections.get(source, []) + if thing not in source_collection: + reply = self.config["no_such_thing_reply"].format(thing=thing) + self.bot.say(event.target, reply) + return True + + source_collection.remove(thing) + collections[source] = source_collection + + target_collection = collections.get(person, []) + target_collection.append(thing) + collections[person] = target_collection + + self.set_storage_value("collections", collections, ns="capture") + + dance_text_1 = f"[{source}] {thing}<(OvO<) [{person}]" + self.bot.say(event.target, dance_text_1) + time.sleep(1) + dance_text_2 = f"[{source}] (>OvO)>{thing} [{person}]" + self.bot.say(event.target, dance_text_2) + return True