diff --git a/admin/migrate_playerstats.js b/admin/migrate_playerstats.js index 331c9cf..1f157f0 100644 --- a/admin/migrate_playerstats.js +++ b/admin/migrate_playerstats.js @@ -39,6 +39,7 @@ async function migrate() { } guild.server.playerstats.map(stat => stat.nitradoServerID = NitradoServerID); + guild.server.playerstats.map(stat => stat.bountiesLength = stat.bounties.length); // write JSON to file fs.writeFileSync(`${dir}/player_stats_backup.json`, JSON.stringify(guild.server.playerstats, null, 2)); diff --git a/commands/admin.js b/commands/admin.js index 65df155..cc7a20e 100644 --- a/commands/admin.js +++ b/commands/admin.js @@ -2,7 +2,8 @@ const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelect const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes; const bitfieldCalculator = require('discord-bitfield-calculator'); const { Armbands } = require('../database/armbands.js'); -const { createUser, addUser } = require('../database/user') +const { createUser, addUser } = require('../database/user'); +const { UpdatePlayer } = require('../database/player'); module.exports = { name: "admin", @@ -134,19 +135,8 @@ module.exports = { if (args[0].name == 'gamertag-link') { - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].options[1].value ); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[1].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[1].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[1].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); if (client.exists(playerStat.discordID)) { const warnGTOverwrite = new EmbedBuilder() @@ -170,14 +160,7 @@ module.exports = { playerStat.discordID = args[0].options[0].value; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }) + await UpdatePlayer(client, playerStat, interaction); let member = interaction.guild.members.cache.get(args[0].options[0].value); if (client.exists(GuildDB.linkedGamertagRole)) { @@ -198,19 +181,8 @@ module.exports = { } else if (args[0].name == 'gamertag-unlink') { - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == args[0].options[0].value ); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** <@${args[0].options[0].value}> has no gamertag linked.`)] }); + let playerStat = await client.dbo.collection("players").findOne({"discordID": args[0].options[0].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** <@${args[0].options[0].value}> has no gamertag linked.`)] }); const warnGTOverwrite = new EmbedBuilder() .setColor(client.config.Colors.Yellow) @@ -294,20 +266,12 @@ module.exports = { } else if (args[0].name == 'bounty-clear') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].options[0].value); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least ` 5 minutes `.')] }); - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least ` 5 minutes `.')] }); playerStat.bounties = []; - GuildDB.playerstats[playerStatIndex] = playerStat; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); + await UpdatePlayer(client, playerStat, interaction); const clearedBounty = new EmbedBuilder() .setColor(client.config.Colors.Green) @@ -357,18 +321,11 @@ module.exports = { return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) }); if (interaction.customId.split('-')[1]=='yes') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == interaction.customId.split('-')[2]); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.customId.split('-')[2]}); playerStat.discordID = interaction.customId.split('-')[3]; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }); + await UpdatePlayer(client, playerStat); let member = interaction.guild.members.cache.get(interaction.member.user.id); if (client.exists(GuildDB.linkedGamertagRole)) { @@ -403,18 +360,11 @@ module.exports = { return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) }); if (interaction.customId.split('-')[1]=='yes') { - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == interaction.customId.split('-')[2]); + let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.customId.split('-')[2]}); playerStat.discordID = ""; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }); + await UpdatePlayer(client, playerStat, interaction); let connectedEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default) diff --git a/commands/alarm.js b/commands/alarm.js index a911a09..5dd46df 100644 --- a/commands/alarm.js +++ b/commands/alarm.js @@ -471,8 +471,8 @@ module.exports = { let alarm = GuildDB.alarms.find(alarm => alarm.name == interaction.values[0]); let alarmIndex = GuildDB.alarms.indexOf(alarm); - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == interaction.customId.split('-')[2]); - if (playerStat == undefined) return interaction.update({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before.')], components: [] }); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.customId.split('-')[2]}); + if (!client.exists(playerStat)) return interaction.update({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before.')], components: [] }); let add = interaction.customId.split('-')[1] == 'add'; diff --git a/commands/bounty.js b/commands/bounty.js index ad01408..1696afc 100644 --- a/commands/bounty.js +++ b/commands/bounty.js @@ -1,6 +1,7 @@ const { EmbedBuilder } = require('discord.js'); const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes; const { createUser, addUser } = require('../database/user'); +const { UpdatePlayer } = require('../database/player'); module.exports = { name: "bounty", @@ -76,10 +77,9 @@ module.exports = { if (args[0].name == 'set') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].options[0].value); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least ` 5 minutes `.')] }); - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least ` 5 minutes `.')] }); + if (args[0].options[1].value > banking.guilds[GuildDB.serverID].balance) { let nsf = new EmbedBuilder() .setDescription('**Bank Notice:** NSF. Non sufficient funds') @@ -104,16 +104,9 @@ module.exports = { setBy: (anonymous && !anonymous.value) ? interaction.member.user.id : null, value: args[0].options[1].value, }); + playerStat.bountiesLength++; - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); + await UpdatePlayer(client, playerStat, interaction); const successEmbed = new EmbedBuilder() .setTitle('Success') @@ -124,10 +117,9 @@ module.exports = { } else if (args[0].name == 'pay') { - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == interaction.member.user.id); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** Your user ID could not be found, contact an Admin.')] }); - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - + let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.member.user.id}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** Your user ID could not be found, contact an Admin.')] }); + if (playerStat.bounties.length == 0) { const noBounty = new EmbedBuilder() .setColor(client.config.Colors.Yellow) @@ -156,15 +148,9 @@ module.exports = { }); playerStat.bounties = []; - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); + playerStat.bountiesLength = 0; + + await UpdatePlayer(client, playerStat, interaction); const payedOff = new EmbedBuilder() .setColor(client.config.Colors.Green) @@ -174,8 +160,11 @@ module.exports = { } else if (args[0].name == 'view') { - let activeBounties = GuildDB.playerstats.filter((p) => p.bounties.length > 0); - + // TODO: only get players with boutnies.length greater than 0 + const activeBounties = await dbo.collection("players").find({ + "bountiesLength": { $gt: 0 } + }); + let bountiesEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default) .setDescription('**Active Boutnies**'); diff --git a/commands/debug.js b/commands/debug.js index ceeb77f..3e0eb9e 100644 --- a/commands/debug.js +++ b/commands/debug.js @@ -40,8 +40,6 @@ module.exports = { } if (args[0].name == 'server-connection-stats') { - let stats = GuildDB.playerstats; - let statsEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default) .setTitle(`Server connection stats`); @@ -49,19 +47,19 @@ module.exports = { statsEmbed.addFields({ name: 'All time Unique connections', value: `> ${stats.length}`, inline: false }); let month3 = new Date().setMonth(new Date().getMonth() - 3); - let month3Players = stats.filter((stat) => stat.lastConnectionDate > month3); + let month3Players = await client.dbo.collection("players").find({"lastConnectDate": {$gt: month3}}); statsEmbed.addFields({ name: 'Unique connections in the last 3 months', value: `> ${month3Players.length}`, inline: false }); let month = new Date().setMonth(new Date().getMonth() - 1); - let monthlyPlayers = stats.filter((stat) => stat.lastConnectionDate > month); + let monthlyPlayers = await client.dbo.collection("players").find({"lastConnectDate": {$gt: month}}); statsEmbed.addFields({ name: 'Unique connections in the last month', value: `> ${monthlyPlayers.length}`, inline: false }); let week = new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000) - let weeklyPlayers = stats.filter((stat) => stat.lastConnectionDate > week); + let weeklyPlayers = await client.dbo.collection("players").find({"lastConnectDate": {$gt: week}}); statsEmbed.addFields({ name: 'Unique connections in the last week', value: `> ${weeklyPlayers.length}`, inline: false }); let today = new Date(new Date().getTime() - 1 * 24 * 60 * 60 * 1000) - let dailyPlayers = stats.filter((stat) => stat.lastConnectionDate > today); + let dailyPlayers = await client.dbo.collection("players").find({"lastConnectDate": {$gt: today}}); statsEmbed.addFields({ name: 'Unique connections in the last 24 hours', value: `> ${dailyPlayers.length}`, inline: false }); return interaction.send({ embeds: [statsEmbed] }); diff --git a/commands/event.js b/commands/event.js index ffe206a..386256d 100644 --- a/commands/event.js +++ b/commands/event.js @@ -83,8 +83,8 @@ module.exports = { if (args[0].name == 'player-track') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].options[0].value ); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); let event = { type: args[0].name, diff --git a/commands/gamertag-link.js b/commands/gamertag-link.js index c97ef56..227e6a4 100644 --- a/commands/gamertag-link.js +++ b/commands/gamertag-link.js @@ -1,5 +1,6 @@ const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes; +const { UpdatePlayer } = require('../database/player'); module.exports = { name: "gamertag-link", @@ -28,19 +29,8 @@ module.exports = { */ run: async (client, interaction, args, { GuildDB }) => { - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].value ); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].value}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); if (client.exists(playerStat.discordID)) { const warnGTOverwrite = new EmbedBuilder() @@ -64,14 +54,7 @@ module.exports = { playerStat.discordID = interaction.member.user.id; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }); + await UpdatePlayer(client, playerStat, interaction); let member = interaction.guild.members.cache.get(interaction.member.user.id); if (client.exists(GuildDB.linkedGamertagRole)) { @@ -100,18 +83,11 @@ module.exports = { return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) }); if (interaction.customId.split('-')[1]=='yes') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == interaction.customId.split('-')[2]); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.customId.split('-')[2]}); playerStat.discordID = interaction.member.user.id; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }); + await UpdatePlayer(client, player, interaction); let member = interaction.guild.members.cache.get(interaction.member.user.id); if (client.exists(GuildDB.linkedGamertagRole)) { diff --git a/commands/gamertag-unlink.js b/commands/gamertag-unlink.js index 93ee436..7c0256e 100644 --- a/commands/gamertag-unlink.js +++ b/commands/gamertag-unlink.js @@ -20,19 +20,8 @@ module.exports = { */ run: async (client, interaction, args, { GuildDB }) => { - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == interaction.member.user.id); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**No Gamertag Linked** It Appears your don't have a gamertag linked to your account.`)] }); + let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**No Gamertag Linked** It Appears your don't have a gamertag linked to your account.`)] }); const warnGTOverwrite = new EmbedBuilder() .setColor(client.config.Colors.Yellow) @@ -62,18 +51,11 @@ module.exports = { return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) }); if (interaction.customId.split('-')[1]=='yes') { - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == interaction.member.user.id); + let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id}); playerStat.discordID = ""; - let playerStatIndex = GuildDB.playerstats.indexOf(playerStat); - GuildDB.playerstats[playerStatIndex] = playerStat; - - client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, { - $set: { - 'server.playerstats': GuildDB.playerstats, - } - }); + await UpdatePlayer(client, playerStat, interaction); let connectedEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default) diff --git a/commands/leaderboard.js b/commands/leaderboard.js index c7cf038..7063c65 100644 --- a/commands/leaderboard.js +++ b/commands/leaderboard.js @@ -18,17 +18,18 @@ module.exports = { type: CommandOptions.String, required: true, choices: [ - { name: "money", value: "money" }, - { name: "total_time_played", value: "total_time_played" }, - { name: "longest_time_played", value: "longest_time_played" }, - { 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: "longest_kill", value: "longest_kill" }, + { name: "Money", value: "money" }, + { name: "Total Time Played", value: "totalSessionTime" }, + { name: "Longest Game Session", value: "longestSessionTime" }, + { name: "Kills", value: "kills" }, + { name: "Kill Streak", value: "killStreak" }, + { name: "Best Kill Streak", value: "bestKillStreak" }, + { name: "Deaths", value: "deaths" }, + { name: "Death Streak", value: "deathStreak" }, + { name: "Worst Death Streak", value: "worstDeathStreak" }, + { name: "Longest Kill", value: "longestKill" }, { name: "KDR", value: "KDR" }, + { name: "Server Connections", value: "connections" }, ] }, { name: "limit", @@ -48,50 +49,51 @@ module.exports = { * @param {*} param3 */ run: async (client, interaction, args, { GuildDB }) => { - let category = args[0].value; + const category = args[0].value; + const limit = args[1].value; - let leaderboard; + let leaderboard = []; if (category == 'money') { - let users = await client.dbo.collection("users").find({}).toArray(); + const usersCursor = await client.dbo.collection("users").aggregate([ + { $sort: { [`user.guilds.${GuildDB.serverID}.balance`]: -1 } } + ]); - leaderboard = users.sort(function(a, b) { - return b.user.guilds[GuildDB.serverID].balance - a.user.guilds[GuildDB.serverID].balance; - }); + let i = 0; + for await (const user of usersCursor) { + if (i == limit) break; + leaderboard.push(user); + } } else { - 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; - if (category == 'longest_kill') return b.longestKill - a.longestKill; - if (category == 'total_time_played') return b.totalSessionTime - a.totalSessionTime; - if (category == 'longest_time_played') return b.longestSessionTime - a.longestSessionTime; - if (category == 'KDR') return b.KDR - a.KDR; - }); + const playersCursor = await client.dbo.collection("players").aggregate([ + { $sort: { [`${category}`]: -1 } } + ]); + + let i = 0; + for await (const player of playersCursor) { + if (i == limit) break; + leaderboard.push(player); + } } - let limit = args[1].value > leaderboard.length ? leaderboard.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 == 'killStreak' ? "Current Killstreak Leaderboard" : + category == 'bestKillStreak' ? "Best Killstreak Leaderboard" : category == 'deaths' ? "Total Deaths Leaderboard" : - category == 'deathstreak' ? "Current Deathstreak Leaderboard" : - category == 'worst_deathstreak' ? "Worst Deathstreak Leaderboard" : - category == 'longest_kill' ? "Longest Kill Leaderboard" : + category == 'deathStreak' ? "Current Deathstreak Leaderboard" : + category == 'worstDeathStreak' ? "Worst Deathstreak Leaderboard" : + category == 'longestKill' ? "Longest Kill Leaderboard" : category == 'money' ? "Money Leaderboard" : - category == 'total_time_played' ? "Total Time Played" : - category == 'longest_time_played' ? "Longest Game Session" : - category == 'KDR' ? "Kill Death Ratio" : 'N/A Error'; + category == 'totalSessionTime' ? "Total Time Played" : + category == 'longestSessionTime' ? "Longest Game Session" : + category == 'KDR' ? "Kill Death Ratio" : + category == 'connections' ? "Times Connected" : 'N/A Error'; leaderboardEmbed.setTitle(`**${title} - DayZ Reforger**`); @@ -100,25 +102,26 @@ module.exports = { if (leaderboard.length < limit && i == leaderboard.length) break; let stats = category == 'kills' ? `${leaderboard[i].kills} Kill${(leaderboard[i].kills>1||leaderboard[i].kills==0)?'s':''}` : - category == 'killstreak' ? `${leaderboard[i].killStreak} Player Killstreak` : - category == 'best_killstreak' ? `${leaderboard[i].bestKillStreak} Player Killstreak` : + category == 'killStreak' ? `${leaderboard[i].killStreak} Player Killstreak` : + category == 'bestKillStreak' ? `${leaderboard[i].bestKillStreak} Player Killstreak` : category == 'deaths' ? `${leaderboard[i].deaths} Death${leaderboard[i].deaths>1||leaderboard[i].deaths==0?'s':''}` : - category == 'deathstreak' ? `${leaderboard[i].deathStreak} Deathstreak` : - category == 'worst_deathstreak' ? `${leaderboard[i].worstDeathStreak} Deathstreak` : - category == 'longest_kill' ? `${leaderboard[i].longestKill}m` : + category == 'deathStreak' ? `${leaderboard[i].deathStreak} Deathstreak` : + category == 'worstDeathstreak' ? `${leaderboard[i].worstDeathStreak} Deathstreak` : + category == 'longestKill' ? `${leaderboard[i].longestKill}m` : category == 'money' ? `$${(leaderboard[i].user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` : - category == 'total_time_played' ? `**Total:** ${client.secondsToDhms(leaderboard[i].totalSessionTime)}\n> **Last Session:** ${client.secondsToDhms(leaderboard[i].lastSessionTime)}` : - category == 'longest_time_played' ? `**Longest Game Session:** ${client.secondsToDhms(leaderboard[i].longestSessionTime)}` : - category == 'KDR' ? `**KDR: ${leaderboard[i].KDR.toFixed(2)}**` : 'N/A Error'; + category == 'totalSessionTime' ? `**Total:** ${client.secondsToDhms(leaderboard[i].totalSessionTime)}\n> **Last Session:** ${client.secondsToDhms(leaderboard[i].lastSessionTime)}` : + category == 'longestSessionTime' ? `**Longest Game Session:** ${client.secondsToDhms(leaderboard[i].longestSessionTime)}` : + category == 'KDR' ? `**KDR: ${leaderboard[i].KDR.toFixed(2)}**` : + category == 'connection' ? `**Connections: ${leaderboard[i].connections}**` : 'N/A Error'; if (category == 'money') des += `**${i+1}.** <@${leaderboard[i].user.userID}> - **${stats}**\n` - else if (category == 'total_time_played' || category == 'longest_time_played') { + else if (category == 'totalSessionTime' || category == 'longestSessionTime') { tag = leaderboard[i].discordID != "" ? `<@${leaderboard[i].discordID}>` : leaderboard[i].gamertag; des += `**${i+1}.** ${tag}\n> ${stats}\n\n`; } else leaderboardEmbed.addFields({ name: `**${i+1}. ${leaderboard[i].gamertag}**`, value: `**${stats}**`, inline: true }); } - if (['money', 'total_time_played', 'longest_time_played'].includes(category)) leaderboardEmbed.setDescription(des); + if (['money', 'totalSessionTime', 'longestSessionTime'].includes(category)) leaderboardEmbed.setDescription(des); return interaction.send({ embeds: [leaderboardEmbed] }); }, diff --git a/commands/location.js b/commands/location.js index dea7f54..982b8a1 100644 --- a/commands/location.js +++ b/commands/location.js @@ -19,20 +19,8 @@ module.exports = { * @param {*} param3 */ run: async (client, interaction, args, { GuildDB }) => { - - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == interaction.member.user.id ); - if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** You haven't linked your gamertag and are unable to use this command.`)], flags: (1 << 6) }); + let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id}); + if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** You haven't linked your gamertag and are unable to use this command.`)], flags: (1 << 6) }); let newDt = await client.getDateEST(playerStat.time); let unixTime = Math.floor(newDt.getTime()/1000); diff --git a/commands/lookup.js b/commands/lookup.js index 3c08a5c..9bde3be 100644 --- a/commands/lookup.js +++ b/commands/lookup.js @@ -46,20 +46,9 @@ module.exports = { */ run: async (client, interaction, args, { GuildDB }) => { - if (!client.exists(GuildDB.playerstats)) { - GuildDB.playerstats = [{}]; - client.dbo.collection("guilds").updateOne({ "server.serverID": GuildDB.serverID }, { - $set: { - "server.playerstats": [] - } - }, (err, res) => { - if (err) return client.sendInternalError(interaction, err); - }); - } - if (args[0].name == 'discord') { - let playerStat = GuildDB.playerstats.find(stat => stat.gamertag == args[0].options[0].value ); + let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value}); if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); if (client.exists(playerStat.discordID)) { @@ -78,7 +67,7 @@ module.exports = { } else if (args[0].name == 'gamertag') { - let playerStat = GuildDB.playerstats.find(stat => stat.discordID == args[0].options[0].value ); + let playerStat = await client.dbo.collection("players").findOne({"discordID": args[0].options[0].value}); if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** The user <@${args[0].options[0].value}> has not linked a gamertag.`)] }); const found = new EmbedBuilder() diff --git a/commands/player-list.js b/commands/player-list.js index c4668f9..8c5ec3b 100644 --- a/commands/player-list.js +++ b/commands/player-list.js @@ -21,7 +21,7 @@ module.exports = { */ run: async (client, interaction, args, { GuildDB }, start) => { - let activePlayers = GuildDB.playerstats.filter(p => p.connected == true); + let activePlayers = await client.dbo.collection("players").find({"connected": true}); let des = activePlayers.length > 0 ? `` : `**No Players Online**`; for (let i = 0; i < activePlayers.length; i++) { diff --git a/commands/player-stats.js b/commands/player-stats.js index 21dc371..33ce86f 100644 --- a/commands/player-stats.js +++ b/commands/player-stats.js @@ -18,17 +18,18 @@ module.exports = { type: CommandOptions.String, required: true, choices: [ - { name: "money", value: "money" }, - { name: "total_time_played", value: "total_time_played" }, - { name: "longest_time_played", value: "longest_time_played" }, - { 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: "longest_kill", value: "longest_kill" }, + { name: "Money", value: "money" }, + { name: "Total Time Played", value: "totalSessionTime" }, + { name: "Longest Game Session", value: "longestSessionTime" }, + { name: "Kills", value: "kills" }, + { name: "Kill Streak", value: "killStreak" }, + { name: "Best Kill Streak", value: "bestKillStreak" }, + { name: "Deaths", value: "deaths" }, + { name: "Death Streak", value: "deathStreak" }, + { name: "Worst Death Streak", value: "worstDeathStreak" }, + { name: "Longest Kill", value: "longestKill" }, { name: "KDR", value: "KDR" }, + { name: "Server Connections", value: "connections" }, ] }, { name: "discord", @@ -57,20 +58,24 @@ module.exports = { let playerStat; if (!discord && gamertag) { - playerStat = GuildDB.playerstats.find(stat => stat.gamertag == gamertag ); + playerStat = await client.dbo.collection("players").findOne({"gamertag": gamertag}); if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] }); } let query; let leaderboard; let leaderboardPos; + if (category == 'money') { - let users = await client.dbo.collection("users").find({}).toArray(); + const usersCursor = await client.dbo.collection("users").aggregate([ + { $sort: { [`user.guilds.${GuildDB.serverID}.balance`]: -1 } } + ]); + + for await (const user of usersCursor) { + leaderboard.push(user); + } - leaderboard = users.sort(function(a, b) { - return b.user.guilds[GuildDB.serverID].balance - a.user.guilds[GuildDB.serverID].balance; - }); if (discord) { // If searching by discord query = leaderboard.find(u => u.user.userID == discord); @@ -88,18 +93,13 @@ module.exports = { } else { - 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; - if (category == 'longest_kill') return b.longestKill - a.longestKill; - if (category == 'total_time_played') return b.totalSessionTime - a.totalSessionTime; - if (category == 'longest_time_played') return b.longestSessionTime - a.longestSessionTime; - if (category == 'KDR') return b.KDR - a.KDR; - }); + const playersCursor = await client.dbo.collection("players").aggregate([ + { $sort: { [`${category}`]: -1 } } + ]); + + for await (const player of playersCursor) { + leaderboard.push(player); + } if (discord) { // If searching by discord query = leaderboard.find(s => s.discordID == discord); @@ -113,20 +113,22 @@ module.exports = { if (query == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** Unable to find any records with the gamertag or user provided.`)] }); leaderboardPos = leaderboard.indexOf(query); + } leaderboardPos++; // add one to leaderboard pos because it is index in array and we want index zero to be num. one, index one to be num. two, etc. etc. let title = category == 'kills' ? "Total Kills" : - category == 'killstreak' ? "Current Killstreak" : - category == 'best_killstreak' ? "Best Killstreak" : + category == 'killStreak' ? "Current Killstreak" : + category == 'bestkillStreak' ? "Best Killstreak" : category == 'deaths' ? "Total Deaths" : - category == 'deathstreak' ? "Current Deathstreak" : - category == 'worst_deathstreak' ? "Worst Deathstreak" : - category == 'longest_kill' ? "Longest Kill" : + category == 'deathStreak' ? "Current Deathstreak" : + category == 'worstDeathStreak' ? "Worst Deathstreak" : + category == 'longestKill' ? "Longest Kill" : category == 'money' ? "Total Money" : - category == 'total_time_played' ? "Total Time Played" : - category == 'longest_time_played' ? "Longest Game Session" : - category == 'KDR' ? "Kill Death Ratio" : 'N/A Error'; + category == 'totalSessionTime' ? "Total Time Played" : + category == 'longestSessionTime' ? "Longest Game Session" : + category == 'KDR' ? "Kill Death Ratio" : + category == 'connections' ? "Times Connected" : 'N/A Error'; let statsEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default); @@ -139,14 +141,15 @@ module.exports = { let des = ``; let stats = category == 'kills' ? `${query.kills} Kill${(query.kills>1||query.kills==0)?'s':''}` : - category == 'killstreak' ? `${query.killStreak} Player Killstreak` : - category == 'best_killstreak' ? `${query.bestKillStreak} Player Killstreak` : + category == 'killStreak' ? `${query.killStreak} Player Killstreak` : + category == 'bestKillStreak' ? `${query.bestKillStreak} Player Killstreak` : category == 'deaths' ? `${query.deaths} Death${query.deaths>1||query.deaths==0?'s':''}` : - category == 'deathstreak' ? `${query.deathStreak} Deathstreak` : - category == 'worst_deathstreak' ? `${query.worstDeathStreak} Deathstreak` : - category == 'longest_kill' ? `${query.longestKill}m` : + category == 'deathStreak' ? `${query.deathStreak} Deathstreak` : + category == 'worstDeathStreak' ? `${query.worstDeathStreak} Deathstreak` : + category == 'longestKill' ? `${query.longestKill}m` : category == 'money' ? `$${(query.user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` : - category == 'KDR' ? `${query.KDR.toFixed(2)} KDR` : 'N/A Error'; + category == 'KDR' ? `${query.KDR.toFixed(2)} KDR` : + category == 'connections' ? `${query.connections} connections` : 'N/A Error'; statsEmbed.addFields({ name: 'Leaderboard Position', value: `# ${leaderboardPos}`, inline: true }); diff --git a/database/player.js b/database/player.js index fbed000..0bfbc41 100644 --- a/database/player.js +++ b/database/player.js @@ -1,15 +1,19 @@ module.exports = { - UpdatePlayer: async (client, player) => { + UpdatePlayer: async (client, player, interaction=null) => { return await client.dbo.collection("players").updateOne({"playerID": player.playerID}, {$set: player}, (err, _) => { - if (err) client.error(err); + if (err) { + if (intearction == null) return client.error(err); + else return client.sendInternalError(interaction, err); + } }); }, - getDefaultPlayer(gt, pID) { + getDefaultPlayer(gt, pID, NSID) { return { gamertag: gt, playerID: pID, discordID: "", + nitradoServerID: NSID, KDR: 0.00, kills: 0, @@ -35,6 +39,7 @@ module.exports = { totalSessionTime: 0, lastSessionTime: 0, longestSessionTime: 0, + connections: 0, bounties: [], } diff --git a/util/AlarmsHandler.js b/util/AlarmsHandler.js index 8603ed0..7bf1ea5 100644 --- a/util/AlarmsHandler.js +++ b/util/AlarmsHandler.js @@ -205,9 +205,9 @@ module.exports = { let info = { time: data[1], - victim: data[2], - victimID: data[3], - victimPOS: data[4].split(', ').map(v => parseFloat(v)), + player: data[2], + playerID: data[3], + playerPOS: data[4].split(', ').map(v => parseFloat(v)), }; for (let i = 0; i < guild.alarms.length; i++) { diff --git a/util/KillfeedHandler.js b/util/KillfeedHandler.js index 18eb8e5..bc2bc5d 100644 --- a/util/KillfeedHandler.js +++ b/util/KillfeedHandler.js @@ -191,13 +191,13 @@ module.exports = { let banking = await client.dbo.collection("users").findOne({"user.userID": killerStat.discordID}).then(banking => banking); if (!banking) { - banking = await createUser(interaction.member.user.id, GuildDB.serverID, GuildDB.startingBalance, client) + banking = await createUser(interaction.member.user.id, guildId, guild.startingBalance, client) if (!client.exists(banking)) return client.sendInternalError(interaction, err); } banking = banking.user; - if (!client.exists(banking.guilds[GuildDB.serverID])) { - const success = addUser(banking.guilds, GuildDB.serverID, interaction.member.user.id, client, GuildDB.startingBalance); + if (!client.exists(banking.guilds[guildId])) { + const success = addUser(banking.guilds, guildId, interaction.member.user.id, client, guild.startingBalance); if (!success) return client.sendInternalError(interaction, 'Failed to add bank'); } diff --git a/util/LogsHandler.js b/util/LogsHandler.js index 08b7fc1..ac2acb6 100644 --- a/util/LogsHandler.js +++ b/util/LogsHandler.js @@ -30,11 +30,12 @@ module.exports = { if (!client.exists(info.player) || !client.exists(info.playerID)) return; let playerStat = await client.dbo.collection("players").findOne({"playerID": info.playerID}); - if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID); + if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, client.config.Nitrado.ServerID); const newDt = await client.getDateEST(info.time); playerStat.lastConnectionDate = newDt; playerStat.connected = true; + playerStat.connections++; // Track adjusted sessions this instance has handled (e.g. no bot crashes or restarts). if (client.playerSessions.has(info.playerID)) { @@ -73,7 +74,7 @@ module.exports = { if (!client.exists(info.player) || !client.exists(info.playerID)) return; let playerStat = await client.dbo.collection("players").findOne({"playerID": info.playerID}); - if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID); + if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, client.config.Nitrado.ServerID); const newDt = await client.getDateEST(info.time); const unixTime = Math.round(newDt.getTime() / 1000); // Seconds @@ -123,7 +124,7 @@ module.exports = { if (!client.exists(info.player) || !client.exists(info.playerID)) return; let playerStat = await client.dbo.collection("players").findOne({"playerID": info.playerID}); - if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID); + if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, client.config.Nitrado.ServerID); if (!client.exists(playerStat.lastConnectionDate)) playerStat.lastConnectionDate = await client.getDateEST(info.time); playerStat.lastPos = playerStat.pos; @@ -160,7 +161,7 @@ module.exports = { if (!client.exists(info.player) || !client.exists(info.playerID)) return; let playerStat = await client.dbo.collection("players").findOne({"playerID": info.playerID}); - if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID); + if (!client.exits(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, client.config.Nitrado.ServerID); playerStat.lastDamageDate = await client.getDateEST(info.time); playerStat.lastHitBy = info.attacker;