From 90ed90cb68316b07712f5b453201c40a29f7e24f Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Sat, 4 Jun 2022 10:42:20 -0400 Subject: [PATCH 1/9] SquadCreated Regex and Event Emitter Move Squad Created To RCON rcon.js Move Squad Created emitter to RCON index.js --- squad-server/index.js | 18 +++++++++--------- squad-server/rcon.js | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/squad-server/index.js b/squad-server/index.js index 6023337..0d8198b 100644 --- a/squad-server/index.js +++ b/squad-server/index.js @@ -152,6 +152,15 @@ export default class SquadServer extends EventEmitter { this.emit('PLAYER_BANNED', data); }); + + this.rcon.on('SQUAD_CREATED', async (data) => { + data.player = await this.getPlayerBySteamID(data.playerSteamID, true); + delete data.playerName; + delete data.playerSteamID; + delete data.squadID; + + this.emit('SQUAD_CREATED', data); + }); } async restartRCON() { @@ -293,15 +302,6 @@ export default class SquadServer extends EventEmitter { this.logParser.on('TICK_RATE', (data) => { this.emit('TICK_RATE', data); }); - - this.logParser.on('SQUAD_CREATED', async (data) => { - data.player = await this.getPlayerBySteamID(data.playerSteamID, true); - delete data.playerName; - delete data.playerSteamID; - delete data.squadID; - - this.emit('SQUAD_CREATED', data); - }); } async restartLogParser() { diff --git a/squad-server/rcon.js b/squad-server/rcon.js index 66ac46c..8c605b8 100644 --- a/squad-server/rcon.js +++ b/squad-server/rcon.js @@ -84,6 +84,24 @@ export default class SquadRcon extends Rcon { return; } + const matchSqCreated = decodedPacket.body.match( + /(.+) \(Steam ID: ([0-9]{17})\) has created Squad (\d+) \(Squad Name: (.+)\) on (.+)/ + ); + if (matchSqCreated) { + Logger.verbose('SquadRcon', 2, `Matched Squad Created: ${decodedPacket.body}`); + + this.emit('SQUAD_CREATED', { + time: new Date(), + playerName: matchSqCreated[1], + playerSteamID: matchSqCreated[2], + squadID: matchSqCreated[3], + squadName: matchSqCreated[4], + teamName: matchSqCreated[5] + }); + + return; + } + const matchBan = decodedPacket.body.match( /Banned player ([0-9]+)\. \[steamid=(.*?)\] (.*) for interval (.*)/ ); From b9f5766cc98dd90d9d72db988df5a85f939d5796 Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Sat, 4 Jun 2022 10:57:28 -0400 Subject: [PATCH 2/9] Remove Squad Created from LogParser Remove LogParser event Squad Created --- squad-server/log-parser/index.js | 4 +--- squad-server/log-parser/squad-created.js | 17 ----------------- 2 files changed, 1 insertion(+), 20 deletions(-) delete mode 100644 squad-server/log-parser/squad-created.js diff --git a/squad-server/log-parser/index.js b/squad-server/log-parser/index.js index 990f41f..1d1e016 100644 --- a/squad-server/log-parser/index.js +++ b/squad-server/log-parser/index.js @@ -14,7 +14,6 @@ import PlayerWounded from './player-wounded.js'; import RoundWinner from './round-winner.js'; import ServerTickRate from './server-tick-rate.js'; import SteamIDConnected from './steamid-connected.js'; -import SquadCreated from './squad-created.js'; export default class SquadLogParser extends LogParser { constructor(options) { @@ -36,8 +35,7 @@ export default class SquadLogParser extends LogParser { PlayerWounded, RoundWinner, ServerTickRate, - SteamIDConnected, - SquadCreated + SteamIDConnected ]; } } diff --git a/squad-server/log-parser/squad-created.js b/squad-server/log-parser/squad-created.js deleted file mode 100644 index 48c462b..0000000 --- a/squad-server/log-parser/squad-created.js +++ /dev/null @@ -1,17 +0,0 @@ -export default { - regex: /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquad: (.+) \(Steam ID: ([0-9]{17})\) has created Squad (\d+) \(Squad Name: (.+)\) on (.+)/, - onMatch: async (args, logParser) => { - const data = { - raw: args[0], - time: args[1], - chainID: args[2], - playerName: args[3], - playerSteamID: args[4], - squadID: args[5], - squadName: args[6], - teamName: args[7] - }; - - logParser.emit('SQUAD_CREATED', data); - } -}; \ No newline at end of file From 3f3be7c027eb9b4d27567a9028b928c5894f76b0 Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Wed, 28 Sep 2022 21:11:11 -0400 Subject: [PATCH 3/9] Add round-tickets and round-ended events; discord-roundended plugin Adds round-tickets regex to logparser; this will fire when the server prints new log lines related to tickets and factions. Adds round-ended regex to log parser and event; this event forwards round tickets where we have both a winner and a loser to the main server object. discord-roundended: This plugin is similar but functionally different from round winner, due to cases where the server experiences a draw. --- README.md | 23 +++++++ config.json | 7 ++ squad-server/index.js | 4 ++ squad-server/log-parser/index.js | 4 ++ squad-server/log-parser/round-ended.js | 20 ++++++ squad-server/log-parser/round-tickets.js | 28 ++++++++ squad-server/plugins/discord-roundended.js | 78 ++++++++++++++++++++++ 7 files changed, 164 insertions(+) create mode 100644 squad-server/log-parser/round-ended.js create mode 100644 squad-server/log-parser/round-tickets.js create mode 100644 squad-server/plugins/discord-roundended.js diff --git a/README.md b/README.md index a21144e..e1b720e 100644 --- a/README.md +++ b/README.md @@ -639,6 +639,29 @@ Grafana:
16761867
+
+ DiscordRoundEnded +

DiscordRoundEnded

+

The DiscordRoundEnded plugin will send the round winner to a Discord channel.

+

Options

+ +
+
DiscordServerStatus

DiscordServerStatus

diff --git a/config.json b/config.json index 3747000..e68f5e5 100644 --- a/config.json +++ b/config.json @@ -166,6 +166,13 @@ "channelID": "", "color": 16761867 }, + { + "plugin": "DiscordRoundEnded", + "enabled": true, + "discordClient": "discord", + "channelID": "", + "color": 16761867 + }, { "plugin": "DiscordServerStatus", "enabled": true, diff --git a/squad-server/index.js b/squad-server/index.js index 6023337..c366be2 100644 --- a/squad-server/index.js +++ b/squad-server/index.js @@ -290,6 +290,10 @@ export default class SquadServer extends EventEmitter { this.emit('PLAYER_UNPOSSESS', data); }); + this.logParser.on('ROUND_ENDED', async (data) => { + this.emit('ROUND_ENDED', data); + }); + this.logParser.on('TICK_RATE', (data) => { this.emit('TICK_RATE', data); }); diff --git a/squad-server/log-parser/index.js b/squad-server/log-parser/index.js index 990f41f..4358868 100644 --- a/squad-server/log-parser/index.js +++ b/squad-server/log-parser/index.js @@ -11,6 +11,8 @@ import PlayerPossess from './player-possess.js'; import PlayerRevived from './player-revived.js'; import PlayerUnPossess from './player-un-possess.js'; import PlayerWounded from './player-wounded.js'; +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'; @@ -34,6 +36,8 @@ export default class SquadLogParser extends LogParser { PlayerRevived, PlayerUnPossess, PlayerWounded, + RoundEnded, + RoundTickets, RoundWinner, ServerTickRate, SteamIDConnected, diff --git a/squad-server/log-parser/round-ended.js b/squad-server/log-parser/round-ended.js new file mode 100644 index 0000000..f4ab96f --- /dev/null +++ b/squad-server/log-parser/round-ended.js @@ -0,0 +1,20 @@ +/** + * Matches when Map state Changes to PostMatch (ScoreBoard) + * + * Emits winner and loser from eventstore + * + * winner and loser may be null if the match ends with a draw + */ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogGameState: Match State Changed from InProgress to WaitingPostMatch/, + onMatch: (args, logParser) => { + const data = { + winner: logParser.eventStore.ROUND_WINNER ? logParser.eventStore.ROUND_WINNER : null, + loser: logParser.eventStore.ROUND_LOSER ? logParser.eventStore.ROUND_LOSER : null + }; + logParser.emit('ROUND_ENDED', data); + delete logParser.eventStore.ROUND_WINNER; + delete logParser.eventStore.ROUND_LOSER; + } +}; diff --git a/squad-server/log-parser/round-tickets.js b/squad-server/log-parser/round-tickets.js new file mode 100644 index 0000000..646241b --- /dev/null +++ b/squad-server/log-parser/round-tickets.js @@ -0,0 +1,28 @@ +/** + * Matches when tickets appear in the log + * + * Will not match on Draw or Map Changes before the game has started + */ +export default { + regex: + /^\[([0-9.:-]+)]\[([ 0-9]*)]LogSquadGameEvents: Display: Team ([0-9]), (.*) \( ?(.*?) ?\) has (won|lost) the match with ([0-9]+) Tickets on layer (.*) \(level (.*)\)!/, + onMatch: (args, logParser) => { + const data = { + raw: args[0], + time: args[1], + chainID: args[2], + team: args[3], + subfaction: args[4], + faction: args[5], + action: args[6], + tickets: args[7], + layer: args[8], + level: args[9] + }; + if (data.action === 'won') { + logParser.eventStore.ROUND_WINNER = data; + } else { + logParser.eventStore.ROUND_LOSER = data; + } + } +}; diff --git a/squad-server/plugins/discord-roundended.js b/squad-server/plugins/discord-roundended.js new file mode 100644 index 0000000..7cc0899 --- /dev/null +++ b/squad-server/plugins/discord-roundended.js @@ -0,0 +1,78 @@ +import DiscordBasePlugin from './discord-base-plugin.js'; + +export default class DiscordRoundEnded extends DiscordBasePlugin { + static get description() { + return 'The DiscordRoundEnded plugin will send the round winner to a Discord channel.'; + } + + static get defaultEnabled() { + return true; + } + + static get optionsSpecification() { + return { + ...DiscordBasePlugin.optionsSpecification, + channelID: { + required: true, + description: 'The ID of the channel to log round end events to.', + default: '', + example: '667741905228136459' + }, + color: { + required: false, + description: 'The color of the embed.', + default: 16761867 + } + }; + } + + constructor(server, options, connectors) { + super(server, options, connectors); + + this.onNewGame = this.onNewGame.bind(this); + } + + async mount() { + this.server.on('ROUND_ENDED', this.onNewGame); + } + + async unmount() { + this.server.removeEventListener('ROUND_ENDED', this.onRoundEnd); + } + + async onRoundEnd(info) { + if (!info.winner || !info.loser) { + await this.sendDiscordMessage({ + embed: { + title: 'Round Ended', + description: 'This match Ended in a Draw', + color: this.options.color, + timestamp: info.time.toISOString() + } + }); + } + + await this.sendDiscordMessage({ + embed: { + title: 'Round Ended', + description: `${info.winner.layer} - ${info.winner.level}`, + color: this.options.color, + fields: [ + { + name: 'Winner', + value: `${info.winner.subfaction} : ${info.winner.faction} won with ${info.winner.tickets}.` + }, + { + name: 'Loser', + value: `${info.loser.subfaction} : ${info.loser.faction} lost with ${info.loser.tickets}.` + }, + { + name: 'Ticket Difference', + value: `${info.winner.tickets - info.loser.tickets}.` + } + ], + timestamp: info.time.toISOString() + } + }); + } +} From 9a0d0f613b171ca0302436f323307bea97b89b3f Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:17:50 -0400 Subject: [PATCH 4/9] fix binding --- squad-server/plugins/discord-roundended.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/squad-server/plugins/discord-roundended.js b/squad-server/plugins/discord-roundended.js index 7cc0899..ffb19c4 100644 --- a/squad-server/plugins/discord-roundended.js +++ b/squad-server/plugins/discord-roundended.js @@ -29,11 +29,11 @@ export default class DiscordRoundEnded extends DiscordBasePlugin { constructor(server, options, connectors) { super(server, options, connectors); - this.onNewGame = this.onNewGame.bind(this); + this.onRoundEnd = this.onRoundEnd.bind(this); } async mount() { - this.server.on('ROUND_ENDED', this.onNewGame); + this.server.on('ROUND_ENDED', this.onRoundEnd); } async unmount() { From 49127ca404766c29a03f25eca2166fa4372c5d58 Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Wed, 28 Sep 2022 23:00:55 -0400 Subject: [PATCH 5/9] Add time --- squad-server/log-parser/round-ended.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/squad-server/log-parser/round-ended.js b/squad-server/log-parser/round-ended.js index f4ab96f..4b44199 100644 --- a/squad-server/log-parser/round-ended.js +++ b/squad-server/log-parser/round-ended.js @@ -11,7 +11,8 @@ export default { onMatch: (args, logParser) => { const data = { winner: logParser.eventStore.ROUND_WINNER ? logParser.eventStore.ROUND_WINNER : null, - loser: logParser.eventStore.ROUND_LOSER ? logParser.eventStore.ROUND_LOSER : null + loser: logParser.eventStore.ROUND_LOSER ? logParser.eventStore.ROUND_LOSER : null, + time: args[1] }; logParser.emit('ROUND_ENDED', data); delete logParser.eventStore.ROUND_WINNER; From 2ba6edc4ee0c7d691337d50fe1f8bcbee20ff145 Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Thu, 29 Sep 2022 04:53:25 -0400 Subject: [PATCH 6/9] Embed Format Tweak --- squad-server/plugins/discord-roundended.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/squad-server/plugins/discord-roundended.js b/squad-server/plugins/discord-roundended.js index ffb19c4..8759bbf 100644 --- a/squad-server/plugins/discord-roundended.js +++ b/squad-server/plugins/discord-roundended.js @@ -59,12 +59,12 @@ export default class DiscordRoundEnded extends DiscordBasePlugin { color: this.options.color, fields: [ { - name: 'Winner', - value: `${info.winner.subfaction} : ${info.winner.faction} won with ${info.winner.tickets}.` + name: `Team ${info.winner.team} Won`, + value: `${info.winner.subfaction}\n ${info.winner.faction}\n won with ${info.winner.tickets} tickets.` }, { - name: 'Loser', - value: `${info.loser.subfaction} : ${info.loser.faction} lost with ${info.loser.tickets}.` + name: `Team ${info.loser.team} Lost`, + value: `${info.loser.subfaction}\n ${info.loser.faction}\n lost with ${info.loser.tickets} tickets.` }, { name: 'Ticket Difference', From 915d42d35582858df13cbc47401e1e8145732c31 Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Thu, 6 Oct 2022 23:08:04 -0400 Subject: [PATCH 7/9] Update discord-roundended.js Missing Early Return --- squad-server/plugins/discord-roundended.js | 1 + 1 file changed, 1 insertion(+) diff --git a/squad-server/plugins/discord-roundended.js b/squad-server/plugins/discord-roundended.js index 8759bbf..f9757b1 100644 --- a/squad-server/plugins/discord-roundended.js +++ b/squad-server/plugins/discord-roundended.js @@ -50,6 +50,7 @@ export default class DiscordRoundEnded extends DiscordBasePlugin { timestamp: info.time.toISOString() } }); + return; } await this.sendDiscordMessage({ From 10efb9c4df28b66187305ac4549dbf126f1d19b2 Mon Sep 17 00:00:00 2001 From: Thomas Smyth Date: Thu, 29 Dec 2022 16:55:15 +0000 Subject: [PATCH 8/9] Bump version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9cdfbae..f614ed0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "SquadJS", - "version": "3.6.0", + "version": "3.6.1", "repository": "https://github.com/Team-Silver-Sphere/SquadJS.git", "author": "Thomas Smyth ", "license": "BSL-1.0", From 3ebd5e2c3c73f564f80d4041b540d4612ea4479f Mon Sep 17 00:00:00 2001 From: ect0s <73128770+ect0s@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:27:23 -0500 Subject: [PATCH 9/9] Keep SquadID in Event Emitter data --- squad-server/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/squad-server/index.js b/squad-server/index.js index 0d8198b..1e894fd 100644 --- a/squad-server/index.js +++ b/squad-server/index.js @@ -157,7 +157,6 @@ export default class SquadServer extends EventEmitter { data.player = await this.getPlayerBySteamID(data.playerSteamID, true); delete data.playerName; delete data.playerSteamID; - delete data.squadID; this.emit('SQUAD_CREATED', data); });