88 Commits

Author SHA1 Message Date
cbc0f5198a fix(onmyoji_gacha): 避免重复签到发放积分 2026-06-20 19:00:41 +08:00
8d26c46323 feat(bot): use runtime api for bot data 2026-06-20 18:20:40 +08:00
f67f3ca1d6 fix(danding_api): 从NoneBot2 driver.config读取token
.env 被 NoneBot2 读入 driver.config(小写键名)而非 os.environ,
改用 getattr(driver.config, "danding_api_token") 获取。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 12:24:24 +08:00
29ae3695af debug(danding_api): 列出所有相关环境变量排查token加载
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 12:15:33 +08:00
df0f2ebfbe fix(danding_api): 手动读取环境变量兜底token配置
get_plugin_config(BaseSettings) 不一定从 .env 读取环境变量,
直接用 os.environ.get 兜底确保 DANDING_API_TOKEN 能被加载。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 12:11:02 +08:00
d77007f5a2 debug(danding_api): 添加post_vcode请求参数调试日志
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:41:04 +08:00
e68305d306 fix(danding_api): 将Config改为BaseSettings以支持环境变量读取
BaseModel 的 Field(env=...) 不会自动读取环境变量,
需要继承 pydantic_settings.BaseSettings 才能生效。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:27:49 +08:00
d1f97eccc2 fix(danding_api): 修复配置未从环境变量读取导致API鉴权失败
Token 和 EMAIL_PASSWORD 字段缺少 Field(env=...) 声明,
导致 .env 中的 DANDING_API_TOKEN 始终无法被读取,
后端 API 返回"你没有权限这样做"。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:17:26 +08:00
c2ba9d2f74 fix(qqpush): 修复token配置读取导致的404 2026-05-27 17:25:31 +08:00
1b484d7fda fix: 修复 damo_balance 引号语法错误及 chatai bleach 缺失依赖
- damo_balance/__init__.py: 将外层字符串改为单引号,消除内嵌双引号引起的 SyntaxError
- chatai/screenshot.py: bleach 改为 try/except 可选导入,无 bleach 时降级跳过 HTML 净化
- requirements.txt: 补充 openai>=1.0.0 与 pyppeteer>=1.0.2 依赖声明
2026-05-11 22:43:27 +08:00
3db17fc08b merge: resolve onmyoji_gacha conflicts 2026-05-11 22:32:13 +08:00
44052bc6e8 docs: add REVIEW_REPORT.md for all 11 plugins (round 2 review) 2026-05-10 00:39:37 +08:00
260c66636e review(onmyoji_gacha): fix 2x timeout + Pydantic v2 model_validator + review report 2026-05-10 00:37:18 +08:00
c62ac37611 review: fix critical/medium bugs in 4 plugins (round 2)
group_horse_racing:
- settle_race: rewrite with 7 bug fixes (race condition, draw double-credit, empty participants, etc.)
- models.py: reorder fields for correct defaults, add indexes
- message_service: add logger import

danding_points:
- api.py: add finally blocks to 3 methods (add_points, get_history, get_leaderboard)
- database.py: add finally block to get_user_balance

chatai:
- __init__.py: deprecated API→asyncio.to_thread, deduplicate logging, taskkill filter for safety
- screenshot.py: XSS protection with bleach on HTML content
- requirements.txt: add bleach dependency

danding_qqpush:
- api.py L13: fix self-referencing _renderer NameError crash
- api.py: lazy singleton pattern via _get_renderer() instead of per-request ImageRenderer
- __init__.py: mask Token in log output (security)

