private static async Task<bool> TryUpload(string[] logLines, GameMetaData gameMetaData, GameStats game, bool submitFailure) { try { game?.HsReplay.UploadTry(); Influx.OnGameUpload(game?.HsReplay.UploadTries ?? 1); var lines = logLines.SkipWhile(x => !x.Contains("CREATE_GAME")).ToArray(); var metaData = UploadMetaDataGenerator.Generate(lines, gameMetaData, game); Log.Info("Creating upload request..."); var uploadRequest = await ApiWrapper.CreateUploadRequest(metaData); Log.Info("Upload Id: " + uploadRequest.ShortId); await ApiWrapper.UploadLog(uploadRequest, lines); Log.Info("Upload complete"); if(game != null) { game.HsReplay.UploadId = uploadRequest.ShortId; game.HsReplay.ReplayUrl = uploadRequest.ReplayUrl; if(DefaultDeckStats.Instance.DeckStats.Any(x => x.DeckId == game.DeckId)) DefaultDeckStats.Save(); else DeckStatsList.Save(); } return true; } catch(WebException ex) { Log.Error(ex); if(submitFailure) Influx.OnGameUploadFailed(ex.Status); return false; } }
public static async Task<bool> Upload(string[] logLines, GameMetaData gameMetaData, GameStats game) { var log = string.Join(Environment.NewLine, logLines); var item = new UploaderItem(log.GetHashCode()); if(InProgress.Contains(item)) { Log.Info($"{item.Hash} already in progress. Waiting for it to complete..."); InProgress.Add(item); return await item.Success; } InProgress.Add(item); Log.Info($"Uploading {item.Hash}..."); var success = false; try { success = await TryUpload(logLines, gameMetaData, game, true); } catch(Exception ex) { Log.Error(ex); Influx.OnGameUploadFailed(); } Log.Info($"{item.Hash} complete. Success={success}"); foreach(var waiting in InProgress.Where(x => x.Hash == item.Hash)) waiting.Complete(success); InProgress.RemoveAll(x => x.Hash == item.Hash); return success; }
public static UploadMetaData Generate(string[] log, GameMetaData gameMetaData, GameStats game) { var metaData = new UploadMetaData(); var playerInfo = GetPlayerInfo(log, game); if(playerInfo != null) { metaData.Player1 = playerInfo.Player1; metaData.Player2 = playerInfo.Player2; } if(!string.IsNullOrEmpty(gameMetaData?.ServerInfo?.Address)) metaData.ServerIp = gameMetaData.ServerInfo.Address; if(gameMetaData?.ServerInfo?.Port > 0) metaData.ServerPort = gameMetaData.ServerInfo.Port.ToString(); if(gameMetaData?.ServerInfo?.GameHandle > 0) metaData.GameHandle = gameMetaData.ServerInfo.GameHandle.ToString(); if(gameMetaData?.ServerInfo?.ClientHandle > 0) metaData.ClientHandle = gameMetaData.ServerInfo.ClientHandle.ToString(); if(!string.IsNullOrEmpty(gameMetaData?.ServerInfo?.SpectatorPassword)) metaData.SpectatePassword = gameMetaData.ServerInfo.SpectatorPassword; if(!string.IsNullOrEmpty(gameMetaData?.ServerInfo?.AuroraPassword)) metaData.AuroraPassword = gameMetaData.ServerInfo.AuroraPassword; if(!string.IsNullOrEmpty(gameMetaData?.ServerInfo?.Version)) metaData.ServerVersion = gameMetaData.ServerInfo.Version; if(game?.StartTime > DateTime.MinValue) metaData.MatchStart = game.StartTime.ToString("o"); if(game != null) metaData.GameType = game.GameType != GameType.GT_UNKNOWN ? (int)HearthDbConverter.GetBnetGameType(game.GameType, game.Format) : (int)HearthDbConverter.GetGameType(game.GameMode, game.Format); if(game?.Format != null) metaData.Format = (int)HearthDbConverter.GetFormatType(game.Format); metaData.SpectatorMode = game?.GameMode == GameMode.Spectator; metaData.Reconnected = gameMetaData?.Reconnected ?? false; metaData.Resumable = gameMetaData?.ServerInfo?.Resumable ?? false; metaData.FriendlyPlayerId = game?.FriendlyPlayerId > 0 ? game.FriendlyPlayerId : (playerInfo?.FriendlyPlayerId > 0 ? playerInfo?.FriendlyPlayerId : null); var scenarioId = game?.ScenarioId ?? gameMetaData?.ServerInfo?.Mission; if(scenarioId > 0) metaData.ScenarioId = scenarioId; var build = gameMetaData?.HearthstoneBuild ?? game?.HearthstoneBuild ?? (game != null ? BuildDates.GetByDate(game.StartTime) : null); if(build > 0) metaData.HearthstoneBuild = build; if(game?.BrawlSeasonId > 0) metaData.BrawlSeason = game.BrawlSeasonId; if(game?.RankedSeasonId > 0) metaData.LadderSeason = game.RankedSeasonId; return metaData; }