创建一个新的插件
在 app/plugin/extension
目录新建一个文件夹, 文件名即为该插件的 root_dir
.
Madoka 在启动时会自动加载 extension
目录下每个子目录中的 python
文件,因此支持一个插件中包含多个命令处理文件,如 login.py
做登录,logout.py
做登出。大多时候,单个命令处理文件足以。若未提及,本文档均以单个命令文件来写。
注意
Madoka v4 不再支持单个插件注册多个命令
# 创建一个基础插件框架
from app.util.alconna import Commander
command = Commander(
'<命令头>',
'<命令简短帮助>',
<... Alconna 子命令参数>,
<... 其它配置>=<...>
)
至此,你就得到了一个基础插件。它注册了一个命令,但是它什么都不会做,因为你还没有告诉它如何处理命令。
# 如何匹配各个子命令
为了方便的处理一个命令中的各种子命令,我们提供了下面两个装饰器:
Commander.no_match()
: 无匹配子命令时使用,默认返回帮助菜单。可在某些特殊情况下使用,如.gp
直接返回个人资金。Commander.parse()
: 匹配子命令时使用(常用)(支持同时匹配多个子命令)
关于它们的参数解析,见 模块化处理命令
# 示例
下面我们以一个简单的命令匹配为例,它只处理好友消息,并且消息对象为超级管理员级别以上的用户。值得注意的是,我们还为它加上了10秒的频率控制。
from app.util.alconna import Commander
from app.util.graia import FriendMessage
from app.util.control import Permission
command = Commander(...)
@command.parse('...', events=[FriendMessage], permission=Permission.SUPER_ADMIN, friend_limit=10)
def <...>(...):
pass
# 完整实例
接下来,我们以一个简单的完整插件为例,它可以回复用户发送的消息。处理所有来源的消息,但是只有超级管理员级别以上的用户才能使用。
from typing import Union
from app.util.alconna import Arpamar, Args, Commander
from app.util.graia import Friend, Group, message
from app.util.control import Permission
command = Commander(
'echo',
'复读发送的消息',
Args['content': str]
)
@command.no_match(permission=Permission.SUPER_ADMIN)
async def echo(sender: Union[Friend, Group], cmd: Arpamar):
await message(cmd.query('content')).target(sender).send()
上次更新: 2022/11/22, 00:08:13