diff --git a/core/log-parser/index.js b/core/log-parser/index.js index 8f8867e..2a91ebb 100644 --- a/core/log-parser/index.js +++ b/core/log-parser/index.js @@ -14,7 +14,12 @@ export default class LogParser extends EventEmitter { options.filename = filename; - this.eventStore = {}; + this.eventStore = { + disconnected: {}, // holding area, cleared on map change. + players: {}, // persistent data, steamid, controller, suffix. + session: {}, // old eventstore, nonpersistent data + clients: {} // used in the connection chain before we resolve a player. + }; this.linesPerMinute = 0; this.matchingLinesPerMinute = 0; @@ -61,6 +66,19 @@ export default class LogParser extends EventEmitter { this.linesPerMinute++; } + // manage cleanup disconnected players, session data. + clearEventStore() { + Logger.verbose('LogParser', 2, 'Cleaning Eventstore'); + for (const player of Object.values(this.eventStore.players)) { + if (this.eventStore.disconnected[player.steamID] === true) { + Logger.verbose('LogParser', 2, `Removing ${player.steamID} from eventStore`); + delete this.eventStore.players[player.steamID]; + delete this.eventStore.disconnected[player.steamID]; + } + } + this.eventStore.session = {}; + } + getRules() { return []; } diff --git a/squad-server/log-parser/client-connected.js b/squad-server/log-parser/client-connected.js new file mode 100644 index 0000000..55e8dbc --- /dev/null +++ b/squad-server/log-parser/client-connected.js @@ -0,0 +1,19 @@ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogNet: AddClientConnection: Added client connection: \[UNetConnection\] RemoteAddr: ([0-9]{17}):[0-9]+, Name: (SteamNetConnection_[0-9]+), Driver: GameNetDriver (SteamNetDriver_[0-9]+), IsServer: YES, PC: NULL, Owner: NULL, UniqueId: INVALID/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + steamID: args[3], + connection: args[4], + driver: args[5] + }; + /* This is Called when unreal engine adds a client connection + First Step in Adding a Player to server + */ + logParser.eventStore.clients[args[4]] = args[3]; + logParser.emit('CLIENT_CONNECTED', data); + } +}; diff --git a/squad-server/log-parser/client-login.js b/squad-server/log-parser/client-login.js new file mode 100644 index 0000000..20b84d7 --- /dev/null +++ b/squad-server/log-parser/client-login.js @@ -0,0 +1,20 @@ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: Login: NewPlayer: SteamNetConnection \/Engine\/Transient\.(SteamNetConnection_[0-9]+)/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + connection: args[3] + }; + /* This is Called when a player begins the Login process + We use this to get a SteamID into playerConnected. + 2nd Step in player connected path + */ + + logParser.eventStore['client-login'] = logParser.eventStore.clients[args[3]]; + delete logParser.eventStore.clients[args[3]]; + logParser.emit('CLIENT_LOGIN', data); + } +}; diff --git a/squad-server/log-parser/deployable-damaged.js b/squad-server/log-parser/deployable-damaged.js index 9cd1958..91e653d 100644 --- a/squad-server/log-parser/deployable-damaged.js +++ b/squad-server/log-parser/deployable-damaged.js @@ -14,7 +14,7 @@ export default { healthRemaining: args[8] }; - logParser.eventStore[args[3]] = data; + logParser.eventStore.session[args[3]] = data; logParser.emit('DEPLOYABLE_DAMAGED', data); } diff --git a/squad-server/log-parser/index.js b/squad-server/log-parser/index.js index ca03fb8..594734c 100644 --- a/squad-server/log-parser/index.js +++ b/squad-server/log-parser/index.js @@ -4,6 +4,7 @@ import AdminBroadcast from './admin-broadcast.js'; import DeployableDamaged from './deployable-damaged.js'; import NewGame from './new-game.js'; import PlayerConnected from './player-connected.js'; +import PlayerControllerConnected from './playercontroller-connected.js'; import PlayerDisconnected from './player-disconnected.js'; import PlayerDamaged from './player-damaged.js'; import PlayerDied from './player-died.js'; @@ -15,7 +16,9 @@ import RoundEnded from './round-ended.js'; import RoundTickets from './round-tickets.js'; import RoundWinner from './round-winner.js'; import ServerTickRate from './server-tick-rate.js'; -import SteamIDConnected from './steamid-connected.js'; +import ClientConnected from './client-connected.js'; +import ClientLogin from './client-login.js'; +import PendingConnectionDestroyed from './pending-connection-destroyed.js'; export default class SquadLogParser extends LogParser { constructor(options) { @@ -28,6 +31,7 @@ export default class SquadLogParser extends LogParser { DeployableDamaged, NewGame, PlayerConnected, + PlayerControllerConnected, PlayerDisconnected, PlayerDamaged, PlayerDied, @@ -39,7 +43,9 @@ export default class SquadLogParser extends LogParser { RoundTickets, RoundWinner, ServerTickRate, - SteamIDConnected + ClientConnected, + ClientLogin, + PendingConnectionDestroyed ]; } } diff --git a/squad-server/log-parser/new-game.js b/squad-server/log-parser/new-game.js index 251285d..477de2f 100644 --- a/squad-server/log-parser/new-game.js +++ b/squad-server/log-parser/new-game.js @@ -18,5 +18,6 @@ export default { delete logParser.eventStore.WON; logParser.emit('NEW_GAME', data); + logParser.clearEventStore(); } }; diff --git a/squad-server/log-parser/pending-connection-destroyed.js b/squad-server/log-parser/pending-connection-destroyed.js new file mode 100644 index 0000000..3d4aa1c --- /dev/null +++ b/squad-server/log-parser/pending-connection-destroyed.js @@ -0,0 +1,20 @@ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogNet: UNetConnection::PendingConnectionLost\. \[UNetConnection\] RemoteAddr: ([0-9]{17}):[0-9]+, Name: (SteamNetConnection_[0-9]+), Driver: GameNetDriver (SteamNetDriver_[0-9]+), IsServer: YES, PC: NULL, Owner: NULL, UniqueId: (?:Steam:UNKNOWN \[.+\]|INVALID) bPendingDestroy=0/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + steamID: args[3], + connection: args[4], + driver: args[5] + }; + /* This is Called when a pending client fails + Only used to cleanup clients in eventstore + */ + + delete logParser.eventStore.clients[args[4]]; + logParser.emit('PENDING_CONNECTION_DESTROYED', data); + } +}; diff --git a/squad-server/log-parser/player-connected.js b/squad-server/log-parser/player-connected.js index b3e5b06..279257d 100644 --- a/squad-server/log-parser/player-connected.js +++ b/squad-server/log-parser/player-connected.js @@ -6,9 +6,22 @@ export default { time: args[1], chainID: args[2], playerSuffix: args[3], - steamID: logParser.eventStore['steamid-connected'] + steamID: logParser.eventStore['client-login'], // player connected + controller: logParser.eventStore['player-controller'] // playercontroller connected }; + delete logParser.eventStore['client-login']; + delete logParser.eventStore['player-controller']; + + // Handle Reconnecting players + if (logParser.eventStore.disconnected[data.steamID]) { + delete logParser.eventStore.disconnected[data.steamID]; + } logParser.emit('PLAYER_CONNECTED', data); + logParser.eventStore.players[data.steamID] = { + steamID: data.steamID, + suffix: data.playerSuffix, + controller: data.controller + }; } }; diff --git a/squad-server/log-parser/player-damaged.js b/squad-server/log-parser/player-damaged.js index 2b0fd34..b1057e2 100644 --- a/squad-server/log-parser/player-damaged.js +++ b/squad-server/log-parser/player-damaged.js @@ -12,7 +12,7 @@ export default { weapon: args[6] }; - logParser.eventStore[args[3]] = data; + logParser.eventStore.session[args[3]] = data; logParser.emit('PLAYER_DAMAGED', data); } diff --git a/squad-server/log-parser/player-died.js b/squad-server/log-parser/player-died.js index 26b052b..c9f1520 100644 --- a/squad-server/log-parser/player-died.js +++ b/squad-server/log-parser/player-died.js @@ -3,7 +3,7 @@ export default { /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquadTrace: \[DedicatedServer](?:ASQSoldier::)?Die\(\): Player:(.+) KillingDamage=(?:-)*([0-9.]+) from ([A-z_0-9]+) caused by ([A-z_0-9-]+)_C/, onMatch: (args, logParser) => { const data = { - ...logParser.eventStore[args[3]], + ...logParser.eventStore.session[args[3]], raw: args[0], time: args[1], woundTime: args[1], @@ -14,7 +14,7 @@ export default { weapon: args[6] }; - logParser.eventStore[args[3]] = data; + logParser.eventStore.session[args[3]] = data; logParser.emit('PLAYER_DIED', data); } diff --git a/squad-server/log-parser/player-disconnected.js b/squad-server/log-parser/player-disconnected.js index d3c87ee..6df5e64 100644 --- a/squad-server/log-parser/player-disconnected.js +++ b/squad-server/log-parser/player-disconnected.js @@ -1,14 +1,16 @@ export default { regex: - /^\[([0-9.:-]+)]\[([ 0-9]*)]LogEasyAntiCheatServer: \[[0-9:]+] \[[A-z]+] \[EAC Server] \[Info] \[UnregisterClient] Client: ([A-z0-9]+) PlayerGUID: ([0-9]{17})/, + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogNet: UNetConnection::Close: \[UNetConnection\] RemoteAddr: ([0-9]{17}):[0-9]+, Name: SteamNetConnection_[0-9]+, Driver: GameNetDriver SteamNetDriver_[0-9]+, IsServer: YES, PC: (BP_PlayerController_C_[0-9]+), Owner: BP_PlayerController_C_[0-9]+, UniqueId: Steam:UNKNOWN \[.*\], Channels: [0-9]+, Time: [0-9.:-]+/, onMatch: (args, logParser) => { const data = { raw: args[0], time: args[1], chainID: args[2], - steamID: args[4] + steamID: args[3], + playerController: args[4] }; + logParser.eventStore.disconnected[data.steamID] = true; logParser.emit('PLAYER_DISCONNECTED', data); } }; diff --git a/squad-server/log-parser/player-possess.js b/squad-server/log-parser/player-possess.js index ce96ea8..68dda70 100644 --- a/squad-server/log-parser/player-possess.js +++ b/squad-server/log-parser/player-possess.js @@ -10,7 +10,7 @@ export default { possessClassname: args[4] }; - logParser.eventStore[args[3]] = args[2]; + logParser.eventStore.session[args[3]] = args[2]; logParser.emit('PLAYER_POSSESS', data); } diff --git a/squad-server/log-parser/player-revived.js b/squad-server/log-parser/player-revived.js index 8661b8a..bb412ee 100644 --- a/squad-server/log-parser/player-revived.js +++ b/squad-server/log-parser/player-revived.js @@ -3,7 +3,7 @@ export default { regex: /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: (.+) has revived (.+)\./, onMatch: (args, logParser) => { const data = { - ...logParser.eventStore[args[3]], + ...logParser.eventStore.session[args[3]], raw: args[0], time: args[1], chainID: args[2], diff --git a/squad-server/log-parser/player-un-possess.js b/squad-server/log-parser/player-un-possess.js index 2e697dd..d2b9bc4 100644 --- a/squad-server/log-parser/player-un-possess.js +++ b/squad-server/log-parser/player-un-possess.js @@ -7,10 +7,11 @@ export default { time: args[1], chainID: args[2], playerSuffix: args[3], - switchPossess: args[3] in logParser.eventStore && logParser.eventStore[args[3]] === args[2] + switchPossess: + args[3] in logParser.eventStore.session && logParser.eventStore.session[args[3]] === args[2] }; - delete logParser.eventStore[args[3]]; + delete logParser.eventStore.session[args[3]]; logParser.emit('PLAYER_UNPOSSESS', data); } diff --git a/squad-server/log-parser/player-wounded.js b/squad-server/log-parser/player-wounded.js index 283d8a2..9a832dc 100644 --- a/squad-server/log-parser/player-wounded.js +++ b/squad-server/log-parser/player-wounded.js @@ -3,7 +3,7 @@ export default { /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquadTrace: \[DedicatedServer](?:ASQSoldier::)?Wound\(\): Player:(.+) KillingDamage=(?:-)*([0-9.]+) from ([A-z_0-9]+) caused by ([A-z_0-9-]+)_C/, onMatch: (args, logParser) => { const data = { - ...logParser.eventStore[args[3]], + ...logParser.eventStore.session[args[3]], raw: args[0], time: args[1], chainID: args[2], @@ -13,7 +13,7 @@ export default { weapon: args[6] }; - logParser.eventStore[args[3]] = data; + logParser.eventStore.session[args[3]] = data; logParser.emit('PLAYER_WOUNDED', data); } diff --git a/squad-server/log-parser/playercontroller-connected.js b/squad-server/log-parser/playercontroller-connected.js new file mode 100644 index 0000000..18a0216 --- /dev/null +++ b/squad-server/log-parser/playercontroller-connected.js @@ -0,0 +1,16 @@ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: PostLogin: NewPlayer: BP_PlayerController_C .+(BP_PlayerController_C_[0-9]+)/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + controller: args[3] + }; + + logParser.eventStore['player-controller'] = args[3]; + + logParser.emit('PLAYER_CONTROLLER_CONNECTED', data); + } +}; diff --git a/squad-server/log-parser/steamid-connected.js b/squad-server/log-parser/steamid-connected.js deleted file mode 100644 index 4066ca2..0000000 --- a/squad-server/log-parser/steamid-connected.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - regex: - /^\[([0-9.:-]+)]\[([ 0-9]*)]LogEasyAntiCheatServer: \[[0-9:]+] \[[A-z]+] \[EAC Server] \[Info] \[RegisterClient] Client: ([A-z0-9]+) PlayerGUID: ([0-9]{17}) PlayerIP: [0-9]{17} OwnerGUID: [0-9]{17} PlayerName: (.+)/, - onMatch: async (args, logParser) => { - logParser.eventStore['steamid-connected'] = args[4]; - } -};