public async Task <GameState> LoadHistoryGetState() { var tokens = accountHandler.FindTokenByMetadata(Player1Address, "GameId", Id.ToString()); GameState lastState = null; GameHistory.Clear(); GameHistoryTxIds.Clear(); //var tok = tokens.Values.OrderBy(t => t.TimeStamp); foreach (var t in tokens) { try { if (t.Value.Metadata != null) { if (t.Value.Metadata.TryGetValue("GameData", out var gameData)) { var parsedData = JsonConvert.DeserializeObject <ChessGameDto>(gameData); if (parsedData != null) { if (parsedData.GameId == Id.ToString() && parsedData.Type == GameDtoTypes.ChessGame) { //GameHistoryTxIds.Add(t.Key); if (parsedData.Players.Count > 0) { Players = parsedData.Players; } parsedData.TxId = t.Key; parsedData.TimeStamp = t.Value.TimeStamp; GameHistory.Add(parsedData); } lastState = JsonConvert.DeserializeObject <GameState>(parsedData.GameState); } } } } catch (Exception ex) { log.Error("Chess Game - wrong format of gameData in token metadata. Cannot load history", ex); return(null); } } var ghist = GameHistory.OrderBy(t => t.TimeStamp); GameHistory = ghist.ToList <ChessGameDto>(); foreach (var gh in GameHistory) { GameHistoryTxIds.Add(gh.TxId); } var last = GameHistoryTxIds.LastOrDefault(); if (last != null) { ActualStateTxId = last; } return(await Task.FromResult(lastState)); }
public async Task <string> LoadHistoryFromActualTx() { try { var allLoaded = false; var actualTxLoading = ActualStateTxId; while (!allLoaded) { var info = await NeblioTransactionHelpers.TransactionInfoAsync(null, TransactionTypes.Neblio, actualTxLoading); if (info == null) { return(await Task.FromResult("OK - No History yet.")); } if (info.VoutTokens != null) { if (info.VoutTokens.Count > 0) { var token = info.VoutTokens[0]; if (token.Metadata != null) { if (token.Metadata.Count > 0) { if (token.Metadata.TryGetValue("GameId", out var gameid)) { if (gameid == Id.ToString()) { if (token.Metadata.TryGetValue("GameData", out var gameData)) { if (!string.IsNullOrEmpty(gameData)) { try { var parsedData = JsonConvert.DeserializeObject <ChessGameDto>(gameData); if (parsedData != null) { if (parsedData.GameId == Id.ToString() && parsedData.Type == GameDtoTypes.ChessGame) { GameHistoryTxIds.Add(actualTxLoading); if (Players.Count == 0 && parsedData.Players.Count > 0) { Players = parsedData.Players; } GameHistory.Add(parsedData); if (parsedData.LastGameRecordTxId != "StartOfNewGame") { actualTxLoading = parsedData.LastGameRecordTxId; } else { allLoaded = true; } } } } catch (Exception ex) { log.Error("Chess Game - wrong format of gameData in token metadata. Cannot load history", ex); return(null); } } } } } } } } } } // loading is going from newset to oldest one, so it is important to reverse whole list GameHistoryTxIds.Reverse(); GameHistory.Reverse(); return(await Task.FromResult("OK")); } catch (Exception ex) { log.Error("Chess Game - Cannot load game History!", ex); return(await Task.FromResult("ERROR")); } }