Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into feat/balance
Browse files Browse the repository at this point in the history
# Conflicts:
#	Mimir/Controllers/AvatarController.cs
  • Loading branch information
boscohyun committed May 21, 2024
2 parents fa945ac + 71a4afa commit d4d415d
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 24 deletions.
38 changes: 33 additions & 5 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 All @@ -26,7 +43,7 @@ public async Task<long> GetRankByAvatarAddress(
{
var rank = await arenaRankingRepository.GetRankByAvatarAddress(
network,
avatarAddress,
new Address(avatarAddress),
championshipId,
round
);
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
24 changes: 12 additions & 12 deletions Mimir/Controllers/AvatarController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,6 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer
string address,
IStateService stateService)
{
var avatar = avatarRepository.GetAvatar(network, address);
if (avatar is not null)
{
return avatar;
}

if (!AddressValidator.TryValidate(
address,
out var avatarAddress,
Expand All @@ -123,6 +117,12 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer
return null;
}

var avatar = avatarRepository.GetAvatar(network, avatarAddress);
if (avatar is not null)
{
return avatar;
}

var stateGetter = new StateGetter(stateService);
var avatarState = await stateGetter.GetAvatarStateAsync(avatarAddress);
if (avatarState is null)
Expand All @@ -140,12 +140,6 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer
string address,
IStateService stateService)
{
var inventory = avatarRepository.GetInventory(network, address);
if (inventory is not null)
{
return inventory;
}

if (!AddressValidator.TryValidate(
address,
out var inventoryAddress,
Expand All @@ -157,6 +151,12 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer
return null;
}

var inventory = avatarRepository.GetInventory(network, inventoryAddress);
if (inventory is not null)
{
return inventory;
}

var stateGetter = new StateGetter(stateService);
var inventoryState = await stateGetter.GetInventoryStateAsync(inventoryAddress);
if (inventoryState is null)
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
);
5 changes: 3 additions & 2 deletions Mimir/Repositories/ArenaRankingRespository.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Libplanet.Crypto;
using Mimir.Models.Agent;
using Mimir.Models.Arena;
using Mimir.Services;
Expand Down Expand Up @@ -26,7 +27,7 @@ protected override string GetCollectionName()

public async Task<long> GetRankByAvatarAddress(
string network,
string avatarAddress,
Address avatarAddress,
int? championshipId,
int? round
)
Expand Down Expand Up @@ -59,7 +60,7 @@ public async Task<long> GetRankByAvatarAddress(
"$unwind",
new BsonDocument { { "path", "$docs" }, { "includeArrayIndex", "Rank" } }
),
new("$match", new BsonDocument("docs.AvatarAddress", avatarAddress))
new("$match", new BsonDocument("docs.AvatarAddress", avatarAddress.ToHex()))
};

var aggregation = await collection.Aggregate<dynamic>(pipelines).ToListAsync();
Expand Down
11 changes: 6 additions & 5 deletions Mimir/Repositories/AvatarRepository.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Libplanet.Crypto;
using Mimir.Models.Agent;
using Mimir.Models.Avatar;
using Mimir.Services;
Expand All @@ -18,10 +19,10 @@ protected override string GetCollectionName()
return "avatars";
}

public Avatar? GetAvatar(string network, string avatarAddress)
public Avatar? GetAvatar(string network, Address avatarAddress)
{
var collection = GetCollection(network);
var filter = Builders<BsonDocument>.Filter.Eq("Avatar.address", avatarAddress);
var filter = Builders<BsonDocument>.Filter.Eq("Avatar.address", avatarAddress.ToHex());
var document = collection.Find(filter).FirstOrDefault();
if (document is null)
{
Expand All @@ -36,7 +37,7 @@ protected override string GetCollectionName()
document["Avatar"]["name"].AsString,
document["Avatar"]["level"].AsInt32,
document["Avatar"]["actionPoint"].AsInt32,
document["Avatar"]["dailyRewardReceivedIndex"].AsInt64
document["Avatar"]["dailyRewardReceivedIndex"].ToInt64()
);
}
catch (KeyNotFoundException)
Expand All @@ -45,10 +46,10 @@ protected override string GetCollectionName()
}
}

public Inventory? GetInventory(string network, string avatarAddress)
public Inventory? GetInventory(string network, Address avatarAddress)
{
var collection = GetCollection(network);
var filter = Builders<BsonDocument>.Filter.Eq("Avatar.address", avatarAddress);
var filter = Builders<BsonDocument>.Filter.Eq("Avatar.address", avatarAddress.ToHex());
var projection = Builders<BsonDocument>.Projection.Include("Avatar.inventory.Equipments");
var document = collection.Find(filter).Project(projection).FirstOrDefault();
if (document is null)
Expand Down
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 d4d415d

Please sign in to comment.