All 34 tests pass.
2026-05-10 00:30:22 +08:00
f61465a95b fix(danding_api): 安全修复+性能改进
- config.py: 硬编码Token/EMAIL_PASSWORD→环境变量
- utils.py: requests→aiohttp异步IO
- utils.py: 移除硬编码用户ID
- utils.py: 可变默认参数dict()→None
- utils.py: 全局session_id封装为函数
- utils.py: tab→4空格统一缩进
2026-05-09 23:52:10 +08:00
e28d871940 fix(chatai): 安全修复+代码质量改进
- _force_kill_chrome: 仅kill带--remote-debugging-port的headless chrome
- AI API: 添加60s timeout + run_in_executor避免阻塞事件循环
- AI系统提示抽取为常量
- markdown转图片: 移除错误的html.escape前置
- screenshot: 等待渲染完成替代固定sleep
- 错误信息不再暴露异常详情给用户
2026-05-09 23:48:54 +08:00
f240ba2882 perf+fix(danding_qqpush): perf优化+安全修复+代码DRY
- image_render: cached draw object, font.getlength() 替代逐字符创建临时Image
- image_render: 移除PNG无效的quality参数
- api.py: ImageRenderer单例复用(避免每请求重载字体)
- api.py: 异常详情不再泄露到API响应
- sender.py: 提取_send_msg()消除重复代码
2026-05-09 23:46:44 +08:00
b444bd62f5 security: move onmyoji_gacha BOT_TOKEN to env var (was hardcoded plaintext) 2026-05-09 23:42:48 +08:00
fd2fd90f05 refactor: extract admin check helper & harden room_store JSON parsing
- Extract duplicated admin/owner check from race.py into shared._is_admin_or_owner()
- Add try/except around JSON.loads in room_store.load_rooms for corrupted data resilience
- Use .get() for safer dict access in room deserialization
2026-05-09 23:37:55 +08:00
14397ab645 fix(danding_points): improve conn management in api.py
- Read methods (get_balance/get_transactions/get_ranking): add try/except/finally
- Write methods (add/spend/set_points): add rollback() before early return conn.close()
- Prevents connection leaks on exceptions and early returns
2026-05-09 23:34:07 +08:00
c01338f496 refactor(plugins): comprehensive code review - ~35 fixes across 14 plugins
Phase 1 - Plugin code review (14/14 plugins):
- Security: 3x token leak in print→logger.debug, Bearer prefix handling
- Bug: bare except→specific exceptions, HorseState type safety, sync→async
- Critical: response_model undefined, route dead code, sync blocking event loop
- Quality: 11x print()→logger, variable name shadowing, consistent logging

Phase 2 - Deep analysis:
- Fix: payout int truncation→max(1, round(amount*odds))
- Fix: room_store get_lock race condition→dict.setdefault()
- Verify: data_manager f-string SQL is safe (uses ? placeholders)

