aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/core_modules')
-rw-r--r--src/core_modules/admin.py14
-rw-r--r--src/core_modules/aliases.py38
-rw-r--r--src/core_modules/commands/__init__.py20
-rw-r--r--src/core_modules/cron.py3
-rw-r--r--src/core_modules/line_handler/channel.py5
-rw-r--r--src/core_modules/line_handler/core.py2
-rw-r--r--src/core_modules/line_handler/message.py11
-rw-r--r--src/core_modules/nick_regain.py40
-rw-r--r--src/core_modules/permissions/__init__.py16
9 files changed, 93 insertions, 56 deletions
diff --git a/src/core_modules/admin.py b/src/core_modules/admin.py
index 364380d4..3a92dd39 100644
--- a/src/core_modules/admin.py
+++ b/src/core_modules/admin.py
@@ -33,18 +33,22 @@ class Module(ModuleManager.BaseModule):
event["stderr"].write("Line was filtered")
@utils.hook("received.command.part")
+ @utils.kwarg("help", "Part from the current or given channel")
+ @utils.kwarg("usage", "[channel]")
def part(self, event):
- """
- :help: Part from the current or given channel
- :usage: [channel]
- :permission: part
- """
+ check = utils.Check("permission", "part")
+
if event["args"]:
target = event["args_split"][0]
elif event["is_channel"]:
target = event["target"].name
+ check |= utils.Check("channel-mode", "high")
+ check |= utils.Check("channel-access", "part")
else:
event["stderr"].write("No channel provided")
+
+ event["check_assert"](check)
+
event["server"].send_part(target)
def _id_from_alias(self, alias):
diff --git a/src/core_modules/aliases.py b/src/core_modules/aliases.py
index f1648fea..277a4922 100644
--- a/src/core_modules/aliases.py
+++ b/src/core_modules/aliases.py
@@ -1,30 +1,17 @@
#--depends-on commands
-import re
from src import EventManager, ModuleManager, utils
-REGEX_ARG_NUMBER = re.compile(r"\$(?:(\d+)(-?)|(-))")
SETTING_PREFIX = "command-alias-"
class Module(ModuleManager.BaseModule):
- def _arg_replace(self, s, args_split):
- parts = s.split("$$")
- for i, part in enumerate(parts):
- for match in REGEX_ARG_NUMBER.finditer(s):
- if match.group(1):
- index = int(match.group(1))
- continuous = match.group(2) == "-"
- if index >= len(args_split):
- raise IndexError("Unknown alias arg index")
- else:
- index = 0
- continuous = True
-
- if continuous:
- replace = " ".join(args_split[index:])
- else:
- replace = args_split[index]
- parts[i] = part.replace(match.group(0), replace)
- return "$".join(parts)
+ def _arg_replace(self, s, args_split, kwargs):
+ vars = {}
+ for i in range(len(args_split)):
+ vars[str(i)] = args_split[i]
+ vars["%d-" % i] = " ".join(args_split[i:])
+ vars["-"] = " ".join(args_split)
+ vars.update(kwargs)
+ return utils.parse.format_token_replace(s, vars)
def _get_alias(self, server, target, command):
setting = "%s%s" % (SETTING_PREFIX, command)
@@ -54,9 +41,14 @@ class Module(ModuleManager.BaseModule):
event["command"].command)
if not alias == None:
alias, alias_args = alias
+
+ given_args = []
+ if event["command"].args:
+ given_args = event["command"].args.split(" ")
+
event["command"].command = alias
- event["command"].args = self._arg_replace(alias_args,
- event["command"].args.split(" "))
+ event["command"].args = self._arg_replace(alias_args, given_args,
+ {"NICK": event["user"].nickname})
@utils.hook("received.command.alias")
@utils.hook("received.command.balias")
diff --git a/src/core_modules/commands/__init__.py b/src/core_modules/commands/__init__.py
index a7b55f2b..b22541d5 100644
--- a/src/core_modules/commands/__init__.py
+++ b/src/core_modules/commands/__init__.py
@@ -73,11 +73,12 @@ class Module(ModuleManager.BaseModule):
server.get_setting(COMMAND_METHOD,
self.bot.get_setting(COMMAND_METHOD, default))).upper()
- def _find_command_hook(self, server, target, is_channel, command, args):
+ def _find_command_hook(self, server, target, is_channel, command, user,
+ args):
if not self.has_command(command):
command_event = CommandEvent(command, args)
self.events.on("get.command").call(command=command_event,
- server=server, target=target, is_channel=is_channel)
+ server=server, target=target, is_channel=is_channel, user=user)
command = command_event.command
args = command_event.args
@@ -303,7 +304,8 @@ class Module(ModuleManager.BaseModule):
if command:
try:
hook, command, args_split = self._find_command_hook(
- event["server"], event["channel"], True, command, args)
+ event["server"], event["channel"], True, command,
+ event["user"], args)
except BadContextException:
event["channel"].send_message(
"%s: That command is not valid in a channel" %
@@ -318,7 +320,7 @@ class Module(ModuleManager.BaseModule):
self.command(event["server"], event["channel"],
event["target_str"], True, event["user"], command,
args_split, event["line"], hook,
- command_prefix=command_prefix,
+ command_prefix=command_prefix, expect_output=True,
buffer_line=event["buffer_line"])
else:
self.events.on("unknown.command").call(server=event["server"],
@@ -330,6 +332,9 @@ class Module(ModuleManager.BaseModule):
for hook in regex_hooks:
if event["action"] and hook.get_kwarg("ignore_action", True):
continue
+ if event["statusmsg"] and not hook.get_kwarg("statusmsg", False
+ ):
+ continue
pattern = hook.get_kwarg("pattern", None)
if pattern:
@@ -340,7 +345,7 @@ class Module(ModuleManager.BaseModule):
event["target_str"], True, event["user"], command,
"", event["line"], hook, match=match,
message=event["message"], command_prefix="",
- action=event["action"],
+ action=event["action"], expect_output=False,
buffer_line=event["buffer_line"])
if res:
@@ -361,7 +366,8 @@ class Module(ModuleManager.BaseModule):
try:
hook, command, args_split = self._find_command_hook(
- event["server"], event["user"], False, command, args)
+ event["server"], event["user"], False, command,
+ event["user"], args)
except BadContextException:
event["user"].send_message(
"That command is not valid in a PM")
@@ -371,7 +377,7 @@ class Module(ModuleManager.BaseModule):
self.command(event["server"], event["user"],
event["user"].nickname, False, event["user"], command,
args_split, event["line"], hook, command_prefix="",
- buffer_line=event["buffer_line"])
+ buffer_line=event["buffer_line"], expect_output=True)
else:
self.events.on("unknown.command").call(server=event["server"],
target=event["user"], user=event["user"], command=command,
diff --git a/src/core_modules/cron.py b/src/core_modules/cron.py
index fa6b15a3..69e0105b 100644
--- a/src/core_modules/cron.py
+++ b/src/core_modules/cron.py
@@ -4,7 +4,8 @@ from src import ModuleManager, utils
class Module(ModuleManager.BaseModule):
def on_load(self):
now = datetime.datetime.utcnow()
- next_minute = now.replace(minute=now.minute+1, second=0, microsecond=0)
+ next_minute = now.replace(second=0, microsecond=0)
+ next_minute += datetime.timedelta(minutes=1)
until = time.time()+((next_minute-now).total_seconds())
self.timers.add("cron", self._minute, 60, until)
diff --git a/src/core_modules/line_handler/channel.py b/src/core_modules/line_handler/channel.py
index 91150839..0def7828 100644
--- a/src/core_modules/line_handler/channel.py
+++ b/src/core_modules/line_handler/channel.py
@@ -123,8 +123,9 @@ def handle_324(events, event):
args_str=args)
def handle_329(event):
- channel = event["server"].channels.get(event["line"].args[1])
- channel.creation_timestamp = int(event["line"].args[2])
+ if event["line"].args[1] in event["server"].channels:
+ channel = event["server"].channels.get(event["line"].args[1])
+ channel.creation_timestamp = int(event["line"].args[2])
def handle_477(timers, event):
pass
diff --git a/src/core_modules/line_handler/core.py b/src/core_modules/line_handler/core.py
index d72bf223..60bde125 100644
--- a/src/core_modules/line_handler/core.py
+++ b/src/core_modules/line_handler/core.py
@@ -51,7 +51,7 @@ def handle_005(events, event):
event["server"].channel_modes = list(modes[3])
if "CHANTYPES" in isupport:
event["server"].channel_types = list(isupport["CHANTYPES"])
- if "CASEMAPPING" in isupport:
+ if "CASEMAPPING" in isupport and isupport["CASEMAPPING"]:
event["server"].case_mapping = isupport["CASEMAPPING"]
if "STATUSMSG" in isupport:
event["server"].statusmsg = list(isupport["STATUSMSG"])
diff --git a/src/core_modules/line_handler/message.py b/src/core_modules/line_handler/message.py
index fa36dbc2..035116b6 100644
--- a/src/core_modules/line_handler/message.py
+++ b/src/core_modules/line_handler/message.py
@@ -41,7 +41,13 @@ def message(events, event):
# strip prefix_symbols from the start of target, for when people use
# e.g. 'PRIVMSG +#channel :hi' which would send a message to only
# voiced-or-above users
- target = target_str.lstrip("".join(event["server"].statusmsg))
+ statusmsg = ""
+ for char in target_str:
+ if char in event["server"].statusmsg:
+ statusmsg += char
+ else:
+ break
+ target = target_str.replace(statusmsg, "", 1)
is_channel = event["server"].is_channel(target)
@@ -54,7 +60,8 @@ def message(events, event):
kwargs = {"server": event["server"], "target": target_obj,
"target_str": target_str, "user": user, "tags": event["line"].tags,
- "is_channel": is_channel, "from_self": from_self, "line": event["line"]}
+ "is_channel": is_channel, "from_self": from_self, "line": event["line"],
+ "statusmsg": statusmsg}
action = False
diff --git a/src/core_modules/nick_regain.py b/src/core_modules/nick_regain.py
index cf1dfa48..7a05988c 100644
--- a/src/core_modules/nick_regain.py
+++ b/src/core_modules/nick_regain.py
@@ -2,8 +2,8 @@ from src import ModuleManager, utils
class Module(ModuleManager.BaseModule):
def _done_connecting(self, server):
- target_nick = server.connection_params.nickname
- if not server.irc_equals(server.nickname, target_nick):
+ target_nick = self._target(server)
+ if not self._regained(server, target_nick):
if "MONITOR" in server.isupport:
server.send_raw("MONITOR + %s" % target_nick)
else:
@@ -17,16 +17,34 @@ class Module(ModuleManager.BaseModule):
def no_motd(self, event):
self._done_connecting(event["server"])
+ def _regained(self, server, target_nickname):
+ return server.irc_equals(target_nickname, server.nickname)
+ def _target(self, server):
+ return server.connection_params.nickname
+
@utils.hook("self.nick")
def self_nick(self, event):
- target_nick = event["server"].connection_params.nickname
- if event["server"].irc_equals(event["new_nickname"], target_nick):
+ target_nick = self._target(event["server"])
+ if self._regained(event["server"], target_nick):
if "MONITOR" in event["server"].isupport:
- event["server"].send_raw("MONITOR - %s " % target_nick)
+ event["server"].send_raw("MONITOR - %s" % target_nick)
+
+ @utils.hook("received.nick")
+ def nick(self, event):
+ self._check(event["server"], event["old_nickname"])
+ @utils.hook("received.quit")
+ def quit(self, event):
+ self._check(event["server"], event["user"].nickname)
+
+ def _check(self, server, nickname):
+ target_nick = self._target(server)
+ if (not self._regained(server, target_nick)
+ and server.irc_equals(nickname, target_nick)):
+ server.send_nick(target_nick)
@utils.hook("received.731")
def mon_offline(self, event):
- target_nick = event["server"].connection_params.nickname
+ target_nick = self._target(event["server"])
nicks = event["line"].args[1].split(",")
nicks = [event["server"].irc_lower(n) for n in nicks]
if event["server"].irc_lower(target_nick) in nicks:
@@ -34,15 +52,15 @@ class Module(ModuleManager.BaseModule):
def _ison_check(self, timer):
server = timer.kwargs["server"]
- target_nick = server.connection_params.nickname
- if not server.irc_equals(server.nickname, target_nick):
+ target_nick = self._target(server)
+ if not self._regained(server, target_nick):
server.send_raw("ISON %s" % target_nick)
timer.redo()
@utils.hook("received.303")
def ison_response(self, event):
- target_nick = event["server"].connection_params.nickname
- if not event["line"].args[1] and not event["server"].irc_equals(
- event["server"].nickname, target_nick):
+ target_nick = self._target(event["server"])
+ if (not event["line"].args[1] and
+ not self._regained(event["server"], target_nick)):
event["server"].send_nick(target_nick)
diff --git a/src/core_modules/permissions/__init__.py b/src/core_modules/permissions/__init__.py
index 0559774c..0c591ebe 100644
--- a/src/core_modules/permissions/__init__.py
+++ b/src/core_modules/permissions/__init__.py
@@ -2,10 +2,11 @@
import base64, binascii, os
import scrypt
-from src import ModuleManager, utils
+from src import EventManager, ModuleManager, utils
HOSTMASKS_SETTING = "hostmask-account"
NO_PERMISSION = "You do not have permission to do that"
+ACCOUNT_TAG = utils.irc.MessageTag("account")
class Module(ModuleManager.BaseModule):
def on_load(self):
@@ -56,6 +57,8 @@ class Module(ModuleManager.BaseModule):
def _has_identified(self, server, user, account):
user._id_override = server.get_user_id(account)
+ self.events.on("internal.identified").call(server=server, user=user,
+ accunt=account)
def _is_identified(self, user):
return not user._id_override == None
def _signout(self, user):
@@ -117,6 +120,13 @@ class Module(ModuleManager.BaseModule):
event["user"].account)
else:
self._set_hostmask(event["server"], event["user"])
+ @utils.hook("received.message.private")
+ @utils.hook("received.message.channel")
+ @utils.kwarg("priority", EventManager.PRIORITY_HIGH)
+ def account_tag(self, event):
+ account = ACCOUNT_TAG.get_value(event["line"].tags)
+ if not account == None:
+ self._has_identified(event["server"], event["user"], account)
def _get_permissions(self, user):
if self._is_identified(user):
@@ -219,8 +229,6 @@ class Module(ModuleManager.BaseModule):
event["stdout"].write("Correct password, you have "
"been identified as %s." % account)
- self.events.on("internal.identified").call(
- user=event["user"])
else:
event["stderr"].write("Incorrect password for '%s'" %
account)
@@ -307,7 +315,7 @@ class Module(ModuleManager.BaseModule):
hostmasks.append(hostmask)
event["user"].set_setting(HOSTMASKS_SETTING, hostmasks)
- hostmask_obj = utils.irc.hostmask_parse(hostmaks)
+ hostmask_obj = utils.irc.hostmask_parse(hostmask)
self._specific_hostmask(event["server"], hostmask_obj, account)
self._add_hostmask(event["server"], hostmask_obj, account)