From fb70e48c1a564191ed5b9800f4a2f7bf813c5d73 Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 16 Apr 2025 17:19:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=88=91=E7=9A=84=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E6=A0=BC=E5=BC=8F=EF=BC=8C=E6=9B=B4=E5=8A=A0=E7=BE=8E?= =?UTF-8?q?=E8=A7=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/point_trade/main.py | 35 +++++-- 优化需求.md | 197 ------------------------------------ 2 files changed, 25 insertions(+), 207 deletions(-) diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index 7fcd427..33fcdf1 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -263,24 +263,39 @@ class PointTradePlugin(MessagePluginInterface): source_stats[source] = 0 source_stats[source] += points - # 构建积分详情消息 - source_details = "\n".join([f"- {source}: {points}" for source, points in source_stats.items()]) + # 构建积分详情消息 - 优化格式 + source_icons = { + "sign": "📝", "game": "🎮", "trade": "💱", + "rob": "🔫", "bailout": "🔓", "其他": "🔄" + } + + source_details = [] + for source, points in source_stats.items(): + icon = source_icons.get(source, "✨") + sign = "+" if points > 0 else "" + source_details.append(f"{icon} {source}: {sign}{points}") + + source_text = " | ".join(source_details) if source_details else "暂无记录" - # 构建最近交易记录 + # 构建最近交易记录 - 优化格式 recent_txs = "" if transactions: - recent_txs = "\n最近交易记录:\n" + recent_txs = "\n━━━ 最近交易 ━━━\n" for i, tx in enumerate(transactions[:5], 1): - tx_type = "获得" if tx.get('points', 0) > 0 else "消费" + is_positive = tx.get('points', 0) > 0 + tx_icon = "📈" if is_positive else "📉" + tx_type = "+" if is_positive else "-" points = abs(tx.get('points', 0)) desc = tx.get('description', '无描述') - date = tx.get('created_at', '').strftime('%m-%d %H:%M') if tx.get('created_at') else '未知时间' - recent_txs += f"{i}. {date} {tx_type} {points} 积分 - {desc}\n" + date = tx.get('created_at', '').strftime('%m/%d %H:%M') if tx.get('created_at') else '未知' + recent_txs += f"{tx_icon} {date} {tx_type}{points}分 {desc}\n" + # 构建更Compact美观的输出 output = ( - f"📊 {user_name} 的积分详情\n" - f"总积分: {user_points.get('total_points', 0)}\n" - f"\n积分来源统计:\n{source_details}" + f"💰 {user_name} 的积分\n" + f"━━━━━━━━━━━━━━\n" + f"💵 当前积分: {user_points.get('total_points', 0)}\n" + f"📊 积分来源: {source_text}" f"{recent_txs}" ) diff --git a/优化需求.md b/优化需求.md index 01a6413..e69de29 100644 --- a/优化需求.md +++ b/优化需求.md @@ -1,197 +0,0 @@ -# 插件使用统计功能设计思路 - -为了实现对用户触发的指令进行统计,我需要设计一个完整的数据收集和分析系统。以下是我的思路整理: - -## 1. 数据收集层 - -### 核心需求 -- 记录每次插件被调用的详细信息 -- 包括调用者、调用时间、调用结果等 -- 尽量不影响现有插件的性能 - -### 实现方式 -1. **装饰器模式**:创建一个装饰器函数,包装插件的`process_message`方法 -2. **钩子函数**:在消息处理前后添加钩子函数,记录调用信息 -3. **中间件**:在消息处理流程中添加统计中间件 - -## 2. 数据存储层 - -### 表结构设计 -- **插件使用记录表**:记录每次调用的原始数据 -- **用户使用统计表**:按用户汇总的使用情况 -- **群组使用统计表**:按群组汇总的使用情况 -- **插件统计汇总表**:按插件和时间维度汇总的数据 -- **错误日志表**:记录插件执行错误的详细信息 - -### 数据字段 -- 基础信息:插件名、命令、用户ID、群组ID等 -- 时间信息:调用时间、处理耗时等 -- 结果信息:成功/失败、返回消息等 -- 统计信息:调用次数、成功率、平均响应时间等 - -## 3. 数据分析层 - -### 统计维度 -- 时间维度:按小时、天、周、月统计 -- 用户维度:用户活跃度、偏好插件等 -- 群组维度:群组活跃度、特征插件等 -- 插件维度:使用频率、成功率、响应时间等 - -### 分析指标 -- 插件使用频率排行 -- 用户活跃度排行 -- 群组活跃度排行 -- 命令成功率分析 -- 响应时间分析 - -## 4. 实现方案 - -### 方案一:基于现有消息处理流程的改造 -1. 在`MessagePluginInterface`中添加统计方法 -2. 修改`Robot`类的消息处理流程,添加统计逻辑 -3. 创建数据库操作类,处理统计数据的存储和查询 - -### 方案二:独立的统计模块 -1. 创建独立的统计插件,通过事件系统监听消息处理事件 -2. 实现数据收集、存储和分析功能 -3. 提供API接口,供Web管理界面调用 - -## 5. 数据可视化 - -### 看板设计 -- 插件使用趋势图 -- 用户活跃度热力图 -- 群组活跃度排行榜 -- 命令成功率饼图 -- 响应时间分布图 - -### 报表功能 -- 定期生成使用报告 -- 异常监控报警 -- 性能分析报告 - -这个设计思路全面考虑了数据收集、存储、分析和可视化的各个环节,可以为后期的看板数据分析提供丰富的数据支持。 - - -# 方案二:独立统计模块实现方案 - -如果采用方案二(独立的统计模块),我们可以创建一个专门的插件来处理统计功能。这种方式的优点是与现有代码耦合度低,可以独立开发和部署。 - -## 项目目录结构 - -``` -d:\learn\WeChatRobot\ -├── plugins\ -│ ├── stats_collector\ # 统计收集插件 -│ │ ├── __init__.py # 插件初始化文件 -│ │ ├── main.py # 插件主入口 -│ │ ├── stats_collector.py # 统计收集核心逻辑 -│ │ ├── event_handlers.py # 事件处理器 -│ │ ├── config.yaml # 插件配置文件 -│ │ └── README.md # 插件说明文档 -│ │ -│ └── stats_dashboard\ # 统计看板插件(可选) -│ ├── __init__.py # 插件初始化文件 -│ ├── main.py # 插件主入口 -│ ├── dashboard_server.py # 看板服务器 -│ ├── templates\ # 前端模板 -│ │ ├── index.html # 主页 -│ │ ├── plugins.html # 插件统计页 -│ │ ├── users.html # 用户统计页 -│ │ └── groups.html # 群组统计页 -│ ├── static\ # 静态资源 -│ │ ├── css\ # 样式文件 -│ │ ├── js\ # JavaScript文件 -│ │ └── img\ # 图片资源 -│ ├── config.yaml # 插件配置文件 -│ └── README.md # 插件说明文档 -│ -├── db\ -│ ├── stats_db.py # 统计数据库操作类 -│ └── models\ -│ ├── plugin_stats.py # 插件使用记录模型 -│ ├── user_stats.py # 用户统计模型 -│ ├── group_stats.py # 群组统计模型 -│ └── error_log.py # 错误日志模型 -│ -├── event_system\ -│ └── events\ -│ ├── plugin_events.py # 添加插件相关事件定义 -│ └── stats_events.py # 统计相关事件定义 -│ -└── web_manager\ # Web管理界面(可选) - ├── api\ - │ └── stats_api.py # 统计数据API - └── templates\ - └── stats_dashboard.html # 统计看板页面 -``` - -## 实现思路 - -### 1. 事件系统扩展 - -在现有的事件系统中添加以下事件类型: - -- `PluginCallStartEvent`: 插件调用开始事件 -- `PluginCallEndEvent`: 插件调用结束事件 -- `PluginCallErrorEvent`: 插件调用错误事件 - -### 2. 统计收集插件 - -`stats_collector` 插件负责: - -- 监听插件调用相关事件 -- 收集调用信息(插件名、命令、用户、群组、时间等) -- 计算处理时间 -- 将数据存储到数据库 - -### 3. 数据库模型 - -创建以下数据库表: - -- `t_plugin_stats`: 记录每次插件调用的详细信息 -- `t_user_stats`: 按用户汇总的统计信息 -- `t_group_stats`: 按群组汇总的统计信息 -- `t_plugin_stats`: 按插件汇总的统计信息 -- `t_error_logs`: 记录插件执行错误的详细信息 - -### 4. 机器人核心修改 - -在 `Robot` 类的消息处理流程中添加事件触发点: - -- 在调用插件前触发 `PluginCallStartEvent` -- 在调用插件后触发 `PluginCallEndEvent` -- 在捕获到异常时触发 `PluginCallErrorEvent` - -### 5. 统计看板插件(可选) - -`stats_dashboard` 插件负责: - -- 启动一个轻量级Web服务器 -- 提供统计数据的可视化界面 -- 支持多种维度的数据查询和展示 - -### 6. Web管理界面集成(可选) - -在现有的Web管理界面中添加统计看板页面,展示: - -- 插件使用趋势图 -- 用户活跃度排行 -- 群组活跃度排行 -- 命令成功率分析 -- 响应时间分析 - -## 工作流程 - -1. 用户发送消息 -2. 机器人处理消息,找到匹配的插件 -3. 触发 `PluginCallStartEvent` 事件 -4. `stats_collector` 插件记录开始时间和基本信息 -5. 插件处理消息 -6. 触发 `PluginCallEndEvent` 事件 -7. `stats_collector` 插件计算处理时间,记录结果 -8. 数据存储到数据库 -9. 统计看板实时更新数据 - -这种实现方式可以最小化对现有代码的修改,同时提供全面的统计功能。 -