aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar jesopo2020-01-25 23:57:27 +0000
committerGravatar jesopo2020-01-25 23:57:27 +0000
commit1a8a4ac9d40da780d2760a19f62f4f7dc51f72b6 (patch)
treea9b9b0cbb99f8d7317011518164812646237ff7f /src
parentwhen available, use command spec for !help usage (diff)
signature
support spec arg "context" (e.g. private only), marked exported as private
Diffstat (limited to 'src')
-rw-r--r--src/core_modules/help.py11
-rw-r--r--src/utils/parse.py37
2 files changed, 36 insertions, 12 deletions
diff --git a/src/core_modules/help.py b/src/core_modules/help.py
index 3ebe4f66..bc104839 100644
--- a/src/core_modules/help.py
+++ b/src/core_modules/help.py
@@ -4,14 +4,18 @@ from src import IRCBot, ModuleManager, utils
class Module(ModuleManager.BaseModule):
def _get_help(self, hook):
return hook.get_kwarg("help", None) or hook.docstring.description
- def _get_usage(self, hook, command, command_prefix=""):
+ def _get_usage(self, hook, is_channel, command, command_prefix=""):
command = "%s%s" % (command_prefix, command)
spec = hook.get_kwargs("spec")
usages_kwarg = hook.get_kwargs("usage")
if spec:
- usages = [utils.parse.argument_spec_human(s) for s in spec]
+ if is_channel:
+ context = utils.parse.SpecArgumentContext.CHANNEL
+ else:
+ context = utils.parse.SpecArgumentContext.PRIVATE
+ usages = [utils.parse.argument_spec_human(s, context) for s in spec]
elif usage:
usages = usages_kwarg
@@ -36,7 +40,8 @@ class Module(ModuleManager.BaseModule):
if hook == None:
raise utils.EventError("Unknown command '%s'" % command)
help = self._get_help(hook)
- usage = self._get_usage(hook, command, event["command_prefix"])
+ usage = self._get_usage(hook, event["is_channel"], command,
+ event["command_prefix"])
out = help
if usage:
diff --git a/src/utils/parse.py b/src/utils/parse.py
index d2198e5f..4f9c7f26 100644
--- a/src/utils/parse.py
+++ b/src/utils/parse.py
@@ -1,4 +1,4 @@
-import decimal, io, typing
+import decimal, enum, io, typing
from . import datetime, errors
COMMENT_TYPES = ["#", "//"]
@@ -156,7 +156,14 @@ def format_token_replace(s: str, vars: typing.Dict[str, str],
s = s[:i] + vars[token.replace(sigil, "", 1)] + s[i+len(token):]
return s
+class SpecArgumentContext(enum.IntFlag):
+ CHANNEL = 1
+ PRIVATE = 2
+ ALL = 3
+
class SpecArgumentType(object):
+ context = SpecArgumentContext.ALL
+
def __init__(self, type_name: str, name: typing.Optional[str], exported: str):
self.type = type_name
self._name = name
@@ -195,6 +202,9 @@ class SpecArgumentTypeTime(SpecArgumentType):
def error(self) -> typing.Optional[str]:
return "Invalid timeframe"
+class SpecArgumentPrivateType(SpecArgumentType):
+ context = SpecArgumentContext.PRIVATE
+
SPEC_ARGUMENT_TYPES = {
"word": SpecArgumentTypeWord,
"wordlower": SpecArgumentTypeWordLower,
@@ -228,20 +238,29 @@ def argument_spec(spec: str) -> typing.List[SpecArgument]:
argument_type_class = SpecArgumentType
if argument_type in SPEC_ARGUMENT_TYPES:
argument_type_class = SPEC_ARGUMENT_TYPES[argument_type]
+ elif exported:
+ argument_type_class = SpecArgumentPrivateType
+
argument_types.append(argument_type_class(argument_type,
argument_type_name, exported))
out.append(SpecArgument(optional, argument_types))
return out
-def argument_spec_human(spec: typing.List[SpecArgument]) -> str:
+def argument_spec_human(spec: typing.List[SpecArgument],
+ context: SpecArgumentContext=SpecArgumentContext.ALL) -> str:
out: typing.List[str] = []
for spec_argument in spec:
- names = [t.name() or t.type for t in spec_argument.types]
- names = list(filter(None, names))
+ names: typing.List[str] = []
+ for argument_type in spec_argument.types:
+ if not (context&argument_type.context) == 0:
+ name = argument_type.name() or argument_type.type
+ if name:
+ names.append(name)
- if spec_argument.optional:
- format = "[%s]"
- else:
- format = "<%s>"
- out.append(format % "|".join(names))
+ if names:
+ if spec_argument.optional:
+ format = "[%s]"
+ else:
+ format = "<%s>"
+ out.append(format % "|".join(names))
return " ".join(out)