mirror of
https://github.com/AsgardEternal/SquadJS.git
synced 2024-09-28 14:04:25 -05:00
Merge pull request #258 from ect0s/LogParser-Sessions
Improve player connection and disconnection logic
This commit is contained in:
commit
164bad3e4c
@ -14,7 +14,12 @@ export default class LogParser extends EventEmitter {
|
|||||||
|
|
||||||
options.filename = filename;
|
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.linesPerMinute = 0;
|
||||||
this.matchingLinesPerMinute = 0;
|
this.matchingLinesPerMinute = 0;
|
||||||
@ -61,6 +66,19 @@ export default class LogParser extends EventEmitter {
|
|||||||
this.linesPerMinute++;
|
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() {
|
getRules() {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
19
squad-server/log-parser/client-connected.js
Normal file
19
squad-server/log-parser/client-connected.js
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
};
|
20
squad-server/log-parser/client-login.js
Normal file
20
squad-server/log-parser/client-login.js
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
};
|
@ -14,7 +14,7 @@ export default {
|
|||||||
healthRemaining: args[8]
|
healthRemaining: args[8]
|
||||||
};
|
};
|
||||||
|
|
||||||
logParser.eventStore[args[3]] = data;
|
logParser.eventStore.session[args[3]] = data;
|
||||||
|
|
||||||
logParser.emit('DEPLOYABLE_DAMAGED', data);
|
logParser.emit('DEPLOYABLE_DAMAGED', data);
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import AdminBroadcast from './admin-broadcast.js';
|
|||||||
import DeployableDamaged from './deployable-damaged.js';
|
import DeployableDamaged from './deployable-damaged.js';
|
||||||
import NewGame from './new-game.js';
|
import NewGame from './new-game.js';
|
||||||
import PlayerConnected from './player-connected.js';
|
import PlayerConnected from './player-connected.js';
|
||||||
|
import PlayerControllerConnected from './playercontroller-connected.js';
|
||||||
import PlayerDisconnected from './player-disconnected.js';
|
import PlayerDisconnected from './player-disconnected.js';
|
||||||
import PlayerDamaged from './player-damaged.js';
|
import PlayerDamaged from './player-damaged.js';
|
||||||
import PlayerDied from './player-died.js';
|
import PlayerDied from './player-died.js';
|
||||||
@ -15,7 +16,9 @@ import RoundEnded from './round-ended.js';
|
|||||||
import RoundTickets from './round-tickets.js';
|
import RoundTickets from './round-tickets.js';
|
||||||
import RoundWinner from './round-winner.js';
|
import RoundWinner from './round-winner.js';
|
||||||
import ServerTickRate from './server-tick-rate.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 {
|
export default class SquadLogParser extends LogParser {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
@ -28,6 +31,7 @@ export default class SquadLogParser extends LogParser {
|
|||||||
DeployableDamaged,
|
DeployableDamaged,
|
||||||
NewGame,
|
NewGame,
|
||||||
PlayerConnected,
|
PlayerConnected,
|
||||||
|
PlayerControllerConnected,
|
||||||
PlayerDisconnected,
|
PlayerDisconnected,
|
||||||
PlayerDamaged,
|
PlayerDamaged,
|
||||||
PlayerDied,
|
PlayerDied,
|
||||||
@ -39,7 +43,9 @@ export default class SquadLogParser extends LogParser {
|
|||||||
RoundTickets,
|
RoundTickets,
|
||||||
RoundWinner,
|
RoundWinner,
|
||||||
ServerTickRate,
|
ServerTickRate,
|
||||||
SteamIDConnected
|
ClientConnected,
|
||||||
|
ClientLogin,
|
||||||
|
PendingConnectionDestroyed
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,5 +18,6 @@ export default {
|
|||||||
delete logParser.eventStore.WON;
|
delete logParser.eventStore.WON;
|
||||||
|
|
||||||
logParser.emit('NEW_GAME', data);
|
logParser.emit('NEW_GAME', data);
|
||||||
|
logParser.clearEventStore();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
20
squad-server/log-parser/pending-connection-destroyed.js
Normal file
20
squad-server/log-parser/pending-connection-destroyed.js
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
};
|
@ -6,9 +6,22 @@ export default {
|
|||||||
time: args[1],
|
time: args[1],
|
||||||
chainID: args[2],
|
chainID: args[2],
|
||||||
playerSuffix: args[3],
|
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.emit('PLAYER_CONNECTED', data);
|
||||||
|
logParser.eventStore.players[data.steamID] = {
|
||||||
|
steamID: data.steamID,
|
||||||
|
suffix: data.playerSuffix,
|
||||||
|
controller: data.controller
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -12,7 +12,7 @@ export default {
|
|||||||
weapon: args[6]
|
weapon: args[6]
|
||||||
};
|
};
|
||||||
|
|
||||||
logParser.eventStore[args[3]] = data;
|
logParser.eventStore.session[args[3]] = data;
|
||||||
|
|
||||||
logParser.emit('PLAYER_DAMAGED', data);
|
logParser.emit('PLAYER_DAMAGED', data);
|
||||||
}
|
}
|
||||||
|
@ -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/,
|
/^\[([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) => {
|
onMatch: (args, logParser) => {
|
||||||
const data = {
|
const data = {
|
||||||
...logParser.eventStore[args[3]],
|
...logParser.eventStore.session[args[3]],
|
||||||
raw: args[0],
|
raw: args[0],
|
||||||
time: args[1],
|
time: args[1],
|
||||||
woundTime: args[1],
|
woundTime: args[1],
|
||||||
@ -14,7 +14,7 @@ export default {
|
|||||||
weapon: args[6]
|
weapon: args[6]
|
||||||
};
|
};
|
||||||
|
|
||||||
logParser.eventStore[args[3]] = data;
|
logParser.eventStore.session[args[3]] = data;
|
||||||
|
|
||||||
logParser.emit('PLAYER_DIED', data);
|
logParser.emit('PLAYER_DIED', data);
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
export default {
|
export default {
|
||||||
regex:
|
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) => {
|
onMatch: (args, logParser) => {
|
||||||
const data = {
|
const data = {
|
||||||
raw: args[0],
|
raw: args[0],
|
||||||
time: args[1],
|
time: args[1],
|
||||||
chainID: args[2],
|
chainID: args[2],
|
||||||
steamID: args[4]
|
steamID: args[3],
|
||||||
|
playerController: args[4]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
logParser.eventStore.disconnected[data.steamID] = true;
|
||||||
logParser.emit('PLAYER_DISCONNECTED', data);
|
logParser.emit('PLAYER_DISCONNECTED', data);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -10,7 +10,7 @@ export default {
|
|||||||
possessClassname: args[4]
|
possessClassname: args[4]
|
||||||
};
|
};
|
||||||
|
|
||||||
logParser.eventStore[args[3]] = args[2];
|
logParser.eventStore.session[args[3]] = args[2];
|
||||||
|
|
||||||
logParser.emit('PLAYER_POSSESS', data);
|
logParser.emit('PLAYER_POSSESS', data);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ export default {
|
|||||||
regex: /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: (.+) has revived (.+)\./,
|
regex: /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: (.+) has revived (.+)\./,
|
||||||
onMatch: (args, logParser) => {
|
onMatch: (args, logParser) => {
|
||||||
const data = {
|
const data = {
|
||||||
...logParser.eventStore[args[3]],
|
...logParser.eventStore.session[args[3]],
|
||||||
raw: args[0],
|
raw: args[0],
|
||||||
time: args[1],
|
time: args[1],
|
||||||
chainID: args[2],
|
chainID: args[2],
|
||||||
|
@ -7,10 +7,11 @@ export default {
|
|||||||
time: args[1],
|
time: args[1],
|
||||||
chainID: args[2],
|
chainID: args[2],
|
||||||
playerSuffix: args[3],
|
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);
|
logParser.emit('PLAYER_UNPOSSESS', data);
|
||||||
}
|
}
|
||||||
|
@ -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/,
|
/^\[([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) => {
|
onMatch: (args, logParser) => {
|
||||||
const data = {
|
const data = {
|
||||||
...logParser.eventStore[args[3]],
|
...logParser.eventStore.session[args[3]],
|
||||||
raw: args[0],
|
raw: args[0],
|
||||||
time: args[1],
|
time: args[1],
|
||||||
chainID: args[2],
|
chainID: args[2],
|
||||||
@ -13,7 +13,7 @@ export default {
|
|||||||
weapon: args[6]
|
weapon: args[6]
|
||||||
};
|
};
|
||||||
|
|
||||||
logParser.eventStore[args[3]] = data;
|
logParser.eventStore.session[args[3]] = data;
|
||||||
|
|
||||||
logParser.emit('PLAYER_WOUNDED', data);
|
logParser.emit('PLAYER_WOUNDED', data);
|
||||||
}
|
}
|
||||||
|
16
squad-server/log-parser/playercontroller-connected.js
Normal file
16
squad-server/log-parser/playercontroller-connected.js
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
};
|
@ -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];
|
|
||||||
}
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user