using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Vanguard.Api;
using Vanguard.Api.Contracts;
using Vanguard.State;
namespace Vanguard.Meta
{
/// Обёртка над мета-эндпоинтами: магазин, коллекция, колоды.
public sealed class MetaService
{
private readonly ApiClient _api;
private readonly PlayerState _player;
public MetaService(ApiClient api, PlayerState player)
{
_api = api;
_player = player;
}
public string BaseUrl => _api.BaseUrl;
public async Task GetStoreAsync()
{
var store = await _api.GetAsync("/api/store");
_player.ApplyBalances(store.Balances);
return store;
}
public async Task OnboardAsync(string deckId)
{
var response = await _api.PostAsync(
"/api/meta/onboarding",
new OnboardingRequest { DeckId = deckId });
_player.ApplyBalances(response.Balances);
_player.MarkOnboarded(response.DeckId);
return response;
}
public async Task GetCollectionAsync()
{
var collection = await _api.GetAsync("/api/collection");
_player.ApplyBalances(collection.Balances);
return collection;
}
public async Task DismantleAsync(string printingId, int count)
{
var balances = await _api.PostAsync(
"/api/collection/dismantle",
new DismantleRequest
{
PrintingId = printingId,
Count = count,
IdempotencyKey = Guid.NewGuid().ToString("N"),
});
_player.ApplyBalances(balances);
return balances;
}
public async Task CraftAsync(string printingId)
{
var balances = await _api.PostAsync(
"/api/collection/craft",
new CraftRequest
{
PrintingId = printingId,
IdempotencyKey = Guid.NewGuid().ToString("N"),
});
_player.ApplyBalances(balances);
return balances;
}
public async Task> GetDecksAsync()
{
var decks = await _api.GetAsync>("/api/decks");
return decks ?? new List();
}
public async Task CreateDeckAsync(string name, List cards) =>
await _api.PostAsync(
"/api/decks",
new DeckRequest { Name = name, Cards = cards });
public async Task UpdateDeckAsync(Guid deckId, string name, List cards) =>
await _api.PutAsync(
"/api/decks/" + deckId.ToString("D"),
new DeckRequest { Name = name, Cards = cards });
public Task DeleteDeckAsync(Guid deckId) =>
_api.DeleteAsync("/api/decks/" + deckId.ToString("D"));
public async Task ValidateDeckAsync(Guid deckId, List cards) =>
await _api.PostAsync(
"/api/decks/" + deckId.ToString("D") + "/validate",
new DeckRequest { Cards = cards });
public async Task EnqueueAsync(Guid deckId, string mode) =>
await _api.PostAsync(
"/api/game/queue",
new QueueRequest { DeckId = deckId, Mode = mode });
public async Task GetQueueStatusAsync(Guid queueId) =>
await _api.GetAsync(
"/api/game/queue/" + queueId.ToString("D"));
public Task CancelQueueAsync(Guid queueId) =>
_api.DeleteAsync("/api/game/queue/" + queueId.ToString("D"));
public async Task CreateTicketAsync(string matchId) =>
await _api.PostAsync(
"/api/game/tickets",
new TicketRequest { MatchId = matchId });
public async Task BuyBoosterAsync(string payment)
{
var result = await _api.PostAsync(
"/api/store/buy/booster",
new BoosterBuyRequest
{
Payment = payment,
IdempotencyKey = Guid.NewGuid().ToString("N"),
});
_player.ApplyBalances(result.Balances);
return result;
}
public async Task BuyTrialDeckAsync(string deckId)
{
var balances = await _api.PostAsync(
"/api/store/buy/trialdeck",
new TrialDeckBuyRequest
{
DeckId = deckId,
IdempotencyKey = Guid.NewGuid().ToString("N"),
});
_player.ApplyBalances(balances);
return balances;
}
public async Task GetHistoryAsync(int limit = 20, int offset = 0) =>
await _api.GetAsync(
"/api/matches?limit=" + limit + "&offset=" + offset);
public async Task GetReplayAsync(string matchId, bool includeFrames = true) =>
await _api.GetAsync(
"/api/replays/" + matchId + "?includeFrames=" + (includeFrames ? "true" : "false"));
public async Task> GetCatalogAsync() =>
await _api.GetAsync>("/api/cards")
?? new List();
}
}