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);
        }
Ejemplo n.º 4
0
        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
                });
            }
        }