244 lines
9.7 KiB
TypeScript
244 lines
9.7 KiB
TypeScript
import { MessageEmbed, version as djsversion } from 'discord.js';
|
||
/// @ts-ignore
|
||
import { version } from '../../package.json';
|
||
import ms from 'ms';
|
||
import os from 'os';
|
||
import Command from '../core/command';
|
||
import { CommonLibrary, formatBytes, trimArray } from '../core/lib';
|
||
import { verificationLevels, filterLevels, regions, flags } from '../defs/info';
|
||
import moment from 'moment';
|
||
import utc from 'moment';
|
||
|
||
export default new Command({
|
||
description:
|
||
'Command to provide all sorts of info about the current server, a user, etc.',
|
||
run: 'Please provide an argument.\nFor help, run `%prefix%help info`.',
|
||
subcommands: {
|
||
avatar: new Command({
|
||
description: "Shows your own, or another user's avatar.",
|
||
usage: '(<user>)',
|
||
async run($: CommonLibrary): Promise<any> {
|
||
$.channel.send(
|
||
$.author.displayAvatarURL({ dynamic: true, size: 2048 }),
|
||
);
|
||
},
|
||
user: new Command({
|
||
description: "Shows your own, or another user's avatar.",
|
||
async run($: CommonLibrary): Promise<any> {
|
||
$.channel.send(
|
||
$.args[0].displayAvatarURL({ dynamic: true, size: 2048 }),
|
||
);
|
||
},
|
||
}),
|
||
}),
|
||
|
||
bot: new Command({
|
||
description: 'Displays info about the bot.',
|
||
async run($: CommonLibrary): Promise<any> {
|
||
const core = os.cpus()[0];
|
||
const embed = new MessageEmbed()
|
||
.setThumbnail(
|
||
/// @ts-ignore
|
||
$.client.user?.displayAvatarURL({ dynamic: true, size: 2048 }),
|
||
)
|
||
.setColor($.guild?.me?.displayHexColor || 'BLUE')
|
||
.addField('General', [
|
||
`**❯ Client:** ${$.client.user?.tag} (${$.client.user?.id})`,
|
||
`**❯ Servers:** ${$.client.guilds.cache.size.toLocaleString()}`,
|
||
`**❯ Users:** ${$.client.guilds.cache
|
||
.reduce((a: any, b: { memberCount: any }) => a + b.memberCount, 0)
|
||
.toLocaleString()}`,
|
||
`**❯ Channels:** ${$.client.channels.cache.size.toLocaleString()}`,
|
||
`**❯ Creation Date:** ${utc($.client.user?.createdTimestamp).format(
|
||
'Do MMMM YYYY HH:mm:ss',
|
||
)}`,
|
||
`**❯ Node.JS:** ${process.version}`,
|
||
`**❯ Version:** v${version}`,
|
||
`**❯ Discord.JS:** ${djsversion}`,
|
||
'\u200b',
|
||
])
|
||
.addField('System', [
|
||
`**❯ Platform:** ${process.platform}`,
|
||
`**❯ Uptime:** ${ms(os.uptime() * 1000, { long: true })}`,
|
||
`**❯ CPU:**`,
|
||
`\u3000 • Cores: ${os.cpus().length}`,
|
||
`\u3000 • Model: ${core.model}`,
|
||
`\u3000 • Speed: ${core.speed}MHz`,
|
||
`**❯ Memory:**`,
|
||
`\u3000 • Total: ${formatBytes(process.memoryUsage().heapTotal)}`,
|
||
`\u3000 • Used: ${formatBytes(process.memoryUsage().heapTotal)}`,
|
||
])
|
||
.setTimestamp();
|
||
$.channel.send(embed);
|
||
},
|
||
}),
|
||
|
||
guild: new Command({
|
||
description: 'Displays info about the current guild.',
|
||
async run($: CommonLibrary): Promise<any> {
|
||
if ($.guild) {
|
||
const roles = $.guild.roles.cache
|
||
.sort((a, b) => b.position - a.position)
|
||
.map((role) => role.toString());
|
||
const members = $.guild.members.cache;
|
||
const channels = $.guild.channels.cache;
|
||
const emojis = $.guild.emojis.cache;
|
||
|
||
const iconURL = $.guild.iconURL({ dynamic: true });
|
||
const embed = new MessageEmbed()
|
||
.setDescription(`**Guild information for __${$.guild.name}__**`)
|
||
.setColor('BLUE');
|
||
if (iconURL)
|
||
embed
|
||
.setThumbnail(iconURL)
|
||
.addField('General', [
|
||
`**❯ Name:** ${$.guild.name}`,
|
||
`**❯ ID:** ${$.guild.id}`,
|
||
`**❯ Owner:** ${$.guild.owner?.user.tag} (${$.guild.ownerID})`,
|
||
`**❯ Region:** ${regions[$.guild.region]}`,
|
||
`**❯ Boost Tier:** ${
|
||
$.guild.premiumTier ? `Tier ${$.guild.premiumTier}` : 'None'
|
||
}`,
|
||
`**❯ Explicit Filter:** ${
|
||
filterLevels[$.guild.explicitContentFilter]
|
||
}`,
|
||
`**❯ Verification Level:** ${
|
||
verificationLevels[$.guild.verificationLevel]
|
||
}`,
|
||
`**❯ Time Created:** ${moment($.guild.createdTimestamp).format(
|
||
'LT',
|
||
)} ${moment($.guild.createdTimestamp).format('LL')} ${moment(
|
||
$.guild.createdTimestamp,
|
||
).fromNow()})`,
|
||
'\u200b',
|
||
])
|
||
.addField('Statistics', [
|
||
`**❯ Role Count:** ${roles.length}`,
|
||
`**❯ Emoji Count:** ${emojis.size}`,
|
||
`**❯ Regular Emoji Count:** ${
|
||
emojis.filter((emoji) => !emoji.animated).size
|
||
}`,
|
||
`**❯ Animated Emoji Count:** ${
|
||
emojis.filter((emoji) => emoji.animated).size
|
||
}`,
|
||
`**❯ Member Count:** ${$.guild.memberCount}`,
|
||
`**❯ Humans:** ${
|
||
members.filter((member) => !member.user.bot).size
|
||
}`,
|
||
`**❯ Bots:** ${
|
||
members.filter((member) => member.user.bot).size
|
||
}`,
|
||
`**❯ Text Channels:** ${
|
||
channels.filter((channel) => channel.type === 'text').size
|
||
}`,
|
||
`**❯ Voice Channels:** ${
|
||
channels.filter((channel) => channel.type === 'voice').size
|
||
}`,
|
||
`**❯ Boost Count:** ${$.guild.premiumSubscriptionCount || '0'}`,
|
||
`\u200b`,
|
||
])
|
||
.addField('Presence', [
|
||
`**❯ Online:** ${
|
||
members.filter(
|
||
(member) => member.presence.status === 'online',
|
||
).size
|
||
}`,
|
||
`**❯ Idle:** ${
|
||
members.filter((member) => member.presence.status === 'idle')
|
||
.size
|
||
}`,
|
||
`**❯ Do Not Disturb:** ${
|
||
members.filter((member) => member.presence.status === 'dnd')
|
||
.size
|
||
}`,
|
||
`**❯ Offline:** ${
|
||
members.filter(
|
||
(member) => member.presence.status === 'offline',
|
||
).size
|
||
}`,
|
||
'\u200b',
|
||
])
|
||
.addField(
|
||
`Roles [${roles.length - 1}]`,
|
||
roles.length < 10
|
||
? roles.join(', ')
|
||
: roles.length > 10
|
||
? trimArray(roles)
|
||
: 'None',
|
||
)
|
||
.setTimestamp();
|
||
|
||
$.channel.send(embed);
|
||
} else {
|
||
$.channel.send('Please execute this command in a guild.');
|
||
}
|
||
},
|
||
}),
|
||
},
|
||
user: new Command({
|
||
description: 'Displays info about mentioned user.',
|
||
async run($: CommonLibrary): Promise<any> {
|
||
// Transforms the User object into a GuildMember object of the current guild.
|
||
const member = $.guild?.members.resolve($.args[0]);
|
||
|
||
if (!member)
|
||
return $.channel.send(
|
||
'No member object was found by that user! Are you sure you used this command in a server?',
|
||
);
|
||
|
||
const roles = member.roles.cache
|
||
.sort(
|
||
(a: { position: number }, b: { position: number }) =>
|
||
b.position - a.position,
|
||
)
|
||
.map((role: { toString: () => any }) => role.toString())
|
||
.slice(0, -1);
|
||
// @ts-ignore - Discord.js' typings seem to be outdated here. According to their v12 docs, it's User.fetchFlags() instead of User.flags.
|
||
const userFlags = ((await member.user.fetchFlags()) as UserFlags).toArray();
|
||
|
||
const embed = new MessageEmbed()
|
||
.setThumbnail(
|
||
member.user.displayAvatarURL({ dynamic: true, size: 512 }),
|
||
)
|
||
.setColor(member.displayHexColor || 'BLUE')
|
||
.addField('User', [
|
||
`**❯ Username:** ${member.user.username}`,
|
||
`**❯ Discriminator:** ${member.user.discriminator}`,
|
||
`**❯ ID:** ${member.id}`,
|
||
`**❯ Flags:** ${userFlags.length ? userFlags.join(', ') : 'None'}`,
|
||
`**❯ Avatar:** [Link to avatar](${member.user.displayAvatarURL({
|
||
dynamic: true,
|
||
})})`,
|
||
`**❯ Time Created:** ${moment(member.user.createdTimestamp).format(
|
||
'LT',
|
||
)} ${moment(member.user.createdTimestamp).format('LL')} ${moment(
|
||
member.user.createdTimestamp,
|
||
).fromNow()}`,
|
||
`**❯ Status:** ${member.user.presence.status}`,
|
||
`**❯ Game:** ${
|
||
member.user.presence.activities || 'Not playing a game.'
|
||
}`,
|
||
])
|
||
.addField('Member', [
|
||
`**❯ Highest Role:** ${
|
||
member.roles.highest.id === $.guild?.id
|
||
? 'None'
|
||
: member.roles.highest.name
|
||
}`,
|
||
`**❯ Server Join Date:** ${moment(member.joinedAt).format('LL LTS')}`,
|
||
`**❯ Hoist Role:** ${
|
||
member.roles.hoist ? member.roles.hoist.name : 'None'
|
||
}`,
|
||
`**❯ Roles:** [${roles.length}]: ${
|
||
roles.length < 10
|
||
? roles.join(', ')
|
||
: roles.length > 10
|
||
? this.client.utils.trimArray(roles)
|
||
: 'None'
|
||
}`,
|
||
]);
|
||
$.channel.send(embed);
|
||
},
|
||
}),
|
||
});
|