mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-22 13:38:43 +00:00
feat(filter_bot_messages): 新增 filter_bot 开关,控制 bot 消息是否纳入分析
Fixes #205 默认排除 bot 自身发言(filter_bot_messages=True),可通过 /分析设置 filter_bot 切换。 修改涉及三层: 1. 配置层:ConfigManager getter/setter + _conf_schema.json 面板选项 2. 适配器层:BotManager 传入配置,OneBotAdapter.fetch_messages 认 switch 3. 分析层:clean_messages 和 analyze_user_activity 的 bot_self_ids 受 switch 控制
This commit is contained in:
@@ -51,6 +51,12 @@
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"filter_bot_messages": {
|
||||||
|
"type": "bool",
|
||||||
|
"description": "分析时是否过滤机器人自己的消息",
|
||||||
|
"default": true,
|
||||||
|
"hint": "默认开启,bot 自身的发言不会出现在分析报告中。关闭后 bot 的发言也会被纳入话题分析、金句提取等。"
|
||||||
|
},
|
||||||
"enable_user_card": {
|
"enable_user_card": {
|
||||||
"type": "bool",
|
"type": "bool",
|
||||||
"description": "使用用户群名片",
|
"description": "使用用户群名片",
|
||||||
|
|||||||
@@ -918,6 +918,7 @@ class GroupDailyAnalysis(Star):
|
|||||||
- status: 查看当前状态
|
- status: 查看当前状态
|
||||||
- reload: 重新加载配置并重启定时任务
|
- reload: 重新加载配置并重启定时任务
|
||||||
- test: 测试自动分析功能
|
- test: 测试自动分析功能
|
||||||
|
- filter_bot: 切换是否在分析中包含机器人自己的消息
|
||||||
- incremental_debug: 切换增量分析立即报告模式(调试用)
|
- incremental_debug: 切换增量分析立即报告模式(调试用)
|
||||||
"""
|
"""
|
||||||
group_id = self._get_group_id_from_event(event)
|
group_id = self._get_group_id_from_event(event)
|
||||||
@@ -968,6 +969,13 @@ class GroupDailyAnalysis(Star):
|
|||||||
status_text = "已启用" if new_state else "已禁用"
|
status_text = "已启用" if new_state else "已禁用"
|
||||||
yield event.plain_result(f"✅ 增量分析立即报告模式: {status_text}")
|
yield event.plain_result(f"✅ 增量分析立即报告模式: {status_text}")
|
||||||
|
|
||||||
|
elif action == "filter_bot":
|
||||||
|
current = self.config_manager.get_filter_bot_messages()
|
||||||
|
new_state = not current
|
||||||
|
self.config_manager.set_filter_bot_messages(new_state)
|
||||||
|
status_text = "已启用" if new_state else "已禁用"
|
||||||
|
yield event.plain_result(f"✅ 过滤机器人消息: {status_text}")
|
||||||
|
|
||||||
else: # status
|
else: # status
|
||||||
check_target = getattr(event, "unified_msg_origin", None)
|
check_target = getattr(event, "unified_msg_origin", None)
|
||||||
if not check_target:
|
if not check_target:
|
||||||
@@ -1000,18 +1008,21 @@ class GroupDailyAnalysis(Star):
|
|||||||
f"活跃时段{active_start}:00-{active_end}:00)"
|
f"活跃时段{active_start}:00-{active_end}:00)"
|
||||||
)
|
)
|
||||||
|
|
||||||
debug_report = self.config_manager.get_incremental_report_immediately()
|
debug_report = self.config_manager.get_incremental_report_immediately()
|
||||||
debug_status = "✅ 开启" if debug_report else "❌ 关闭"
|
debug_status = "✅ 开启" if debug_report else "❌ 关闭"
|
||||||
|
filter_bot = self.config_manager.get_filter_bot_messages()
|
||||||
|
filter_bot_status = "✅ 开启" if filter_bot else "❌ 关闭"
|
||||||
|
|
||||||
yield event.plain_result(f"""📊 当前群分析功能状态:
|
yield event.plain_result(f"""📊 当前群分析功能状态:
|
||||||
• 群分析功能: {status} (模式: {mode})
|
• 群分析功能: {status} (模式: {mode})
|
||||||
• 自动分析: {auto_status} ({auto_time})
|
• 自动分析: {auto_status} ({auto_time})
|
||||||
• 增量分析: {incremental_status_text}
|
• 增量分析: {incremental_status_text}
|
||||||
• 调试模式: {debug_status} (增量立即报告)
|
• 调试模式: {debug_status} (增量立即报告)
|
||||||
• 输出格式: {output_format}
|
• 过滤机器人: {filter_bot_status}
|
||||||
|
• 输出格式: {output_format}
|
||||||
• 最小消息数: {min_threshold}
|
• 最小消息数: {min_threshold}
|
||||||
|
|
||||||
💡 可用命令: enable, disable, status, reload, test, incremental_debug
|
💡 可用命令: enable, disable, status, reload, test, filter_bot, incremental_debug
|
||||||
💡 支持的输出格式: image, text (图片包含活跃度可视化)
|
💡 支持的输出格式: image, text (图片包含活跃度可视化)
|
||||||
💡 其他命令: /设置格式, /增量状态""")
|
💡 其他命令: /设置格式, /增量状态""")
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,13 @@ class AnalysisApplicationService:
|
|||||||
|
|
||||||
cleaner = MessageCleanerService()
|
cleaner = MessageCleanerService()
|
||||||
bot_self_ids = self.config_manager.get_bot_self_ids()
|
bot_self_ids = self.config_manager.get_bot_self_ids()
|
||||||
|
if not self.config_manager.get_filter_bot_messages():
|
||||||
|
bot_self_ids = []
|
||||||
|
logger.debug(
|
||||||
|
"filter_bot_messages=%s, bot_self_ids=%s",
|
||||||
|
self.config_manager.get_filter_bot_messages(),
|
||||||
|
bot_self_ids,
|
||||||
|
)
|
||||||
|
|
||||||
# 对于自动任务,强制过滤指令;对于手动任务,也建议过滤以保持报告纯净
|
# 对于自动任务,强制过滤指令;对于手动任务,也建议过滤以保持报告纯净
|
||||||
unified_messages = cleaner.clean_messages(
|
unified_messages = cleaner.clean_messages(
|
||||||
@@ -387,6 +394,13 @@ class AnalysisApplicationService:
|
|||||||
|
|
||||||
cleaner = MessageCleanerService()
|
cleaner = MessageCleanerService()
|
||||||
bot_self_ids = self.config_manager.get_bot_self_ids()
|
bot_self_ids = self.config_manager.get_bot_self_ids()
|
||||||
|
if not self.config_manager.get_filter_bot_messages():
|
||||||
|
bot_self_ids = []
|
||||||
|
logger.debug(
|
||||||
|
"filter_bot_messages=%s, bot_self_ids=%s (incremental)",
|
||||||
|
self.config_manager.get_filter_bot_messages(),
|
||||||
|
bot_self_ids,
|
||||||
|
)
|
||||||
unified_messages = cleaner.clean_messages(
|
unified_messages = cleaner.clean_messages(
|
||||||
raw_messages, bot_self_ids=bot_self_ids, filter_commands=True
|
raw_messages, bot_self_ids=bot_self_ids, filter_commands=True
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -304,6 +304,15 @@ class ConfigManager:
|
|||||||
ids = basic.get("bot_qq_ids", [])
|
ids = basic.get("bot_qq_ids", [])
|
||||||
return ids
|
return ids
|
||||||
|
|
||||||
|
def get_filter_bot_messages(self) -> bool:
|
||||||
|
"""获取是否过滤机器人自己的消息。"""
|
||||||
|
return self._get_group("basic").get("filter_bot_messages", True)
|
||||||
|
|
||||||
|
def set_filter_bot_messages(self, enabled: bool):
|
||||||
|
"""设置是否过滤机器人自己的消息。"""
|
||||||
|
self._ensure_group("basic")["filter_bot_messages"] = enabled
|
||||||
|
self.config.save_config()
|
||||||
|
|
||||||
def get_html_output_dir(self) -> str:
|
def get_html_output_dir(self) -> str:
|
||||||
"""获取HTML输出目录"""
|
"""获取HTML输出目录"""
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,9 @@ class OneBotAdapter(PlatformAdapter):
|
|||||||
)
|
)
|
||||||
if not self.bot_self_ids and config:
|
if not self.bot_self_ids and config:
|
||||||
self.bot_self_ids = [str(id) for id in config.get("bot_qq_ids", [])]
|
self.bot_self_ids = [str(id) for id in config.get("bot_qq_ids", [])]
|
||||||
|
self.filter_bot_messages = (
|
||||||
|
config.get("filter_bot_messages", True) if config else True
|
||||||
|
)
|
||||||
|
|
||||||
# LLBot 探测标志
|
# LLBot 探测标志
|
||||||
self._is_llbot = False
|
self._is_llbot = False
|
||||||
@@ -226,7 +229,7 @@ class OneBotAdapter(PlatformAdapter):
|
|||||||
|
|
||||||
# 身份过滤(排除机器人自己)
|
# 身份过滤(排除机器人自己)
|
||||||
sender_id = str(raw_msg.get("sender", {}).get("user_id", ""))
|
sender_id = str(raw_msg.get("sender", {}).get("user_id", ""))
|
||||||
if sender_id in self.bot_self_ids:
|
if self.filter_bot_messages and sender_id in self.bot_self_ids:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 时间范围判定
|
# 时间范围判定
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ class BotManager:
|
|||||||
adapter_config = {
|
adapter_config = {
|
||||||
"bot_self_ids": self._bot_self_ids.copy(),
|
"bot_self_ids": self._bot_self_ids.copy(),
|
||||||
"platform_id": str(platform_id),
|
"platform_id": str(platform_id),
|
||||||
|
"filter_bot_messages": self.config_manager.get_filter_bot_messages(),
|
||||||
"plugin_instance": self._plugin_instance,
|
"plugin_instance": self._plugin_instance,
|
||||||
}
|
}
|
||||||
platform_instance = self._platforms.get(str(platform_id))
|
platform_instance = self._platforms.get(str(platform_id))
|
||||||
|
|||||||
Reference in New Issue
Block a user