aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/core_modules')
-rw-r--r--src/core_modules/command_spec/__init__.py (renamed from src/core_modules/command_spec.py)73
-rw-r--r--src/core_modules/command_spec/types.py99
2 files changed, 106 insertions, 66 deletions
diff --git a/src/core_modules/command_spec.py b/src/core_modules/command_spec/__init__.py
index 68313fd6..c28976a8 100644
--- a/src/core_modules/command_spec.py
+++ b/src/core_modules/command_spec/__init__.py
@@ -1,4 +1,5 @@
from src import EventManager, ModuleManager, utils
+from . import types
# describing command arg specifications, to centralise parsing and validating.
#
@@ -43,72 +44,12 @@ class Module(ModuleManager.BaseModule):
value = simple_value
n = simple_count
error = argument_type.error()
- elif argument_type.type == "rchannel":
- if channel:
- value = channel
- elif args:
- n = 1
- if args[0] in server.channels:
- value = server.channels.get(args[0])
- error = "No such channel"
- else:
- error = "No channel provided"
- elif argument_type.type == "channel" and args:
- if args[0] in server.channels:
- value = server.channels.get(args[0])
- n = 1
- error = "No such channel"
- elif argument_type.type == "cuser" and args:
- tuser = server.get_user(args[0], create=False)
- if tuser and channel.has_user(tuser):
- value = tuser
- n = 1
- error = "That user is not in this channel"
- elif argument_type.type == "ruser":
- if args:
- value = server.get_user(args[0], create=False)
- n = 1
- else:
- value = user
- error = "No such user"
- elif argument_type.type == "user":
- if args:
- value = server.get_user(args[0], create=False)
- n = 1
- error = "No such user"
- else:
- error = "No user provided"
- elif argument_type.type == "ouser":
- if args:
- if server.has_user_id(args[0]):
- value = server.get_user(args[0], create=True)
- error = "Unknown nickname"
- n = 1
- elif argument_type.type == "nuser":
- if args:
- value = server.get_user(args[0], create=True)
- n = 1
- elif argument_type.type == "lstring":
- if args:
- value = " ".join(args)
- n = len(args)
- else:
- last_message = (channel or user).buffer.get()
- if last_message:
- value = last_message.message
- n = 0
- else:
- n = 1
- elif argument_type.type == "channelonly":
- if channel:
- value = True
- n = 0
- error = "Command not valid in PM"
- elif argument_type.type == "privateonly":
- if not channel:
- value = True
- n = 0
- error = "Command not valid in-channel"
+ elif argument_type.type in types.TYPES:
+ func = types.TYPES[argument_type.type]
+ try:
+ value, n = func(server, channel, user, args)
+ except types.SpecTypeError as e:
+ error = e.message
options.append([argument_type, value, n, error])
return options
diff --git a/src/core_modules/command_spec/types.py b/src/core_modules/command_spec/types.py
new file mode 100644
index 00000000..cb7c841e
--- /dev/null
+++ b/src/core_modules/command_spec/types.py
@@ -0,0 +1,99 @@
+
+class SpecTypeError(Exception):
+ def __init__(self, message: str, arg_count: int=1):
+ self.message = message
+ self.arg_count = arg_count
+
+TYPES = {}
+def _type(func):
+ TYPES[func.__name__] = func
+
+def _assert_args(args, type):
+ if not args:
+ raise SpecTypeError("No %s provided" % type)
+
+@_type
+def rchannel(server, channel, user, args):
+ if channel:
+ return channel, 0
+ elif args:
+ if args[0] in server.channels:
+ return server.channels.get(args[0]), 1
+ else:
+ raise SpecTypeError("No such channel")
+ else:
+ raise SpecTypeError("No channel provided")
+
+@_type
+def channel(server, channel, user, args):
+ _assert_args(args, "channel")
+ if args[0] in server.channels:
+ return server.channels.get(args[0]), 1
+ else:
+ raise SpecTypeError("No such channel")
+
+@_type
+def cuser(server, channel, user, args):
+ _assert_args(args, "user")
+ target_user = server.get_user(args[0], create=False)
+ if target_user and channel.has_user(target_user):
+ return target_user, 1
+ else:
+ raise SpecTypeError("That user is not in this channel")
+
+@_type
+def ruser(server, channel, user, args):
+ if args:
+ target_user = server.get_user(args[0], create=False)
+ if target_user:
+ return target_user, 1
+ else:
+ raise SpecTypeError("No such user")
+ else:
+ return user, 0
+
+@_type
+def user(server, channel, user, args):
+ _assert_args(args, "user")
+ target_user = server.get_user(args[0], create=False)
+ if target_user:
+ return target_user, 1
+ else:
+ raise SpecTypeError("No such user")
+
+@_type
+def ouser(server, channel, user, args):
+ _assert_args(args, "user")
+ if server.has_user_id(args[0]):
+ return server.get_user(args[0], create=True), 1
+ else:
+ raise SpecTypeError("No such user")
+
+@_type
+def nuser(server, channel, user, args):
+ _assert_args(args, "user")
+ return server.get_user(args[0], create=True), 1
+
+@_type
+def lstring(server, channel, user, args):
+ if args:
+ return " ".join(args), len(args)
+ else:
+ last_message = (channel or user).buffer.get()
+ if last_message:
+ return last_message.message, 0
+ else:
+ raise SpecTypeError("No message found")
+
+@_type
+def channelonly(server, channel, user, args):
+ if channel:
+ return True, 0
+ else:
+ raise SpecTypeError("Command not valid in PM")
+@_type
+def privateonly(server, channel, user, args):
+ if not channel:
+ return True, 0
+ else:
+ raise SpecTypeError("Command not valid in channel")