Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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();
        }