dota2-match-calendar/CHANGELOG.md
Ching L aa892e17fb
All checks were successful
continuous-integration/drone/push Build is passing
发布 v4.0:代码结构重构与错误处理优化
主要改进:
- 使用 dataclass 替代字典存储比赛数据,提高类型安全性
- 实现自动重试机制,添加指数退避
- 使用 Python logging 模块,支持多级别日志
- 拆分大函数为多个专门的方法,提高可维护性
- 实现优雅降级,单个失败不影响整体流程
- 将 v3 版本移至 legacy 目录存档

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-12 17:58:02 +08:00

194 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
## v4.0 - 2025-09-12 - 代码结构重构与错误处理优化
- **🏗️ 代码结构重构**
- 使用 `@dataclass` 替代字典存储比赛数据,提高类型安全性
- 拆分大函数 `sync_matches_to_calendar()` 为多个专门的方法
- 新增 `process_upcoming_matches()` 处理即将进行的比赛
- 新增 `process_completed_matches()` 处理已完成的比赛
- 新增 `clean_duplicate_and_expired_events()` 清理重复和过期事件
- 提取 `find_existing_event()` 统一事件查找逻辑
- **🔄 增强错误处理**
- 实现 `retry_on_exception` 装饰器,提供指数退避重试机制
- 所有网络请求Liquipedia 和 Google Calendar API都支持自动重试
- 单个比赛处理失败不影响整体同步流程(优雅降级)
- **📝 专业日志系统**
- 使用 Python `logging` 模块替代 `print` 语句
- 支持多级别日志DEBUG, INFO, WARNING, ERROR
- 添加时间戳和详细的异常堆栈信息
- 支持通过命令行参数调整日志级别
- **⚡ 性能和可维护性**
- 提取重复代码为独立方法(`_extract_score()`, `_extract_format()`, `_extract_tournament()`
- 改进的错误报告和调试信息
- 更好的代码组织和模块化设计
## v3.9 - 2025-09-12 - 增强TBD事件清理功能
- **自动删除已结束的TBD事件**
- 检查事件的结束时间如果已过且仍包含TBD则自动删除
- 避免日历中保留已过期但未更新的TBD占位符
- 例如:删除已结束的 "BB vs TBD"、"Tidebd vs TBD" 等事件
- **智能删除TBD vs TBD占位符**
- 当同一时间段30分钟窗口存在确认的比赛时自动删除TBD vs TBD事件
- 解决了TBD vs TBD与确认比赛重复的问题
- 例如9月11日的多个TBD vs TBD事件被正确清理
- **改进的事件分组逻辑**
- 按30分钟时间窗口分组事件更准确地识别同时间的比赛
- 优化了TBD事件与确认比赛的匹配算法
## v3.8 - 2025-09-08 - 修复重复比分显示问题
- **修复标题中重复比分的问题**
- 修复了在更新比赛比分时可能出现重复比分的bug如 "0-2 0-1"
- 改进了 `update_event_with_score` 方法,使用更强的正则表达式清理多个比分
- 改进了 `update_event_with_result` 方法,先清理所有旧比分再添加最终比分
- **增强比分更新逻辑**
- 进行中比分更新时会正确移除之前的所有比分
- 完成比赛更新时会先清理进行中的比分,再添加最终结果
- 确保标题中始终只显示一个比分
## v3.7 - 2025-09-08 - 增强重复事件处理和TBD管理
- **改进TBD比赛ID生成**
- TBD vs TBD比赛现在使用时间戳生成唯一ID避免重复创建
- 普通比赛继续使用队伍+锦标赛组合生成ID
- **自动删除被取代的TBD事件**
- 当同一时间段存在确定的比赛时自动删除对应的TBD占位符
- 例如XG vs Tundra确定后自动删除XG vs TBD事件
- 使用30分钟时间窗口匹配相近时间的事件
- **重复比赛清理功能**
- 自动检测同一天同队伍的重复比赛
- 优先保留已完成的比赛,删除未完成的重复事件
- 修复了NGX vs Liquid等比赛的重复问题
- **增强的重复事件检测**
- 按30分钟时间窗口分组事件
- 自动删除同时间的重复TBD事件
- 改进了过期TBD事件的清理逻辑
- **改进TBD事件更新逻辑**
- 只在队伍确定时才尝试更新TBD事件避免TBD vs TBD互相匹配
- 保持1小时的时间窗口用于TBD事件匹配
## v3.6 - 改进TBD比赛处理机制
- **放宽TBD比赛时间匹配条件**
- 将TBD事件匹配的时间窗口从5分钟扩大到1小时
- 更好地处理比赛时间调整的情况
- 添加时间差异显示,方便调试
- **自动删除过期TBD事件**
- 新增 `delete_calendar_event()` 方法
- 自动检测并删除超过2小时的过期TBD事件
- 避免日历中积累无效的占位事件
- **增强的TBD事件管理**
- 跟踪已更新的TBD事件避免误删
- 在同步摘要中显示删除的TBD事件数量
## v3.5 - 修复TBD比赛标记问题
- **修复TBD比赛错误标记为完成**
- 修改比分解析逻辑,只匹配破折号而不匹配冒号
- 避免将时间(19:00)误识别为比分
- 添加日期格式检查,防止误识别
- **TBD比赛保护机制**
- 确保TBD vs TBD的比赛永远不会被标记为有比分或已完成
- 如果错误解析了TBD比赛的比分会自动删除
- 增强比分验证逻辑
## v3.4 - 修复重复事件问题
- **修复进行中比赛更新创建重复的问题**
- 改进事件匹配逻辑,增强基于队伍名称的查找
- 即使比分变化也能正确识别同一场比赛
- 避免在比分更新时(如从 1-0 到 1-1创建新事件
- **新增重复事件清理工具**
- 添加 `cleanup_duplicates.py` 用于查找和删除重复事件
- 添加 `delete_duplicates.py` 用于手动清理特定重复
- **增强的事件查找机制**
- 不仅通过 ID 查找,还通过 team+tournament 组合查找
- 支持忽略比分差异的模糊匹配
- 改进对时间变更和 TBD 更新的处理
## v3.3 - 支持进行中比赛的实时比分
- **使用 BeautifulSoup 解析 HTML 结构**
- 重写了 `_parse_match` 方法,使用 DOM 结构而非正则表达式
- 准确提取队名、比分、赛制和锦标赛信息
- 解决了 "Aurora1:0(Bo3)YkBros" 格式的解析问题
- **区分系列赛进行中和已完成状态**
- 新增 `has_score` 标记,表示比赛是否有比分
- Bo3 需要 2 胜才标记为完成Bo5 需要 3 胜
- 进行中的比赛显示当前比分(如 1-0但不显示✓标记
- **新增进行中比分更新功能**
- 添加 `update_event_with_score` 方法处理进行中比赛
- 在日历标题显示实时比分(如 "1-0 Team1 vs Team2"
- 在描述中添加 "📊 CURRENT SCORE" 标记
- **扩展处理时间范围**
- 处理最近 12 小时内的比赛,捕获正在进行的比赛
- 确保进行中的比赛比分能及时同步
## v3.2.1 - 修复比分识别问题
- **修复错误的比分解析**
- 修复了将日期时间误识别为比分的问题(如 "19-00"
- 改进比分识别逻辑,只在包含 "vs" 的上下文中查找比分
- 添加比分范围验证0-5排除不合理的数值
- 增强时间模式识别,避免将时间戳识别为比分
## v3.2 - TBD 比赛优化
- **智能去重机制**
- 相同时间、相同轮次的多个 TBD 比赛只保留一个代表
- 避免日历中出现大量重复的 TBD 条目
- **TBD 比赛自动更新**
- 当 TBD 比赛的队伍确定后,自动更新对应的日历事件
- 通过时间和锦标赛信息智能匹配 TBD 事件
- 新增 `update_event_with_teams` 方法专门处理队伍更新
- **改进的事件匹配逻辑**
- 三层匹配机制ID 匹配 → 队伍+锦标赛匹配 → 时间+锦标赛匹配
- 确保 TBD 比赛更新后仍能正确跟踪
## v3.1 - 格式优化更新
- **新的标题格式**:
- 之前: `Dota 2 - The International 2025: Team1 vs Team2`
- 现在: `Team1 vs Team2 [The International 2025]`
- **简化的完成标记**:
- 之前: `[COMPLETED] Dota 2 - Tournament: Team1 vs Team2`
- 现在: `✓ 2-0 Team1 vs Team2 [Tournament]`
- 移除了 "Dota 2" 字样,让日历更简洁
- 比分紧跟在✓后面,更加紧凑
## v3.0 - 时间变更检测
- 新增比赛时间变更自动检测
- 当赛程调整时自动更新日历
- 支持 `--no-time-updates` 参数跳过时间更新
## v2.0 - 比赛结果更新
- 自动获取已完成比赛的结果
- 更新日历事件显示比分和获胜队伍
- 支持 `--no-results` 参数跳过结果更新
## v1.0 - 基础同步
- 从 Liquipedia 获取 Tier 1 比赛
- 同步到 Google Calendar
- 避免重复添加
- 支持 dry-run 模式
## 功能对比
| 版本 | 同步比赛 | 更新结果 | 时间变更 | 新格式 | TBD优化 | 实时比分 |
|------|---------|---------|---------|--------|---------|----------|
| v1.0 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| v2.0 | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| v3.0 | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| v3.1 | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| v3.2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| v3.3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.9 | ✓ | ✓ | ✓ | ✓ | ✓+ | ✓ |
| v4.0 | ✓ | ✓ | ✓ | ✓ | ✓+ | ✓ |
## 使用建议
推荐使用最新的 v4.0 版本,它包含所有功能并提供更好的错误处理:
```bash
python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID"
```
调试模式:
```bash
python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID" --log-level DEBUG
```