diff --git a/_conf_schema.json b/_conf_schema.json index 6670997..93c5935 100644 --- a/_conf_schema.json +++ b/_conf_schema.json @@ -38,6 +38,12 @@ "default": "", "hint": "用于自动分析的机器人QQ号,填写后可启用自动分析功能" }, + "enable_user_card": { + "type": "bool", + "description": "使用用户群名片", + "default": false, + "hint": "在分析中优先使用用户的群名片作为昵称显示" + }, "output_format": { "type": "string", "description": "输出格式", diff --git a/src/analysis/analyzers/golden_quote_analyzer.py b/src/analysis/analyzers/golden_quote_analyzer.py index 6b15476..671ac63 100644 --- a/src/analysis/analyzers/golden_quote_analyzer.py +++ b/src/analysis/analyzers/golden_quote_analyzer.py @@ -9,6 +9,7 @@ from astrbot.api import logger from ...models.data_models import GoldenQuote, TokenUsage from .base_analyzer import BaseAnalyzer from ..utils.json_utils import extract_golden_quotes_with_regex +from ..utils import InfoUtils @@ -147,7 +148,7 @@ class GoldenQuoteAnalyzer(BaseAnalyzer): for msg in messages: sender = msg.get("sender", {}) - nickname = sender.get("nickname", "") or sender.get("card", "") + nickname = InfoUtils.get_user_nickname(self.config_manager, sender) msg_time = datetime.fromtimestamp(msg.get("time", 0)).strftime("%H:%M") for content in msg.get("message", []): diff --git a/src/analysis/analyzers/topic_analyzer.py b/src/analysis/analyzers/topic_analyzer.py index e31ff91..d8f580d 100644 --- a/src/analysis/analyzers/topic_analyzer.py +++ b/src/analysis/analyzers/topic_analyzer.py @@ -10,6 +10,7 @@ from astrbot.api import logger from ...models.data_models import SummaryTopic, TokenUsage from .base_analyzer import BaseAnalyzer from ..utils.json_utils import extract_topics_with_regex +from ..utils import InfoUtils class TopicAnalyzer(BaseAnalyzer): @@ -71,7 +72,7 @@ class TopicAnalyzer(BaseAnalyzer): logger.warning(f"build_prompt 跳过sender非字典类型的消息: {type(sender)} - {sender}") continue - nickname = sender.get("nickname", "") or sender.get("card", "") + nickname = InfoUtils.get_user_nickname(self.config_manager, sender) msg_time = datetime.fromtimestamp(msg.get("time", 0)).strftime("%H:%M") message_list = msg.get("message", []) @@ -297,7 +298,7 @@ class TopicAnalyzer(BaseAnalyzer): logger.warning(f"extract_text_messages 跳过sender非字典类型的消息: {type(sender)} - {sender}") continue - nickname = sender.get("nickname", "") or sender.get("card", "") + nickname = InfoUtils.get_user_nickname(self.config_manager, sender) msg_time = datetime.fromtimestamp(msg.get("time", 0)).strftime("%H:%M") for content in msg.get("message", []): diff --git a/src/analysis/statistics.py b/src/analysis/statistics.py index 2292268..c1bbb1a 100644 --- a/src/analysis/statistics.py +++ b/src/analysis/statistics.py @@ -6,6 +6,7 @@ from datetime import datetime from typing import List, Dict from collections import defaultdict +from .utils import InfoUtils class UserAnalyzer: @@ -28,7 +29,7 @@ class UserAnalyzer: for msg in messages: sender = msg.get("sender", {}) user_id = str(sender.get("user_id", "")) - nickname = sender.get("nickname", "") or sender.get("card", "") + nickname = InfoUtils.get_user_nickname(self.config_manager, sender) user_stats[user_id]["message_count"] += 1 user_stats[user_id]["nickname"] = nickname diff --git a/src/analysis/utils/__init__.py b/src/analysis/utils/__init__.py index 440c513..b935e13 100644 --- a/src/analysis/utils/__init__.py +++ b/src/analysis/utils/__init__.py @@ -17,6 +17,8 @@ from .llm_utils import ( extract_response_text ) +from .info_utils import InfoUtils + __all__ = [ # JSON处理工具 'fix_json', @@ -28,5 +30,8 @@ __all__ = [ # LLM工具 'call_provider_with_retry', 'extract_token_usage', - 'extract_response_text' + 'extract_response_text', + + # 信息工具 + 'InfoUtils' ] \ No newline at end of file diff --git a/src/analysis/utils/info_utils.py b/src/analysis/utils/info_utils.py new file mode 100644 index 0000000..bf07545 --- /dev/null +++ b/src/analysis/utils/info_utils.py @@ -0,0 +1,13 @@ +class InfoUtils: + @staticmethod + def get_user_nickname(config_manager, sender) -> str: + """ + 获取用户昵称 + + 优先使用nickname字段,如果为空则使用card(群名片)字段 + """ + enable_user_card = config_manager.get_enable_user_card() + if enable_user_card: + return sender.get("card", "") or sender.get("nickname", "") + else: + return sender.get("nickname", "") or sender.get("card", "") diff --git a/src/core/config.py b/src/core/config.py index bb9b64a..8cc2eda 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -197,6 +197,10 @@ class ConfigManager: self.config["enabled_groups"] = enabled_groups self.config.save_config() + def get_enable_user_card(self) -> bool: + """获取是否使用用户群名片""" + return self.config.get("enable_user_card", False) + @property def pyppeteer_available(self) -> bool: """检查pyppeteer是否可用""" diff --git a/src/visualization/activity_charts.py b/src/visualization/activity_charts.py index 63d921d..4f2a004 100644 --- a/src/visualization/activity_charts.py +++ b/src/visualization/activity_charts.py @@ -30,7 +30,7 @@ class ActivityVisualizer: # # 用户分析 # sender = msg.get("sender", {}) # user_id = str(sender.get("user_id", "")) - # nickname = sender.get("nickname", "") or sender.get("card", "") + # nickname = InfoUtils.get_user_nickname(self.config_manager, sender) # 统计每小时消息数 hourly_activity[hour] += 1