68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
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.matched) :].strip()
|
|
matched = self.content_re.match(content)
|
|
if not matched:
|
|
return False
|
|
groups = matched.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
|