mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
feat✨: test hook
This commit is contained in:
parent
7b3793728a
commit
2501a72bb8
@ -1,24 +1,13 @@
|
|||||||
from nonebot.adapters import Bot
|
from nonebot.adapters import Bot
|
||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
from nonebot_plugin_alconna import (
|
from nonebot_plugin_alconna import Arparma, Match
|
||||||
Alconna,
|
|
||||||
Args,
|
|
||||||
Arparma,
|
|
||||||
Match,
|
|
||||||
Option,
|
|
||||||
Subcommand,
|
|
||||||
on_alconna,
|
|
||||||
store_true,
|
|
||||||
)
|
|
||||||
from nonebot_plugin_saa import Image, Text
|
from nonebot_plugin_saa import Image, Text
|
||||||
from nonebot_plugin_session import EventSession
|
from nonebot_plugin_session import EventSession
|
||||||
from requests import session
|
|
||||||
|
|
||||||
from zhenxun.configs.config import Config
|
from zhenxun.configs.config import Config
|
||||||
from zhenxun.configs.utils import PluginExtraData, RegisterConfig
|
from zhenxun.configs.utils import PluginExtraData, RegisterConfig
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.enum import BlockType, PluginType
|
from zhenxun.utils.enum import BlockType, PluginType
|
||||||
from zhenxun.utils.rules import admin_check, ensure_group
|
|
||||||
|
|
||||||
from ._data_source import PluginManage, build_plugin, build_task
|
from ._data_source import PluginManage, build_plugin, build_task
|
||||||
from .command import _group_status_matcher, _status_matcher
|
from .command import _group_status_matcher, _status_matcher
|
||||||
@ -54,44 +43,7 @@ __plugin_meta__ = PluginMetadata(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# _status_matcher = on_alconna(
|
# TODO: shortcut
|
||||||
# Alconna(
|
|
||||||
# "switch",
|
|
||||||
# Option("-t|--task", action=store_true, help_text="被动技能"),
|
|
||||||
# Subcommand(
|
|
||||||
# "open",
|
|
||||||
# Args["name", str],
|
|
||||||
# Option(
|
|
||||||
# "-g|--group",
|
|
||||||
# Args["group_id", str],
|
|
||||||
# ),
|
|
||||||
# ),
|
|
||||||
# Subcommand(
|
|
||||||
# "close",
|
|
||||||
# Args["name", str],
|
|
||||||
# Option(
|
|
||||||
# "-t|--type",
|
|
||||||
# Args["block_type", ["all", "a", "private", "p", "group", "g"]],
|
|
||||||
# ),
|
|
||||||
# Option(
|
|
||||||
# "-g|--group",
|
|
||||||
# Args["group_id", str],
|
|
||||||
# ),
|
|
||||||
# ),
|
|
||||||
# ),
|
|
||||||
# rule=admin_check("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL"),
|
|
||||||
# priority=5,
|
|
||||||
# block=True,
|
|
||||||
# )
|
|
||||||
|
|
||||||
# # TODO: shortcut
|
|
||||||
|
|
||||||
# _group_status_matcher = on_alconna(
|
|
||||||
# Alconna("group-status", Args["status", ["sleep", "wake"]]),
|
|
||||||
# rule=admin_check("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL") & ensure_group,
|
|
||||||
# priority=5,
|
|
||||||
# block=True,
|
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
@_status_matcher.assign("$main")
|
@_status_matcher.assign("$main")
|
||||||
|
|||||||
@ -249,8 +249,8 @@ class PluginManage:
|
|||||||
if plugin:
|
if plugin:
|
||||||
if group_id:
|
if group_id:
|
||||||
if group := await GroupConsole.get_or_none(group_id=group_id):
|
if group := await GroupConsole.get_or_none(group_id=group_id):
|
||||||
if f"super:{plugin_name}," not in group.block_plugin:
|
if f"super:{plugin.module}," not in group.block_plugin:
|
||||||
group.block_plugin += f"super:{plugin_name},"
|
group.block_plugin += f"super:{plugin.module},"
|
||||||
await group.save(update_fields=["block_plugin"])
|
await group.save(update_fields=["block_plugin"])
|
||||||
return (
|
return (
|
||||||
f"已成功关闭群组 {group.group_name} 的 {plugin_name} 功能!"
|
f"已成功关闭群组 {group.group_name} 的 {plugin_name} 功能!"
|
||||||
@ -263,5 +263,10 @@ class PluginManage:
|
|||||||
if not block_type:
|
if not block_type:
|
||||||
return f"已成功将 {plugin.name} 全局启用!"
|
return f"已成功将 {plugin.name} 全局启用!"
|
||||||
else:
|
else:
|
||||||
|
if block_type == BlockType.ALL:
|
||||||
return f"已成功将 {plugin.name} 全局关闭!"
|
return f"已成功将 {plugin.name} 全局关闭!"
|
||||||
|
if block_type == BlockType.GROUP:
|
||||||
|
return f"已成功将 {plugin.name} 全局群组关闭!"
|
||||||
|
if block_type == BlockType.PRIVATE:
|
||||||
|
return f"已成功将 {plugin.name} 全局私聊关闭!"
|
||||||
return "没有找到这个功能喔..."
|
return "没有找到这个功能喔..."
|
||||||
|
|||||||
@ -19,7 +19,7 @@ _status_matcher = on_alconna(
|
|||||||
Args["name", [str, int]],
|
Args["name", [str, int]],
|
||||||
Option(
|
Option(
|
||||||
"-g|--group",
|
"-g|--group",
|
||||||
Args["group_id", str],
|
Args["group", str],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Subcommand(
|
Subcommand(
|
||||||
@ -31,7 +31,7 @@ _status_matcher = on_alconna(
|
|||||||
),
|
),
|
||||||
Option(
|
Option(
|
||||||
"-g|--group",
|
"-g|--group",
|
||||||
Args["group_id", str],
|
Args["group", str],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -145,7 +145,7 @@ class LimitManage:
|
|||||||
key_type = user_id
|
key_type = user_id
|
||||||
if group_id and limit.watch_type == LimitWatchType.GROUP:
|
if group_id and limit.watch_type == LimitWatchType.GROUP:
|
||||||
key_type = channel_id or group_id
|
key_type = channel_id or group_id
|
||||||
if is_limit and limiter.check(key_type):
|
if is_limit and not limiter.check(key_type):
|
||||||
if limit.result:
|
if limit.result:
|
||||||
await Text(limit.result).send()
|
await Text(limit.result).send()
|
||||||
logger.debug(
|
logger.debug(
|
||||||
@ -153,7 +153,7 @@ class LimitManage:
|
|||||||
"HOOK",
|
"HOOK",
|
||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
raise IgnoredException(f"{limit.module} 正在cd中...")
|
raise IgnoredException(f"{limit.module} 正在限制中...")
|
||||||
else:
|
else:
|
||||||
if isinstance(limiter, FreqLimiter):
|
if isinstance(limiter, FreqLimiter):
|
||||||
limiter.start_cd(key_type)
|
limiter.start_cd(key_type)
|
||||||
@ -207,6 +207,8 @@ class AuthChecker:
|
|||||||
if user_id and matcher.plugin and (module := matcher.plugin.name):
|
if user_id and matcher.plugin and (module := matcher.plugin.name):
|
||||||
user = await UserConsole.get_user(user_id, session.platform)
|
user = await UserConsole.get_user(user_id, session.platform)
|
||||||
if plugin := await PluginInfo.get_or_none(module=module):
|
if plugin := await PluginInfo.get_or_none(module=module):
|
||||||
|
if plugin.plugin_type == PluginType.HIDDEN:
|
||||||
|
return
|
||||||
try:
|
try:
|
||||||
cost_gold = await self.auth_cost(user, plugin, session)
|
cost_gold = await self.auth_cost(user, plugin, session)
|
||||||
if session.id1 in bot.config.superusers:
|
if session.id1 in bot.config.superusers:
|
||||||
@ -277,6 +279,19 @@ class AuthChecker:
|
|||||||
channel_id = None
|
channel_id = None
|
||||||
if user_id:
|
if user_id:
|
||||||
if group_id:
|
if group_id:
|
||||||
|
if await GroupConsole.is_super_block_plugin(
|
||||||
|
group_id, plugin.module, channel_id
|
||||||
|
):
|
||||||
|
"""超级用户群组插件状态"""
|
||||||
|
if self._flmt_s.check(group_id or user_id):
|
||||||
|
self._flmt_s.start_cd(group_id or user_id)
|
||||||
|
await Text("超级管理员禁用了该群此功能...").send(reply=True)
|
||||||
|
logger.debug(
|
||||||
|
f"{plugin.name}({plugin.module}) 超级管理员禁用了该群此功能...",
|
||||||
|
"HOOK",
|
||||||
|
session=session,
|
||||||
|
)
|
||||||
|
raise IgnoredException("超级管理员禁用了该群此功能...")
|
||||||
if await GroupConsole.is_block_plugin(
|
if await GroupConsole.is_block_plugin(
|
||||||
group_id, plugin.module, channel_id
|
group_id, plugin.module, channel_id
|
||||||
):
|
):
|
||||||
@ -290,42 +305,33 @@ class AuthChecker:
|
|||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
raise IgnoredException("该群未开启此功能...")
|
raise IgnoredException("该群未开启此功能...")
|
||||||
if await GroupConsole.is_super_block_plugin(
|
|
||||||
group_id, plugin.module, channel_id
|
|
||||||
):
|
|
||||||
"""群组插件状态"""
|
|
||||||
if self._flmt_s.check(group_id or user_id):
|
|
||||||
self._flmt_s.start_cd(group_id or user_id)
|
|
||||||
await Text("超级管理员禁用了该群此功能...").send(reply=True)
|
|
||||||
logger.debug(
|
|
||||||
f"{plugin.name}({plugin.module}) 超级管理员禁用了该群此功能...",
|
|
||||||
"HOOK",
|
|
||||||
session=session,
|
|
||||||
)
|
|
||||||
raise IgnoredException("超级管理员禁用了该群此功能...")
|
|
||||||
# 群聊禁用
|
|
||||||
if not plugin.status and plugin.block_type == BlockType.GROUP:
|
if not plugin.status and plugin.block_type == BlockType.GROUP:
|
||||||
|
"""全局群组禁用"""
|
||||||
try:
|
try:
|
||||||
if self._flmt_c.check(group_id):
|
if self._flmt_c.check(group_id):
|
||||||
self._flmt_c.start_cd(group_id)
|
self._flmt_c.start_cd(group_id)
|
||||||
await Text("该功能在群聊中已被禁用...").send(reply=True)
|
await Text("该功能在群组中已被禁用...").send(reply=True)
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
logger.error(
|
||||||
|
"auth_plugin 发送消息失败", "HOOK", session=session, e=e
|
||||||
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 该插件在群聊中已被禁用...",
|
f"{plugin.name}({plugin.module}) 该插件在群组中已被禁用...",
|
||||||
"HOOK",
|
"HOOK",
|
||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
raise IgnoredException("该插件在群聊中已被禁用...")
|
raise IgnoredException("该插件在群组中已被禁用...")
|
||||||
else:
|
else:
|
||||||
# 私聊禁用
|
|
||||||
if not plugin.status and plugin.block_type == BlockType.PRIVATE:
|
if not plugin.status and plugin.block_type == BlockType.PRIVATE:
|
||||||
|
"""全局私聊禁用"""
|
||||||
try:
|
try:
|
||||||
if self._flmt_c.check(user_id):
|
if self._flmt_c.check(user_id):
|
||||||
self._flmt_c.start_cd(user_id)
|
self._flmt_c.start_cd(user_id)
|
||||||
await Text("该功能在私聊中已被禁用...").send()
|
await Text("该功能在私聊中已被禁用...").send()
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
logger.error(
|
||||||
|
"auth_admin 发送消息失败", "HOOK", session=session, e=e
|
||||||
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 该插件在私聊中已被禁用...",
|
f"{plugin.name}({plugin.module}) 该插件在私聊中已被禁用...",
|
||||||
"HOOK",
|
"HOOK",
|
||||||
@ -356,9 +362,11 @@ class AuthChecker:
|
|||||||
"""
|
"""
|
||||||
user_id = session.id1
|
user_id = session.id1
|
||||||
group_id = session.id3 or session.id2
|
group_id = session.id3 or session.id2
|
||||||
if user_id and group_id and plugin.admin_level:
|
if user_id and plugin.admin_level:
|
||||||
if group_id:
|
if group_id:
|
||||||
if await LevelUser.check_level(user_id, group_id, plugin.admin_level):
|
if not await LevelUser.check_level(
|
||||||
|
user_id, group_id, plugin.admin_level
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
if self._flmt.check(user_id):
|
if self._flmt.check(user_id):
|
||||||
self._flmt.start_cd(user_id)
|
self._flmt.start_cd(user_id)
|
||||||
@ -369,9 +377,11 @@ class AuthChecker:
|
|||||||
f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}"
|
f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}"
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
).finish(reply=True)
|
).send(reply=True)
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
logger.error(
|
||||||
|
"auth_admin 发送消息失败", "HOOK", session=session, e=e
|
||||||
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 管理员权限不足...",
|
f"{plugin.name}({plugin.module}) 管理员权限不足...",
|
||||||
"HOOK",
|
"HOOK",
|
||||||
@ -379,13 +389,15 @@ class AuthChecker:
|
|||||||
)
|
)
|
||||||
raise IgnoredException("管理员权限不足...")
|
raise IgnoredException("管理员权限不足...")
|
||||||
else:
|
else:
|
||||||
if not await LevelUser.check_level(user_id, "", plugin.admin_level):
|
if not await LevelUser.check_level(user_id, None, plugin.admin_level):
|
||||||
try:
|
try:
|
||||||
await Text(
|
await Text(
|
||||||
f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}"
|
f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}"
|
||||||
).finish()
|
).send()
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
logger.error(
|
||||||
|
"auth_admin 发送消息失败", "HOOK", session=session, e=e
|
||||||
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 管理员权限不足...",
|
f"{plugin.name}({plugin.module}) 管理员权限不足...",
|
||||||
"HOOK",
|
"HOOK",
|
||||||
@ -406,7 +418,7 @@ class AuthChecker:
|
|||||||
if group_id := session.id3 or session.id2:
|
if group_id := session.id3 or session.id2:
|
||||||
text = message.extract_plain_text()
|
text = message.extract_plain_text()
|
||||||
group, _ = await GroupConsole.get_or_create(group_id=group_id)
|
group, _ = await GroupConsole.get_or_create(group_id=group_id)
|
||||||
if group.level < -1:
|
if group.level < 0:
|
||||||
"""群权限小于0"""
|
"""群权限小于0"""
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 群黑名单, 群权限-1...",
|
f"{plugin.name}({plugin.module}) 群黑名单, 群权限-1...",
|
||||||
@ -441,8 +453,8 @@ class AuthChecker:
|
|||||||
"""插件消耗金币不足"""
|
"""插件消耗金币不足"""
|
||||||
try:
|
try:
|
||||||
await Text(f"金币不足..该功能需要{plugin.cost_gold}金币..").send()
|
await Text(f"金币不足..该功能需要{plugin.cost_gold}金币..").send()
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
logger.error("auth_cost 发送消息失败", "HOOK", session=session, e=e)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{plugin.name}({plugin.module}) 金币限制..该功能需要{plugin.cost_gold}金币..",
|
f"{plugin.name}({plugin.module}) 金币限制..该功能需要{plugin.cost_gold}金币..",
|
||||||
"HOOK",
|
"HOOK",
|
||||||
|
|||||||
@ -71,6 +71,8 @@ _matcher = on_alconna(
|
|||||||
block=True,
|
block=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TODO: shortcut
|
||||||
|
|
||||||
|
|
||||||
def CheckGroupId():
|
def CheckGroupId():
|
||||||
"""
|
"""
|
||||||
@ -92,7 +94,7 @@ def CheckGroupId():
|
|||||||
return Depends(dependency)
|
return Depends(dependency)
|
||||||
|
|
||||||
|
|
||||||
@_matcher.assign("modify-level", parameterless=[])
|
@_matcher.assign("modify-level", parameterless=[CheckGroupId()])
|
||||||
async def _(session: EventSession, arparma: Arparma, state: T_State, level: int):
|
async def _(session: EventSession, arparma: Arparma, state: T_State, level: int):
|
||||||
gid = state["group_id"]
|
gid = state["group_id"]
|
||||||
group, _ = await GroupConsole.get_or_create(group_id=gid)
|
group, _ = await GroupConsole.get_or_create(group_id=gid)
|
||||||
@ -108,7 +110,7 @@ async def _(session: EventSession, arparma: Arparma, state: T_State, level: int)
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@_matcher.assign("super-handle")
|
@_matcher.assign("super-handle", parameterless=[CheckGroupId()])
|
||||||
async def _(session: EventSession, arparma: Arparma, state: T_State):
|
async def _(session: EventSession, arparma: Arparma, state: T_State):
|
||||||
gid = state["group_id"]
|
gid = state["group_id"]
|
||||||
group = await GroupConsole.get_or_none(group_id=gid)
|
group = await GroupConsole.get_or_none(group_id=gid)
|
||||||
@ -121,7 +123,7 @@ async def _(session: EventSession, arparma: Arparma, state: T_State):
|
|||||||
logger.info(f"{s}群白名单", arparma.header_result, session=session, target=gid)
|
logger.info(f"{s}群白名单", arparma.header_result, session=session, target=gid)
|
||||||
|
|
||||||
|
|
||||||
@_matcher.assign("auth-handle")
|
@_matcher.assign("auth-handle", parameterless=[CheckGroupId()])
|
||||||
async def _(session: EventSession, arparma: Arparma, state: T_State):
|
async def _(session: EventSession, arparma: Arparma, state: T_State):
|
||||||
gid = state["group_id"]
|
gid = state["group_id"]
|
||||||
await GroupConsole.update_or_create(
|
await GroupConsole.update_or_create(
|
||||||
|
|||||||
@ -82,7 +82,7 @@ class LevelUser(Model):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def check_level(cls, user_id: str, group_id: str, level: int) -> bool:
|
async def check_level(cls, user_id: str, group_id: str | None, level: int) -> bool:
|
||||||
"""检查用户权限等级是否大于 level
|
"""检查用户权限等级是否大于 level
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
@ -97,7 +97,7 @@ class LevelUser(Model):
|
|||||||
if user := await cls.get_or_none(user_id=user_id, group_id=group_id):
|
if user := await cls.get_or_none(user_id=user_id, group_id=group_id):
|
||||||
return user.user_level >= level
|
return user.user_level >= level
|
||||||
else:
|
else:
|
||||||
user_list = await cls.filter(user_id=user_id).all()
|
if user_list := await cls.filter(user_id=user_id).all():
|
||||||
user = max(user_list, key=lambda x: x.user_level)
|
user = max(user_list, key=lambda x: x.user_level)
|
||||||
return user.user_level >= level
|
return user.user_level >= level
|
||||||
return False
|
return False
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user