public static ParsedEvtcLog ParseLog(string location) { var parser = new EvtcParser(parserSettings); var fInfo = new FileInfo(location); return(parser.ParseLog(new TestOperationController(), fInfo)); }
public static void DoWork(OperationController operation) { System.Globalization.CultureInfo before = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); operation.Reset(); var sw = new Stopwatch(); try { sw.Start(); var fInfo = new FileInfo(operation.InputFile); var parser = new EvtcParser(new EvtcParserSettings(Properties.Settings.Default.Anonymous, Properties.Settings.Default.SkipFailedTries, Properties.Settings.Default.ParsePhases, Properties.Settings.Default.ParseCombatReplay, Properties.Settings.Default.ComputeDamageModifiers, Properties.Settings.Default.CustomTooShort, Properties.Settings.Default.DetailledWvW), APIController); //Process evtc here ParsedEvtcLog log = parser.ParseLog(operation, fInfo, out GW2EIEvtcParser.ParserHelpers.ParsingFailureReason failureReason); if (failureReason != null) { failureReason.Throw(); } var externalTraces = new List <string>(); string[] uploadresult = UploadOperation(externalTraces, fInfo); if (Properties.Settings.Default.SendEmbedToWebhook && Properties.Settings.Default.UploadToDPSReports) { var webhookSettings = new WebhookSettings(Properties.Settings.Default.WebhookURL, !Properties.Settings.Default.SendSimpleMessageToWebhook ? BuildEmbed(log, uploadresult[0]) : null); WebhookController.SendMessage(externalTraces, uploadresult[0], webhookSettings); } foreach (string trace in externalTraces) { operation.UpdateProgress(trace); } if (uploadresult[0].Contains("https")) { operation.DPSReportLink = uploadresult[0]; } //Creating File GenerateFiles(log, operation, uploadresult, fInfo); } catch (Exception ex) { throw new ProgramException(ex); } finally { sw.Stop(); GC.Collect(); Thread.CurrentThread.CurrentCulture = before; operation.Elapsed = ("Elapsed " + sw.ElapsedMilliseconds + " ms"); } }
public static ParsedEvtcLog ParseLog(string location, GW2EIGW2API.GW2APIController apiController) { var parser = new EvtcParser(parserSettings, apiController); var fInfo = new FileInfo(location); ParsedEvtcLog parsedLog = parser.ParseLog(new TestOperationController(), fInfo, out GW2EIEvtcParser.ParserHelpers.ParsingFailureReason failureReason); if (failureReason != null) { failureReason.Throw(); } return(parsedLog); }
public CheckResult CheckLog(string filename) { try { var parser = new EVTCParser(); var processor = new LogProcessor(); var bytes = ReadLogFileBytes(filename); var parsedLog = parser.ParseLog(bytes); var log = processor.ProcessLog(parsedLog); var analyzer = new LogAnalyzer(log); var encounter = log.EncounterData.Encounter; var mode = analyzer.GetMode(); var result = analyzer.GetResult(); var players = analyzer.GetPlayers() .Select(p => new LogPlayer { CharacterName = p.Name, AccountName = p.AccountName, Profession = p.Profession, EliteSpecialization = p.EliteSpecialization, Subgroup = p.Subgroup }).ToList(); var duration = analyzer.GetEncounterDuration(); // This combination of builds resulted in logs that did not contain NPCs other than the main target. // There is not much of a point in checking these. // This outdated version of arcdps was commonly used for extended periods of time due to it being // the last version that had working arcdps build templates. if (log.EvtcVersion == "EVTC20191001" && (log.GameBuild ?? 0) >= 100565) { return(new CheckResult { Ignored = true, Correct = false, ProcessingFailed = false, Encounter = Result <Encounter> .UncheckedResult(encounter), Mode = Result <EncounterMode> .UncheckedResult(mode), Result = Result <EncounterResult> .UncheckedResult(result), Players = Result <List <LogPlayer> > .UncheckedResult(players), Duration = Result <TimeSpan> .UncheckedResult(duration) }); } var eiSettings = new EvtcParserSettings(false, false, true, false, false, 0); var eiParser = new EvtcParser(eiSettings, eiApiController); var eiLog = eiParser.ParseLog(new EIController(), new MemoryStream(bytes), out var eiFailureReason); if (eiLog == null) { eiFailureReason.Throw(); } var eiDuration = TimeSpan.FromMilliseconds(eiLog.FightData.FightEnd - eiLog.FightData.FightStart); var eiResult = eiLog.FightData.Success ? EncounterResult.Success : EncounterResult.Failure; var eiPlayers = eiLog.PlayerList .Where(p => p.Prof != "Sword") .Select(p => { Profession profession; if (Enum.TryParse(p.Prof, out EliteSpecialization specialization)) { profession = GameData.Characters.GetProfession(specialization); } else { specialization = EliteSpecialization.None; if (!Enum.TryParse(p.Prof, out profession)) { throw new Exception($"Unknown profession {p.Prof} found in Elite Insights data."); } } return(new LogPlayer { CharacterName = p.Character, // EI strips the leading : in account names, so we re-add it AccountName = $":{p.Account}", Profession = profession, EliteSpecialization = specialization, Subgroup = p.Group }); }).ToList(); var eiMode = eiLog.FightData.IsCM ? EncounterMode.Challenge : EncounterMode.Normal; // There is no reasonable way to compare EI and Analytics encounters var encounterResult = Result <Encounter> .UncheckedResult(encounter); var resultResult = CheckResult ? Result <EncounterResult> .CheckedResult(eiResult, result) : Result <EncounterResult> .UncheckedResult(result); var modeResult = CheckMode ? Result <EncounterMode> .CheckedResult(eiMode, mode) : Result <EncounterMode> .UncheckedResult(mode); var playerResult = CheckPlayers ? players.ToHashSet().SetEquals(eiPlayers) ? Result <List <LogPlayer> > .CorrectResult(players) : Result <List <LogPlayer> > .IncorrectResult(eiPlayers, players) : Result <List <LogPlayer> > .UncheckedResult(players); var durationResult = CheckDuration ? (eiDuration - duration) < DurationEpsilon ? Result <TimeSpan> .CorrectResult(duration) : Result <TimeSpan> .IncorrectResult(eiDuration, duration) : Result <TimeSpan> .UncheckedResult(duration); bool correct = encounterResult.Correct && resultResult.Correct && modeResult.Correct && playerResult.Correct && durationResult.Correct; return(new CheckResult { Correct = correct, ProcessingFailed = false, Encounter = encounterResult, Mode = modeResult, Result = resultResult, Players = playerResult, Duration = durationResult }); } catch (TooShortException) { return(new CheckResult { Ignored = true, Correct = false }); } catch (Exception e) { return(new CheckResult { Correct = false, ProcessingFailed = true, ProcessingException = e }); } }