mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-22 20:01:04 +00:00
配置模式 (_conf_schema.json): 将所有 "QQ号" 描述更名为通用的 "ID" 或 "用户ID"。 更新了 话题分析、用户称号分析、金句分析 的默认 Prompt 模板,将示例 JSON 中的 qq 字段改为 user_id。 保留 bot_qq_ids 配置项名称以维持向后兼容性,但其描述已更新。 数据模型 (data_models.py): UserTitle 和 GoldenQuote 类中的 qq 字段重命名为 user_id (类型 str)。 为了兼容旧代码,添加了 qq 属性(@property),自动将 user_id 转为 int 返回。 分析逻辑 (analyzers/*.py): TopicAnalyzer: 通用化了 @ 消息的处理,支持读取 qq、id 或 user_id 字段。 UserTitleAnalyzer & GoldenQuoteAnalyzer: 更新了 Prompt 构建和结果提取逻辑,优先使用 user_id,不再强制依赖 QQ 号格式。 ReportGenerator: 更新了报告生成逻辑,使用 user_id 获取头像。 结果: 插件现在更具通用性,配置和提示词不再默认绑定 QQ 平台术语,能更好地适应 Discord 等其他平台。容器已重启,新配置生效。
113 lines
2.7 KiB
Python
113 lines
2.7 KiB
Python
"""
|
|
数据模型定义
|
|
包含所有分析相关的数据结构
|
|
"""
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
@dataclass
|
|
class SummaryTopic:
|
|
"""话题总结数据结构"""
|
|
|
|
topic: str
|
|
contributors: list[str]
|
|
detail: str
|
|
|
|
|
|
@dataclass
|
|
class UserTitle:
|
|
"""用户称号数据结构"""
|
|
|
|
name: str
|
|
user_id: str # 原 qq 字段
|
|
title: str
|
|
mbti: str
|
|
reason: str
|
|
|
|
@property
|
|
def qq(self) -> int:
|
|
"""兼容旧字段"""
|
|
try:
|
|
return int(self.user_id) if self.user_id else 0
|
|
except ValueError:
|
|
return 0
|
|
|
|
|
|
@dataclass
|
|
class GoldenQuote:
|
|
"""群聊金句数据结构"""
|
|
|
|
content: str
|
|
sender: str
|
|
reason: str
|
|
user_id: str = "" # 原 qq 字段
|
|
|
|
@property
|
|
def qq(self) -> int:
|
|
"""兼容旧字段"""
|
|
try:
|
|
return int(self.user_id) if self.user_id else 0
|
|
except ValueError:
|
|
return 0
|
|
|
|
|
|
@dataclass
|
|
class TokenUsage:
|
|
"""Token使用统计"""
|
|
|
|
prompt_tokens: int = 0
|
|
completion_tokens: int = 0
|
|
total_tokens: int = 0
|
|
|
|
|
|
@dataclass
|
|
class EmojiStatistics:
|
|
"""表情统计数据结构"""
|
|
|
|
face_count: int = 0 # QQ基础表情数量
|
|
mface_count: int = 0 # 动画表情数量
|
|
bface_count: int = 0 # 超级表情数量
|
|
sface_count: int = 0 # 小表情数量
|
|
other_emoji_count: int = 0 # 其他表情数量
|
|
face_details: dict = field(default_factory=dict) # 具体表情ID统计 {face_id: count}
|
|
|
|
@property
|
|
def total_emoji_count(self) -> int:
|
|
"""总表情数量"""
|
|
return (
|
|
self.face_count
|
|
+ self.mface_count
|
|
+ self.bface_count
|
|
+ self.sface_count
|
|
+ self.other_emoji_count
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class ActivityVisualization:
|
|
"""活跃度可视化数据结构"""
|
|
|
|
hourly_activity: dict = field(default_factory=dict) # {hour: count}
|
|
daily_activity: dict = field(default_factory=dict) # {date: count}
|
|
user_activity_ranking: list = field(default_factory=list) # 用户活跃度排行
|
|
peak_hours: list = field(default_factory=list) # 高峰时段
|
|
activity_heatmap_data: dict = field(default_factory=dict) # 热力图数据
|
|
|
|
|
|
@dataclass
|
|
class GroupStatistics:
|
|
"""群聊统计数据结构"""
|
|
|
|
message_count: int
|
|
total_characters: int
|
|
participant_count: int
|
|
most_active_period: str
|
|
golden_quotes: list[GoldenQuote]
|
|
emoji_count: int # 保持向后兼容
|
|
emoji_statistics: EmojiStatistics = field(default_factory=EmojiStatistics)
|
|
activity_visualization: ActivityVisualization = field(
|
|
default_factory=ActivityVisualization
|
|
)
|
|
token_usage: TokenUsage = field(default_factory=TokenUsage)
|