From 7323e1184acf86a5c01e45baf6eb2bc8386a53e5 Mon Sep 17 00:00:00 2001 From: Ri-Nai Date: Sat, 18 Oct 2025 23:20:53 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[refactor]=20=E4=BD=BF=E7=94=A8=20InfoUtils?= =?UTF-8?q?=20=E6=8F=90=E5=8F=96=E7=94=A8=E6=88=B7=E6=98=B5=E7=A7=B0?= =?UTF-8?q?=EF=BC=8C=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/analysis/analyzers/golden_quote_analyzer.py | 3 ++- src/analysis/analyzers/topic_analyzer.py | 5 +++-- src/analysis/statistics.py | 3 ++- src/utils/__init__.py | 4 +++- src/utils/info_utils.py | 9 +++++++++ src/visualization/activity_charts.py | 2 +- 6 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 src/utils/info_utils.py diff --git a/src/analysis/analyzers/golden_quote_analyzer.py b/src/analysis/analyzers/golden_quote_analyzer.py index 6b15476..050780a 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(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..50b9bef 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(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(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..9a9a9ac 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(sender) user_stats[user_id]["message_count"] += 1 user_stats[user_id]["nickname"] = nickname diff --git a/src/utils/__init__.py b/src/utils/__init__.py index c70fe49..5e00fa4 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -5,8 +5,10 @@ from .pdf_utils import PDFInstaller from .helpers import MessageAnalyzer +from .info_utils import InfoUtils __all__ = [ 'PDFInstaller', - 'MessageAnalyzer' + 'MessageAnalyzer', + 'InfoUtils' ] \ No newline at end of file diff --git a/src/utils/info_utils.py b/src/utils/info_utils.py new file mode 100644 index 0000000..30b0405 --- /dev/null +++ b/src/utils/info_utils.py @@ -0,0 +1,9 @@ +class InfoUtils: + @staticmethod + def get_user_nickname(sender) -> str: + """ + 获取用户昵称 + + 优先使用nickname字段,如果为空则使用card(群名片)字段 + """ + return sender.get("nickname", "") or sender.get("card", "") diff --git a/src/visualization/activity_charts.py b/src/visualization/activity_charts.py index 63d921d..90945aa 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(sender) # 统计每小时消息数 hourly_activity[hour] += 1 From 98fd257532bca4e4a060165ab57f552ea8dd91e6 Mon Sep 17 00:00:00 2001 From: Ri-Nai Date: Sat, 18 Oct 2025 23:23:54 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[feat]=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=BE=A4=E5=90=8D=E7=89=87=E9=85=8D=E7=BD=AE=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E5=8F=8A=E8=8E=B7=E5=8F=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _conf_schema.json | 6 ++++++ src/core/config.py | 4 ++++ 2 files changed, 10 insertions(+) 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/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是否可用""" From b6633613db97b393c3e64d0d4ff7549d84354835 Mon Sep 17 00:00:00 2001 From: Ri-Nai Date: Sat, 18 Oct 2025 23:34:27 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[refactor]=20=E6=9B=B4=E6=96=B0=20InfoUtils?= =?UTF-8?q?.get=5Fuser=5Fnickname=20=E6=96=B9=E6=B3=95=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20config=5Fmanager=20=E5=8F=82=E6=95=B0=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BE=A4=E5=90=8D=E7=89=87=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/analysis/analyzers/golden_quote_analyzer.py | 2 +- src/analysis/analyzers/topic_analyzer.py | 4 ++-- src/analysis/statistics.py | 2 +- src/utils/info_utils.py | 8 ++++++-- src/visualization/activity_charts.py | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/analysis/analyzers/golden_quote_analyzer.py b/src/analysis/analyzers/golden_quote_analyzer.py index 050780a..f764af8 100644 --- a/src/analysis/analyzers/golden_quote_analyzer.py +++ b/src/analysis/analyzers/golden_quote_analyzer.py @@ -148,7 +148,7 @@ class GoldenQuoteAnalyzer(BaseAnalyzer): for msg in messages: sender = msg.get("sender", {}) - nickname = InfoUtils.get_user_nickname(sender) + 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 50b9bef..e69400e 100644 --- a/src/analysis/analyzers/topic_analyzer.py +++ b/src/analysis/analyzers/topic_analyzer.py @@ -72,7 +72,7 @@ class TopicAnalyzer(BaseAnalyzer): logger.warning(f"build_prompt 跳过sender非字典类型的消息: {type(sender)} - {sender}") continue - nickname = InfoUtils.get_user_nickname(sender) + 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", []) @@ -298,7 +298,7 @@ class TopicAnalyzer(BaseAnalyzer): logger.warning(f"extract_text_messages 跳过sender非字典类型的消息: {type(sender)} - {sender}") continue - nickname = InfoUtils.get_user_nickname(sender) + 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 9a9a9ac..dcd01b1 100644 --- a/src/analysis/statistics.py +++ b/src/analysis/statistics.py @@ -29,7 +29,7 @@ class UserAnalyzer: for msg in messages: sender = msg.get("sender", {}) user_id = str(sender.get("user_id", "")) - nickname = InfoUtils.get_user_nickname(sender) + 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/utils/info_utils.py b/src/utils/info_utils.py index 30b0405..2e63af8 100644 --- a/src/utils/info_utils.py +++ b/src/utils/info_utils.py @@ -1,9 +1,13 @@ class InfoUtils: @staticmethod - def get_user_nickname(sender) -> str: + def get_user_nickname(config_manager, sender) -> str: """ 获取用户昵称 优先使用nickname字段,如果为空则使用card(群名片)字段 """ - return sender.get("nickname", "") or sender.get("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/visualization/activity_charts.py b/src/visualization/activity_charts.py index 90945aa..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 = InfoUtils.get_user_nickname(sender) + # nickname = InfoUtils.get_user_nickname(self.config_manager, sender) # 统计每小时消息数 hourly_activity[hour] += 1 From 7290736e464dc5a7cccb3ade2235a3eb07ab7891 Mon Sep 17 00:00:00 2001 From: Ri-Nai Date: Sun, 19 Oct 2025 00:29:48 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[feat]=20=E5=B0=86=20InfoUtils=20=E7=B1=BB?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=87=B3=E5=88=86=E6=9E=90=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=98=B5=E7=A7=B0=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/analysis/analyzers/golden_quote_analyzer.py | 2 +- src/analysis/analyzers/topic_analyzer.py | 2 +- src/analysis/statistics.py | 2 +- src/analysis/utils/__init__.py | 7 ++++++- src/{ => analysis}/utils/info_utils.py | 2 +- src/utils/__init__.py | 4 +--- 6 files changed, 11 insertions(+), 8 deletions(-) rename src/{ => analysis}/utils/info_utils.py (82%) diff --git a/src/analysis/analyzers/golden_quote_analyzer.py b/src/analysis/analyzers/golden_quote_analyzer.py index f764af8..671ac63 100644 --- a/src/analysis/analyzers/golden_quote_analyzer.py +++ b/src/analysis/analyzers/golden_quote_analyzer.py @@ -9,7 +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 +from ..utils import InfoUtils diff --git a/src/analysis/analyzers/topic_analyzer.py b/src/analysis/analyzers/topic_analyzer.py index e69400e..d8f580d 100644 --- a/src/analysis/analyzers/topic_analyzer.py +++ b/src/analysis/analyzers/topic_analyzer.py @@ -10,7 +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 +from ..utils import InfoUtils class TopicAnalyzer(BaseAnalyzer): diff --git a/src/analysis/statistics.py b/src/analysis/statistics.py index dcd01b1..c1bbb1a 100644 --- a/src/analysis/statistics.py +++ b/src/analysis/statistics.py @@ -6,7 +6,7 @@ from datetime import datetime from typing import List, Dict from collections import defaultdict -from ..utils import InfoUtils +from .utils import InfoUtils class UserAnalyzer: 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/utils/info_utils.py b/src/analysis/utils/info_utils.py similarity index 82% rename from src/utils/info_utils.py rename to src/analysis/utils/info_utils.py index 2e63af8..bf07545 100644 --- a/src/utils/info_utils.py +++ b/src/analysis/utils/info_utils.py @@ -4,7 +4,7 @@ class InfoUtils: """ 获取用户昵称 - 优先使用nickname字段,如果为空则使用card(群名片)字段 + 优先使用nickname字段,如果为空则使用card(群名片)字段 """ enable_user_card = config_manager.get_enable_user_card() if enable_user_card: diff --git a/src/utils/__init__.py b/src/utils/__init__.py index 5e00fa4..c70fe49 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -5,10 +5,8 @@ from .pdf_utils import PDFInstaller from .helpers import MessageAnalyzer -from .info_utils import InfoUtils __all__ = [ 'PDFInstaller', - 'MessageAnalyzer', - 'InfoUtils' + 'MessageAnalyzer' ] \ No newline at end of file