1
0
mirror of synced 2024-11-28 00:20:53 +01:00

Fix Oni/UraOni best score handling

This commit is contained in:
esuo1198 2024-04-18 22:02:22 +09:00
parent 8a15529e12
commit 15c63c097c

View File

@ -5,7 +5,7 @@ namespace TaikoLocalServer.Handlers;
public record GetSelfBestQuery(uint Baid, uint Difficulty, uint[] SongIdList) : IRequest<CommonSelfBestResponse>; public record GetSelfBestQuery(uint Baid, uint Difficulty, uint[] SongIdList) : IRequest<CommonSelfBestResponse>;
public class GetSelfBestQueryHandler(IGameDataService gameDataService, TaikoDbContext context, ILogger<GetSelfBestQueryHandler> logger) public class GetSelfBestQueryHandler(IGameDataService gameDataService, TaikoDbContext context, ILogger<GetSelfBestQueryHandler> logger)
: IRequestHandler<GetSelfBestQuery, CommonSelfBestResponse> : IRequestHandler<GetSelfBestQuery, CommonSelfBestResponse>
{ {
public async Task<CommonSelfBestResponse> Handle(GetSelfBestQuery request, CancellationToken cancellationToken) public async Task<CommonSelfBestResponse> Handle(GetSelfBestQuery request, CancellationToken cancellationToken)
@ -21,22 +21,39 @@ public class GetSelfBestQueryHandler(IGameDataService gameDataService, TaikoDbCo
logger.LogWarning("Invalid song IDs: {InvalidSongIds}", invalidSongIds.Stringify()); logger.LogWarning("Invalid song IDs: {InvalidSongIds}", invalidSongIds.Stringify());
requestSet.ExceptWith(invalidSongIds); requestSet.ExceptWith(invalidSongIds);
} }
var selfbestScores = await context.SongBestData var selfBestScores = await context.SongBestData
.Where(datum => datum.Baid == request.Baid && .Where(datum => datum.Baid == request.Baid &&
requestSet.Contains(datum.SongId) && requestSet.Contains(datum.SongId) &&
(datum.Difficulty == requestDifficulty || (datum.Difficulty == requestDifficulty ||
(datum.Difficulty == Difficulty.UraOni && requestDifficulty == Difficulty.Oni))) (datum.Difficulty == Difficulty.UraOni && requestDifficulty == Difficulty.Oni)))
.OrderBy(datum => datum.SongId) .OrderBy(datum => datum.SongId)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
var selfBestList = selfbestScores.ConvertAll(datum => new CommonSelfBestResponse.SelfBestData var selfBestList = new List<CommonSelfBestResponse.SelfBestData>();
foreach (var songId in selfBestScores.Select(datum => datum.SongId))
{ {
SongNo = datum.SongId, var selfBest = new CommonSelfBestResponse.SelfBestData();
SelfBestScore = datum.BestScore, var selfBestScore = selfBestScores
UraBestScore = datum.Difficulty == Difficulty.UraOni ? datum.BestScore : 0, .FirstOrDefault(datum => datum.SongId == songId &&
SelfBestScoreRate = datum.BestRate, datum.Difficulty == requestDifficulty);
UraBestScoreRate = datum.Difficulty == Difficulty.UraOni ? datum.BestRate : 0 var uraSelfBestScore = selfBestScores
}); .FirstOrDefault(datum => datum.SongId == songId &&
(datum.Difficulty == Difficulty.UraOni && requestDifficulty == Difficulty.Oni));
selfBest.SongNo = songId;
if (selfBestScore is not null)
{
selfBest.SelfBestScore = selfBestScore.BestScore;
selfBest.SelfBestScoreRate = selfBestScore.BestRate;
}
if (uraSelfBestScore is not null)
{
selfBest.UraBestScore = uraSelfBestScore.BestScore;
selfBest.UraBestScoreRate = uraSelfBestScore.BestRate;
}
selfBestList.Add(selfBest);
}
// For songs that don't have a score, add them to the response with 0s // For songs that don't have a score, add them to the response with 0s
var missingSongs = requestSet.Except(selfBestList.Select(datum => datum.SongNo)); var missingSongs = requestSet.Except(selfBestList.Select(datum => datum.SongNo));
selfBestList.AddRange(missingSongs.Select(songNo => new CommonSelfBestResponse.SelfBestData selfBestList.AddRange(missingSongs.Select(songNo => new CommonSelfBestResponse.SelfBestData