diff --git a/zhenxun/builtin_plugins/admin/welcome_message/__init__.py b/zhenxun/builtin_plugins/admin/welcome_message/__init__.py index 28ed1952..36444928 100644 --- a/zhenxun/builtin_plugins/admin/welcome_message/__init__.py +++ b/zhenxun/builtin_plugins/admin/welcome_message/__init__.py @@ -125,7 +125,7 @@ async def _(session: Uninfo, arparma: Arparma, idx: Match[int]): @_del_matcher.handle() async def _(session: Uninfo, arparma: Arparma, idx: int): - result = await Manager.delete_group_message(session, int(idx)) + result = await Manager.delete_group_message(session, idx) if not result: await MessageUtils.build_message("未查找到指定id的群组欢迎消息...").finish() await MessageUtils.build_message(result).send() diff --git a/zhenxun/builtin_plugins/admin/welcome_message/data_source.py b/zhenxun/builtin_plugins/admin/welcome_message/data_source.py index 811a8dda..2ccb33ee 100644 --- a/zhenxun/builtin_plugins/admin/welcome_message/data_source.py +++ b/zhenxun/builtin_plugins/admin/welcome_message/data_source.py @@ -22,8 +22,11 @@ BASE_PATH.mkdir(parents=True, exist_ok=True) driver = nonebot.get_driver() -old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json" -if old_file.exists(): +def __migrate(): + """首次数据迁移""" + old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json" + if not old_file.exists(): + return try: old_data: dict[str, str] = json.load(old_file.open(encoding="utf8")) for group_id, message in old_data.items(): @@ -53,6 +56,7 @@ def migrate(path: Path): 参数: path: 路径 """ + __migrate() text_file = path / "text.json" if not text_file.exists(): return @@ -248,9 +252,11 @@ class Manager: 返回: list: 消息内容 """ + path = cls.get_path(session) json_data = cls.__get_data(session) - if not json_data: + if not json_data or not path: return None + file = path / "text.json" key_list = list(json_data.keys()) if idx < 0 or idx >= len(key_list): return None diff --git a/zhenxun/builtin_plugins/help_help.py b/zhenxun/builtin_plugins/help_help.py index c315bcd8..fec04a8d 100644 --- a/zhenxun/builtin_plugins/help_help.py +++ b/zhenxun/builtin_plugins/help_help.py @@ -2,11 +2,12 @@ import os import random from nonebot import on_message +from nonebot.adapters import Event from nonebot.matcher import Matcher from nonebot.plugin import PluginMetadata -from nonebot.rule import to_me from nonebot_plugin_alconna import UniMsg from nonebot_plugin_session import EventSession +from nonebot_plugin_uninfo import Uninfo from zhenxun.configs.path_config import IMAGE_PATH from zhenxun.configs.utils import PluginExtraData @@ -29,7 +30,22 @@ __plugin_meta__ = PluginMetadata( ).to_dict(), ) -_matcher = on_message(rule=to_me(), priority=996, block=False) + +async def rule(event: Event, message: UniMsg, session: Uninfo) -> bool: + group_id = session.group.id if session.group else None + text = message.extract_plain_text().strip() + if await BanConsole.is_ban(session.user.id, group_id): + return False + if group_id: + if await BanConsole.is_ban(None, group_id): + return False + if g := await GroupConsole.get_group(group_id): + if g.level < 0: + return False + return event.is_tome() and bool(text and len(text) < 20) + + +_matcher = on_message(rule=rule, priority=996, block=False) _path = IMAGE_PATH / "_base" / "laugh" @@ -37,37 +53,30 @@ _path = IMAGE_PATH / "_base" / "laugh" @_matcher.handle() async def _(matcher: Matcher, message: UniMsg, session: EventSession): - gid = session.id3 or session.id2 - if await BanConsole.is_ban(session.id1, gid): + text = message.extract_plain_text().strip() + plugin = await PluginInfo.get_or_none( + name=text, + load_status=True, + plugin_type=PluginType.NORMAL, + block_type__isnull=True, + status=True, + ) + + if not plugin: return - if gid: - if await BanConsole.is_ban(None, gid): - return - if g := await GroupConsole.get_group(gid): - if g.level < 0: - return - if text := message.extract_plain_text().strip(): - if plugin := await PluginInfo.get_or_none( - name=text, - load_status=True, - plugin_type=PluginType.NORMAL, - block_type__isnull=True, - status=True, - ): - image = None - if _path.exists(): - if files := os.listdir(_path): - image = _path / random.choice(files) - message_list = [] - if image: - message_list.append(image) - message_list.append( - "桀桀桀,预判到会有 '笨蛋' 把功能名称当命令用,特地前来嘲笑!" - f"但还是好心来帮帮你啦!\n请at我发送 '帮助{plugin.name}' 或者" - f" '帮助{plugin.id}' 来获取该功能帮助!" - ) - logger.info( - "检测到功能名称当命令使用,已发送帮助信息", "功能帮助", session=session - ) - await MessageUtils.build_message(message_list).send(reply_to=True) - matcher.stop_propagation() + + image = None + if _path.exists(): + if files := os.listdir(_path): + image = _path / random.choice(files) + message_list = [] + if image: + message_list.append(image) + message_list.append( + "桀桀桀,预判到会有 '笨蛋' 把功能名称当命令用,特地前来嘲笑!" + f"但还是好心来帮帮你啦!\n请at我发送 '帮助{plugin.name}' 或者" + f" '帮助{plugin.id}' 来获取该功能帮助!" + ) + logger.info("检测到功能名称当命令使用,已发送帮助信息", "功能帮助", session=session) + await MessageUtils.build_message(message_list).send(reply_to=True) + matcher.stop_propagation() diff --git a/zhenxun/builtin_plugins/shop/_data_source.py b/zhenxun/builtin_plugins/shop/_data_source.py index c4343bbb..2160238d 100644 --- a/zhenxun/builtin_plugins/shop/_data_source.py +++ b/zhenxun/builtin_plugins/shop/_data_source.py @@ -478,35 +478,42 @@ class ShopManage: user = await UserConsole.get_user(user_id, platform) if not user.props: return None - is_change = False - for uuid in list(user.props.keys()): - if user.props[uuid] <= 0: - is_change = True - del user.props[uuid] - if is_change: - await user.save(update_fields=["props"]) - result = await GoodsInfo.filter(uuid__in=user.props.keys()).all() - data_list = [] - uuid2goods = {item.uuid: item for item in result} - column_name = ["-", "使用ID", "名称", "数量", "简介"] - for i, p in enumerate(user.props): - if prop := uuid2goods.get(p): - icon = "" - icon_path = ICON_PATH / prop.icon - if icon_path.exists(): - icon = (icon_path, 33, 33) - data_list.append( - [ - icon, - i, - prop.goods_name, - user.props[p], - prop.goods_description, - ] - ) + user.props = {uuid: count for uuid, count in user.props.items() if count > 0} + + goods_list = await GoodsInfo.filter(uuid__in=user.props.keys()).all() + goods_by_uuid = {item.uuid: item for item in goods_list} + + table_rows = [] + for i, prop_uuid in enumerate(user.props): + prop = goods_by_uuid.get(prop_uuid) + if not prop: + continue + + icon = "" + if prop.icon: + icon_path = ICON_PATH / prop.icon + icon = (icon_path, 33, 33) if icon_path.exists() else "" + + table_rows.append( + [ + icon, + i, + prop.goods_name, + user.props[prop_uuid], + prop.goods_description, + ] + ) + + if not table_rows: + return None + + column_name = ["-", "使用ID", "名称", "数量", "简介"] return await ImageTemplate.table_page( - f"{name}的道具仓库", "", column_name, data_list + f"{name}的道具仓库", + "通过 使用道具[ID/名称] 令道具生效", + column_name, + table_rows, ) @classmethod diff --git a/zhenxun/utils/rules.py b/zhenxun/utils/rules.py index d439e3fe..9f2a4ab6 100644 --- a/zhenxun/utils/rules.py +++ b/zhenxun/utils/rules.py @@ -5,6 +5,8 @@ from nonebot_plugin_session import EventSession from nonebot_plugin_uninfo import Uninfo from zhenxun.configs.config import Config +from zhenxun.models.ban_console import BanConsole +from zhenxun.models.group_console import GroupConsole from zhenxun.models.level_user import LevelUser from zhenxun.utils.platform import PlatformUtils @@ -89,3 +91,21 @@ def notice_rule(event_type: type | list[type]) -> Rule: return False return Rule(_rule) + + +def is_allowed_call() -> Rule: + """是否允许调用插件""" + + async def _rule(session: Uninfo) -> bool: + group_id = session.group.id if session.group else None + if await BanConsole.is_ban(session.user.id, group_id): + return False + if group_id: + if await BanConsole.is_ban(None, group_id): + return False + if g := await GroupConsole.get_group(group_id): + if g.level < 0: + return False + return True + + return Rule(_rule)