Add split_args decorator

This commit is contained in:
Richard Chien 2017-01-11 15:20:00 +08:00
parent 1040b600d6
commit 58a1352b19
4 changed files with 36 additions and 6 deletions

View File

@ -3,9 +3,10 @@ import re
import os import os
from apiclient import client as api 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_name_seps = get_command_name_separators()
_command_args_seps = get_command_args_separators()
class CommandNotExistsError(Exception): class CommandNotExistsError(Exception):
@ -288,3 +289,14 @@ class CommandHub:
hub = 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

View File

@ -1,7 +1,8 @@
config = { config = {
'fallback_command': 'natural_language.process', 'fallback_command': 'natural_language.process',
'fallback_command_after_nl_processors': 'core.tuling123', 'fallback_command_after_nl_processors': 'core.tuling123',
'command_start_flags': ('/', '', '来,', '来,'), # add '' (empty string) here to allow commands without start flags 'command_start_flags': ('/', '', '来,', '来,'), # Add '' (empty string) here to allow commands without start flags
'command_name_separators': ('\.', '->', '::', '/'), # Regex 'command_name_separators': ('->', '::', '/'), # Regex
'command_args_start_flags': ('', '', ',', ', ', ':', ': '), # Regex 'command_args_start_flags': ('', '', ',', ', ', ':', ': '), # Regex
'command_args_separators': ('', ','), # Regex
} }

View File

@ -101,3 +101,16 @@ Source 表示命令的来源由谁发出Target 表示命令将对谁产
高级用户可以使用 `commands/scheduler.py` 里的命令来添加计划任务以定期执行某一个或一连串命令,但对普通用户来说可能较难使用,因此对于可能有需要定期执行的命令,可以编写相应的订阅命令来方便用户使用。 高级用户可以使用 `commands/scheduler.py` 里的命令来添加计划任务以定期执行某一个或一连串命令,但对普通用户来说可能较难使用,因此对于可能有需要定期执行的命令,可以编写相应的订阅命令来方便用户使用。
命令编写者只需要在后台帮用户把要执行的任务翻译成 `commands/scheduler.py` 能够处理的形式,并直接调用其中的函数即可,该文件中的命令一般接受一个 `internal` 参数来表示是否是命令间的内部调用,在调用时,指定该参数为 True 将不会对用户发送消息,并且在执行结束后会返回相应的返回值以便调用者知道命令执行是否成功等,具体可参见 `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])
```

View File

@ -83,15 +83,19 @@ def get_target(ctx_msg):
def get_command_start_flags(): 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(): 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(): 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(): def get_fallback_command():