aboutsummaryrefslogtreecommitdiff
path: root/modules/sed.py
diff options
context:
space:
mode:
authorGravatar jesopo2016-03-29 12:56:58 +0100
committerGravatar jesopo2016-03-29 12:56:58 +0100
commitf943d63098a50746f4e470e403a991a4d9713030 (patch)
treedeeb98058917d0155227211d72576f0cbab28d3f /modules/sed.py
parentInitial commit (diff)
first commit.
Diffstat (limited to 'modules/sed.py')
-rw-r--r--modules/sed.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/modules/sed.py b/modules/sed.py
new file mode 100644
index 00000000..6bdd1cb0
--- /dev/null
+++ b/modules/sed.py
@@ -0,0 +1,64 @@
+import re, traceback
+
+REGEX_SPLIT = re.compile("(?<!\\\\)/")
+REGEX_SED = re.compile("^s/")
+
+class Module(object):
+ def __init__(self, bot):
+ self.bot = bot
+ bot.events.on("boot").on("done").hook(self.boot_done)
+ bot.events.on("received").on("message").on("channel").hook(
+ self.channel_message)
+
+ def validate_setchannel(self, s):
+ return s.lower() == "true"
+ def boot_done(self, event):
+ self.bot.events.on("postboot").on("configure").on(
+ "channelset").call(setting="sed",
+ help="Disable/Enable sed in a channel",
+ validate=self.validate_setchannel)
+
+ def channel_message(self, event):
+ if event["action"] or not event["channel"].get_setting("sed", True):
+ return
+ sed_split = re.split(REGEX_SPLIT, event["message"], 3)
+ if event["message"].startswith("s/") and len(sed_split) > 2:
+ regex_flags = 0
+ flags = (sed_split[3:] or [""])[0]
+ count = None
+
+ last_flag = ""
+ for flag in flags:
+ if flag.isdigit():
+ if last_flag.isdigit():
+ count = int(str(count) + flag)
+ elif not count:
+ count = int(flag)
+ elif flag == "i":
+ regex_flags |= re.I
+ elif flag == "g":
+ count = 0
+ last_flag = flag
+ if count == None:
+ count = 1
+
+ try:
+ pattern = re.compile(sed_split[1], regex_flags)
+ except:
+ traceback.print_exc()
+ self.bot.events.on("send").on("stderr").call(target=event[
+ "channel"], module_name="Sed", server=event["server"],
+ message="Invalid regex in pattern")
+ return
+ replace = sed_split[2].replace("\\/", "/")
+
+ line = event["channel"].log.find(pattern, from_self=False, not_pattern=REGEX_SED)
+ if line:
+ new_message = re.sub(pattern, replace, line.message, count)
+ if line.action:
+ prefix = "* %s" % line.sender
+ else:
+ prefix = "<%s>" % line.sender
+ self.bot.events.on("send").on("stdout").call(target=event[
+ "channel"], module_name="Sed", server=event["server"],
+ message="%s %s" % (prefix, new_message))