first draft of command_spec.py
This commit is contained in:
parent
a9a9cd816b
commit
fa98b72fd5
2 changed files with 76 additions and 1 deletions
73
src/core_modules/command_spec.py
Normal file
73
src/core_modules/command_spec.py
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
from src import ModuleManager, utils
|
||||||
|
|
||||||
|
class Module(ModuleManager.BaseModule):
|
||||||
|
def _spec_chunk(self, server, channel, types, args):
|
||||||
|
options = []
|
||||||
|
first_error = None
|
||||||
|
for type in types:
|
||||||
|
chunk = None
|
||||||
|
n = 0
|
||||||
|
error = None
|
||||||
|
|
||||||
|
if type == "time" and args:
|
||||||
|
time, _ = utils.parse.timed_args(args)
|
||||||
|
chunk = time
|
||||||
|
n = 1
|
||||||
|
error = "Invalid timeframe"
|
||||||
|
elif type == "channel" and args:
|
||||||
|
if args[0] in server.channels:
|
||||||
|
chunk = server.channels.get(args[0])
|
||||||
|
n = 1
|
||||||
|
error = "No such channel"
|
||||||
|
elif type == "cuser" and args:
|
||||||
|
user = server.get_user(args[0], create=False)
|
||||||
|
if user and channel.has_user(user):
|
||||||
|
chunk = user
|
||||||
|
n = 1
|
||||||
|
error = "That user is not in this channel"
|
||||||
|
elif type == "user" and args:
|
||||||
|
chunk = server.get_user(args[0], create=False)
|
||||||
|
n = 1
|
||||||
|
error = "No such user"
|
||||||
|
elif type == "word" and args:
|
||||||
|
chunk = args[0]
|
||||||
|
n = 1
|
||||||
|
elif type == "...":
|
||||||
|
chunk = " ".join(args)
|
||||||
|
n = len(args)
|
||||||
|
|
||||||
|
options.append([type, chunk, n, error])
|
||||||
|
return options
|
||||||
|
|
||||||
|
@utils.hook("preprocess.command")
|
||||||
|
def preprocess(self, event):
|
||||||
|
spec = event["hook"].get_kwarg("spec", None)
|
||||||
|
if not spec == None:
|
||||||
|
server = event["server"]
|
||||||
|
channel = event["target"] if event["is_channel"] else None
|
||||||
|
args = event["args_split"].copy()
|
||||||
|
|
||||||
|
out = []
|
||||||
|
for word in spec.split():
|
||||||
|
types = word[1:].split("|")
|
||||||
|
optional = word[0] == "?"
|
||||||
|
|
||||||
|
options = self._spec_chunk(server, channel, types, args)
|
||||||
|
|
||||||
|
found = False
|
||||||
|
first_error = None
|
||||||
|
for type, chunk, n, error in options:
|
||||||
|
if error and not first_error:
|
||||||
|
first_error = error
|
||||||
|
|
||||||
|
if chunk:
|
||||||
|
found = True
|
||||||
|
args = args[n:]
|
||||||
|
if len(types) > 1:
|
||||||
|
chunk = [type, chunk]
|
||||||
|
out.append(chunk)
|
||||||
|
|
||||||
|
if not optional and not found:
|
||||||
|
error = first_error or "Invalid arguments"
|
||||||
|
return utils.consts.PERMISSION_HARD_FAIL, error
|
||||||
|
event["kwargs"]["spec"] = out
|
|
@ -184,7 +184,8 @@ class Module(ModuleManager.BaseModule):
|
||||||
"target": target, "target_str": target_str,
|
"target": target, "target_str": target_str,
|
||||||
"is_channel": is_channel, "line": line, "args_split": args_split,
|
"is_channel": is_channel, "line": line, "args_split": args_split,
|
||||||
"command": command, "args": " ".join(args_split), "stdout": stdout,
|
"command": command, "args": " ".join(args_split), "stdout": stdout,
|
||||||
"stderr": stderr, "tags": {}}
|
"stderr": stderr, "tags": {}, "kwargs": {}}
|
||||||
|
|
||||||
event_kwargs.update(kwargs)
|
event_kwargs.update(kwargs)
|
||||||
|
|
||||||
check_assert = lambda check: self._check_assert(event_kwargs, user,
|
check_assert = lambda check: self._check_assert(event_kwargs, user,
|
||||||
|
@ -195,6 +196,7 @@ class Module(ModuleManager.BaseModule):
|
||||||
|
|
||||||
check_success, check_message = self._check("preprocess", event_kwargs)
|
check_success, check_message = self._check("preprocess", event_kwargs)
|
||||||
if check_success:
|
if check_success:
|
||||||
|
event_kwargs.update(event_kwargs.pop("kwargs"))
|
||||||
new_event = self.events.on(hook.event_name).make_event(**event_kwargs)
|
new_event = self.events.on(hook.event_name).make_event(**event_kwargs)
|
||||||
self.log.trace("calling command '%s': %s", [command, new_event.kwargs])
|
self.log.trace("calling command '%s': %s", [command, new_event.kwargs])
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue