private async Task <string> ReadData(SftpClient client, SftpFile actualFile, GameLogFile known) { _logger.LogInformation("Read {0} from offset {1}", actualFile.FullName, known.ReadSize); using (var stream = client.Open(actualFile.FullName, FileMode.Open, FileAccess.Read)) { if (known.ReadSize != 0) { stream.Seek(known.ReadSize, SeekOrigin.Begin); } var data = known.UnreadData + await ReadData(stream); var dataEnd = data.LastIndexOf("\r\n"); known.UnreadData = data.Substring(dataEnd + 2); known.ReadSize = stream.Position; return(data.Substring(0, dataEnd)); } }
private async Task ProcessArmaLogFile(GameServer server, SftpClient client, SftpFile actualFile, GameLogFile logFileInfos) { var data = await ReadData(client, actualFile, logFileInfos); logFileInfos.LastSyncUTC = DateTime.UtcNow; if (logFileInfos.GameLogFileID == 0) { _context.Add(logFileInfos); } else { _context.Update(logFileInfos); } var playerConnectEvents = await _context.GameLogEvents .Where(e => e.Type == GameLogEventType.Connect && !e.IsFinished && e.GameServerID == server.GameServerID) .ToDictionaryAsync(e => e.SteamId, e => e); var lineMatch = 0; foreach (var line in data.Split("\r\n")) { var match = ArmaLineRegex.Match(line); if (match.Success) { lineMatch++; var lineData = match.Groups[7].Value; if (lineData == "Starting mission:") { var dt = ParseDateTime(match); foreach (var evData in playerConnectEvents.Values) { Finish(dt, evData); } playerConnectEvents = new Dictionary <string, GameLogEvent>(); } else if (lineData.StartsWith("OPC DATA") || lineData.StartsWith("OPD DATA")) { var ev = AramaSteamIdQuotedRegex.Match(lineData); if (ev.Success) { var evData = new GameLogEvent() { Timestamp = ParseDateTime(match), SteamId = ev.Groups[1].Value, Server = server, Type = lineData.StartsWith("OPD DATA") ? GameLogEventType.Disconnect : GameLogEventType.Connect }; PlayerEvent(playerConnectEvents, evData); } } else if (lineData.StartsWith("[GTD] (persistence)")) { var ev = ArmaConnectRegex.Match(lineData); if (ev.Success) { var evData = new GameLogEvent() { Timestamp = ParseDateTime(match), SteamId = ev.Groups[2].Value, Server = server, Type = ev.Groups[1].Value == "Saved" ? GameLogEventType.Disconnect : GameLogEventType.Connect }; PlayerEvent(playerConnectEvents, evData); } } } } _logger.LogInformation("{0} matching lines", lineMatch); await _context.SaveChangesAsync(); }