feat(mission): wire Tier 1 emits — rank/free/challenge match events
Adds IMissionProgressService to RankBattle, FreeBattle, ArenaTwoPickBattle, and ArenaTwoPick controllers. Each finish handler emits the appropriate MissionEventKeys builder result: - RankBattle.Finish (win) → Ranked.WinAll(classId) Includes AI-rank routes; on a private server AI wins count the same. - FreeBattle.Finish (win) → Free.WinAll() (aggregates only) - ArenaTwoPickBattle.Finish → Challenge.MatchPlayAll or MatchWinAll Always fires challenge_play; wins additionally fire challenge_win and the ranked/arena/daily aggregates. - ArenaTwoPick.Finish (5-win full clear) → Challenge.FullClearAll Gated on RunFinishOutcome.WasFullClear from the previous commit. This closes six of the eight remaining catalog wire-up gaps; class_level_up and rank_achieved follow in Tier 2 (need pre-state detection). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ using SVSim.BattleNode.Sessions;
|
||||
using SVSim.Database;
|
||||
using SVSim.Database.Enums;
|
||||
using SVSim.Database.Repositories.Viewer;
|
||||
using SVSim.Database.Services;
|
||||
using SVSim.Database.Services.BattleXp;
|
||||
using SVSim.Database.Services.Friend;
|
||||
using SVSim.Database.Services.RankProgress;
|
||||
@@ -40,6 +41,7 @@ public sealed class RankBattleController : ControllerBase
|
||||
private readonly IViewerRepository _viewers;
|
||||
private readonly IBattleXpService _xp;
|
||||
private readonly IRankProgressService _rankProgress;
|
||||
private readonly IMissionProgressService _missionProgress;
|
||||
private readonly SVSimDbContext _db;
|
||||
private readonly ILogger<RankBattleController> _log;
|
||||
|
||||
@@ -54,6 +56,7 @@ public sealed class RankBattleController : ControllerBase
|
||||
IViewerRepository viewers,
|
||||
IBattleXpService xp,
|
||||
IRankProgressService rankProgress,
|
||||
IMissionProgressService missionProgress,
|
||||
SVSimDbContext db,
|
||||
ILogger<RankBattleController> log)
|
||||
{
|
||||
@@ -67,6 +70,7 @@ public sealed class RankBattleController : ControllerBase
|
||||
_viewers = viewers;
|
||||
_xp = xp;
|
||||
_rankProgress = rankProgress;
|
||||
_missionProgress = missionProgress;
|
||||
_db = db;
|
||||
_log = log;
|
||||
}
|
||||
@@ -161,6 +165,13 @@ public sealed class RankBattleController : ControllerBase
|
||||
level = xp.Level == 0 ? 1 : xp.Level;
|
||||
}
|
||||
|
||||
// Mission counters — AI-rank routes emit the same keys as human-rank on a private server.
|
||||
if (isWin)
|
||||
{
|
||||
await _missionProgress.RecordEventAsync(
|
||||
vid, MissionEventKeys.Ranked.WinAll(req.ClassId), ct: ct);
|
||||
}
|
||||
|
||||
return Ok(new RankBattleFinishResponseDto
|
||||
{
|
||||
BattleResult = req.BattleResult,
|
||||
|
||||
Reference in New Issue
Block a user