mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
from nonebot.plugin import on_shell_command, get_loaded_plugins, export
|
|
from nonebot.matcher import Matcher
|
|
from nonebot.typing import T_State
|
|
from nonebot.exception import IgnoredException
|
|
from nonebot.message import run_preprocessor
|
|
from nonebot.adapters.cqhttp import (
|
|
Event,
|
|
Bot,
|
|
GroupMessageEvent,
|
|
PrivateMessageEvent,
|
|
MessageEvent,
|
|
)
|
|
from configs.config import plugins2info_dict
|
|
from utils.utils import FreqLimiter
|
|
from models.ban_user import BanUser
|
|
from .data import (
|
|
block_plugin,
|
|
unblock_plugin,
|
|
get_group_plugin_list,
|
|
auto_update_plugin_list,
|
|
)
|
|
from .parser import npm_parser
|
|
|
|
# 导出给其他插件使用
|
|
export = export()
|
|
export.block_plugin = block_plugin
|
|
export.unblock_plugin = unblock_plugin
|
|
export.get_group_plugin_list = get_group_plugin_list
|
|
|
|
# 注册 shell_like 事件响应器
|
|
plugin_manager = on_shell_command("npm", parser=npm_parser, priority=1)
|
|
|
|
flmt = FreqLimiter(60)
|
|
|
|
|
|
# 在 Matcher 运行前检测其是否启用
|
|
@run_preprocessor
|
|
async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State):
|
|
if not isinstance(event, MessageEvent) and matcher.module != 'poke':
|
|
return
|
|
plugin = matcher.module
|
|
group_id = _get_group_id(event)
|
|
loaded_plugin_list = _get_loaded_plugin_list()
|
|
plugin_list = auto_update_plugin_list(loaded_plugin_list)
|
|
|
|
# 无视本插件的 Matcher
|
|
if (
|
|
plugin not in plugins2info_dict
|
|
or matcher.priority in [1, 9]
|
|
or await BanUser.is_ban(event.user_id)
|
|
):
|
|
return
|
|
if isinstance(event, PrivateMessageEvent) and plugin_list[plugin]["default"]:
|
|
return
|
|
if not plugin_list[plugin]["default"]:
|
|
if str(event.user_id) in bot.config.superusers:
|
|
return
|
|
if isinstance(event, GroupMessageEvent):
|
|
if flmt.check(event.group_id):
|
|
flmt.start_cd(event.group_id)
|
|
await bot.send_group_msg(group_id=event.group_id, message="此功能正在维护...")
|
|
else:
|
|
if flmt.check(event.user_id):
|
|
flmt.start_cd(event.user_id)
|
|
await bot.send_private_msg(user_id=event.user_id, message="此功能正在维护...")
|
|
raise IgnoredException(f"Nonebot Plugin Manager has blocked {plugin} !")
|
|
|
|
if group_id in plugin_list[plugin]:
|
|
if not plugin_list[plugin][group_id]:
|
|
if plugin != "ai" and matcher.type == "message":
|
|
if flmt.check(event.group_id):
|
|
flmt.start_cd(event.group_id)
|
|
await bot.send_group_msg(
|
|
group_id=event.group_id, message="该群未开启此功能.."
|
|
)
|
|
raise IgnoredException(f"Nonebot Plugin Manager has blocked {plugin} !")
|
|
|
|
|
|
@plugin_manager.handle()
|
|
async def _(bot: Bot, event: Event, state: T_State):
|
|
args = state["args"]
|
|
group_id = _get_group_id(event)
|
|
is_admin = _is_admin(event)
|
|
is_superuser = _is_superuser(bot, event)
|
|
if group_id == 0:
|
|
group_id = "default"
|
|
|
|
if hasattr(args, "handle"):
|
|
await plugin_manager.finish(args.handle(args, group_id, is_admin, is_superuser))
|
|
|
|
|
|
# 获取插件列表,并自动排除本插件
|
|
def _get_loaded_plugin_list() -> list:
|
|
return list(
|
|
filter(
|
|
lambda plugin: plugin != "nonebot_plugin_manager",
|
|
map(lambda plugin: plugin.name, get_loaded_plugins()),
|
|
)
|
|
)
|
|
|
|
|
|
def _get_group_id(event: Event) -> str:
|
|
try:
|
|
group_id = event.group_id
|
|
except AttributeError:
|
|
group_id = "default"
|
|
return str(group_id) if group_id else "default"
|
|
|
|
|
|
def _is_admin(event: Event) -> bool:
|
|
return (
|
|
event.sender.role in ["admin", "owner"]
|
|
if isinstance(event, GroupMessageEvent)
|
|
else False
|
|
)
|
|
|
|
|
|
def _is_superuser(bot: Bot, event: Event) -> bool:
|
|
return str(event.user_id) in bot.config.superusers
|
|
|
|
|
|
plugins_dict = {}
|