diff --git a/src/discordTools/SetupSettingsMenu.js b/src/discordTools/SetupSettingsMenu.js index 4784ddef5..69a939005 100644 --- a/src/discordTools/SetupSettingsMenu.js +++ b/src/discordTools/SetupSettingsMenu.js @@ -257,6 +257,18 @@ async function setupGeneralSettings(client, guildId, channel) { Path.join(__dirname, '..', 'resources/images/settings_logo.png'))] }); + await client.messageSend(channel, { + embeds: [DiscordEmbeds.getEmbed({ + color: Constants.COLOR_SETTINGS, + title: client.intlGet(guildId, 'displayInformationBattlemetricsUpcomingWipes'), + thumbnail: `attachment://settings_logo.png` + })], + components: [DiscordButtons.getDisplayInformationBattlemetricsUpcomingWipesButton(guildId, + instance.generalSettings.displayInformationBattlemetricsUpcomingWipes)], + files: [new Discord.AttachmentBuilder( + Path.join(__dirname, '..', 'resources/images/settings_logo.png'))] + }); + await client.messageSend(channel, { embeds: [DiscordEmbeds.getEmbed({ color: Constants.COLOR_SETTINGS, diff --git a/src/discordTools/discordButtons.js b/src/discordTools/discordButtons.js index 7f90a1066..d8be18ec8 100644 --- a/src/discordTools/discordButtons.js +++ b/src/discordTools/discordButtons.js @@ -531,6 +531,16 @@ module.exports = { style: enabled ? SUCCESS : DANGER })); }, + getDisplayInformationBattlemetricsUpcomingWipesButton: function (guildId, enabled) { + return new Discord.ActionRowBuilder().addComponents( + module.exports.getButton({ + customId: 'DisplayInformationBattlemetricsUpcomingWipes', + label: enabled ? + Client.client.intlGet(guildId, 'enabledCap') : + Client.client.intlGet(guildId, 'disabledCap'), + style: enabled ? SUCCESS : DANGER + })); + }, getSubscribeToChangesBattlemetricsButtons: function (guildId) { const instance = Client.client.getInstance(guildId); diff --git a/src/discordTools/discordEmbeds.js b/src/discordTools/discordEmbeds.js index d9deb2554..8e2626310 100644 --- a/src/discordTools/discordEmbeds.js +++ b/src/discordTools/discordEmbeds.js @@ -699,6 +699,40 @@ module.exports = { const guildId = rustplus.guildId; const instance = Client.client.getInstance(guildId); + const emptyFieldValue = { name: '\u200B', value: '\u200B', inline: true }; + let firstWipe = emptyFieldValue; + let secondWipe = emptyFieldValue; + + const battlemetricsId = instance.activeServer !== null ? + instance.serverList[instance.activeServer].battlemetricsId : null; + + if (battlemetricsId && instance.generalSettings.displayInformationBattlemetricsUpcomingWipes){ + const bmInstance = Client.client.battlemetricsInstances[battlemetricsId]; + const upcomingWipes = bmInstance.getUpcomingWipesOrderedByTime(); + + if (upcomingWipes.length > 0){ + const closestWipe = upcomingWipes[0]; + if (closestWipe.type === 'map' || closestWipe.type === 'full') { + /* try match next map or full wipe*/ + const nextMapWipe = upcomingWipes.find((upcoming)=> upcoming.type === 'map') + if (nextMapWipe){ + firstWipe = { name: Client.client.intlGet(guildId, 'nextMapWipe'), value: ``, inline: true} + } + const nextFullWipe = upcomingWipes.find((upcoming)=> upcoming.type === 'full') + if (nextFullWipe){ + secondWipe = { name: Client.client.intlGet(guildId, 'nextFullWipe'), value: ` `, inline: true } + } + } else { + /*if closest wipe is not matched type*/ + firstWipe = { + name: Client.client.intlGet(guildId, 'nextWipe'), + value: ` `, + inline: true + } + } + } + } + const time = rustplus.getCommandTime(true); const timeLeftTitle = Client.client.intlGet(rustplus.guildId, 'timeTill', { event: rustplus.time.isDay() ? Constants.NIGHT_EMOJI : Constants.DAY_EMOJI @@ -719,18 +753,20 @@ module.exports = { fields: [ { name: playersFieldName, value: `\`${rustplus.getCommandPop(true)}\``, inline: true }, { name: timeFieldName, value: `\`${time[0]}\``, inline: true }, - { name: wipeFieldName, value: `\`${rustplus.getCommandWipe(true)}\``, inline: true }], + time[1] ? { name: timeLeftTitle, value: `\`${time[1]}\``, inline: true } : emptyFieldValue, + ], timestamp: true }); if (time[1] !== null) { embed.addFields( - { name: timeLeftTitle, value: `\`${time[1]}\``, inline: true }, - { name: '\u200B', value: '\u200B', inline: true }, - { name: '\u200B', value: '\u200B', inline: true }); + { name: wipeFieldName, value: `\`${rustplus.getCommandWipe(true)}\``, inline: true }, + firstWipe, + secondWipe, + ); } else { - embed.addFields({ name: '\u200B', value: '\u200B', inline: false }); + embed.addFields(emptyFieldValue); } embed.addFields( diff --git a/src/handlers/buttonHandler.js b/src/handlers/buttonHandler.js index f6bb724f0..6e7a3a8a0 100644 --- a/src/handlers/buttonHandler.js +++ b/src/handlers/buttonHandler.js @@ -340,6 +340,24 @@ module.exports = async (client, interaction) => { instance.generalSettings.displayInformationBattlemetricsAllOnlinePlayers)] }); } + else if (interaction.customId === 'DisplayInformationBattlemetricsUpcomingWipes') { + instance.generalSettings.displayInformationBattlemetricsUpcomingWipes = + !instance.generalSettings.displayInformationBattlemetricsUpcomingWipes; + client.setInstance(guildId, instance); + + if (rustplus) rustplus.generalSettings.displayInformationBattlemetricsUpcomingWipes = + instance.generalSettings.displayInformationBattlemetricsUpcomingWipes; + + client.log(client.intlGet(null, 'infoCap'), client.intlGet(null, 'buttonValueChange', { + id: `${verifyId}`, + value: `${instance.generalSettings.displayInformationBattlemetricsUpcomingWipes}` + })); + + await client.interactionUpdate(interaction, { + components: [DiscordButtons.getDisplayInformationBattlemetricsUpcomingWipesButton(guildId, + instance.generalSettings.displayInformationBattlemetricsUpcomingWipes)] + }); + } else if (interaction.customId === 'BattlemetricsServerNameChanges') { instance.generalSettings.battlemetricsServerNameChanges = !instance.generalSettings.battlemetricsServerNameChanges; diff --git a/src/languages/en.json b/src/languages/en.json index 61289e3f5..04da631c1 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -346,6 +346,7 @@ "discordCap": "DISCORD", "discordUsers": "Discord Users", "displayInformationBattlemetricsAllOnlinePlayers": "Should all online players from Battlemetrics be displayed in the information channel?", + "displayInformationBattlemetricsUpcomingWipes": "Should be closest wipe from Battlemetrics be displayed in the information channel?", "displayingMap": "Displaying {mapName} map.", "displayingOnlinePlayers": "Displaying online players.", "distanceDirectionGrid": "{distance}m in direction {direction}° [{grid}].", @@ -484,6 +485,9 @@ "new": "New", "newVendingMachine": "New Vending Machine located at {location}.", "newsCap": "NEWS", + "nextFullWipe": "Next full wipe", + "nextMapWipe": "Next map wipe", + "nextWipe": "Next wipe", "noActiveTimers": "No active timers.", "noCommandDelay": "No command delay.", "noCommunicationSmartSwitch": "Could not communicate with Smart Switch: {name}", diff --git a/src/structures/Battlemetrics.js b/src/structures/Battlemetrics.js index cbfca1a7d..6b9a81850 100644 --- a/src/structures/Battlemetrics.js +++ b/src/structures/Battlemetrics.js @@ -106,6 +106,7 @@ class Battlemetrics { this.server_rust_last_wipe = null; this.server_rust_last_wipe_ent = null; this.server_serverSteamId = null; + this.server_rust_wipes = null; this.map_url = null; this.map_thumbnailUrl = null; this.map_monuments = null; @@ -153,6 +154,7 @@ class Battlemetrics { set offlinePlayers(offlinePlayers) { this._offlinePlayers = offlinePlayers; } get serverEvaluation() { return this._serverEvaluation; } set serverEvaluation(serverEvaluation) { this._serverEvaluation = serverEvaluation; } + get rustWipes() { return this.server_rust_wipes; } /** * Construct the Battlemetrics API call for searching servers by name. @@ -667,6 +669,11 @@ class Battlemetrics { if (content['status'] === false) this.offlinePlayers.push(playerId); } + const rustWipes = details.rust_wipes; + if (rustWipes) { + this.#evaluateServerParameter('server_rust_wipes', this.server_rust_wipes, rustWipes, firstTime); + } + this.update(data); return true; } @@ -725,6 +732,7 @@ class Battlemetrics { this.server_rust_last_wipe = details.rust_last_wipe; this.server_rust_last_wipe_ent = details.rust_last_wipe_ent; this.server_serverSteamId = details.serverSteamId; + this.server_rust_wipes = details.rust_wipes const rustMaps = details.rust_maps; if (rustMaps) { @@ -801,6 +809,18 @@ class Battlemetrics { return ordered.map(e => e[1]); } + getUpcomingWipesOrderedByTime() { + const unordered = []; + for (const wipe of this.rustWipes) { + const timestampDate = new Date(wipe.timestamp) + wipe.discordTimestamp = timestampDate.getTime() / 1000; + const timestampSplit = timestampDate.toISOString().split('T') + wipe.readableTimestamp = timestampSplit.length === 2 ?`${timestampSplit[0]} T ${timestampSplit[1]}`: timestampDate.toISOString() + unordered.push(wipe); + } + return unordered.sort(function (a, b) { return a.discordTimestamp - b.discordTimestamp }) + } + /** * Get the offline time from a player. * @param {string} playerId The id of the player to get offline time from. diff --git a/src/templates/generalSettingsTemplate.json b/src/templates/generalSettingsTemplate.json index cb25eed70..e9e47c772 100644 --- a/src/templates/generalSettingsTemplate.json +++ b/src/templates/generalSettingsTemplate.json @@ -18,6 +18,7 @@ "mapWipeNotifyEveryone": false, "itemAvailableInVendingMachineNotifyInGame": true, "displayInformationBattlemetricsAllOnlinePlayers": false, + "displayInformationBattlemetricsUpcomingWipes": false, "battlemetricsServerNameChanges": true, "battlemetricsTrackerNameChanges": true, "battlemetricsGlobalNameChanges": false,