diff --git a/src/commands/social/leaderboard/money.js b/src/commands/social/leaderboard/money.js index a867c6170..c47a15579 100644 --- a/src/commands/social/leaderboard/money.js +++ b/src/commands/social/leaderboard/money.js @@ -11,6 +11,7 @@ module.exports = class MoneyLeaderboard extends Command { } async run ({ t, author, channel }) { + // TODO: Remake everything because it's not working properly channel.startTyping() const top = await this.client.controllers.social.leaderboard('money') diff --git a/src/commands/social/leaderboard/reputation.js b/src/commands/social/leaderboard/reputation.js index 34b7e6463..23e1ef5e0 100644 --- a/src/commands/social/leaderboard/reputation.js +++ b/src/commands/social/leaderboard/reputation.js @@ -11,6 +11,7 @@ module.exports = class ReputationLeaderboard extends Command { } async run ({ t, author, channel }) { + // TODO: Remake everything because it's not working properly channel.startTyping() const top = await this.client.controllers.social.leaderboard('rep') diff --git a/src/commands/utility/guildinfo.js b/src/commands/utility/guildinfo.js index 6d582967c..011a901b0 100644 --- a/src/commands/utility/guildinfo.js +++ b/src/commands/utility/guildinfo.js @@ -16,21 +16,26 @@ module.exports = class GuildInfo extends Command { }, client) } - run ({ t, author, channel, language }, guild = channel.guild) { + async run ({ t, author, channel, language }, guild = channel.guild) { + if (guild.members.cache.size !== guild.memberCount) { + await guild.members.fetch({ withPresences: true }) + } const embed = new SwitchbladeEmbed(author) moment.locale(language) channel.startTyping() embed.setTitle(guild.name) .setThumbnail(guild.iconURL({ dynamic: true }) ? guild.iconURL({ dynamic: true }) : `https://guild-default-icon.herokuapp.com/${guild.nameAcronym}`) .addField(t('commands:guildinfo.id'), guild.id, true) - .addField(t('commands:guildinfo.owner'), guild.owner, true) - .addField(t('commands:guildinfo.region'), t(`regions:${guild.region}`), true) + .addField(t('commands:guildinfo.owner'), `<@${guild.ownerID}>`, true) .addField(t('commands:guildinfo.channels', { count: MiscUtils.formatNumber(guild.channels.cache.size, language) }), [ t('commands:guildinfo.textChannels', { count: MiscUtils.formatNumber(guild.channels.cache.filter(g => g.type === 'text' || g.type === 'category').size, language) }), t('commands:guildinfo.voiceChannels', { count: MiscUtils.formatNumber(guild.channels.cache.filter(g => g.type === 'voice').size, language) }) ].join('\n'), true) .addField(t('commands:guildinfo.createdAt'), `${moment(guild.createdTimestamp).format('LLL')}\n(${moment(guild.createdTimestamp).fromNow()})`, true) .addField(t('commands:guildinfo.joinedAt'), `${moment(guild.joinedTimestamp).format('LLL')}\n(${moment(guild.joinedTimestamp).fromNow()})`, true) + .addField(t('commands:guildinfo.serverBoost', { count: MiscUtils.formatNumber(guild.premiumSubscriptionCount, language) }), [ + t('commands:guildinfo.level', { count: MiscUtils.formatNumber(guild.premiumTier, language) }) + ].join('\n'), true) .addField(t('commands:guildinfo.members', { count: MiscUtils.formatNumber(guild.members.cache.size, language) }), [ `${this.getEmoji('streaming')} ${t('commands:guildinfo.streaming', { count: MiscUtils.formatNumber(guild.members.cache.filter(m => m.game === 'streaming').size, language) })}`, `${this.getEmoji('online')} ${t('commands:guildinfo.online', { count: MiscUtils.formatNumber(guild.members.cache.filter(m => m.presence.status === 'online').size, language) })}`, diff --git a/src/http/api/contributors.js b/src/http/api/contributors.js index e116ef015..385abd68f 100644 --- a/src/http/api/contributors.js +++ b/src/http/api/contributors.js @@ -8,11 +8,11 @@ module.exports = class Contributors extends Route { }, client) } - register (app) { + async register (app) { const router = Router() router.get('/', async (req, res) => { - const guild = this.client.guilds.cache.get(process.env.BOT_GUILD) + const guild = await this.client.guilds.fetch(process.env.BOT_GUILD) const roles = guild.roles.cache const members = await guild.members.fetch() diff --git a/src/http/api/guilds.js b/src/http/api/guilds.js index a78c51462..1380400a9 100644 --- a/src/http/api/guilds.js +++ b/src/http/api/guilds.js @@ -8,17 +8,18 @@ module.exports = class Guilds extends Route { }, client) } - register (app) { + async register (app) { const router = Router() // Info router.get('/:guildId/members', async (req, res) => { - const guild = this.client.guilds.cache.get(req.params.guildId) + const guild = await this.client.guilds.fetch(req.params.guildId) + const guildMembers = await guild.members.fetch() if (guild) { - const { id, name, icon, members: { size } } = guild - const userMembers = guild.members.filter(m => !m.user.bot).size - const botMembers = size - userMembers - return res.status(200).json({ id, name, icon, totalMembers: size, userMembers, botMembers }) + const { id, name, icon, memberCount } = guild + const userMembers = guildMembers.filter(m => !m.user.bot).size + const botMembers = memberCount - userMembers + return res.status(200).json({ id, name, icon, totalMembers: memberCount, userMembers, botMembers }) } res.status(400).json({ error: 'Guild not found!' }) }) diff --git a/src/http/api/statistics.js b/src/http/api/statistics.js index 6f7655af7..0b6e45c0b 100644 --- a/src/http/api/statistics.js +++ b/src/http/api/statistics.js @@ -9,13 +9,17 @@ module.exports = class Statistics extends Route { }, client) } - register (app) { + async register (app) { const router = Router() + const shardGuildCounts = await this.client.shard.fetchClientValues('guilds.cache.size') + const totalGuildCount = shardGuildCounts.reduce((total, current) => total + current, 0) + const shardUserCounts = await this.client.shard.broadcastEval('this.guilds.cache.reduce((acc, g) => acc + g.memberCount, 0)') + const totalUserCount = shardUserCounts.reduce((total, current) => total + current, 0) router.get('/', (req, res) => { res.status(200).json({ - serverCount: this.client.guilds.size, - userCount: this.client.users.size, + serverCount: totalGuildCount, + userCount: totalUserCount, uptime: process.uptime() * 1000, commandCount: this.client.commands.length, languageCount: Object.keys(i18next.store.data).length diff --git a/src/listeners/MainListener.js b/src/listeners/MainListener.js index 46f339b09..862b10860 100644 --- a/src/listeners/MainListener.js +++ b/src/listeners/MainListener.js @@ -137,6 +137,7 @@ module.exports = class MainListener extends EventListener { const cmd = fullCmd[0].toLowerCase().trim() const command = this.commands.find(c => c.name.toLowerCase() === cmd || (c.aliases && c.aliases.includes(cmd))) if (command) { + if (!message.channel.permissionsFor(this.user.id).has('SEND_MESSAGES')) return const userDocument = this.database && await this.database.users.findOne(message.author.id, 'blacklisted') if (userDocument && userDocument.blacklisted) return diff --git a/src/locales/en-US/commands.json b/src/locales/en-US/commands.json index b2f1e50f2..fd080c685 100644 --- a/src/locales/en-US/commands.json +++ b/src/locales/en-US/commands.json @@ -464,7 +464,8 @@ "commandUsage": "[server id]", "id": "ID", "owner": "Owner", - "region": "Region", + "serverBoost": "Server Boost (**{{count}}**)", + "level": "Level: **{{count}}**", "channels": "Channels **({{count}})**", "textChannels": "Text: **{{count}}**", "voiceChannels": "Voice: **{{count}}**", diff --git a/src/utils/EndpointUtils.js b/src/utils/EndpointUtils.js index eb37f093e..a335ea730 100644 --- a/src/utils/EndpointUtils.js +++ b/src/utils/EndpointUtils.js @@ -43,7 +43,7 @@ module.exports = class EndpointUtils { static async _fetchGuilds (client, token) { return this._requestDiscord('/users/@me/guilds', token).then(gs => gs.map(g => { - g.common = client.guilds.cache.has(g.id) + g.common = client.guilds.fetch(g.id) return g })) } @@ -81,7 +81,7 @@ module.exports = class EndpointUtils { const guild = client.guilds.cache.get(id) if (!guild) return res.status(400).json({ ok: false }) if (!req.isAdmin) { - const member = await guild.fetchMember(req.user.id) + const member = await guild.members.fetch(req.user.id) if (!member || (permissions && !member.hasPermission(permissions))) return res.status(403).json({ error: 'Missing permissions!' }) } req.guildId = id diff --git a/src/utils/PermissionUtils.js b/src/utils/PermissionUtils.js index 3bbf203c7..91422bfa4 100644 --- a/src/utils/PermissionUtils.js +++ b/src/utils/PermissionUtils.js @@ -9,9 +9,9 @@ module.exports = class PermissionUtils { return isDeveloper } - static specialRole (client, user) { - const botGuild = client.guilds.cache.get(process.env.BOT_GUILD) - const member = botGuild && botGuild.members.cache.get(user.id) + static async specialRole (client, user) { + const botGuild = await client.guilds.fetch(process.env.BOT_GUILD) + const member = botGuild && await botGuild.members.fetch(user.id) if (member) { return member.roles.cache.filter(r => r.hoist).sort((a, b) => b.position - a.position).first() }