Skip to content

Commit

Permalink
Merge pull request #72 from Atralupus/feat/arena-season-endpoint
Browse files Browse the repository at this point in the history
Implement arena season endpoint
  • Loading branch information
Atralupus authored May 21, 2024
2 parents 6ff43da + 311316c commit 71a4afa
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 4 deletions.
36 changes: 32 additions & 4 deletions Mimir/Controllers/ArenaController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,25 @@ namespace Mimir.Controllers;

[ApiController]
[Route("{network}/arena")]
public class ArenaController(ArenaRankingRepository arenaRankingRepository) : ControllerBase
public class ArenaController(
ArenaRankingRepository arenaRankingRepository,
TableSheetsRepository tableSheetsRepository
) : ControllerBase
{
[HttpGet("season")]
public async Task<ArenaSeason> GetLatestSeason(
string network,
MetadataRepository metadataRepository
)
{
var (championshipId, round) = await tableSheetsRepository.GetLatestArenaSeason(
network,
await metadataRepository.GetLatestBlockIndex(network)
);

return new ArenaSeason(championshipId, round);
}

[HttpGet("ranking/{avatarAddress}/rank")]
public async Task<long> GetRankByAvatarAddress(
string network,
Expand Down Expand Up @@ -71,15 +88,26 @@ IStateService stateService
var myAvatarState = await stateGetter.GetAvatarStateAsync(myAvatarAddress);
var myAvatarItemSlotState = await stateGetter.GetItemSlotStateAsync(myAvatarAddress);
var myAvatarRuneStates = await stateGetter.GetRuneStatesAsync(myAvatarAddress);
var myAvatarRuneSlotState = await stateGetter.GetRuneSlotStateAsync(myAvatarAddress, BattleType.Arena);
var myAvatarRuneSlotState = await stateGetter.GetRuneSlotStateAsync(
myAvatarAddress,
BattleType.Arena
);
var enemyAvatarState = await stateGetter.GetAvatarStateAsync(enemyAvatarAddress);
var enemyAvatarItemSlotState = await stateGetter.GetItemSlotStateAsync(enemyAvatarAddress);
var enemyAvatarRuneStates = await stateGetter.GetRuneStatesAsync(enemyAvatarAddress);
var enemyAvatarRuneSlotState = await stateGetter.GetRuneSlotStateAsync(enemyAvatarAddress, BattleType.Arena);
var enemyAvatarRuneSlotState = await stateGetter.GetRuneSlotStateAsync(
enemyAvatarAddress,
BattleType.Arena
);

var bulkSimulator = new ArenaBulkSimulator();
var result = await bulkSimulator.BulkSimulate(
new AvatarStatesForArena(myAvatarState, myAvatarItemSlotState, myAvatarRuneStates, myAvatarRuneSlotState),
new AvatarStatesForArena(
myAvatarState,
myAvatarItemSlotState,
myAvatarRuneStates,
myAvatarRuneSlotState
),
new AvatarStatesForArena(
enemyAvatarState,
enemyAvatarItemSlotState,
Expand Down
6 changes: 6 additions & 0 deletions Mimir/Models/Arena/ArenaSeason.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Mimir.Models.Arena;

public record ArenaSeason(
int ChampionshipId,
int Round
);
51 changes: 51 additions & 0 deletions Mimir/Repositories/TableSheetsRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using MongoDB.Bson.IO;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using static Nekoyume.TableData.ArenaSheet;

namespace Mimir.Repositories;

Expand All @@ -19,6 +20,56 @@ protected override string GetCollectionName()
return "tableSheets";
}

public async Task<(int, int)> GetLatestArenaSeason(string network, long blockIndex)
{
var collection = GetCollection(network);

var pipelines = new BsonDocument[]
{
new BsonDocument("$match", new BsonDocument("Name", "ArenaSheet")),
new BsonDocument(
"$addFields",
new BsonDocument("SheetJsonArray", new BsonDocument("$objectToArray", "$SheetJson"))
),
new BsonDocument("$unwind", new BsonDocument("path", "$SheetJsonArray")),
new BsonDocument("$unwind", new BsonDocument("path", "$SheetJsonArray.v.Round")),
new BsonDocument(
"$match",
new BsonDocument(
"$and",
new BsonArray
{
new BsonDocument(
"SheetJsonArray.v.Round.StartBlockIndex",
new BsonDocument("$lte", blockIndex)
),
new BsonDocument(
"SheetJsonArray.v.Round.EndBlockIndex",
new BsonDocument("$gte", blockIndex)
)
}
)
),
new BsonDocument(
"$project",
new BsonDocument
{
{ "_id", 0 },
{ "ChampionshipId", "$SheetJsonArray.v.Round.ChampionshipId" },
{ "Round", "$SheetJsonArray.v.Round.Round" }
}
)
};

var document = collection.Aggregate<BsonDocument>(pipelines).FirstOrDefault();
if (document == null)
{
throw new InvalidOperationException("No matching document found.");
}

return (document["ChampionshipId"].ToInt32(), document["Round"].ToInt32());
}

public string[] GetSheetNames(string network)
{
var collection = GetCollection(network);
Expand Down

0 comments on commit 71a4afa

Please sign in to comment.