void EventHandler(object sender, LogsMonitorEventArgs logsMonitorEventArgs) { // note: event needs to be triggered regardless of skill being already known and up to date // there is no point in updating skill values, if server is not known var currentSvr = currentServer; if (currentSvr == null) { return; } SkillEntryParser parser = new SkillEntryParser(logger); bool anyParsed = false; foreach (var wurmLogEntry in logsMonitorEventArgs.WurmLogEntries) { SkillInfo skillInfo = parser.TryParseSkillInfoFromLogLine(wurmLogEntry); if (skillInfo != null) { skillInfo.Server = currentSvr; changedSkills.Enqueue(skillInfo); skillsMap.UpdateSkill(skillInfo, currentSvr); anyParsed = true; } } if (anyParsed) { onSkillsChanged.Trigger(); } }
private async Task ScanLogsHistory(TimeSpan maxTimeToLookBackInLogs) { DateTime maxDate = await currentServerLookupFinished.Task.ConfigureAwait(false); DateTime minDate = maxDate.SubtractConstrain(maxTimeToLookBackInLogs); // if already scanned, optimize if (scannedMinDate != null) { if (minDate >= scannedMinDate) { // do not scan, if this period has already been scanned return; } maxDate = scannedMinDate.Value; } var entries = await logsHistory.ScanAsync(new LogSearchParameters() { CharacterName = character.Name.Normalized, LogType = LogType.Skills, MinDate = minDate, MaxDate = maxDate }).ConfigureAwait(false); SkillEntryParser parser = new SkillEntryParser(logger); foreach (var wurmLogEntry in entries) { SkillInfo skillInfo = parser.TryParseSkillInfoFromLogLine(wurmLogEntry); if (skillInfo != null) { var entryServer = await character.TryGetHistoricServerAtLogStampAsync(wurmLogEntry.Timestamp).ConfigureAwait(false); if (entryServer != null) { skillInfo.Server = entryServer; skillsMap.UpdateSkill(skillInfo, entryServer); } else { logger.Log(LogLevel.Info, "Skill info rejected, server could not be identified for this entry: " + wurmLogEntry, this, null); } } } scannedMinDate = minDate; }
Dictionary <string, float> ParseDump() { var fileLines = File.ReadAllLines(dumpInfo.FileInfo.FullName); Dictionary <string, float> skills = new Dictionary <string, float>(); var parser = new SkillEntryParser(logger); foreach (var line in fileLines) { if (line.StartsWith("Skills") || line.StartsWith("Characteristics") || line.StartsWith("Religion") || line.StartsWith("-----")) { continue; } var match = Regex.Match(line, @"(.+): (.+) .+ .+", RegexOptions.Compiled | RegexOptions.CultureInvariant); var skillName = match.Groups[1].Value.Trim(); if (string.IsNullOrEmpty(skillName)) { logger.Log(LogLevel.Error, string.Format("Unparseable skill name in dump file {0}, raw line: {1}", dumpInfo.FileInfo.FullName, line), this, null); continue; } var level = parser.TryParseFloatInvariant(match.Groups[2].Value); if (level == null) { logger.Log(LogLevel.Error, string.Format("Unparseable skill value in dump file {0}, raw line: {1}", dumpInfo.FileInfo.FullName, line), this, null); continue; } skills[WurmSkills.NormalizeSkillName(skillName)] = level.Value; } return(skills); }