2020-12-15 01:44:28 +00:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
});
|