Almost working about command

pull/17/head
PineaFan 3 years ago
parent 65801cf0c6
commit c729e76ee0
No known key found for this signature in database
GPG Key ID: 0AEF25BAA0FB1C74

@ -2,12 +2,13 @@ import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { import Discord, {
CommandInteraction, CommandInteraction,
GuildMember, GuildMember,
Message,
ActionRowBuilder, ActionRowBuilder,
Component,
ButtonBuilder, ButtonBuilder,
MessageComponentInteraction, MessageComponentInteraction,
ButtonStyle ButtonStyle,
PermissionResolvable,
APISelectMenuOption,
StringSelectMenuBuilder
} from "discord.js"; } from "discord.js";
import type { SlashCommandSubcommandBuilder } from "@discordjs/builders"; import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js"; import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
@ -25,11 +26,12 @@ const command = (builder: SlashCommandSubcommandBuilder) =>
); );
class Embed { class Embed {
embed: Discord.EmbedBuilder; embed: EmojiEmbed = new EmojiEmbed();
title: string; title: string = "";
description = ""; description = "";
pageId = 0; pageId = 0;
setEmbed(embed: Discord.EmbedBuilder) {
setEmbed(embed: EmojiEmbed) {
this.embed = embed; this.embed = embed;
return this; return this;
} }
@ -48,9 +50,20 @@ class Embed {
} }
const callback = async (interaction: CommandInteraction): Promise<void> => { const callback = async (interaction: CommandInteraction): Promise<void> => {
if (!interaction.guild) return; const guild = interaction.guild!;
const { renderUser, renderDelta } = client.logger;
const member = (interaction.options.getMember("user") ?? interaction.member) as Discord.GuildMember; const member = (interaction.options.getMember("user") ?? interaction.member) as Discord.GuildMember;
await userAbout(guild, member, interaction);
}
async function userAbout(guild: Discord.Guild, member: Discord.GuildMember, interaction: Discord.CommandInteraction | Discord.ContextMenuCommandInteraction) {
await member.user.fetch()
await member.fetch()
await interaction.reply({
embeds: LoadingEmbed,
fetchReply: true,
ephemeral: true
});
const { renderUser, renderDelta } = client.logger;
const flags: string[] = []; const flags: string[] = [];
if ( if (
[ [
@ -70,33 +83,32 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
) { ) {
flags.push("CLICKSDEVELOPER"); flags.push("CLICKSDEVELOPER");
} }
member.user.flags.toArray().map((flag) => { if (member.user.flags) { member.user.flags.toArray().map((flag) => { flags.push(flag.toString()); }); }
flags.push(flag.toString()); if (member.user.bot) { flags.push("BOT"); }
});
if (member.user.bot) {
flags.push("BOT");
}
// Check if they are boosting the server // Check if they are boosting the server
if (member.premiumSince) { if (member.premiumSince) { flags.push("BOOSTER"); }
flags.push("BOOSTER"); const nameReplacements: Record<string, string> = {
}
const nameReplacements = {
NUCLEUSDEVELOPER: "**Nucleus Developer**", NUCLEUSDEVELOPER: "**Nucleus Developer**",
CLICKSDEVELOPER: "Clicks Developer", CLICKSDEVELOPER: "Clicks Developer",
HOUSE_BRAVERY: "Hypesquad Bravery",
HOUSE_BRILLIANCE: "Hypesquad Brilliance",
HOUSE_BALANCE: "Hypesquad Balance",
HYPESQUAD_EVENTS: "Hypesquad Events",
EARLY_SUPPORTER: "Early Supporter",
BUGHUNTER_LEVEL_1: "Bug Hunter Level 1",
BUGHUNTER_LEVEL_2: "Bug Hunter Level 2",
PARTNERED_SERVER_OWNER: "Partnered Server Owner",
DISCORD_EMPLOYEE: "Discord Staff",
EARLY_VERIFIED_BOT_DEVELOPER: "Verified Bot Developer",
BOT: "Bot", BOT: "Bot",
BOOSTER: "Server Booster" BOOSTER: "Server Booster",
HypeSquadOnlineHouse1: "Hypesquad Bravery",
HypeSquadOnlineHouse2: "Hypesquad Brilliance",
HypeSquadOnlineHouse3: "Hypesquad Balance",
Hypesquad: "Hypesquad Events",
PremiumEarlySupporter: "Early Supporter",
BugHunterLevel1: "Bug Hunter Level 1",
BugHunterLevel2: "Bug Hunter Level 2",
Partner: "Partnered Server Owner",
Staff: "Discord Staff",
VerifiedDeveloper: "Verified Bot Developer"
// ActiveDeveloper
// CertifiedModerator
// Quarantined https://discord-api-types.dev/api/discord-api-types-v10/enum/UserFlags#Quarantined
// Spammer https://discord-api-types.dev/api/discord-api-types-v10/enum/UserFlags#Spammer
// VerifiedBot
}; };
const members = await interaction.guild.members.fetch(); const members = await guild.members.fetch();
const membersArray = [...members.values()]; const membersArray = [...members.values()];
membersArray.sort((a, b) => { membersArray.sort((a, b) => {
if (a.joinedTimestamp === null) return 1; if (a.joinedTimestamp === null) return 1;
@ -105,7 +117,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
}); });
const joinPos = membersArray.findIndex((m) => m.id === member.user.id); const joinPos = membersArray.findIndex((m) => m.id === member.user.id);
const roles = member.roles.cache.filter((r) => r.id !== interaction.guild!.id).sort(); const roles = member.roles.cache.filter((r) => r.id !== guild.id).sort();
let s = ""; let s = "";
let count = 0; let count = 0;
let ended = false; let ended = false;
@ -122,22 +134,22 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
if (s.length > 0 && !ended) s = s.slice(0, -2); if (s.length > 0 && !ended) s = s.slice(0, -2);
let perms = ""; let perms = "";
const permsArray = { const permsArray: Record<string, string> = {
ADMINISTRATOR: "Administrator", Administrator: "Administrator",
MANAGE_GUILD: "Manage Server", ManageGuild: "Manage Server",
MANAGE_ROLES: "Manage Roles", ManageRoles: "Manage Roles",
MANAGE_CHANNELS: "Manage Channels", ManageChannels: "Manage Channels",
KICK_MEMBERS: "Kick Members", KickMembers: "Kick Members",
BAN_MEMBERS: "Ban Members", BanMembers: "Ban Members",
MODERATE_MEMBERS: "Moderate Members", ModerateMembers: "Moderate Members",
MANAGE_NICKNAMES: "Manage Nicknames", ManageNicknames: "Manage Nicknames",
MANAGE_WEBHOOKS: "Manage Webhooks", ManageWebhooks: "Manage Webhooks",
MANAGE_MESSAGES: "Manage Messages", ManageMessages: "Manage Messages",
VIEW_AUDIT_LOG: "View Audit Log", ViewAuditLog: "View Audit Log",
MENTION_EVERYONE: "Mention Everyone" MentionEveryone: "Mention Everyone"
}; };
Object.keys(permsArray).map((perm) => { Object.keys(permsArray).map((perm) => {
const hasPerm = member.permissions.has(perm as Discord.PermissionString); const hasPerm = member.permissions.has(perm as PermissionResolvable);
perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`; perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`;
}); });
@ -151,28 +163,26 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
.setStatus("Success") .setStatus("Success")
.setEmoji("MEMBER.JOIN") .setEmoji("MEMBER.JOIN")
.setDescription( .setDescription(
flags flags.map((flag) => {
.map((flag) => { if (nameReplacements[flag]) {
if (nameReplacements[flag]) { const emoji = getEmojiByName(`BADGES.${flag}`)
return getEmojiByName(`BADGES.${flag}`) + " " + nameReplacements[flag]; if (emoji) return (emoji + " " + nameReplacements[flag] + "\n");
} else return nameReplacements[flag] + "\n";
}) }
.join("\n") + }).join("") + "\n" +
"\n\n" + generateKeyValueList({
generateKeyValueList({ member: renderUser(member.user),
member: renderUser(member.user), nickname: member.nickname ?? "*None set*",
nickname: member.nickname ?? "*None set*", id: `\`${member.id}\``,
id: `\`${member.id}\``, "joined the server": renderDelta(member.joinedTimestamp!),
"joined the server": renderDelta(member.joinedTimestamp), "joined discord": renderDelta(member.user.createdTimestamp),
"joined discord": renderDelta(member.user.createdTimestamp), "boost status": member.premiumSince
"boost status": member.premiumSince ? `Started boosting ${renderDelta(member.premiumSinceTimestamp!)}`
? `Started boosting ${renderDelta(member.premiumSinceTimestamp)}` : "*Not boosting*",
: "*Not boosting*", "join position": `${joinPos + 1}`
"join position": `${joinPos + 1}` })
})
) )
.setThumbnail(member.user.displayAvatarURL({ dynamic: true })) .setThumbnail(member.user.displayAvatarURL())
.setImage((await member.user.fetch()).bannerURL({ format: "gif" }))
) )
.setTitle("General") .setTitle("General")
.setDescription("General information about the user") .setDescription("General information about the user")
@ -187,13 +197,12 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
generateKeyValueList({ generateKeyValueList({
member: renderUser(member.user), member: renderUser(member.user),
id: `\`${member.id}\``, id: `\`${member.id}\``,
roles: `${member.roles.cache.size - 1}` roles: `${member.roles.cache.size - 1}` // FIXME
}) + }) +
"\n" + "\n" +
(s.length > 0 ? s : "*None*") + (s.length > 0 ? s : "*None*") +
"\n" "\n"
) )
.setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
) )
.setTitle("Roles") .setTitle("Roles")
.setDescription("Roles the user has") .setDescription("Roles the user has")
@ -212,26 +221,24 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
"\n" + "\n" +
perms perms
) )
.setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
) )
.setTitle("Key Permissions") .setTitle("Key Permissions")
.setDescription("Key permissions the user has") .setDescription("Key permissions the user has")
.setPageId(2) .setPageId(2)
]; ];
const m = (await interaction.reply({ if (member.user.bannerURL() ) { embeds[0]!.embed.setImage(member.user.bannerURL()!); }
embeds: LoadingEmbed,
fetchReply: true,
ephemeral: true
})) as Message;
let page = 0; let page = 0;
let timedOut = false; let timedOut = false;
for (const embed of embeds) {
embed.embed.setDescription(embed.embed.description + "\n" + createPageIndicator(embeds.length, embed.pageId));
}
while (!timedOut) { while (!timedOut) {
const em = new Discord.EmbedBuilder(embeds[page].embed); const em = embeds[page]!.embed;
em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page));
let selectPane = []; let selectPane: ActionRowBuilder<ButtonBuilder | StringSelectMenuBuilder>[] = [];
if (selectPaneOpen) { if (selectPaneOpen) {
const options: MessageSelectOptionData[] = []; const options: APISelectMenuOption[] = [];
embeds.forEach((embed) => { embeds.forEach((embed) => {
options.push({ options.push({
label: embed.title, label: embed.title,
@ -240,19 +247,19 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
}); });
}); });
selectPane = [ selectPane = [
new ActionRowBuilder().addComponents([ new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(
new Discord.SelectMenuBuilder() new Discord.StringSelectMenuBuilder()
.addOptions(options) .addOptions(options)
.setCustomId("page") .setCustomId("page")
.setMaxValues(1) .setMaxValues(1)
.setPlaceholder("Choose a page...") .setPlaceholder("Choose a page...")
]) )
]; ];
} }
await interaction.editReply({ const m = await interaction.editReply({
embeds: [em], embeds: [em],
components: selectPane.concat([ components: selectPane.concat([
new ActionRowBuilder().addComponents([ new ActionRowBuilder<ButtonBuilder>().addComponents([
new ButtonBuilder() new ButtonBuilder()
.setEmoji(getEmojiByName("CONTROL.LEFT", "id")) .setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle(ButtonStyle.Secondary) .setStyle(ButtonStyle.Secondary)
@ -279,21 +286,21 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
continue; continue;
} }
i.deferUpdate(); i.deferUpdate();
if ((i.component as Component).customId === "left") { if (i.customId === "left") {
if (page > 0) page--; if (page > 0) page--;
selectPaneOpen = false; selectPaneOpen = false;
} else if ((i.component as Component).customId === "right") { } else if (i.customId === "right") {
if (page < embeds.length - 1) page++; if (page < embeds.length - 1) page++;
selectPaneOpen = false; selectPaneOpen = false;
} else if ((i.component as Component).customId === "select") { } else if (i.customId === "select") {
selectPaneOpen = !selectPaneOpen; selectPaneOpen = !selectPaneOpen;
} else if ((i.component as Component).customId === "page") { } else if (i.customId === "page" && i.isStringSelectMenu()) {
page = parseInt((i as SelectMenuInteraction).values[0]); page = parseInt(i.values[0]!);
selectPaneOpen = false; selectPaneOpen = false;
} }
} }
const em = new Discord.EmbedBuilder(embeds[page].embed); const em = embeds[page]!.embed;
em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page) + " | Message closed"); em.setDescription(em.description + " | Message closed");
await interaction.editReply({ await interaction.editReply({
embeds: [em], embeds: [em],
components: [] components: []
@ -307,3 +314,4 @@ const check = () => {
export { command }; export { command };
export { callback }; export { callback };
export { check }; export { check };
export { userAbout };

@ -179,18 +179,18 @@
"BADGES": { "BADGES": {
"NUCLEUSDEVELOPER": "957722888360853595", "NUCLEUSDEVELOPER": "957722888360853595",
"CLICKSDEVELOPER": "957722888314683462", "CLICKSDEVELOPER": "957722888314683462",
"HOUSE_BRAVERY": "775783765930016789",
"HOUSE_BRILLIANCE": "775783766152577095",
"HOUSE_BALANCE": "775783766303440937",
"HYPESQUAD_EVENTS": "775783766194126908",
"EARLY_SUPPORTER": "775783766055452693",
"BUGHUNTER_LEVEL_1": "775783766252847154",
"BUGHUNTER_LEVEL_2": "775783766130950234",
"PARTNERED_SERVER_OWNER": "775783766178005033",
"DISCORD_EMPLOYEE": "775783766383788082",
"EARLY_VERIFIED_BOT_DEVELOPER": "775783766425600060",
"BOT": "776375959108190239", "BOT": "776375959108190239",
"BOOSTER": "775783766131605545" "BOOSTER": "775783766131605545",
"HypeSquadOnlineHouse1": "775783765930016789",
"HypeSquadOnlineHouse2": "775783766152577095",
"HypeSquadOnlineHouse3": "775783766303440937",
"Hypesquad": "775783766194126908",
"PremiumEarlySupporter": "775783766055452693",
"BugHunterLevel1": "775783766252847154",
"BugHunterLevel2": "775783766130950234",
"Partner": "775783766178005033",
"Staff": "775783766383788082",
"VerifiedDeveloper": "775783766425600060"
}, },
"VOICE": { "VOICE": {
"CONNECT": "784785219391193138", "CONNECT": "784785219391193138",

@ -119,10 +119,10 @@ async function registerContextMenus() {
client.commands["contextCommands/user/" + context.command.name] = context; client.commands["contextCommands/user/" + context.command.name] = context;
console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.green}Loaded ${file.name} [${i} / ${userFiles.length}]${colours.none}`) console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.green}Loaded ${file.name} [${i} / ${totalFiles}]${colours.none}`)
} catch (e) { } catch (e) {
errors++; errors++;
console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.red}Failed to load ${file.name} [${i} / ${userFiles.length}]${colours.none}`) console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.red}Failed to load ${file.name} [${i} / ${totalFiles}]${colours.none}`)
} }
} }
@ -187,7 +187,7 @@ export default async function register() {
} }
await registerCommandHandler(); await registerCommandHandler();
await registerEvents(); await registerEvents();
console.log(`${colours.green}Registered commands and events${colours.none}`) console.log(`${colours.green}Registered commands, events and context menus${colours.none}`)
console.log( console.log(
(config.enableDevelopment ? `${colours.purple}Bot started in Development mode` : (config.enableDevelopment ? `${colours.purple}Bot started in Development mode` :
`${colours.blue}Bot started in Production mode`) + colours.none) `${colours.blue}Bot started in Production mode`) + colours.none)

@ -10,6 +10,7 @@ const colors = {
class EmojiEmbed extends EmbedBuilder { class EmojiEmbed extends EmbedBuilder {
_title = ""; _title = "";
_emoji: string | null = null; _emoji: string | null = null;
description = "";
_generateTitle() { _generateTitle() {
if (this._emoji) { return `${getEmojiByName(this._emoji)} ${this._title}`; } if (this._emoji) { return `${getEmojiByName(this._emoji)} ${this._title}`; }
@ -21,6 +22,11 @@ class EmojiEmbed extends EmbedBuilder {
super.setTitle(this._generateTitle()); super.setTitle(this._generateTitle());
return this; return this;
} }
override setDescription(description: string) {
this.description = description;
super.setDescription(description);
return this;
}
setEmoji(emoji: string) { setEmoji(emoji: string) {
this._emoji = emoji; this._emoji = emoji;
super.setTitle(this._generateTitle()); super.setTitle(this._generateTitle());

Loading…
Cancel
Save