Compare commits

...

2 Commits

Author SHA1 Message Date
pre-commit-ci[bot]
e6f6ad0559 🚨 auto fix by pre-commit hooks 2025-10-22 10:22:51 +00:00
webjoin111
6815caf805 🐛 fix(tag): 修复黑名单标签解析逻辑并优化标签详情展示 2025-10-22 18:22:34 +08:00
4 changed files with 57 additions and 28 deletions

View File

@ -213,17 +213,31 @@ async def handle_info(name: Match[str], bot: Bot):
msg += f"模式: {mode}\n" msg += f"模式: {mode}\n"
msg += f"描述: {details['description'] or ''}\n" msg += f"描述: {details['description'] or ''}\n"
if details["tag_type"] == "DYNAMIC": if details["tag_type"] == "STATIC" and details["is_blacklist"]:
msg += f"排除群组 ({len(details['groups'])}个):\n"
if details["groups"]:
msg += "\n".join(f"- {gid}" for gid in details["groups"])
else:
msg += ""
msg += "\n\n"
if details["tag_type"] == "DYNAMIC" and details.get("dynamic_rule"):
msg += f"动态规则: {details['dynamic_rule']}\n" msg += f"动态规则: {details['dynamic_rule']}\n"
if details["resolved_groups"] is not None:
msg += f"当前匹配群组 ({len(details['resolved_groups'])}个):\n" title = (
if details["resolved_groups"]: "当前生效群组"
msg += "\n".join( if details["tag_type"] == "DYNAMIC" or details["is_blacklist"]
f"- {g_name} ({g_id})" else "关联群组"
for g_id, g_name in details["resolved_groups"] )
)
else: if details["resolved_groups"] is not None:
msg += "" msg += f"{title} ({len(details['resolved_groups'])}个):\n"
if details["resolved_groups"]:
msg += "\n".join(
f"- {g_name} ({g_id})" for g_id, g_name in details["resolved_groups"]
)
else:
msg += ""
else: else:
msg += f"关联群组 ({len(details['groups'])}个):\n" msg += f"关联群组 ({len(details['groups'])}个):\n"
if details["groups"]: if details["groups"]:

View File

@ -468,9 +468,7 @@ class SchedulerManager:
"required_permission": required_permission, "required_permission": required_permission,
"source": source, "source": source,
"is_one_off": is_one_off, "is_one_off": is_one_off,
"execution_options": model_dump( "execution_options": model_dump(validated_options, exclude_none=True),
validated_options, exclude_none=True
),
} }
defaults = {k: v for k, v in defaults.items() if v is not None} defaults = {k: v for k, v in defaults.items() if v is not None}

View File

@ -77,6 +77,7 @@ class Trigger:
"""创建一个 Date 触发器配置。""" """创建一个 Date 触发器配置。"""
return DateTrigger(**kwargs) return DateTrigger(**kwargs)
class ExecutionOptions(BaseModel): class ExecutionOptions(BaseModel):
""" """
封装定时任务的执行策略包括重试和回调 封装定时任务的执行策略包括重试和回调

View File

@ -234,16 +234,13 @@ class TagManager:
if not tag: if not tag:
return None return None
resolved_groups = None final_group_ids = await self.resolve_tag_to_group_ids(name, bot=bot)
if tag.tag_type == "DYNAMIC" and bot: resolved_groups: list[tuple[str, str]] = []
resolved_group_ids = await self.resolve_tag_to_group_ids(name, bot=bot) if final_group_ids:
if resolved_group_ids: groups_from_db = await GroupConsole.filter(
groups_from_db = await GroupConsole.filter( group_id__in=final_group_ids
group_id__in=resolved_group_ids ).all()
).all() resolved_groups = [(g.group_id, g.group_name) for g in groups_from_db]
resolved_groups = [(g.group_id, g.group_name) for g in groups_from_db]
else:
resolved_groups = []
return { return {
"name": tag.name, "name": tag.name,
@ -418,18 +415,37 @@ class TagManager:
if not tag: if not tag:
return [] return []
if tag.tag_type == "DYNAMIC": associated_groups: set[str] = set()
if tag.tag_type == "STATIC":
associated_groups = {str(link.group_id) for link in tag.groups}
elif tag.tag_type == "DYNAMIC":
if not tag.dynamic_rule or not isinstance(tag.dynamic_rule, dict | str): if not tag.dynamic_rule or not isinstance(tag.dynamic_rule, dict | str):
return [] return []
associated_groups = await self._resolve_dynamic_tag(tag.dynamic_rule, bot) dynamic_ids = await self._resolve_dynamic_tag(tag.dynamic_rule, bot)
associated_groups = {str(gid) for gid in dynamic_ids}
else: else:
associated_groups = {link.group_id for link in tag.groups} associated_groups = {str(link.group_id) for link in tag.groups}
if tag.is_blacklist: if tag.is_blacklist:
all_group_ids_from_db = await GroupConsole.all().values_list( all_groups_query = GroupConsole.all()
if bot:
bot_groups, _ = await PlatformUtils.get_group_list(bot)
bot_group_ids = {str(g.group_id) for g in bot_groups if g.group_id}
if bot_group_ids:
all_groups_query = all_groups_query.filter(
group_id__in=bot_group_ids
)
else:
return []
all_relevant_group_ids_from_db = await all_groups_query.values_list(
"group_id", flat=True "group_id", flat=True
) )
return list({str(gid) for gid in all_group_ids_from_db} - associated_groups) all_relevant_group_ids = {
str(gid) for gid in all_relevant_group_ids_from_db
}
return list(all_relevant_group_ids - associated_groups)
else: else:
return list(associated_groups) return list(associated_groups)