diff --git a/squad-server/index.js b/squad-server/index.js index b139f3a..52ea5d0 100644 --- a/squad-server/index.js +++ b/squad-server/index.js @@ -130,6 +130,24 @@ export default class SquadServer extends EventEmitter { this.rcon.on('RCON_ERROR', (data) => { this.emit('RCON_ERROR', data); }); + + this.rcon.on('PLAYER_WARNED', async (data) => { + data.player = await this.getPlayerByName(data.name); + + this.emit('PLAYER_WARNED', data); + }); + + this.rcon.on('PLAYER_KICKED', async (data) => { + data.player = await this.getPlayerBySteamID(data.steamID); + + this.emit('PLAYER_KICKED', data); + }); + + this.rcon.on('PLAYER_BANNED', async (data) => { + data.player = await this.getPlayerBySteamID(data.steamID); + + this.emit('PLAYER_BANNED', data); + }); } async restartRCON() { diff --git a/squad-server/rcon.js b/squad-server/rcon.js index 16b6a8c..954054f 100644 --- a/squad-server/rcon.js +++ b/squad-server/rcon.js @@ -47,6 +47,54 @@ export default class SquadRcon extends Rcon { name: matchUnpossessedAdminCam[2], time: new Date() }); + + return; + } + + const matchKick = decodedPacket.body.match(/Kicked player \d.?.\s?\[steamid=([0-9]{17})] (.*)/); + if (matchKick) { + Logger.verbose('SquadRcon', 2, `Matched kick message: ${decodedPacket.body}`); + + this.emit('PLAYER_KICKED', { + raw: decodedPacket.body, + steamID: matchKick[1], + name: matchKick[2], + time: new Date() + }); + + return; + } + + const matchWarn = decodedPacket.body.match( + /Remote admin has warned player (.*)\. Message was "(.*)"/ + ); + if (matchWarn) { + Logger.verbose('SquadRcon', 2, `Matched warn message: ${decodedPacket.body}`); + + this.emit('PLAYER_WARNED', { + raw: decodedPacket.body, + name: matchWarn[1], + reason: matchWarn[2], + time: new Date() + }); + + return; + } + + const matchBan = decodedPacket.body.match( + /Banned player (.*)\. \[steamid=(.*?)\] (.*) for interval (.*)/ + ); + if (matchBan) { + Logger.verbose('SquadRcon', 2, `Matched ban message: ${decodedPacket.body}`); + + this.emit('PLAYER_BANNED', { + raw: decodedPacket.body, + playerID: matchBan[1], + steamID: matchBan[2], + name: matchBan[3], + interval: matchBan[4], + time: new Date() + }); } } @@ -126,6 +174,11 @@ export default class SquadRcon extends Rcon { await this.execute(`AdminWarn "${steamID}" ${message}`); } + // 0 = Perm | 1m = 1 minute | 1d = 1 Day | 1M = 1 Month | etc... + async ban(steamID, banLength, message) { + await this.execute(`AdminBan "${steamID}" ${banLength} ${message}`); + } + async switchTeam(steamID) { await this.execute(`AdminForceTeamChange "${steamID}"`); }