diff --git a/squad-server/factory.js b/squad-server/factory.js index a8865a5a..7bda552e 100644 --- a/squad-server/factory.js +++ b/squad-server/factory.js @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; -import Discord from 'discord.js'; +import {Client, Events, GatewayIntentBits} from 'discord.js'; import sequelize from 'sequelize'; import AwnAPI from './utils/awn-api.js'; @@ -103,8 +103,18 @@ export default class SquadServerFactory { Logger.verbose('SquadServerFactory', 1, `Starting ${type} connector ${connectorName}...`); if (type === 'discord') { - const connector = new Discord.Client(); + const connector = new Client({intents:[ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + GatewayIntentBits.GuildMembers, + ]}); + connector.once(Events.ClientReady, readyClient => {console.log(`Ready! Logged in as ${readyClient.user.tag}`);}); await connector.login(connectorConfig); + // setup compatability with older plugins for message create event. + connector.on('messageCreate', message=>{ + connector.emit('message', message); + }); return connector; } diff --git a/squad-server/package.json b/squad-server/package.json index c7d8104c..cbe06f00 100644 --- a/squad-server/package.json +++ b/squad-server/package.json @@ -6,7 +6,7 @@ "axios": "^0.21.1", "core": "1.0.0", "didyoumean": "^1.2.1", - "discord.js": "^12.3.1", + "discord.js": "^14.14.1", "gamedig": "^2.0.20", "graphql": "^15.4.0", "graphql-request": "^3.4.0", diff --git a/squad-server/plugins/discord-base-message-updater.js b/squad-server/plugins/discord-base-message-updater.js index 66376a62..9532a5e9 100644 --- a/squad-server/plugins/discord-base-message-updater.js +++ b/squad-server/plugins/discord-base-message-updater.js @@ -51,11 +51,11 @@ export default class DiscordBaseMessageUpdater extends BasePlugin { } async mount() { - this.options.discordClient.on('message', this.onDiscordMessage); + this.options.discordClient.on('messageCreate', this.onDiscordMessage); } async unmount() { - this.options.discordClient.removeEventListener('message', this.onDiscordMessage); + this.options.discordClient.removeEventListener('messageCreate', this.onDiscordMessage); } async generateMessage() { diff --git a/squad-server/plugins/discord-base-plugin.js b/squad-server/plugins/discord-base-plugin.js index 26557ed9..1f1fffd0 100644 --- a/squad-server/plugins/discord-base-plugin.js +++ b/squad-server/plugins/discord-base-plugin.js @@ -33,8 +33,12 @@ export default class DiscordBasePlugin extends BasePlugin { return; } - if (typeof message === 'object' && 'embed' in message) + if (typeof message === 'object' && 'embed' in message) { message.embed.footer = message.embed.footer || { text: COPYRIGHT_MESSAGE }; + if (typeof message.embed.color === 'string') + message.embed.color = parseInt(message.embed.color,16); + message = {...message, embeds:[message.embed]}; + } await this.channel.send(message); } diff --git a/squad-server/plugins/discord-placeholder.js b/squad-server/plugins/discord-placeholder.js index 495f7c53..d6ba1934 100644 --- a/squad-server/plugins/discord-placeholder.js +++ b/squad-server/plugins/discord-placeholder.js @@ -42,11 +42,11 @@ export default class DiscordPlaceholder extends BasePlugin { } async mount() { - this.options.discordClient.on('message', this.onMessage); + this.options.discordClient.on('messageCreate', this.onMessage); } async unmount() { - this.options.discordClient.removeEventListener('message', this.onMessage); + this.options.discordClient.removeEventListener('messageCreate', this.onMessage); } async onMessage(message) { diff --git a/squad-server/plugins/discord-rcon.js b/squad-server/plugins/discord-rcon.js index 5f42e68e..1efee9f6 100644 --- a/squad-server/plugins/discord-rcon.js +++ b/squad-server/plugins/discord-rcon.js @@ -54,11 +54,11 @@ export default class DiscordRcon extends BasePlugin { } async mount() { - this.options.discordClient.on('message', this.onMessage); + this.options.discordClient.on('messageCreate', this.onMessage); } async unmount() { - this.options.discordClient.removeEventListener('message', this.onMessage); + this.options.discordClient.removeEventListener('messageCreate', this.onMessage); } async onMessage(message) { diff --git a/squad-server/plugins/discord-server-status.js b/squad-server/plugins/discord-server-status.js index a3c9d4a6..e7d610c1 100644 --- a/squad-server/plugins/discord-server-status.js +++ b/squad-server/plugins/discord-server-status.js @@ -1,4 +1,3 @@ -import Discord from 'discord.js'; import tinygradient from 'tinygradient'; import { COPYRIGHT_MESSAGE } from '../utils/constants.js'; @@ -55,10 +54,6 @@ export default class DiscordServerStatus extends DiscordBaseMessageUpdater { } async generateMessage() { - const embed = new Discord.MessageEmbed(); - - // Set embed title. - embed.setTitle(this.server.serverName); // Set player embed field. let players = ''; @@ -70,41 +65,14 @@ export default class DiscordServerStatus extends DiscordBaseMessageUpdater { players += ` / ${this.server.publicSlots}`; if (this.server.reserveSlots > 0) players += ` (+${this.server.reserveSlots})`; - embed.addField('Players', players); - - // Set layer embed fields. - embed.addField( - 'Current Layer', - `\`\`\`${this.server.currentLayer?.name || 'Unknown'}\`\`\``, - true - ); - embed.addField( - 'Next Layer', - `\`\`\`${ - this.server.nextLayer?.name || (this.server.nextLayerToBeVoted ? 'To be voted' : 'Unknown') - }\`\`\``, - true - ); - - // Set layer image. - embed.setImage( - this.server.currentLayer - ? `https://squad-data.nyc3.cdn.digitaloceanspaces.com/main/${this.server.currentLayer.layerid}.jpg` - : undefined - ); - - // Set timestamp. - embed.setTimestamp(new Date()); - - // Set footer. - embed.setFooter(COPYRIGHT_MESSAGE); + const layerName = this.server.currentLayer ? this.server.currentLayer.name : (await this.server.rcon.getCurrentMap()).layer; // Clamp the ratio between 0 and 1 to avoid tinygradient errors. const ratio = this.server.a2sPlayerCount / (this.server.publicSlots + this.server.reserveSlots); const clampedRatio = Math.min(1, Math.max(0, ratio)); // Set gradient embed color. - embed.setColor( + const color = parseInt( tinygradient([ { color: '#ff0000', pos: 0 }, @@ -114,10 +82,37 @@ export default class DiscordServerStatus extends DiscordBaseMessageUpdater { .rgbAt(clampedRatio) .toHex(), 16 - ) - ); + ); + + const embedobj = { + title: this.server.serverName, + fields: [ + { + name: 'Players', + value: players + }, + { + name: 'Current Layer', + value: `\`\`\`${layerName || 'Unknown'}\`\`\``, + inline: true + }, + { + name: 'Next Layer', + value: `\`\`\`${ + this.server.nextLayer?.name || (this.server.nextLayerToBeVoted ? 'To be voted' : 'Unknown') + }\`\`\``, + inline: true + } + ], + color: color, + footer: {text:COPYRIGHT_MESSAGE}, + timestamp: new Date(), + image: { + url: (this.server.currentLayer ? `https://squad-data.nyc3.cdn.digitaloceanspaces.com/main/${this.server.currentLayer.layerid}.jpg` : undefined) + }, + } - return embed; + return { embeds: [embedobj] }; } async updateStatus() { @@ -127,7 +122,7 @@ export default class DiscordServerStatus extends DiscordBaseMessageUpdater { `(${this.server.a2sPlayerCount}/${this.server.publicSlots}) ${ this.server.currentLayer?.name || 'Unknown' }`, - { type: 'WATCHING' } + { type: 4 } ); } } diff --git a/squad-server/plugins/discord-subsystem-restarter.js b/squad-server/plugins/discord-subsystem-restarter.js index e718e757..e6adb48b 100644 --- a/squad-server/plugins/discord-subsystem-restarter.js +++ b/squad-server/plugins/discord-subsystem-restarter.js @@ -40,11 +40,11 @@ export default class DiscordSubsystemRestarter extends BasePlugin { } async mount() { - this.options.discordClient.on('message', this.onMessage); + this.options.discordClient.on('messageCreate', this.onMessage); } async unmount() { - this.options.discordClient.removeEventListener('message', this.onMessage); + this.options.discordClient.removeEventListener('messageCreate', this.onMessage); } async onMessage(message) {