调整我的积分格式,更加美观
This commit is contained in:
@@ -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}"
|
||||
)
|
||||
|
||||
|
||||
197
优化需求.md
197
优化需求.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. 统计看板实时更新数据
|
||||
|
||||
这种实现方式可以最小化对现有代码的修改,同时提供全面的统计功能。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user