All checks were successful
continuous-integration/drone/push Build is passing
- 修复 update_event_with_score() 和 update_event_with_result() 的比分清理逻辑 - 解决了标题中比分不断累积的问题(如 "✓ 2-0 1-0") - 改进正则表达式,现在能清理所有位置的比分 - 手动修复了9个历史事件的标题 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
234 lines
11 KiB
Markdown
234 lines
11 KiB
Markdown
# Changelog
|
||
|
||
## v4.3 - 2025-09-13 - 修复标题多重比分问题
|
||
- **🐛 修复多重比分累积问题**:
|
||
- 修复了 `update_event_with_score()` 和 `update_event_with_result()` 方法中的比分清理逻辑
|
||
- 原问题:正则表达式 `^(\d+[-:]\d+\s+)+` 无法匹配带有 `✓` 标记的标题,导致比分不断累积
|
||
- 现在使用 `\d+-\d+\s+` 清理所有比分,不限于开头位置
|
||
- 修复了9个历史事件的标题(如 "✓ 2-0 1-0" 改为 "✓ 2-0")
|
||
|
||
## v4.2 - 2025-09-13 - 智能合并重复比赛
|
||
- **🔀 智能合并重复比赛**:
|
||
- 新增 `_merge_duplicate_matches()` 方法
|
||
- 自动检测同时间(30分钟窗口)具有共同队伍的比赛
|
||
- 当发现两场比赛在同一时间且共享一个队伍时,认为是同一场比赛的不同表示
|
||
- 例如:将 "Team Liquid vs OG" 和 "Team Liquid vs OG Esports" 合并为一场比赛
|
||
- **📝 队伍名称标准化**:
|
||
- 保留更长的队伍名称作为正式名称
|
||
- 解决了队伍名称变体问题(如 "OG" vs "OG Esports")
|
||
- 避免因队伍名称不一致导致的重复事件
|
||
- **⚡ 优化处理流程**:
|
||
- 在 `fetch_all_matches()` 后立即进行合并处理
|
||
- 减少后续同步过程中的重复检查
|
||
- 提高整体同步效率
|
||
|
||
## v4.1 - 2025-09-13 - 修复TBD事件重复问题
|
||
- **🐛 修复TBD事件匹配逻辑**:
|
||
- 修复了 `find_existing_event()` 方法中的TBD匹配逻辑
|
||
- 原问题:只匹配 "TBD_TBD" 事件键,不匹配 "TBD_NGX" 或 "PV_TBD" 等部分TBD事件
|
||
- 现在可以正确识别并更新所有包含TBD的事件("TBD vs Team" 和 "Team vs TBD")
|
||
- 防止创建重复事件,确保TBD事件被更新而非创建新事件
|
||
- **🔧 增强TBD事件清理**:
|
||
- 修复了 `clean_duplicate_and_expired_events()` 方法的清理逻辑
|
||
- 原问题:只删除 "TBD vs TBD" 格式的事件,导致部分TBD事件无法被清理
|
||
- 现在删除所有与确认比赛同时间的TBD事件,不再限于特定格式
|
||
- 成功清理了9月13日的3个重复TBD事件
|
||
- **🎯 问题根源分析**:
|
||
- 发现问题:同一时间存在 "TBD vs NGX" 和 "XG vs NGX" 重复事件
|
||
- 根本原因:TBD事件没有被正确更新,而是创建了新的确认事件
|
||
- 解决方案:改进事件匹配算法,支持部分TBD匹配和时间窗口匹配
|
||
|
||
## 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.1 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
|
||
| v4.2 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
|
||
|
||
## 使用建议
|
||
|
||
推荐使用最新的 v4.2 版本,它包含智能合并重复比赛功能并提供更好的错误处理:
|
||
```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
|
||
``` |