From 76b0d1054793124da224e4cc5e6784c75da1fc1d Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Thu, 9 Mar 2023 13:10:43 -0800 Subject: [PATCH] 5.2.0.1 leaderboard feature and dev v1 --- commands/leaderboard.js | 82 ++++++++++++++++++++++++++++++++++++++ package.json | 2 +- structures/DayzArmbands.js | 4 ++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 commands/leaderboard.js diff --git a/commands/leaderboard.js b/commands/leaderboard.js new file mode 100644 index 0000000..c209bb9 --- /dev/null +++ b/commands/leaderboard.js @@ -0,0 +1,82 @@ +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: "leaderboard", + debug: false, + global: false, + description: "View server statistics leaderboard", + usage: "[category] [limit]", + permissions: { + channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"], + member: [], + }, + options: [{ + name: "category", + description: "Leaderboard Category", + value: "category", + type: 3, + required: true, + choices: [ + { name: "kills", value: "kills" }, + { name: "killstreak", value: "killstreak" }, + { name: "best_killstreak", value: "best_killstreak" }, + { name: "deaths", value: "deaths" }, + { name: "deathstreak", value: "deathstreak" }, + { name: "worst_deathstreak", value: "worst_deathstreak" }, + ] + }, { + name: "limit", + description: "leaderboard limit", + value: "limit", + type: 4, + min_value: 1, + required: true, + }], + SlashCommand: { + /** + * + * @param {require("../structures/QuarksBot")} client + * @param {import("discord.js").Message} message + * @param {string[]} args + * @param {*} param3 + */ + run: async (client, interaction, args, { GuildDB }) => { + let category = args[0].value; + let leaderboard = GuildDB.playerstats.sort(function(a, b){ + if (category == 'kills') return b.kills - a.kills; + if (category == 'killstreak') return b.killStreak - a.killStreak; + if (category == 'best_killstreak') return b.bestKillStreak - a.bestKillStreak; + if (category == 'deaths') return b.deaths - a.deaths; + if (category == 'deathstreak') return b.deathStreak - a.deathSreak; + if (category == 'worst_deathstreak') return b.worstDeathStreak - a.worstDeathStreak; + }) + + let limit = args[1].value > a.length ? a.length : args[1].value; + + let leaderboardEmbed = new EmbedBuilder() + .setColor(client.config.Colors.Default); + + let title = category == 'kills' ? "Total Kills Leaderboard" : + category == 'killstreak' ? "Current Killstreak Leaderboard" : + category == 'best_killstreak' ? "Best Killstreak Leaderboard" : + category == 'deaths' ? "Total Deaths Leaderboard" : + category == 'deathstreak' ? "Current Deathstreak Leaderboard" : + category == 'worst_deathstreak' ? "Worst Deathstreak Leaderboard" : 'N/A Error'; + + leaderboardEmbed.setTitle(`**${title} - DayZ Reforger**`); + + for (let i = 0; i < limit; i++) { + let stats = category == 'kills' ? `${leaderboard[i].kills} Kill${leaderboard[i].kills > 1 ? 's' : ''}` : + category == 'killstreak' ? `${leaderboard[i].killStreak} Player Killstreak` : + category == 'best_killstreak' ? `${leaderboard[i].bestKillStreak} Player Killstreak` : + category == 'deaths' ? `${leaderboard[i].deaths} Death${leaderboard[i].deaths > 1 ? 's' : ''}` : + category == 'deathstreak' ? `${leaderboard[i].deathStreak} Deathstreak` : + category == 'worst_deathstreak' ? `${leaderboard[i].worstDeathStreak} Deathstreak` : 'N/A Error'; + + leaderboardEmbed.addFields({ name: `**${i+1}. ${leaderboard[i].gamertag}**`, value: `**${stats}**`, inline: true }); + } + + return interaction.send({ embeds: [leaderboardEmbed] }); + }, + }, +} diff --git a/package.json b/package.json index 0f90c54..81e0e60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayz-armbands", - "version": "5.1.0.0", + "version": "5.2.0.1", "description": "A General Purpose Discord Bot for DayZ Servers.", "main": "index.js", "nodemonConfig": { diff --git a/structures/DayzArmbands.js b/structures/DayzArmbands.js index b640196..46c6a33 100644 --- a/structures/DayzArmbands.js +++ b/structures/DayzArmbands.js @@ -168,8 +168,10 @@ class DayzArmbands extends Client { killerStat.kills++; killerStat.killStreak++; + killerStat.bestKillStreak = killerStat.killStreak > killerStat.bestKillStreak ? killerStat.killStreak : killerStat.bestKillStreak; victimStat.deaths++; victimStat.deathStreak++; + victimStat.worstDeathStreak = victimStat.deathStreak > victimStat.worstDeathStreak ? victimStat.deathStreak : victimStat.bestKillStreak; killerStat.KDR = killerStat.kills / (killerStat.deaths == 0 ? 1 : killerStat.deaths); // prevent division by 0 victimStat.KDR = victimStat.kills / (victimStat.deaths == 0 ? 1 : victimStat.deaths); // prevent division by 0 if (victimStat.killStreak>0) victimStat.killStreak = 0; @@ -357,7 +359,9 @@ class DayzArmbands extends Client { kills: 0, deaths: 0, killStreak: 0, + bestKillStreak: 0, deathStreak: 0, + worstDeathStreak: 0, } }