/// <summary> /// Register a provider for a particular game. Can register only one provider for a single gameID /// </summary> /// <param name="game"></param> /// <param name="provider"></param> public async Task RegisterGame(GameID game, IGameItemProvider provider) { if (!Providers.ContainsKey(game)) { //register this game in BC (this is a must for every game) //TODO: should we asume that all games should have a SecureProvider as BCGameItemProvider? //TODO: should we keep SecureProvider in original provider or parallel to it? //TODO: when to use SecureProvider: // - only when secure check should happen // - when original GameItemProvider fails // - switch original to SecureProvider upon direct request await BCComm.RegisterHoardGame(game); if (DefaultGame == GameID.kInvalidID) { DefaultGame = game; } await provider.Connect(); Providers.Add(game, provider); return; } throw new HoardException($"Game {game.ID} already registered!"); }
/// <summary> /// Return GameItem types for specyfied game /// </summary> /// <param name="game"></param> /// <returns></returns> public string[] GetGameItemTypes(GameID game) { if (Providers.ContainsKey(game)) { IGameItemProvider p = Providers[game]; return(p.GetItemTypes()); } return(null); }
/// <summary> /// Request game item transfer to player. /// </summary> /// <param name="sender">Transfer address of sender.</param> /// <param name="recipientID">Transfer address of recipient.</param> /// <param name="item">Game item to be transfered.</param> /// <param name="amount">Amount of game item to be transfered.</param> /// <returns>Async task that transfer game item to the other player.</returns> public async Task <bool> RequestGameItemTransfer(Profile sender, HoardID recipientID, GameItem item, BigInteger amount) { IGameItemProvider gameItemProvider = GetGameItemProvider(item); if (gameItemProvider != null && sender != null && recipientID != null) { return(await gameItemProvider.Transfer(sender, recipientID, item, amount)); } return(false); }
/// <summary> /// Returns all Game Items matching gameItemsParams /// </summary> /// <param name="gameItemsParams"></param> /// <returns></returns> public async Task <GameItem[]> GetItems(GameItemsParams[] gameItemsParams) { List <GameItem> items = new List <GameItem>(); foreach (var p in Providers) { IGameItemProvider provider = p.Value; items.AddRange(await provider.GetItems(gameItemsParams).ConfigureAwait(false)); } return(items.ToArray()); }
/// <summary> /// Return provider that supports given GameItem /// </summary> /// <param name="item"></param> /// <returns></returns> public IGameItemProvider GetGameItemProvider(GameItem item) { if (Providers.ContainsKey(item.Game)) { IGameItemProvider p = Providers[item.Game]; if (p.GetItemTypes().Contains(item.Symbol)) { return(p); } } return(null); }
/// <summary> /// Returns amount of all items of the specified type belonging to a particular player with given type /// </summary> /// <param name="profile"></param> /// <param name="gameID"></param> /// <param name="itemType">Item type</param> /// <returns></returns> public async Task <ulong> GetPlayerItemsAmount(Profile profile, GameID gameID, string itemType) { if (Providers.ContainsKey(gameID)) { IGameItemProvider c = Providers[gameID]; return(await c.GetPlayerItemsAmount(profile, itemType).ConfigureAwait(false)); } else { ErrorCallbackProvider.ReportWarning($"Game [{gameID.Name}] could not be found. Have you registered it properly?"); } return(await Task.FromResult <ulong>(0)); }
/// <summary> /// Returns all Game Items owned by player's subaccount in particular game /// </summary> /// <param name="profile"></param> /// <param name="gameID"></param> /// <param name="page">Page number</param> /// <param name="itemsPerPage">Number of items per page</param> /// <param name="itemType">Item type</param> /// <returns></returns> public async Task <GameItem[]> GetPlayerItems(Profile profile, GameID gameID, string itemType, ulong page, ulong itemsPerPage) { List <GameItem> items = new List <GameItem>(); if (Providers.ContainsKey(gameID)) { IGameItemProvider c = Providers[gameID]; items.AddRange(await c.GetPlayerItems(profile, itemType, page, itemsPerPage).ConfigureAwait(false)); } else { ErrorCallbackProvider.ReportWarning($"Game [{gameID.Name}] could not be found. Have you registered it properly?"); } return(items.ToArray()); }
/// <inheritdoc/> public async Task <bool> Deposit(Profile profile, GameItem item, BigInteger amount) { try { IGameItemProvider gameItemProvider = Hoard.GetGameItemProvider(item); if (gameItemProvider != null) { return(await gameItemProvider.Transfer(profile, ExchangeContract.Address, item, amount)); } throw new HoardException($"Cannot find GameItemProvider for item: {item.Symbol}!"); } catch (Nethereum.JsonRpc.Client.RpcResponseException ex) { throw new Exception(ex.ToString(), ex); } }