Compare commits

...

2 Commits

Author SHA1 Message Date
Ching
b049bdfda4 docs: 重构文档结构,将更新日志移至 CHANGELOG.md
All checks were successful
continuous-integration/drone/push Build is passing
- 从 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
Ching
cf679b7107 fix: 防止未开始的比赛被错误标记为完成 v4.4
问题修复:
- 添加时间检查,只有已开始的比赛才能标记为完成
- 防止Liquipedia的预设比分导致未来比赛被误标为完成
- 修复了XG vs PV等未开始比赛显示完成状态的问题

技术细节:
- 在_parse_match方法中增加match_has_started检查
- 只有match_datetime <= now时才判断比赛是否完成
- 对未来比赛的比分记录debug日志但不标记为完成

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-14 12:27:35 +08:00
3 changed files with 57 additions and 31 deletions

View File

@ -1,13 +1,38 @@
# Changelog
## v4.3 - 2025-09-13 - 修复标题多重比分问题
## 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 - 智能合并重复比赛
## v4.2 - 2025-09-13
### 智能合并重复比赛
- 🔀 智能合并重复比赛:自动检测同时间具有共同队伍的比赛并合并(处理队伍名称变体)
- 📝 队伍名称标准化:当发现 "OG" 和 "OG Esports" 这样的变体时,保留更长的完整名称
- ⚡ 优化数据获取:在获取数据时即进行去重,减少后续处理的复杂度
**技术细节**
- **🔀 智能合并重复比赛**
- 新增 `_merge_duplicate_matches()` 方法
- 自动检测同时间30分钟窗口具有共同队伍的比赛
@ -22,7 +47,13 @@
- 减少后续同步过程中的重复检查
- 提高整体同步效率
## v4.1 - 2025-09-13 - 修复TBD事件重复问题
## 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事件
@ -38,7 +69,15 @@
- 根本原因TBD事件没有被正确更新而是创建了新的确认事件
- 解决方案改进事件匹配算法支持部分TBD匹配和时间窗口匹配
## v4.0 - 2025-09-12 - 代码结构重构与错误处理优化
## v4.0 - 2025-09-05
### 代码结构重构与错误处理优化
- 🏗️ 代码结构重构:使用 dataclass 替代字典,提高类型安全性
- 🔄 增强错误处理:添加自动重试机制(指数退避)
- 📝 专业日志系统:使用 Python logging 模块,支持多级别日志
- 🛡️ 优雅降级:部分失败不影响整体同步流程
- ⚡ 代码模块化:拆分大函数,提高可维护性
**技术细节**
- **🏗️ 代码结构重构**
- 使用 `@dataclass` 替代字典存储比赛数据,提高类型安全性
- 拆分大函数 `sync_matches_to_calendar()` 为多个专门的方法
@ -220,10 +259,12 @@
| v4.0 | ✓ | ✓ | ✓ | ✓ | ✓+ | ✓ |
| v4.1 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.2 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.3 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.4 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
## 使用建议
推荐使用最新的 v4.2 版本,它包含智能合并重复比赛功能并提供更好的错误处理
推荐使用最新的 v4.4 版本,它修复了未开始比赛被错误标记为完成的问题
```bash
python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID"
```

View File

@ -1,31 +1,7 @@
# Dota 2 Calendar Sync v4.3
# Dota 2 Calendar Sync v4.4
自动从 Liquipedia 获取 Dota 2 Tier 1 比赛信息并同步到 Google Calendar支持自动更新比赛结果、时间变更、智能管理TBD占位事件、自动清理过期和重复比赛。
## 更新日志
### v4.3 (2025-09-13)
- 🐛 修复多重比分累积:解决了标题中出现多个比分的问题(如 "✓ 2-0 1-0"
- 🔧 改进比分清理逻辑:现在能正确清理所有位置的比分,不只是开头
- ✅ 修复了9个历史事件的标题格式
### v4.2 (2025-09-13)
- 🔀 智能合并重复比赛:自动检测同时间具有共同队伍的比赛并合并(处理队伍名称变体)
- 📝 队伍名称标准化:当发现 "OG" 和 "OG Esports" 这样的变体时,保留更长的完整名称
- ⚡ 优化数据获取:在获取数据时即进行去重,减少后续处理的复杂度
### v4.1 (2025-09-13)
- 🐛 修复TBD事件匹配逻辑现在可以正确识别并更新部分TBD事件如 "TBD vs Team" 或 "Team vs TBD"
- 🔧 增强TBD事件清理删除所有与确认比赛同时间的TBD事件不再限于 "TBD vs TBD" 格式
- 🎯 防止创建重复事件改进事件匹配算法确保TBD事件被更新而非创建新事件
### v4.0 (2025-09-05)
- 🏗️ 代码结构重构:使用 dataclass 替代字典,提高类型安全性
- 🔄 增强错误处理:添加自动重试机制(指数退避)
- 📝 专业日志系统:使用 Python logging 模块,支持多级别日志
- 🛡️ 优雅降级:部分失败不影响整体同步流程
- ⚡ 代码模块化:拆分大函数,提高可维护性
## 功能
- 自动获取 Liquipedia 上的 Tier 1 级别 Dota 2 比赛

View File

@ -317,7 +317,16 @@ class Dota2CalendarSync:
score2 = int(score_parts.group(2))
# Check if series is completed
completed = self._is_series_completed(score1, score2, format_str)
# Only mark as completed if the match has already started
now = datetime.now(pytz.UTC)
match_has_started = match_datetime <= now
if match_has_started:
completed = self._is_series_completed(score1, score2, format_str)
else:
# Future match with score - likely a placeholder/prediction
completed = False
logger.debug(f"Future match {team1} vs {team2} has score {score} but not marking as completed")
if completed:
winner = team1 if score1 > score2 else team2