Infrastructure: review reports generated for all plugins.
2026-05-09 23:22:28 +08:00
698b0ec93a fix: 添加"三连"别名并将三连抽优先级调整为10 2026-05-03 11:20:45 +08:00
0ed20f9a4a fix: rules.py ALLOWED_GROUPS→ALLOWED_GROUP_ID整数比较 2026-05-03 10:37:36 +08:00
bf97fe3fd1 fix: restore cross-plugin points_api import in onmyoji_gacha 2026-05-03 10:00:39 +08:00
0312c79c9d refactor: onmyoji gacha plugin overhaul (gacha-refactor) 2026-05-03 09:55:34 +08:00
9a8cb3ad6d 移除赛马帮助命令的管理员权限鉴权 2026-05-02 16:32:35 +08:00
56b56e4e85 fix: room_store __db name mangling + add singleton 2026-05-02 16:07:16 +08:00
d3b5499896 fix: add room_store singleton instance 2026-05-02 16:06:04 +08:00
69d4a17674 fix: remove nonexistent handle_access import 2026-05-02 16:01:06 +08:00
a952760cf8 fix: break circular import in horse racing commands
Extract shared.py from commands/__init__.py to break circular dependency:
- shared.py: shared variables/services/helper functions
- access.py: get_scope/check_access/get_event_id (canonical source)
- __init__.py: re-exports from shared.py for backward compat
- register/bet/race/help: import from .shared instead of package
2026-05-02 15:38:34 +08:00
5fae4a271a fix: add bot.py entry point and danding_bot/__init__.py 2026-05-02 14:56:12 +08:00
fe081f43cf fix(race): 代码质量审查修复 + commands包拆分 + 赛马取消命令
- P1: bet.py赔率计算移入锁内防竞态
- P1: config.py TESTERS解析失败添加warning日志
- P2: 新增赛马取消命令(积分退还/任务取消/状态重置)
- P3: bet.py清理未使用的_send_to_scope导入
- 将commands.py拆分为commands/包(access/bet/help/race/register)
- OpenSpec变更提案: fix-race-conditions-and-logs
2026-05-02 14:33:34 +08:00
5869618a9c feat(horse-racing): 新增赛马列表/取消下注/开赛权限限制 + 修复退还异常保护 + 文档同步 2026-05-02 11:50:34 +08:00
a2b7e1fc11 fix: settle_race返回tuple消除odds重复计算
- settle_race() 返回 tuple[RaceResult, odds] | None
- run_race_with_settlement 解包使用,移除多余 calculate_odds 调用
- _test_send_to_scope 签名已兼容(含*args/**kwargs)
2026-05-01 23:04:32 +08:00
569801dd14 fix: 赛马插件P0-P2问题修复
- P0: room_store sqlite3→aiosqlite异步化
- P0: points_service统一异常处理+轻量重试
- P0: _send_to_scope加warning日志
- P1: 积分历史记录补充source/reason字段
- P1: 赛马结算写入赔率快照(odds_snapshot)
- P1: test_commands改为commands_mod间接引用(测试隔离)
- P2: 马名去重统一casefold()比较
2026-05-01 22:50:14 +08:00
b86cc009e9 refactor: 移除插件初始化时的配置打印日志
这些调试日志在生产环境中会造成不必要的控制台输出,移除后使代码更简洁。
2026-04-07 20:51:40 +08:00
b4f71ddb3b docs(赛马插件): 更新命令说明并改进默认马名逻辑
- 在README中补充命令参数和示例
- 当未提供马名时,自动使用用户昵称作为默认马名
- 优化帮助文本中的命令描述
2026-04-07 20:50:28 +08:00
9205b1af8b fix(配置): 清空特殊概率用户列表默认值
将 SPECIAL_PROBABILITY_USERS 默认值从包含特定用户ID的列表改为空列表,避免默认开启特殊概率功能。
2026-04-07 20:46:46 +08:00
f81fffcf50 test: 增加测试超时时间以提升稳定性
- 将模拟赛事的等待超时从60秒延长至180秒(实时进度)和15秒延长至30秒(非实时)
- 避免测试因网络延迟或处理时间不足而意外失败
2026-04-07 20:42:32 +08:00
5df0487b88 fix(测试): 修复完全模拟比赛测试中的消息验证逻辑
- 将消息列表中的消息强制转换为字符串,避免类型错误
- 使用 any() 检查关键消息是否存在,而不是依赖固定索引
- 改进开赛名单和进度消息的验证逻辑
- 修复回合进度条目数量检查的逻辑
2026-04-07 20:38:31 +08:00
33b75d46f8 fix(test): 修复模拟消息发送返回类型不匹配的问题
将返回的消息ID从字符串类型改为包含message_id键的字典,以匹配实际接口的返回格式。
2026-04-07 20:35:16 +08:00
9a00d3d731 test: 完善模拟赛马测试中的消息服务模拟
为 _NoopMessageService 添加基本消息记录和撤回功能,以支持 race_update 消息的防刷屏机制。这使得测试环境能更真实地模拟生产代码的行为,确保在模拟密集更新时不会因消息过多而影响测试观察。
2026-04-07 20:29:43 +08:00
e445878ed8 fix: 修正测试中模拟赛马奖励次数检查逻辑
原检查条件错误地减去了1,导致在赛马数量为0时出现负值。
现在直接比较奖励调用次数与赛马数量是否相等。
2026-04-07 20:26:02 +08:00
d1871d3919 test: 为内存积分服务添加获取余额的模拟方法
添加 get_balance 方法到 _InMemoryPointsService 模拟类中,以便在测试中能够模拟查询用户余额的操作。
2026-04-07 20:22:48 +08:00
9895256064 feat(horse_racing): 实现赛马消息更新替换与自动撤回
重构消息发送逻辑,引入消息类型区分和自动撤回机制。赛马进度更新现在会替换前一条更新消息,避免消息刷屏;比赛结果发送前自动撤回最后一条进度更新,提升聊天体验。同时支持配置不同消息类型的自动撤回时间。

- 新增 MessageService.send_with_recall 方法统一处理消息发送和撤回
- 添加 recall_previous_of_type 方法用于撤回特定类型的上一条消息
- 修改 _send_to_scope 函数支持消息类型参数
- 更新测试代码以适配新的消息发送接口
2026-04-07 20:17:00 +08:00
889cfc799b feat: 添加积分查询插件,提供用户积分查询相关命令
- 新增积分查询插件,包含我的积分、积分查询、积分排行和积分历史查询命令
- 支持群组和私聊场景,排行榜功能仅限群组使用
- 实现用户显示名称优先级(群昵称 > 昵称 > 用户ID)
- 添加详细的帮助文档和使用说明
2026-04-06 23:45:05 +08:00
5979f0c501 fix(赛马插件): 调整冠军奖励金额为150
冠军奖励从200降低至150,以平衡游戏经济系统。
2026-04-06 23:37:02 +08:00
2b8afcb1b0 fix(赛马插件): 修复进度条对齐并显示积分余额
修复赛马进度条显示时中文字符宽度计算问题,使用全角空格进行对齐
在积分结算时异步获取并显示用户当前积分余额
2026-04-06 23:33:01 +08:00
4aefb18435 refactor(room_store): 将上次马名存储从内存迁移至数据库
- 移除内存字典 `_last_horse_names`,改为使用 SQLite 表 `user_horse_names`
- 修改 `get_last_horse_name` 和 `set_last_horse_name` 方法以操作数据库
- 提升数据持久化能力,防止重启后数据丢失
2026-04-06 23:28:23 +08:00
386e67ec60 feat(赛马插件): 在结算时显示用户昵称而非ID
- 新增 `_get_user_name` 和 `_build_name_map` 函数,用于根据群名片或昵称获取用户显示名
- 修改 `_format_point_change_lines` 函数,接受并应用昵称映射
- 在 `run_race_with_settlement` 中构建昵称映射,并在冠军马主和中奖下注者处使用显示名
2026-04-06 23:24:32 +08:00