mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-28 04:56:57 +08:00
Add split_args decorator
This commit is contained in:
parent
1040b600d6
commit
58a1352b19
14
command.py
14
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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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])
|
||||
```
|
||||
|
@ -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():
|
||||
|
Loading…
Reference in New Issue
Block a user