2016-03-29 11:56:58 +00:00
|
|
|
import re, traceback
|
2018-10-03 12:22:37 +00:00
|
|
|
from src import ModuleManager, utils
|
2016-03-29 11:56:58 +00:00
|
|
|
|
|
|
|
REGEX_SPLIT = re.compile("(?<!\\\\)/")
|
|
|
|
REGEX_SED = re.compile("^s/")
|
|
|
|
|
2018-10-03 12:22:37 +00:00
|
|
|
@utils.export("channelset", {"setting": "sed",
|
2018-09-27 11:08:07 +00:00
|
|
|
"help": "Disable/Enable sed in a channel",
|
2019-05-23 09:28:14 +00:00
|
|
|
"validate": utils.bool_or_none, "example": "on"})
|
2018-10-03 12:22:37 +00:00
|
|
|
@utils.export("channelset", {"setting": "sed-sender-only",
|
2018-09-27 11:08:07 +00:00
|
|
|
"help": "Disable/Enable sed only looking at the messages sent by the user",
|
2019-05-23 09:28:14 +00:00
|
|
|
"validate": utils.bool_or_none, "example": "on"})
|
2018-09-27 11:08:07 +00:00
|
|
|
class Module(ModuleManager.BaseModule):
|
2018-10-30 14:58:48 +00:00
|
|
|
def _closest_setting(self, event, setting, default):
|
2019-05-18 17:35:47 +00:00
|
|
|
return event["target"].get_setting(setting,
|
2018-10-30 14:58:48 +00:00
|
|
|
event["server"].get_setting(setting, default))
|
|
|
|
|
2019-05-18 17:35:47 +00:00
|
|
|
@utils.hook("command.regex")
|
2016-03-29 11:56:58 +00:00
|
|
|
def channel_message(self, event):
|
2019-05-18 17:35:47 +00:00
|
|
|
"""
|
|
|
|
:command: sed
|
|
|
|
:pattern: ^s/
|
|
|
|
"""
|
2016-03-29 11:56:58 +00:00
|
|
|
sed_split = re.split(REGEX_SPLIT, event["message"], 3)
|
|
|
|
if event["message"].startswith("s/") and len(sed_split) > 2:
|
2019-05-18 17:35:47 +00:00
|
|
|
if not self._closest_setting(event, "sed", False):
|
2019-04-27 13:49:57 +00:00
|
|
|
return
|
2018-08-05 14:35:23 +00:00
|
|
|
|
2016-03-29 11:56:58 +00:00
|
|
|
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()
|
2019-05-18 17:35:47 +00:00
|
|
|
event["stderr"].write("Invalid regex in pattern")
|
2016-03-29 11:56:58 +00:00
|
|
|
return
|
2019-04-15 20:55:53 +00:00
|
|
|
replace = utils.irc.bold(sed_split[2].replace("\\/", "/"))
|
2016-03-29 11:56:58 +00:00
|
|
|
|
2018-10-30 14:58:48 +00:00
|
|
|
for_user = event["user"].nickname if self._closest_setting(event,
|
|
|
|
"sed-sender-only", False) else None
|
2019-05-18 17:35:47 +00:00
|
|
|
line = event["target"].buffer.find(pattern, from_self=False,
|
2017-10-27 12:15:33 +00:00
|
|
|
for_user=for_user, not_pattern=REGEX_SED)
|
2016-03-29 11:56:58 +00:00
|
|
|
if line:
|
|
|
|
new_message = re.sub(pattern, replace, line.message, count)
|
|
|
|
if line.action:
|
|
|
|
prefix = "* %s" % line.sender
|
|
|
|
else:
|
|
|
|
prefix = "<%s>" % line.sender
|
2019-05-18 17:35:47 +00:00
|
|
|
event["stdout"].write("%s %s" % (prefix, new_message))
|