From db3320365711808c3bfb6427ea0f14db50e38316 Mon Sep 17 00:00:00 2001 From: WatDuhHekBro <44940783+WatDuhHekBro@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:15:17 -0500 Subject: [PATCH] Cleaned up guild checks and return statements --- src/commands/fun/cookie.ts | 8 +- src/commands/fun/eco.ts | 1 + src/commands/fun/figlet.ts | 7 +- src/commands/fun/love.ts | 13 +-- src/commands/fun/modules/eco-core.ts | 1 + src/commands/fun/neko.ts | 9 +- src/commands/fun/weather.ts | 7 +- src/commands/fun/whois.ts | 32 +++--- src/commands/system/admin.ts | 128 +++++++++-------------- src/commands/utility/calc.ts | 10 +- src/commands/utility/desc.ts | 20 +--- src/commands/utility/info.ts | 146 ++++++++++++++------------- src/commands/utility/scanemotes.ts | 23 ++--- src/commands/utility/time.ts | 1 + 14 files changed, 174 insertions(+), 232 deletions(-) diff --git a/src/commands/fun/cookie.ts b/src/commands/fun/cookie.ts index 50b1b3d..69a624a 100644 --- a/src/commands/fun/cookie.ts +++ b/src/commands/fun/cookie.ts @@ -36,18 +36,16 @@ export default new NamedCommand({ } }) }, + id: "user", user: new Command({ description: "User to give cookie to.", async run({message, channel, guild, author, member, client, args}) { const sender = author; const mention: User = args[0]; - if (mention.id == sender.id) { - channel.send("You can't give yourself cookies!"); - return; - } + if (mention.id == sender.id) return channel.send("You can't give yourself cookies!"); - channel.send( + return channel.send( `:cookie: <@${sender.id}> ${parseVars(random(cookies), { target: mention.toString() })}` diff --git a/src/commands/fun/eco.ts b/src/commands/fun/eco.ts index 37c288e..da7d97a 100644 --- a/src/commands/fun/eco.ts +++ b/src/commands/fun/eco.ts @@ -18,6 +18,7 @@ export default new NamedCommand({ shop: ShopCommand, monday: MondayCommand }, + id: "user", user: new Command({ description: "See how much money someone else has by using their user ID or pinging them.", async run({guild, channel, args}) { diff --git a/src/commands/fun/figlet.ts b/src/commands/fun/figlet.ts index b78ba89..439ce00 100644 --- a/src/commands/fun/figlet.ts +++ b/src/commands/fun/figlet.ts @@ -5,11 +5,8 @@ export default new NamedCommand({ description: "Generates a figlet of your input.", async run({message, channel, guild, author, member, client, args}) { const input = args.join(" "); - if (!args[0]) { - channel.send("You have to provide input for me to create a figlet!"); - return; - } - channel.send( + if (!args[0]) return channel.send("You have to provide input for me to create a figlet!"); + return channel.send( "```" + figlet.textSync(`${input}`, { horizontalLayout: "full" diff --git a/src/commands/fun/love.ts b/src/commands/fun/love.ts index 94467c5..bf42d0d 100644 --- a/src/commands/fun/love.ts +++ b/src/commands/fun/love.ts @@ -1,13 +1,10 @@ -import {Command, NamedCommand} from "../../core"; +import {Command, NamedCommand, CHANNEL_TYPE} from "../../core"; export default new NamedCommand({ description: "Chooses someone to love.", - async run({message, channel, guild, author, member, client, args}) { - if (guild) { - const member = guild.members.cache.random(); - channel.send(`I love ${member.user.username}!`); - } else { - channel.send("You must use this command in a guild!"); - } + channelType: CHANNEL_TYPE.GUILD, + async run({message, channel, guild, author, client, args}) { + const member = guild!.members.cache.random(); + channel.send(`I love ${member.nickname ?? member.user.username}!`); } }); diff --git a/src/commands/fun/modules/eco-core.ts b/src/commands/fun/modules/eco-core.ts index b1966f2..6ed9628 100644 --- a/src/commands/fun/modules/eco-core.ts +++ b/src/commands/fun/modules/eco-core.ts @@ -112,6 +112,7 @@ export const PayCommand = new NamedCommand({ description: "Send money to someone.", usage: " ", run: "Who are you sending this money to?", + id: "user", user: new Command({ run: "You need to enter an amount you're sending!", number: new Command({ diff --git a/src/commands/fun/neko.ts b/src/commands/fun/neko.ts index 46d0bfc..18cfe76 100644 --- a/src/commands/fun/neko.ts +++ b/src/commands/fun/neko.ts @@ -45,15 +45,10 @@ export default new NamedCommand({ description: "Image type to send.", async run({message, channel, guild, author, member, client, args}) { const arg = args[0]; - - if (!(arg in endpoints.sfw)) { - channel.send("Couldn't find that endpoint!"); - return; - } - + if (!(arg in endpoints.sfw)) return channel.send("Couldn't find that endpoint!"); let url = new URL(`https://nekos.life/api/v2${endpoints.sfw[arg]}`); const content = await getContent(url.toString()); - channel.send(content.url); + return channel.send(content.url); } }) }); diff --git a/src/commands/fun/weather.ts b/src/commands/fun/weather.ts index d232ea3..590755f 100644 --- a/src/commands/fun/weather.ts +++ b/src/commands/fun/weather.ts @@ -6,11 +6,8 @@ const weather = require("weather-js"); export default new NamedCommand({ description: "Shows weather info of specified location.", async run({message, channel, guild, author, member, client, args}) { - if (args.length == 0) { - channel.send("You need to provide a city."); - return; - } - weather.find( + if (args.length == 0) return channel.send("You need to provide a city."); + return weather.find( { search: args.join(" "), degreeType: "C" diff --git a/src/commands/fun/whois.ts b/src/commands/fun/whois.ts index c8daff2..a65a064 100644 --- a/src/commands/fun/whois.ts +++ b/src/commands/fun/whois.ts @@ -1,5 +1,5 @@ import {User} from "discord.js"; -import {Command, NamedCommand, getMemberByUsername} from "../../core"; +import {Command, NamedCommand, getMemberByUsername, CHANNEL_TYPE} from "../../core"; // Quotes must be used here or the numbers will change const registry: {[id: string]: string} = { @@ -46,6 +46,7 @@ export default new NamedCommand({ channel.send("You haven't been added to the registry yet!"); } }, + id: "user", user: new Command({ async run({message, channel, guild, author, member, client, args}) { const user: User = args[0]; @@ -54,31 +55,28 @@ export default new NamedCommand({ if (id in registry) { channel.send(`\`${user.username}\` - ${registry[id]}`); } else { - channel.send(`\`${user.username}#${user.discriminator}\` hasn't been added to the registry yet!`); + channel.send(`\`${user.tag}\` hasn't been added to the registry yet!`); } } }), any: new Command({ - async run({message, channel, guild, author, member, client, args}) { - if (guild) { - const query: string = args.join(" "); - const member = await getMemberByUsername(guild, query); + channelType: CHANNEL_TYPE.GUILD, + async run({message, channel, guild, author, client, args}) { + const query = args.join(" ") as string; + const member = await getMemberByUsername(guild!, query); - if (member && member.id in registry) { - const id = member.id; + if (member && member.id in registry) { + const id = member.id; - if (id in registry) { - channel.send(`\`${member.user.username}\` - ${registry[member.id]}`); - } else { - channel.send(`\`${member.user.username}\` hasn't been added to the registry yet!`); - } + if (id in registry) { + channel.send(`\`${member.nickname ?? member.user.username}\` - ${registry[member.id]}`); } else { - channel.send(`Couldn't find a user by the name of \`${query}\`!`); + channel.send( + `\`${member.nickname ?? member.user.username}\` hasn't been added to the registry yet!` + ); } } else { - channel.send( - "You must run this in a guild! (*If you have the user's ID, you don't have to be in a guild.*)" - ); + channel.send(`Couldn't find a user by the name of \`${query}\`!`); } } }) diff --git a/src/commands/system/admin.ts b/src/commands/system/admin.ts index 7aeebc2..ac0e9e0 100644 --- a/src/commands/system/admin.ts +++ b/src/commands/system/admin.ts @@ -1,7 +1,7 @@ -import {Command, NamedCommand, botHasPermission, getPermissionLevel, getPermissionName} from "../../core"; +import {Command, NamedCommand, botHasPermission, getPermissionLevel, getPermissionName, CHANNEL_TYPE} from "../../core"; import {clean} from "../../lib"; import {Config, Storage} from "../../structures"; -import {Permissions} from "discord.js"; +import {Permissions, TextChannel} from "discord.js"; import {logs} from "../../modules/globals"; function getLogBuffer(type: string) { @@ -22,8 +22,6 @@ export default new NamedCommand({ description: "An all-in-one command to do admin stuff. You need to be either an admin of the server or one of the bot's mechanics to use this command.", async run({message, channel, guild, author, member, client, args}) { - if (!member) - return channel.send("Couldn't find a member object for you! Did you make sure you used this in a server?"); const permLevel = getPermissionLevel(author, member); return channel.send(`${author}, your permission level is \`${getPermissionName(permLevel)}\` (${permLevel}).`); }, @@ -32,12 +30,13 @@ export default new NamedCommand({ description: "Set different per-guild settings for the bot.", run: "You have to specify the option you want to set.", permission: PERMISSIONS.ADMIN, + channelType: CHANNEL_TYPE.GUILD, subcommands: { prefix: new NamedCommand({ description: "Set a custom prefix for your guild. Removes your custom prefix if none is provided.", usage: "()", async run({message, channel, guild, author, member, client, args}) { - Storage.getGuild(guild?.id || "N/A").prefix = null; + Storage.getGuild(guild!.id).prefix = null; Storage.save(); channel.send( `The custom prefix for this guild has been removed. My prefix is now back to \`${Config.prefix}\`.` @@ -45,7 +44,7 @@ export default new NamedCommand({ }, any: new Command({ async run({message, channel, guild, author, member, client, args}) { - Storage.getGuild(guild?.id || "N/A").prefix = args[0]; + Storage.getGuild(guild!.id).prefix = args[0]; Storage.save(); channel.send(`The custom prefix for this guild is now \`${args[0]}\`.`); } @@ -61,36 +60,24 @@ export default new NamedCommand({ "Sets how welcome messages are displayed for your server. Removes welcome messages if unspecified.", usage: "`none`/`text`/`graphical`", async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Storage.getGuild(guild.id).welcomeType = "none"; - Storage.save(); - channel.send("Set this server's welcome type to `none`."); - } else { - channel.send("You must use this command in a server."); - } + Storage.getGuild(guild!.id).welcomeType = "none"; + Storage.save(); + channel.send("Set this server's welcome type to `none`."); }, // I should probably make this a bit more dynamic... Oh well. subcommands: { text: new NamedCommand({ async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Storage.getGuild(guild.id).welcomeType = "text"; - Storage.save(); - channel.send("Set this server's welcome type to `text`."); - } else { - channel.send("You must use this command in a server."); - } + Storage.getGuild(guild!.id).welcomeType = "text"; + Storage.save(); + channel.send("Set this server's welcome type to `text`."); } }), graphical: new NamedCommand({ async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Storage.getGuild(guild.id).welcomeType = "graphical"; - Storage.save(); - channel.send("Set this server's welcome type to `graphical`."); - } else { - channel.send("You must use this command in a server."); - } + Storage.getGuild(guild!.id).welcomeType = "graphical"; + Storage.save(); + channel.send("Set this server's welcome type to `graphical`."); } }) } @@ -99,34 +86,17 @@ export default new NamedCommand({ description: "Sets the welcome channel for your server. Type `#` to reference the channel.", usage: "()", async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Storage.getGuild(guild.id).welcomeChannel = channel.id; - Storage.save(); - channel.send(`Successfully set ${channel} as the welcome channel for this server.`); - } else { - channel.send("You must use this command in a server."); - } + Storage.getGuild(guild!.id).welcomeChannel = channel.id; + Storage.save(); + channel.send(`Successfully set ${channel} as the welcome channel for this server.`); }, - // If/when channel types come out, this will be the perfect candidate to test it. - any: new Command({ + id: "channel", + channel: new Command({ async run({message, channel, guild, author, member, client, args}) { - if (guild) { - const match = args[0].match(/^<#(\d{17,19})>$/); - - if (match) { - Storage.getGuild(guild.id).welcomeChannel = match[1]; - Storage.save(); - channel.send( - `Successfully set this server's welcome channel to ${match[0]}.` - ); - } else { - channel.send( - "You must provide a reference channel. You can do this by typing `#` then searching for the proper channel." - ); - } - } else { - channel.send("You must use this command in a server."); - } + const result = args[0] as TextChannel; + Storage.getGuild(guild!.id).welcomeChannel = result.id; + Storage.save(); + channel.send(`Successfully set this server's welcome channel to ${result}.`); } }) }), @@ -135,24 +105,16 @@ export default new NamedCommand({ "Sets a custom welcome message for your server. Use `%user%` as the placeholder for the user.", usage: "()", async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Storage.getGuild(guild.id).welcomeMessage = null; - Storage.save(); - channel.send("Reset your server's welcome message to the default."); - } else { - channel.send("You must use this command in a server."); - } + Storage.getGuild(guild!.id).welcomeMessage = null; + Storage.save(); + channel.send("Reset your server's welcome message to the default."); }, any: new Command({ async run({message, channel, guild, author, member, client, args}) { - if (guild) { - const message = args.join(" "); - Storage.getGuild(guild.id).welcomeMessage = message; - Storage.save(); - channel.send(`Set your server's welcome message to \`${message}\`.`); - } else { - channel.send("You must use this command in a server."); - } + const newMessage = args.join(" "); + Storage.getGuild(guild!.id).welcomeMessage = newMessage; + Storage.save(); + channel.send(`Set your server's welcome message to \`${newMessage}\`.`); } }) }) @@ -202,9 +164,10 @@ export default new NamedCommand({ purge: new NamedCommand({ description: "Purges the bot's own messages.", permission: PERMISSIONS.BOT_SUPPORT, + channelType: CHANNEL_TYPE.GUILD, async run({message, channel, guild, author, member, client, args}) { // It's probably better to go through the bot's own messages instead of calling bulkDelete which requires MANAGE_MESSAGES. - if (botHasPermission(guild, Permissions.FLAGS.MANAGE_MESSAGES) && channel.type !== "dm") { + if (botHasPermission(guild, Permissions.FLAGS.MANAGE_MESSAGES)) { message.delete(); const msgs = await channel.messages.fetch({ limit: 100 @@ -216,7 +179,7 @@ export default new NamedCommand({ timeout: 5000 }) ); - await channel.bulkDelete(travMessages); + await (channel as TextChannel).bulkDelete(travMessages); } else { channel.send( "This command must be executed in a guild where I have the `MANAGE_MESSAGES` permission." @@ -227,17 +190,16 @@ export default new NamedCommand({ clear: new NamedCommand({ description: "Clears a given amount of messages.", usage: "", + channelType: CHANNEL_TYPE.GUILD, run: "A number was not provided.", number: new Command({ description: "Amount of messages to delete.", async run({message, channel, guild, author, member, client, args}) { - if (channel.type === "dm") return channel.send("Can't clear messages in the DMs!"); message.delete(); const fetched = await channel.messages.fetch({ limit: args[0] }); - await channel.bulkDelete(fetched); - return; + return await (channel as TextChannel).bulkDelete(fetched); } }) }), @@ -261,9 +223,10 @@ export default new NamedCommand({ nick: new NamedCommand({ description: "Change the bot's nickname.", permission: PERMISSIONS.BOT_SUPPORT, + channelType: CHANNEL_TYPE.GUILD, async run({message, channel, guild, author, member, client, args}) { const nickName = args.join(" "); - await guild?.me?.setNickname(nickName); + await guild!.me?.setNickname(nickName); if (botHasPermission(guild, Permissions.FLAGS.MANAGE_MESSAGES)) message.delete({timeout: 5000}); channel.send(`Nickname set to \`${nickName}\``).then((m) => m.delete({timeout: 5000})); } @@ -308,15 +271,20 @@ export default new NamedCommand({ syslog: new NamedCommand({ description: "Sets up the current channel to receive system logs.", permission: PERMISSIONS.BOT_ADMIN, + channelType: CHANNEL_TYPE.GUILD, async run({message, channel, guild, author, member, client, args}) { - if (guild) { - Config.systemLogsChannel = channel.id; + Config.systemLogsChannel = channel.id; + Config.save(); + channel.send(`Successfully set ${channel} as the system logs channel.`); + }, + channel: new Command({ + async run({message, channel, guild, author, member, client, args}) { + const targetChannel = args[0] as TextChannel; + Config.systemLogsChannel = targetChannel.id; Config.save(); - channel.send(`Successfully set ${channel} as the system logs channel.`); - } else { - channel.send("DM system log channels aren't supported."); + channel.send(`Successfully set ${targetChannel} as the system logs channel.`); } - } + }) }) } }); diff --git a/src/commands/utility/calc.ts b/src/commands/utility/calc.ts index 2303351..dad3e88 100644 --- a/src/commands/utility/calc.ts +++ b/src/commands/utility/calc.ts @@ -5,22 +5,18 @@ import {MessageEmbed} from "discord.js"; export default new NamedCommand({ description: "Calculates a specified math expression.", async run({message, channel, guild, author, member, client, args}) { - if (!args[0]) { - channel.send("Please provide a calculation."); - return; - } + if (!args[0]) return channel.send("Please provide a calculation."); let resp; try { resp = math.evaluate(args.join(" ")); } catch (e) { - channel.send("Please provide a *valid* calculation."); - return; + return channel.send("Please provide a *valid* calculation."); } const embed = new MessageEmbed() .setColor(0xffffff) .setTitle("Math Calculation") .addField("Input", `\`\`\`js\n${args.join("")}\`\`\``) .addField("Output", `\`\`\`js\n${resp}\`\`\``); - channel.send(embed); + return channel.send(embed); } }); diff --git a/src/commands/utility/desc.ts b/src/commands/utility/desc.ts index ed0b87c..b3c3d57 100644 --- a/src/commands/utility/desc.ts +++ b/src/commands/utility/desc.ts @@ -6,24 +6,14 @@ export default new NamedCommand({ async run({message, channel, guild, author, member, client, args}) { const voiceChannel = message.member?.voice.channel; - if (!voiceChannel) { - channel.send("You are not in a voice channel."); - return; - } - - if (!voiceChannel.guild.me?.hasPermission("MANAGE_CHANNELS")) { - channel.send("I am lacking the required permissions to perform this action."); - return; - } - - if (args.length === 0) { - channel.send("Please provide a new voice channel name."); - return; - } + if (!voiceChannel) return channel.send("You are not in a voice channel."); + if (!voiceChannel.guild.me?.hasPermission("MANAGE_CHANNELS")) + return channel.send("I am lacking the required permissions to perform this action."); + if (args.length === 0) return channel.send("Please provide a new voice channel name."); const prevName = voiceChannel.name; const newName = args.join(" "); await voiceChannel.setName(newName); - await channel.send(`Changed channel name from "${prevName}" to "${newName}".`); + return await channel.send(`Changed channel name from "${prevName}" to "${newName}".`); } }); diff --git a/src/commands/utility/info.ts b/src/commands/utility/info.ts index 68b4d35..7006a0e 100644 --- a/src/commands/utility/info.ts +++ b/src/commands/utility/info.ts @@ -1,14 +1,16 @@ -import {MessageEmbed, version as djsversion, Guild} from "discord.js"; +import {MessageEmbed, version as djsversion, Guild, User, GuildMember} from "discord.js"; import ms from "ms"; import os from "os"; -import {Command, NamedCommand, getMemberByUsername} from "../../core"; +import {Command, NamedCommand, getMemberByUsername, CHANNEL_TYPE} from "../../core"; import {formatBytes, trimArray} from "../../lib"; import {verificationLevels, filterLevels, regions} from "../../defs/info"; import moment, {utc} from "moment"; export default new NamedCommand({ 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`.", + async run({message, channel, guild, author, member, client, args}) { + channel.send(await getUserInfo(author, member)); + }, subcommands: { avatar: new NamedCommand({ description: "Shows your own, or another user's avatar.", @@ -16,6 +18,7 @@ export default new NamedCommand({ async run({message, channel, guild, author, member, client, args}) { channel.send(author.displayAvatarURL({dynamic: true, size: 2048})); }, + id: "user", user: new Command({ description: "Shows your own, or another user's avatar.", async run({message, channel, guild, author, member, client, args}) { @@ -29,21 +32,20 @@ export default new NamedCommand({ }), any: new Command({ description: "Shows another user's avatar by searching their name", - async run({message, channel, guild, author, member, client, args}) { - if (guild) { - const name = args.join(" "); - const member = await getMemberByUsername(guild, name); + channelType: CHANNEL_TYPE.GUILD, + async run({message, channel, guild, author, client, args}) { + const name = args.join(" "); + const member = await getMemberByUsername(guild!, name); - if (member) { - channel.send( - member.user.displayAvatarURL({ - dynamic: true, - size: 2048 - }) - ); - } else { - channel.send(`No user found by the name \`${name}\`!`); - } + if (member) { + channel.send( + member.user.displayAvatarURL({ + dynamic: true, + size: 2048 + }) + ); + } else { + channel.send(`No user found by the name \`${name}\`!`); } } }) @@ -92,12 +94,9 @@ export default new NamedCommand({ guild: new NamedCommand({ description: "Displays info about the current guild or another guild.", usage: "(/)", + channelType: CHANNEL_TYPE.GUILD, async run({message, channel, guild, author, member, client, args}) { - if (guild) { - channel.send(await getGuildInfo(guild, guild)); - } else { - channel.send("Please execute this command in a guild."); - } + channel.send(await getGuildInfo(guild!, guild)); }, any: new Command({ description: "Display info about a guild by finding its name or ID.", @@ -105,19 +104,21 @@ export default new NamedCommand({ // If a guild ID is provided (avoid the "number" subcommand because of inaccuracies), search for that guild if (args.length === 1 && /^\d{17,19}$/.test(args[0])) { const id = args[0]; - const guild = client.guilds.cache.get(id); + const targetGuild = client.guilds.cache.get(id); - if (guild) { - channel.send(await getGuildInfo(guild, guild)); + if (targetGuild) { + channel.send(await getGuildInfo(targetGuild, guild)); } else { channel.send(`None of the servers I'm in matches the guild ID \`${id}\`!`); } } else { const query: string = args.join(" ").toLowerCase(); - const guild = client.guilds.cache.find((guild) => guild.name.toLowerCase().includes(query)); + const targetGuild = client.guilds.cache.find((guild) => + guild.name.toLowerCase().includes(query) + ); - if (guild) { - channel.send(await getGuildInfo(guild, guild)); + if (targetGuild) { + channel.send(await getGuildInfo(targetGuild, guild)); } else { channel.send(`None of the servers I'm in matches the query \`${query}\`!`); } @@ -126,55 +127,62 @@ export default new NamedCommand({ }) }) }, + id: "user", user: new Command({ description: "Displays info about mentioned user.", async run({message, channel, guild, author, client, args}) { + const user = args[0] as User; // Transforms the User object into a GuildMember object of the current guild. - const member = await guild?.members.fetch(args[0]); - - if (!member) { - channel.send( - "No member object was found by that user! Are you sure you used this command in a server?" - ); - return; - } - - 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); - const userFlags = (await member.user.fetchFlags()).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 == 0 ? "None" : roles.length <= 10 ? roles.join(", ") : trimArray(roles).join(", ") - }` - ]); - channel.send(embed); + const member = guild?.members.resolve(args[0]); + channel.send(await getUserInfo(user, member)); } }) }); +async function getUserInfo(user: User, member: GuildMember | null | undefined): Promise { + const userFlags = (await user.fetchFlags()).toArray(); + + const embed = new MessageEmbed() + .setThumbnail(user.displayAvatarURL({dynamic: true, size: 512})) + .setColor("BLUE") + .addField("User", [ + `**❯ Username:** ${user.username}`, + `**❯ Discriminator:** ${user.discriminator}`, + `**❯ ID:** ${user.id}`, + `**❯ Flags:** ${userFlags.length ? userFlags.join(", ") : "None"}`, + `**❯ Avatar:** [Link to avatar](${user.displayAvatarURL({ + dynamic: true + })})`, + `**❯ Time Created:** ${moment(user.createdTimestamp).format("LT")} ${moment(user.createdTimestamp).format( + "LL" + )} ${moment(user.createdTimestamp).fromNow()}`, + `**❯ Status:** ${user.presence.status}`, + `**❯ Game:** ${user.presence.activities || "Not playing a game."}` + ]); + + if (member) { + 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); + + embed + .setColor(member.displayHexColor) + .addField("Member", [ + `**❯ Highest Role:** ${ + member.roles.highest.id === member.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 == 0 ? "None" : roles.length <= 10 ? roles.join(", ") : trimArray(roles).join(", ") + }` + ]); + } + + return embed; +} + async function getGuildInfo(guild: Guild, currentGuild: Guild | null) { const members = await guild.members.fetch({ withPresences: true, diff --git a/src/commands/utility/scanemotes.ts b/src/commands/utility/scanemotes.ts index 41d5115..a60d861 100644 --- a/src/commands/utility/scanemotes.ts +++ b/src/commands/utility/scanemotes.ts @@ -1,4 +1,4 @@ -import {Command, NamedCommand} from "../../core"; +import {Command, NamedCommand, CHANNEL_TYPE} from "../../core"; import {pluralise} from "../../lib"; import moment from "moment"; import {Collection, TextChannel} from "discord.js"; @@ -8,26 +8,21 @@ const lastUsedTimestamps: {[id: string]: number} = {}; export default new NamedCommand({ description: "Scans all text channels in the current guild and returns the number of times each emoji specific to the guild has been used. Has a cooldown of 24 hours per guild.", + channelType: CHANNEL_TYPE.GUILD, async run({message, channel, guild, author, member, client, args}) { - if (!guild) { - channel.send(`You must use this command on a server!`); - return; - } - // Test if the command is on cooldown. This isn't the strictest cooldown possible, because in the event that the bot crashes, the cooldown will be reset. But for all intends and purposes, it's a good enough cooldown. It's a per-server cooldown. const startTime = Date.now(); const cooldown = 86400000; // 24 hours - const lastUsedTimestamp = lastUsedTimestamps[guild.id] ?? 0; + const lastUsedTimestamp = lastUsedTimestamps[guild!.id] ?? 0; const difference = startTime - lastUsedTimestamp; const howLong = moment(startTime).to(lastUsedTimestamp + cooldown); // If it's been less than an hour since the command was last used, prevent it from executing. - if (difference < cooldown) { - channel.send( + if (difference < cooldown) + return channel.send( `This command requires a day to cooldown. You'll be able to activate this command ${howLong}.` ); - return; - } else lastUsedTimestamps[guild.id] = startTime; + else lastUsedTimestamps[guild!.id] = startTime; const stats: { [id: string]: { @@ -39,7 +34,7 @@ export default new NamedCommand({ } = {}; let totalUserEmoteUsage = 0; // IMPORTANT: You MUST check if the bot actually has access to the channel in the first place. It will get the list of all channels, but that doesn't mean it has access to every channel. Without this, it'll require admin access and throw an annoying unhelpful DiscordAPIError: Missing Access otherwise. - const allTextChannelsInCurrentGuild = guild.channels.cache.filter( + const allTextChannelsInCurrentGuild = guild!.channels.cache.filter( (channel) => channel.type === "text" && channel.viewable ) as Collection; let messagesSearched = 0; @@ -52,7 +47,7 @@ export default new NamedCommand({ // Initialize the emote stats object with every emote in the current guild. // The goal here is to cut the need to access guild.emojis.get() which'll make it faster and easier to work with. - for (let emote of guild.emojis.cache.values()) { + for (let emote of guild!.emojis.cache.values()) { // If you don't include the "a" for animated emotes, it'll not only not show up, but also cause all other emotes in the same message to not show up. The emote name is self-correcting but it's better to keep the right value since it'll be used to calculate message lengths that fit. stats[emote.id] = { name: emote.name, @@ -186,6 +181,6 @@ export default new NamedCommand({ ); } - await channel.send(lines, {split: true}); + return await channel.send(lines, {split: true}); } }); diff --git a/src/commands/utility/time.ts b/src/commands/utility/time.ts index c51552a..23250ba 100644 --- a/src/commands/utility/time.ts +++ b/src/commands/utility/time.ts @@ -374,6 +374,7 @@ export default new NamedCommand({ run: DST_NOTE_INFO }) }, + id: "user", user: new Command({ description: "See what time it is for someone else.", async run({channel, args}) {