diff --git a/command.py b/command.py index 0ff050ed..ebd128e2 100644 --- a/command.py +++ b/command.py @@ -3,9 +3,10 @@ import re import os from apiclient import client as api -from little_shit import SkipException, get_command_name_separators +from little_shit import SkipException, get_command_name_separators, get_command_args_separators _command_name_seps = get_command_name_separators() +_command_args_seps = get_command_args_separators() class CommandNotExistsError(Exception): @@ -288,3 +289,14 @@ class CommandHub: hub = CommandHub() + + +def split_args(maxsplit=0): + def decorator(func): + def wrapper(args_text, *args, **kwargs): + args_list = list(filter(lambda arg: arg, re.split('|'.join(_command_args_seps), args_text, maxsplit))) + return func(args_list, *args, **kwargs) + + return wrapper + + return decorator diff --git a/config.py b/config.py index df129935..c8aa4c6f 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,8 @@ config = { 'fallback_command': 'natural_language.process', 'fallback_command_after_nl_processors': 'core.tuling123', - 'command_start_flags': ('/', '/', '来,', '来,'), # add '' (empty string) here to allow commands without start flags - 'command_name_separators': ('\.', '->', '::', '/'), # Regex + 'command_start_flags': ('/', '/', '来,', '来,'), # Add '' (empty string) here to allow commands without start flags + 'command_name_separators': ('->', '::', '/'), # Regex 'command_args_start_flags': (',', ':', ',', ', ', ':', ': '), # Regex + 'command_args_separators': (',', ','), # Regex } diff --git a/docs/Write_Command.md b/docs/Write_Command.md index dab6014d..71f658ef 100644 --- a/docs/Write_Command.md +++ b/docs/Write_Command.md @@ -101,3 +101,16 @@ Source 表示命令的来源(由谁发出),Target 表示命令将对谁产 高级用户可以使用 `commands/scheduler.py` 里的命令来添加计划任务以定期执行某一个或一连串命令,但对普通用户来说可能较难使用,因此对于可能有需要定期执行的命令,可以编写相应的订阅命令来方便用户使用。 命令编写者只需要在后台帮用户把要执行的任务翻译成 `commands/scheduler.py` 能够处理的形式,并直接调用其中的函数即可,该文件中的命令一般接受一个 `internal` 参数来表示是否是命令间的内部调用,在调用时,指定该参数为 True 将不会对用户发送消息,并且在执行结束后会返回相应的返回值以便调用者知道命令执行是否成功等,具体可参见 `commands/scheduler.py` 的代码。 + +## 命令参数 + +命令的函数的第一个参数为命令参数,默认情况下,是一个字符串,即用户发送的消息中命令后面的内容,可以自行切割、分析。如果需要使用默认的命令参数分隔符,可以使用 `command.py` 中的 `split_args` 装饰器,使用之后,命令的函数接收到的第一个参数将变为命令参数列表,而不再是字符串。例如: + +```python +@__registry__.register('test') +@__registry__.restrict(group_admin_only=True) +@split_args() +def test(args, ctx_msg): + if len(args) > 0: + print(args[0]) +``` diff --git a/little_shit.py b/little_shit.py index dfc1d8b7..a259387a 100644 --- a/little_shit.py +++ b/little_shit.py @@ -83,15 +83,19 @@ def get_target(ctx_msg): def get_command_start_flags(): - return tuple(sorted(config['command_start_flags'], reverse=True)) + return tuple(sorted(config.get('command_start_flags', ('',)), reverse=True)) def get_command_name_separators(): - return tuple(sorted(config['command_name_separators'], reverse=True)) + return tuple(sorted(('\.',) + config.get('command_name_separators', ()), reverse=True)) def get_command_args_start_flags(): - return tuple(sorted(('[ \t\n]',) + config['command_args_start_flags'], reverse=True)) + return tuple(sorted(('[ \t\n]',) + config.get('command_args_start_flags', ()), reverse=True)) + + +def get_command_args_separators(): + return tuple(sorted(('[ \t\n]',) + config.get('command_args_separators', ()), reverse=True)) def get_fallback_command():