dota2-match-calendar/CHANGELOG.md
Ching b049bdfda4
All checks were successful
continuous-integration/drone/push Build is passing
docs: 重构文档结构,将更新日志移至 CHANGELOG.md
- 从 README.md 中移除详细的更新日志
- 在 CHANGELOG.md 中统一格式,每个版本包含简要说明和技术细节
- README.md 保持简洁,只包含项目介绍和使用说明
- 更新至 v4.4 版本说明

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-14 14:36:30 +08:00

13 KiB
Raw Permalink Blame History

Changelog

v4.4 - 2025-09-14

修复未开始比赛被错误标记为完成

  • 🐛 修复未开始比赛被错误标记为完成的问题
  • 添加时间检查:只有已开始的比赛才能被标记为完成
  • 🔧 防止Liquipedia的预设比分导致未来比赛被误标为完成
  • 📝 为未来带比分的比赛添加debug日志

技术细节

  • _parse_match() 方法中添加时间检查逻辑
  • 只有当 match_datetime <= now 时才会将比赛标记为完成
  • 新增 match_has_started 检查,确保只处理已开始的比赛
  • 例如:修复了 XG vs PV16:00 UTC被误标为 "✓ 0-2" 的问题

v4.3 - 2025-09-13

修复标题多重比分问题

  • 🐛 修复多重比分累积:解决了标题中出现多个比分的问题(如 "✓ 2-0 1-0"
  • 🔧 改进比分清理逻辑:现在能正确清理所有位置的比分,不只是开头
  • 修复了9个历史事件的标题格式

技术细节

  • 🐛 修复多重比分累积问题
    • 修复了 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

智能合并重复比赛

  • 🔀 智能合并重复比赛:自动检测同时间具有共同队伍的比赛并合并(处理队伍名称变体)
  • 📝 队伍名称标准化:当发现 "OG" 和 "OG Esports" 这样的变体时,保留更长的完整名称
  • 优化数据获取:在获取数据时即进行去重,减少后续处理的复杂度

技术细节

  • 🔀 智能合并重复比赛
    • 新增 _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事件匹配逻辑现在可以正确识别并更新部分TBD事件如 "TBD vs Team" 或 "Team vs TBD"
  • 🔧 增强TBD事件清理删除所有与确认比赛同时间的TBD事件不再限于 "TBD vs TBD" 格式
  • 🎯 防止创建重复事件改进事件匹配算法确保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-05

代码结构重构与错误处理优化

  • 🏗️ 代码结构重构:使用 dataclass 替代字典,提高类型安全性
  • 🔄 增强错误处理:添加自动重试机制(指数退避)
  • 📝 专业日志系统:使用 Python logging 模块,支持多级别日志
  • 🛡️ 优雅降级:部分失败不影响整体同步流程
  • 代码模块化:拆分大函数,提高可维护性

技术细节

  • 🏗️ 代码结构重构
    • 使用 @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.3 ✓++
v4.4 ✓++

使用建议

推荐使用最新的 v4.4 版本,它修复了未开始比赛被错误标记为完成的问题:

python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID"

调试模式:

python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID" --log-level DEBUG