mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-15 01:00:00 +08:00
🐛 修复群欢迎消息删除问题 (#1864)
* 🐛 修复群欢迎消息删除问题 * 🩹 优化笨蛋检测和修复商店图标问题 * 🎨 笨蛋检测更多规则移入rule * 🎨 优化我的道具方法
This commit is contained in:
@@ -125,7 +125,7 @@ async def _(session: Uninfo, arparma: Arparma, idx: Match[int]):
|
|||||||
|
|
||||||
@_del_matcher.handle()
|
@_del_matcher.handle()
|
||||||
async def _(session: Uninfo, arparma: Arparma, idx: int):
|
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:
|
if not result:
|
||||||
await MessageUtils.build_message("未查找到指定id的群组欢迎消息...").finish()
|
await MessageUtils.build_message("未查找到指定id的群组欢迎消息...").finish()
|
||||||
await MessageUtils.build_message(result).send()
|
await MessageUtils.build_message(result).send()
|
||||||
|
|||||||
@@ -22,8 +22,11 @@ BASE_PATH.mkdir(parents=True, exist_ok=True)
|
|||||||
driver = nonebot.get_driver()
|
driver = nonebot.get_driver()
|
||||||
|
|
||||||
|
|
||||||
old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json"
|
def __migrate():
|
||||||
if old_file.exists():
|
"""首次数据迁移"""
|
||||||
|
old_file = DATA_PATH / "custom_welcome_msg" / "custom_welcome_msg.json"
|
||||||
|
if not old_file.exists():
|
||||||
|
return
|
||||||
try:
|
try:
|
||||||
old_data: dict[str, str] = json.load(old_file.open(encoding="utf8"))
|
old_data: dict[str, str] = json.load(old_file.open(encoding="utf8"))
|
||||||
for group_id, message in old_data.items():
|
for group_id, message in old_data.items():
|
||||||
@@ -53,6 +56,7 @@ def migrate(path: Path):
|
|||||||
参数:
|
参数:
|
||||||
path: 路径
|
path: 路径
|
||||||
"""
|
"""
|
||||||
|
__migrate()
|
||||||
text_file = path / "text.json"
|
text_file = path / "text.json"
|
||||||
if not text_file.exists():
|
if not text_file.exists():
|
||||||
return
|
return
|
||||||
@@ -248,9 +252,11 @@ class Manager:
|
|||||||
返回:
|
返回:
|
||||||
list: 消息内容
|
list: 消息内容
|
||||||
"""
|
"""
|
||||||
|
path = cls.get_path(session)
|
||||||
json_data = cls.__get_data(session)
|
json_data = cls.__get_data(session)
|
||||||
if not json_data:
|
if not json_data or not path:
|
||||||
return None
|
return None
|
||||||
|
file = path / "text.json"
|
||||||
key_list = list(json_data.keys())
|
key_list = list(json_data.keys())
|
||||||
if idx < 0 or idx >= len(key_list):
|
if idx < 0 or idx >= len(key_list):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import os
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from nonebot import on_message
|
from nonebot import on_message
|
||||||
|
from nonebot.adapters import Event
|
||||||
from nonebot.matcher import Matcher
|
from nonebot.matcher import Matcher
|
||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
from nonebot.rule import to_me
|
|
||||||
from nonebot_plugin_alconna import UniMsg
|
from nonebot_plugin_alconna import UniMsg
|
||||||
from nonebot_plugin_session import EventSession
|
from nonebot_plugin_session import EventSession
|
||||||
|
from nonebot_plugin_uninfo import Uninfo
|
||||||
|
|
||||||
from zhenxun.configs.path_config import IMAGE_PATH
|
from zhenxun.configs.path_config import IMAGE_PATH
|
||||||
from zhenxun.configs.utils import PluginExtraData
|
from zhenxun.configs.utils import PluginExtraData
|
||||||
@@ -29,7 +30,22 @@ __plugin_meta__ = PluginMetadata(
|
|||||||
).to_dict(),
|
).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"
|
_path = IMAGE_PATH / "_base" / "laugh"
|
||||||
@@ -37,37 +53,30 @@ _path = IMAGE_PATH / "_base" / "laugh"
|
|||||||
|
|
||||||
@_matcher.handle()
|
@_matcher.handle()
|
||||||
async def _(matcher: Matcher, message: UniMsg, session: EventSession):
|
async def _(matcher: Matcher, message: UniMsg, session: EventSession):
|
||||||
gid = session.id3 or session.id2
|
text = message.extract_plain_text().strip()
|
||||||
if await BanConsole.is_ban(session.id1, gid):
|
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
|
return
|
||||||
if gid:
|
|
||||||
if await BanConsole.is_ban(None, gid):
|
image = None
|
||||||
return
|
if _path.exists():
|
||||||
if g := await GroupConsole.get_group(gid):
|
if files := os.listdir(_path):
|
||||||
if g.level < 0:
|
image = _path / random.choice(files)
|
||||||
return
|
message_list = []
|
||||||
if text := message.extract_plain_text().strip():
|
if image:
|
||||||
if plugin := await PluginInfo.get_or_none(
|
message_list.append(image)
|
||||||
name=text,
|
message_list.append(
|
||||||
load_status=True,
|
"桀桀桀,预判到会有 '笨蛋' 把功能名称当命令用,特地前来嘲笑!"
|
||||||
plugin_type=PluginType.NORMAL,
|
f"但还是好心来帮帮你啦!\n请at我发送 '帮助{plugin.name}' 或者"
|
||||||
block_type__isnull=True,
|
f" '帮助{plugin.id}' 来获取该功能帮助!"
|
||||||
status=True,
|
)
|
||||||
):
|
logger.info("检测到功能名称当命令使用,已发送帮助信息", "功能帮助", session=session)
|
||||||
image = None
|
await MessageUtils.build_message(message_list).send(reply_to=True)
|
||||||
if _path.exists():
|
matcher.stop_propagation()
|
||||||
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()
|
|
||||||
|
|||||||
@@ -478,35 +478,42 @@ class ShopManage:
|
|||||||
user = await UserConsole.get_user(user_id, platform)
|
user = await UserConsole.get_user(user_id, platform)
|
||||||
if not user.props:
|
if not user.props:
|
||||||
return None
|
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(
|
return await ImageTemplate.table_page(
|
||||||
f"{name}的道具仓库", "", column_name, data_list
|
f"{name}的道具仓库",
|
||||||
|
"通过 使用道具[ID/名称] 令道具生效",
|
||||||
|
column_name,
|
||||||
|
table_rows,
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ from nonebot_plugin_session import EventSession
|
|||||||
from nonebot_plugin_uninfo import Uninfo
|
from nonebot_plugin_uninfo import Uninfo
|
||||||
|
|
||||||
from zhenxun.configs.config import Config
|
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.models.level_user import LevelUser
|
||||||
from zhenxun.utils.platform import PlatformUtils
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
@@ -89,3 +91,21 @@ def notice_rule(event_type: type | list[type]) -> Rule:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
return Rule(_rule)
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user