插件控制(decorators)
以下控制器有部分参考自 BlueGlassBlock
本工具类位置: shared.utils.control
使用方法
-
由于本文中所有的装饰器返回的都是
Depend(func)
形式,所以你只能在broadcast / saya
中使用 -
注意,在二次开发时请勿将修饰器实例化,以修饰器
Permission
为例,使用时格式应类似于Permission.require(...)
,而非Permission().require(...)
-
关于
Depend
依赖注入,请查看 Ariadne文档 -
broadcast:
@broadcast.receiver(GroupMessage, decorators=[Class.func()]) async def foo(...): ...
-
saya:
@channel.use( ListenerSchema( listening_events=[GroupMessage], decorators=[Class.func()] ) ) async def foo(...): ...
其中 Class
为管理类, func
为管理类调用函数,具体请查看类说明
Permission
权限管理类,用于获取成员权限或判断成员权限是否满足某一等级
导入:from shared.utils.control import Permission
Permission.get
用途:获取成员权限
示例:print(f"成员{member.name}权限为{Permission.get(group, member)}")
Permission.require
用途:判断成员权限是否满足某一等级
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Permission.require(Permission.USER)]
)
)
async def foo(...): ...
内置等级
名称 | 权限等级 | 等级 |
---|---|---|
GLOBAL_BANNED | -1 | 全局黑名单(尚未实现) |
BANNED | 0 | 群内黑名单(尚未实现) |
USER | 1 | 普通用户 |
GROUP_ADMIN | 2 | 管理员 |
SUPER_ADMIN | 3 | 超级管理员 |
MASTER | 4 | 所有者 |
备注
对于某些在同一module中不同等级需要不同相应的情形,可以使用 shared.utils.permission.user_permission_require
使用方法:
from shared.utils.permission import user_permission_require
await user_permission_require(group, member, level)
FrequencyLimit
调用频率限制类,用于限制功能调用频率
导入:from shared.utils.control import FrequencyLimit
FrequencyLimit.require
用途:限制功能调用频率
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[FrequencyLimit.require("function_name", weight=1, total_weight=10, override_level=Permission.MASTER)]
)
)
async def foo(...): ...
其中 weight
为调用一次增加的权重
total_weight
为10秒内本功能所接受的最大权重(若超过则会警告或拉黑一小时)
override_level
为不受此限制的最小权限等级(Permission
详见上文)
Switch
机器人开关控制类
用途:实现机器人全局关闭
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Switch.enable(response_administrator=True)]
)
)
async def foo(...): ...
其中 response_administrator
为在机器人关闭的情况下是否响应管理员
注:此控制器功能已默认并入 Function
控制器,在使用 Function
控制器时不需再单独调用
BlackListControl
黑名单控制类
用途:实现黑名单功能
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[BlackListControl.enable()]
)
)
async def foo(...): ...
Interval
冷却管理类
用途:实现功能调用间隔
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Interval.require(suspend_time=10, max_exec=1, override_level=Permission.MASTER, slient=False)]
)
)
async def foo(...): ...
其中 suspend_time
为冷却时间
max_exec
为在再次冷却前可使用次数
override_level
为可超越限制的最小等级(Permission
详见上文)
silent
为是否通知
UserCalledCountControl
功能调用记录类
用途:实现功能调用计数
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[UserCalledCountControl.add(data_type=UserCalledCountControl.SETU, value=1)]
)
)
async def foo(...): ...
内置类型
名称 | 类别 |
---|---|
SETU | 二次元图 |
REAL | 三次元图 |
BIZHI | 壁纸 |
AT | @机器人 |
SEARCH | 搜索功能如搜图搜番 |
CHAT | 聊天 |
FUNCTIONS | 其他功能 |
备注
对于某些在module中触发某种条件才计入功能计数的情况,可以使用 sagiri_bot.utils.update_user_call_count_plus
Function
单插件开关限制类
用途:实现单插件开关(替代 SayaManager
)
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Function.require(name=channel.module, response_administrator=False, log=False, notice=False)]
)
)
async def foo(...): ...
其中 name
为插件唯一标识,建议使用 channel.module
以防止插件重名的情况导致管理混乱
response_administrator
为在机器人关闭的情况下是否响应管理员
log
为收到消息时在控制台是否输出插件开关信息(不会计入log文件)
notice
为插件关闭时是否通知
Distribute
功能多账号任务分配类
用途:用于在一个群中有多个账号的情况,可以控制其中仅一个账号发出消息
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Distribute.distribute(require_admin=False, show_log=False)]
)
)
async def foo(...): ...
其中 require_admin
为是否获取拥有管理员权限的账号
show_log
为收到消息时是否输出账号的分配信息(不会计入log文件)
备注:SAGIRI 实现了多账户功能,物理上为多个账户,逻辑上这些账户组成一个整体,为了避免出现一个群中有多个账号多次响应同一条消息的情况,请在开发时务必使用此装饰器
Anonymous
匿名屏蔽类
用途:用于屏蔽匿名用户的功能请求
示例:
@channel.use(
ListenerSchema(
listening_events=[GroupMessage],
decorators=[Anonymous.block(message="不许匿名,你是不是想干坏事?")]
)
)
async def foo(...): ...
其中 message
为收到匿名用户的请求后返回的消息