worked on user/track

pull/17/head
TheCodedProf 3 years ago
parent 59772f8423
commit 2ec2ba615c

@ -1,5 +1,5 @@
import { LoadingEmbed } from "../../utils/defaults.js"; import { LoadingEmbed } from "../../utils/defaults.js";
import Discord, { CommandInteraction, GuildMember, Message, ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js"; import Discord, { CommandInteraction, GuildMember, Message, ActionRowBuilder, ButtonBuilder, ButtonStyle, SelectMenuOptionBuilder, APIMessageComponentEmoji, StringSelectMenuBuilder, MessageComponentInteraction, StringSelectMenuInteraction, Role } 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";
import getEmojiByName from "../../utils/getEmojiByName.js"; import getEmojiByName from "../../utils/getEmojiByName.js";
@ -35,32 +35,32 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
let managed: boolean; let managed: boolean;
let timedOut = false; let timedOut = false;
while (!timedOut) { while (!timedOut) {
const data = config.tracks[track]; const data = config.tracks[track]!;
if (data.manageableBy !== undefined) if (data.manageableBy !== undefined)
managed = data.manageableBy.some((element: string) => { managed = data.manageableBy.some((element: string) => {
return memberRoles.cache.has(element); return memberRoles.cache.has(element);
}); });
else managed = false; else managed = false;
const dropdown = new Discord.SelectMenuBuilder() const dropdown = new Discord.StringSelectMenuBuilder()
.addOptions( .addOptions(
config.tracks.map((option, index) => { config.tracks.map((option, index) => {
const hasRoleInTrack = option.track.some((element: string) => { const hasRoleInTrack = option.track.some((element: string) => {
return memberRoles.cache.has(element); return memberRoles.cache.has(element);
}); });
return new SelectMenuOption({ return new SelectMenuOptionBuilder({
default: index === track, default: index === track,
label: option.name, label: option.name,
value: index.toString(), value: index.toString(),
description: option.track.length === 0 ? "No" : addPlural(option.track.length, "role"), description: option.track.length === 0 ? "No" : addPlural(option.track.length, "role"),
emoji: client.emojis.resolve( emoji: client.emojis.resolve(
getEmojiByName("TRACKS.SINGLE." + (hasRoleInTrack ? "ACTIVE" : "INACTIVE"), "id") getEmojiByName("TRACKS.SINGLE." + (hasRoleInTrack ? "ACTIVE" : "INACTIVE"), "id")
) ) as APIMessageComponentEmoji
}); });
}) })
) )
.setCustomId("select") .setCustomId("select")
.setMaxValues(1); .setMaxValues(1);
const allowed = []; const allowed: boolean[] = [];
generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n"; generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n";
generated += generated +=
(data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n"; (data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n";
@ -72,8 +72,8 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
"\n" + "\n" +
data.track data.track
.map((role, index) => { .map((role, index) => {
const allow = const allow: boolean =
roles.get(role).position >= (interaction.member as GuildMember).roles.highest.position && roles.get(role)!.position >= (interaction.member as GuildMember).roles.highest.position &&
!managed; !managed;
allowed.push(!allow); allowed.push(!allow);
return ( return (
@ -81,9 +81,9 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
generateFromTrack(index, memberRoles.cache.has(role), data.track.length, allow) generateFromTrack(index, memberRoles.cache.has(role), data.track.length, allow)
) + ) +
" " + " " +
roles.get(role).name + roles.get(role)!.name +
" [<@&" + " [<@&" +
roles.get(role).id + roles.get(role)!.id +
">]" ">]"
); );
}) })
@ -93,27 +93,28 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
if (memberRoles.cache.has(position)) selected.push(position); if (memberRoles.cache.has(position)) selected.push(position);
} }
const conflict = data.retainPrevious ? false : selected.length > 1; const conflict = data.retainPrevious ? false : selected.length > 1;
let conflictDropdown; let conflictDropdown: StringSelectMenuBuilder[] = [];
let currentRoleIndex; let conflictDropdownOptions: SelectMenuOptionBuilder[] = [];
let currentRoleIndex: number = -1;
if (conflict) { if (conflict) {
generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${ generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${
selected.length selected.length
} roles from this track. `; } roles from this track. `;
conflictDropdown = []; conflictDropdown = [];
if (roles.get(selected[0]).position < memberRoles.highest.position || managed) { if (roles.get(selected[0]!)!.position < memberRoles.highest.position || managed) {
generated += generated +=
"In order to promote or demote this user, you must select which role the member should keep."; "In order to promote or demote this user, you must select which role the member should keep.";
selected.forEach((role) => { selected.forEach((role) => {
conflictDropdown.push( conflictDropdownOptions.push(
new SelectMenuOption({ new SelectMenuOptionBuilder({
label: roles.get(role).name, label: roles.get(role)!.name,
value: roles.get(role).id value: roles.get(role)!.id
}) })
); );
}); });
conflictDropdown = [ conflictDropdown = [
new Discord.SelectMenuBuilder() new Discord.StringSelectMenuBuilder()
.addOptions(conflictDropdown) .addOptions(conflictDropdownOptions)
.setCustomId("conflict") .setCustomId("conflict")
.setMaxValues(1) .setMaxValues(1)
.setPlaceholder("Select a role to keep") .setPlaceholder("Select a role to keep")
@ -123,7 +124,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
"You don't have permission to manage one or more of the users roles, and therefore can't select one to keep."; "You don't have permission to manage one or more of the users roles, and therefore can't select one to keep.";
} }
} else { } else {
currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0].toString()); currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0]!.toString());
} }
const m = (await interaction.editReply({ const m = (await interaction.editReply({
embeds: [ embeds: [
@ -133,12 +134,12 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
.setDescription(`${generated}`) .setDescription(`${generated}`)
.setStatus("Success") .setStatus("Success")
], ],
components: [new ActionRowBuilder().addComponents(dropdown)] components: [new ActionRowBuilder<StringSelectMenuBuilder | ButtonBuilder>().addComponents(dropdown)]
.concat( .concat(
conflict && conflictDropdown.length ? [new ActionRowBuilder().addComponents(conflictDropdown)] : [] conflict && conflictDropdown.length ? [new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(conflictDropdown)] : []
) )
.concat([ .concat([
new ActionRowBuilder().addComponents([ new ActionRowBuilder<ButtonBuilder>().addComponents([
new ButtonBuilder() new ButtonBuilder()
.setEmoji(getEmojiByName("CONTROL.UP", "id")) .setEmoji(getEmojiByName("CONTROL.UP", "id"))
.setLabel("Move up") .setLabel("Move up")
@ -164,7 +165,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
]) ])
]) ])
})) as Message; })) as Message;
let component; let component: MessageComponentInteraction;
try { try {
component = await m.awaitMessageComponent({ component = await m.awaitMessageComponent({
time: 300000, time: 300000,
@ -176,7 +177,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
} }
component.deferUpdate(); component.deferUpdate();
if (component.customId === "conflict") { if (component.customId === "conflict") {
const rolesToRemove = selected.filter((role) => role !== component.values[0]); const rolesToRemove = selected.filter((role) => role !== (component as StringSelectMenuInteraction).values[0]);
await member.roles.remove(rolesToRemove); await member.roles.remove(rolesToRemove);
} else if (component.customId === "promote") { } else if (component.customId === "promote") {
if ( if (
@ -185,43 +186,43 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
: allowed[currentRoleIndex - 1] && allowed[currentRoleIndex] : allowed[currentRoleIndex - 1] && allowed[currentRoleIndex]
) { ) {
if (currentRoleIndex === -1) { if (currentRoleIndex === -1) {
await member.roles.add(data.track[data.track.length - 1]); await member.roles.add(data.track[data.track.length - 1]!);
} else if (currentRoleIndex < data.track.length) { } else if (currentRoleIndex < data.track.length) {
if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex]); if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex]!);
await member.roles.add(data.track[currentRoleIndex - 1]); await member.roles.add(data.track[currentRoleIndex - 1]!);
} }
} }
} else if (component.customId === "demote") { } else if (component.customId === "demote") {
if (allowed[currentRoleIndex]) { if (allowed[currentRoleIndex]) {
if (currentRoleIndex === data.track.length - 1) { if (currentRoleIndex === data.track.length - 1) {
if (data.nullable) await member.roles.remove(data.track[currentRoleIndex]); if (data.nullable) await member.roles.remove(data.track[currentRoleIndex]!);
} else if (currentRoleIndex > -1) { } else if (currentRoleIndex > -1) {
await member.roles.remove(data.track[currentRoleIndex]); await member.roles.remove(data.track[currentRoleIndex]!);
await member.roles.add(data.track[currentRoleIndex + 1]); await member.roles.add(data.track[currentRoleIndex + 1]!);
} }
} }
} else if (component.customId === "select") { } else if (component.customId === "select") {
track = component.values[0]; track = (component as StringSelectMenuInteraction).values[0];
} }
} }
}; };
const check = async (interaction: CommandInteraction) => { const check = async (interaction: CommandInteraction) => {
const tracks = (await client.database.guilds.read(interaction.guild.id)).tracks; const tracks = (await client.database.guilds.read(interaction.guild!.id)).tracks;
if (tracks.length === 0) throw new Error("This server does not have any tracks"); if (tracks.length === 0) throw new Error("This server does not have any tracks");
const member = interaction.member as GuildMember; const member = interaction.member as GuildMember;
// Allow the owner to promote anyone // Allow the owner to promote anyone
if (member.id === interaction.guild.ownerId) return true; if (member.id === interaction.guild!.ownerId) return true;
// Check if the user can manage any of the tracks // Check if the user can manage any of the tracks
let managed = false; let managed = false;
for (const element of tracks) { for (const element of tracks) {
if (!element.track.manageableBy) continue; if (!element.track.manageableBy) continue;
if (!element.track.manageableBy.some((role) => member.roles.cache.has(role))) continue; if (!element.track.manageableBy.some((role: Role) => member.roles.cache.has(role.id))) continue;
managed = true; managed = true;
break; break;
} }
// Check if the user has manage_roles permission // Check if the user has manage_roles permission
if (!managed && !member.permissions.has("MANAGE_ROLES")) if (!managed && !member.permissions.has("ManageRoles"))
throw new Error("You do not have the *Manage Roles* permission"); throw new Error("You do not have the *Manage Roles* permission");
// Allow track // Allow track
return true; return true;

@ -1,5 +1,4 @@
import fs from "fs"; import fs from "fs";
// @ts-expect-error
import * as readLine from "node:readline/promises"; import * as readLine from "node:readline/promises";
const defaultDict: Record<string, string | string[] | boolean> = { const defaultDict: Record<string, string | string[] | boolean> = {

Loading…
Cancel
Save