mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-22 20:01:04 +00:00
[v1.7.0] (解耦化) 优化项目结构,修复部分提示内容
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
"""
|
||||
工具函数模块
|
||||
包含PDF处理和通用工具函数
|
||||
"""
|
||||
|
||||
from .pdf_utils import PDFInstaller
|
||||
from .helpers import MessageAnalyzer
|
||||
|
||||
__all__ = [
|
||||
'PDFInstaller',
|
||||
'MessageAnalyzer'
|
||||
]
|
||||
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
通用工具函数模块
|
||||
包含消息分析和其他通用功能
|
||||
"""
|
||||
|
||||
from typing import List, Dict
|
||||
from ...src.models.data_models import GroupStatistics, SummaryTopic, UserTitle, GoldenQuote, TokenUsage
|
||||
from ...src.core.message_handler import MessageHandler
|
||||
from ...src.analysis.llm_analyzer import LLMAnalyzer
|
||||
from ...src.analysis.statistics import UserAnalyzer
|
||||
|
||||
|
||||
class MessageAnalyzer:
|
||||
"""消息分析器 - 整合所有分析功能"""
|
||||
|
||||
def __init__(self, context, config_manager):
|
||||
self.context = context
|
||||
self.config_manager = config_manager
|
||||
self.message_handler = MessageHandler(config_manager)
|
||||
self.llm_analyzer = LLMAnalyzer(context, config_manager)
|
||||
self.user_analyzer = UserAnalyzer(config_manager)
|
||||
|
||||
async def set_bot_instance(self, bot_instance):
|
||||
"""设置bot实例"""
|
||||
await self.message_handler.set_bot_qq_id(bot_instance)
|
||||
|
||||
async def analyze_messages(self, messages: List[Dict], group_id: str) -> Dict:
|
||||
"""完整的消息分析流程"""
|
||||
try:
|
||||
# 基础统计
|
||||
statistics = self.message_handler.calculate_statistics(messages)
|
||||
|
||||
# 用户分析
|
||||
user_analysis = self.user_analyzer.analyze_users(messages)
|
||||
|
||||
# LLM分析
|
||||
topics = []
|
||||
user_titles = []
|
||||
golden_quotes = []
|
||||
total_token_usage = TokenUsage()
|
||||
|
||||
# 话题分析
|
||||
if self.config_manager.get_topic_analysis_enabled():
|
||||
topics, topic_tokens = await self.llm_analyzer.analyze_topics(messages)
|
||||
total_token_usage.prompt_tokens += topic_tokens.prompt_tokens
|
||||
total_token_usage.completion_tokens += topic_tokens.completion_tokens
|
||||
total_token_usage.total_tokens += topic_tokens.total_tokens
|
||||
|
||||
# 用户称号分析
|
||||
if self.config_manager.get_user_title_analysis_enabled():
|
||||
user_titles, title_tokens = await self.llm_analyzer.analyze_user_titles(messages, user_analysis)
|
||||
total_token_usage.prompt_tokens += title_tokens.prompt_tokens
|
||||
total_token_usage.completion_tokens += title_tokens.completion_tokens
|
||||
total_token_usage.total_tokens += title_tokens.total_tokens
|
||||
|
||||
# 金句分析
|
||||
golden_quotes, quote_tokens = await self.llm_analyzer.analyze_golden_quotes(messages)
|
||||
total_token_usage.prompt_tokens += quote_tokens.prompt_tokens
|
||||
total_token_usage.completion_tokens += quote_tokens.completion_tokens
|
||||
total_token_usage.total_tokens += quote_tokens.total_tokens
|
||||
|
||||
# 更新统计数据
|
||||
statistics.golden_quotes = golden_quotes
|
||||
statistics.token_usage = total_token_usage
|
||||
|
||||
return {
|
||||
"statistics": statistics,
|
||||
"topics": topics,
|
||||
"user_titles": user_titles,
|
||||
"user_analysis": user_analysis
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
from astrbot.api import logger
|
||||
logger.error(f"消息分析失败: {e}")
|
||||
return None
|
||||
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
PDF工具模块
|
||||
负责PDF相关的安装和管理功能
|
||||
"""
|
||||
|
||||
import sys
|
||||
import asyncio
|
||||
from astrbot.api import logger
|
||||
|
||||
|
||||
class PDFInstaller:
|
||||
"""PDF功能安装器"""
|
||||
|
||||
@staticmethod
|
||||
async def install_pyppeteer(config_manager):
|
||||
"""安装pyppeteer依赖"""
|
||||
try:
|
||||
logger.info("开始安装 pyppeteer...")
|
||||
|
||||
# 使用asyncio安装pyppeteer和兼容的websockets版本
|
||||
logger.info("安装 pyppeteer==1.0.2 和兼容的依赖...")
|
||||
process = await asyncio.create_subprocess_exec(
|
||||
sys.executable, "-m", "pip", "install",
|
||||
"pyppeteer==1.0.2", "websockets==10.4",
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.PIPE
|
||||
)
|
||||
|
||||
stdout, stderr = await process.communicate()
|
||||
|
||||
if process.returncode == 0:
|
||||
logger.info("pyppeteer 安装成功")
|
||||
logger.info(f"安装输出: {stdout.decode()}")
|
||||
|
||||
# 重新加载pyppeteer模块
|
||||
success = config_manager.reload_pyppeteer()
|
||||
if success:
|
||||
return "✅ pyppeteer 安装成功!PDF 功能现已可用。"
|
||||
else:
|
||||
return "⚠️ pyppeteer 安装完成,但重新加载失败。请重启 AstrBot 以使用 PDF 功能。"
|
||||
else:
|
||||
error_msg = stderr.decode()
|
||||
logger.error(f"pyppeteer 安装失败: {error_msg}")
|
||||
return f"❌ pyppeteer 安装失败: {error_msg}"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"安装 pyppeteer 时出错: {e}")
|
||||
return f"❌ 安装过程中出错: {str(e)}"
|
||||
|
||||
@staticmethod
|
||||
def get_pdf_status(config_manager) -> str:
|
||||
"""获取PDF功能状态"""
|
||||
if config_manager.pyppeteer_available:
|
||||
version = config_manager.pyppeteer_version or "未知版本"
|
||||
return f"✅ PDF 功能可用 (pyppeteer {version})"
|
||||
else:
|
||||
return "❌ PDF 功能不可用 - 需要安装 pyppeteer"
|
||||
Reference in New Issue
Block a user