More errors fixed

pull/17/head
PineaFan 3 years ago
parent 9dac7afe3e
commit 5bea7e1286
No known key found for this signature in database
GPG Key ID: 0AEF25BAA0FB1C74

@ -12,9 +12,8 @@ import Discord, {
ButtonStyle, ButtonStyle,
StringSelectMenuInteraction, StringSelectMenuInteraction,
TextInputStyle, TextInputStyle,
APIMessageComponentEmoji
} from "discord.js"; } from "discord.js";
import { SlashCommandSubcommandBuilder, StringSelectMenuOptionBuilder } 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";
import client from "../../utils/client.js"; import client from "../../utils/client.js";
@ -158,26 +157,19 @@ async function showHistory(member: Discord.GuildMember, interaction: CommandInte
let components: (ActionRowBuilder<Discord.StringSelectMenuBuilder> | ActionRowBuilder<ButtonBuilder>)[] = [] let components: (ActionRowBuilder<Discord.StringSelectMenuBuilder> | ActionRowBuilder<ButtonBuilder>)[] = []
if (openFilterPane) components = components.concat([ if (openFilterPane) components = components.concat([
new ActionRowBuilder<Discord.StringSelectMenuBuilder>().addComponents( new ActionRowBuilder<Discord.StringSelectMenuBuilder>().addComponents(
new Discord.StringSelectMenuBuilder().setOptions( new Discord.StringSelectMenuBuilder()
// ...Object.entries(types).map(([key, value]) => new StringSelectMenuOptionBuilder() .setMinValues(1)
// .setLabel(value.text) .setMaxValues(Object.keys(types).length)
// .setValue(key) .setCustomId("filter")
// .setDefault(filteredTypes.includes(key)) .setPlaceholder("Select events to show")
// .setEmoji(client.emojis.resolve(getEmojiByName(value.emoji, "id"))! as APIMessageComponentEmoji) .setOptions(...Object.entries(types).map(([key, value]) => new Discord.StringSelectMenuOptionBuilder()
// ) .setLabel(value.text)
...Object.entries(types).map(([key, value]) => ({ .setValue(key)
label: value.text, .setDefault(filteredTypes.includes(key))
value: key, // @ts-expect-error
default: filteredTypes.includes(key), .setEmoji(getEmojiByName(value.emoji, "id")) // FIXME: This gives a type error but is valid
emoji: client.emojis.resolve(getEmojiByName(value.emoji, "id"))! as APIMessageComponentEmoji )))
})) ]);
)
.setMinValues(1)
.setMaxValues(Object.keys(types).length)
.setCustomId("filter")
.setPlaceholder("Select events to show")
)
])
components = components.concat([new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([ components = components.concat([new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([
new ButtonBuilder() new ButtonBuilder()
.setCustomId("prevYear") .setCustomId("prevYear")
@ -188,7 +180,10 @@ async function showHistory(member: Discord.GuildMember, interaction: CommandInte
.setCustomId("prevPage") .setCustomId("prevPage")
.setLabel("Previous page") .setLabel("Previous page")
.setStyle(ButtonStyle.Primary), .setStyle(ButtonStyle.Primary),
new ButtonBuilder().setCustomId("today").setLabel("Today").setStyle(ButtonStyle.Primary), new ButtonBuilder()
.setCustomId("today")
.setLabel("Today")
.setStyle(ButtonStyle.Primary),
new ButtonBuilder() new ButtonBuilder()
.setCustomId("nextPage") .setCustomId("nextPage")
.setLabel("Next page") .setLabel("Next page")

@ -1,5 +1,5 @@
import { LoadingEmbed } from "./../../utils/defaultEmbeds.js"; import { LinkWarningFooter, LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, GuildMember, Message, ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js"; import Discord, { CommandInteraction, GuildMember, ActionRowBuilder, ButtonBuilder, ButtonStyle } 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";
@ -48,15 +48,16 @@ const command = (builder: SlashCommandSubcommandBuilder) =>
.setRequired(false) .setRequired(false)
); );
const callback = async (interaction: CommandInteraction): Promise<unknown> => { const callback = async (interaction: CommandInteraction): Promise<unknown> => {
if (!interaction.guild) return; if (!interaction.guild) return;
const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger; const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger;
const user = interaction.options.getMember("user") as GuildMember; const member = interaction.options.getMember("user") as GuildMember;
const time = { const time: {days: number, hours: number, minutes: number, seconds: number} = {
days: interaction.options.getInteger("days") ?? 0, days: (interaction.options.get("days")?.value as number | null) ?? 0,
hours: interaction.options.getInteger("hours") ?? 0, hours: (interaction.options.get("hours")?.value as number | null) ?? 0,
minutes: interaction.options.getInteger("minutes") ?? 0, minutes: (interaction.options.get("minutes")?.value as number | null) ?? 0,
seconds: interaction.options.getInteger("seconds") ?? 0 seconds: (interaction.options.get("seconds")?.value as number | null) ?? 0
}; };
const config = await client.database.guilds.read(interaction.guild.id); const config = await client.database.guilds.read(interaction.guild.id);
let serverSettingsDescription = config.moderation.mute.timeout ? "given a timeout" : ""; let serverSettingsDescription = config.moderation.mute.timeout ? "given a timeout" : "";
@ -66,28 +67,28 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
let muteTime = time.days * 24 * 60 * 60 + time.hours * 60 * 60 + time.minutes * 60 + time.seconds; let muteTime = time.days * 24 * 60 * 60 + time.hours * 60 * 60 + time.minutes * 60 + time.seconds;
if (muteTime === 0) { if (muteTime === 0) {
const m = (await interaction.reply({ const m = await interaction.reply({
embeds: [ embeds: [
new EmojiEmbed() new EmojiEmbed()
.setEmoji("PUNISH.MUTE.GREEN") .setEmoji("PUNISH.MUTE.GREEN")
.setTitle("Mute") .setTitle("Mute")
.setDescription("How long should the user be muted") .setDescription("How long should the user be muted for?")
.setStatus("Success") .setStatus("Success")
], ],
components: [ components: [
new ActionRowBuilder().addComponents([ new ActionRowBuilder<ButtonBuilder>().addComponents([
new Discord.ButtonBuilder().setCustomId("1m").setLabel("1 Minute").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("1m").setLabel("1 Minute").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("10m").setLabel("10 Minutes").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("10m").setLabel("10 Minutes").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("30m").setLabel("30 Minutes").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("30m").setLabel("30 Minutes").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("1h").setLabel("1 Hour").setStyle(ButtonStyle.Secondary) new Discord.ButtonBuilder().setCustomId("1h").setLabel("1 Hour").setStyle(ButtonStyle.Secondary)
]), ]),
new ActionRowBuilder().addComponents([ new ActionRowBuilder<ButtonBuilder>().addComponents([
new Discord.ButtonBuilder().setCustomId("6h").setLabel("6 Hours").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("6h").setLabel("6 Hours").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("12h").setLabel("12 Hours").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("12h").setLabel("12 Hours").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("1d").setLabel("1 Day").setStyle(ButtonStyle.Secondary), new Discord.ButtonBuilder().setCustomId("1d").setLabel("1 Day").setStyle(ButtonStyle.Secondary),
new Discord.ButtonBuilder().setCustomId("1w").setLabel("1 Week").setStyle(ButtonStyle.Secondary) new Discord.ButtonBuilder().setCustomId("1w").setLabel("1 Week").setStyle(ButtonStyle.Secondary)
]), ]),
new ActionRowBuilder().addComponents([ new ActionRowBuilder<ButtonBuilder>().addComponents([
new Discord.ButtonBuilder() new Discord.ButtonBuilder()
.setCustomId("cancel") .setCustomId("cancel")
.setLabel("Cancel") .setLabel("Cancel")
@ -97,7 +98,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
], ],
ephemeral: true, ephemeral: true,
fetchReply: true fetchReply: true
})) as Message; });
let component; let component;
try { try {
component = await m.awaitMessageComponent({ component = await m.awaitMessageComponent({
@ -172,7 +173,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
.setTitle("Mute") .setTitle("Mute")
.setDescription( .setDescription(
keyValueList({ keyValueList({
user: renderUser(user.user), user: renderUser(member.user),
time: `${humanizeDuration(muteTime * 1000, { time: `${humanizeDuration(muteTime * 1000, {
round: true round: true
})}`, })}`,
@ -180,17 +181,15 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
}) + }) +
"The user will be " + "The user will be " +
serverSettingsDescription + serverSettingsDescription +
"\n" + "\n\n" +
`The user **will${notify ? "" : " not"}** be notified\n\n` + `Are you sure you want to mute <@!${member.id}>?`
`Are you sure you want to mute <@!${user.id}>?`
) )
.setColor("Danger") .setColor("Danger")
.addCustomBoolean( .addCustomBoolean(
"appeal", "appeal",
"Create appeal ticket", "Create appeal ticket",
!(await areTicketsEnabled(interaction.guild.id)), !(await areTicketsEnabled(interaction.guild.id)),
async () => async () => await create(interaction.guild!, interaction.options.getUser("user")!, interaction.user, reason),
await create(interaction.guild, interaction.options.getUser("user")!, interaction.user, reason),
"An appeal ticket will be created when Confirm is clicked", "An appeal ticket will be created when Confirm is clicked",
null, null,
"CONTROL.TICKET", "CONTROL.TICKET",
@ -200,8 +199,8 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
"notify", "notify",
"Notify user", "Notify user",
false, false,
undefined,
null, null,
"The user will be sent a DM",
null, null,
"ICONS.NOTIFY." + (notify ? "ON" : "OFF"), "ICONS.NOTIFY." + (notify ? "ON" : "OFF"),
notify notify
@ -210,163 +209,172 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
.send(true); .send(true);
reason = reason ?? ""; reason = reason ?? "";
if (confirmation.cancelled) timedOut = true; if (confirmation.cancelled) timedOut = true;
if (confirmation.success) success = true; else if (confirmation.success) success = true;
if (confirmation.newReason) reason = confirmation.newReason; else if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) { else if (confirmation.components) {
notify = confirmation.components["notify"]!.active; notify = confirmation.components["notify"]!.active;
createAppealTicket = confirmation.components["appeal"]!.active; createAppealTicket = confirmation.components["appeal"]!.active;
} }
} while (!timedOut && !success) } while (!timedOut && !success)
if (timedOut) return; if (timedOut) return;
let dmd = false; if (!confirmation.success) {
let dm; await interaction.editReply({
if (confirmation.success) { embeds: [
try { new EmojiEmbed()
if (notify) { .setEmoji("PUNISH.BAN.GREEN")
dm = await user.send({ .setTitle("Softban")
embeds: [ .setDescription("No changes were made")
new EmojiEmbed() .setStatus("Success")
.setEmoji("PUNISH.MUTE.RED") ],
.setTitle("Muted") components: []
.setDescription( });
`You have been muted in ${interaction.guild.name}` + return;
(reason }
? ` for:\n> ${reason}` const status: {timeout: boolean | null, role: boolean | null, dm: boolean | null} = {timeout: null, role: null, dm: null};
: ".\n\n" + let dmMessage;
`You will be unmuted at: <t:${ try {
Math.round(new Date().getTime() / 1000) + muteTime if (notify) {
}:D> at <t:${Math.round(new Date().getTime() / 1000) + muteTime}:T> (<t:${ const messageData: {
Math.round(new Date().getTime() / 1000) + muteTime embeds: EmojiEmbed[];
}:R>)`) + components: ActionRowBuilder<ButtonBuilder>[];
(confirmation.components!["appeal"]!.response } = {
? `You can appeal this here: <#${confirmation.components!["appeal"]!.response}>` embeds: [
: "") new EmojiEmbed()
) .setEmoji("PUNISH.MUTE.RED")
.setStatus("Danger") .setTitle("Muted")
], .setDescription(
components: [ `You have been muted in ${interaction.guild.name}` +
new ActionRowBuilder().addComponents( (reason ? ` for:\n> ${reason}` : ".\n*No reason was provided*") + "\n\n" +
config.moderation.mute.text `You will be unmuted at: <t:${Math.round(new Date().getTime() / 1000) + muteTime}:D> at ` +
? [ `<t:${Math.round(new Date().getTime() / 1000) + muteTime}:T> (<t:${Math.round(new Date().getTime() / 1000) + muteTime
new ButtonBuilder() }:R>)` + "\n\n" +
.setStyle(ButtonStyle.Link) (createAppealTicket
.setLabel(config.moderation.mute.text) ? `You can appeal this in the ticket created in <#${confirmation.components!["appeal"]!.response}>`
.setURL(config.moderation.mute.link) : "")
]
: []
) )
] .setStatus("Danger")
}); ],
dmd = true; components: []
}
} catch {
dmd = false;
}
const member = user;
let errors = 0;
try {
if (config.moderation.mute.timeout) {
await member.timeout(muteTime * 1000, reason || "*No reason provided*");
if (config.moderation.mute.role !== null) {
await member.roles.add(config.moderation.mute.role);
await client.database.eventScheduler.schedule("naturalUnmute", new Date().getTime() + muteTime * 1000, {
guild: interaction.guild.id,
user: user.id,
expires: new Date().getTime() + muteTime * 1000
});
}
} }
} catch { if (config.moderation.mute.text && config.moderation.mute.link) {
errors++; messageData.embeds[0]!.setFooter(LinkWarningFooter);
messageData.components.push(new ActionRowBuilder<Discord.ButtonBuilder>()
.addComponents(new ButtonBuilder()
.setStyle(ButtonStyle.Link)
.setLabel(config.moderation.mute.text)
.setURL(config.moderation.mute.link)
)
)
};
dmMessage = await member.send(messageData);
status.dm = true;
} }
try { } catch {
status.dm = false;
}
try {
if (config.moderation.mute.timeout) {
await member.timeout(muteTime * 1000, reason || "*No reason provided*");
if (config.moderation.mute.role !== null) { if (config.moderation.mute.role !== null) {
await member.roles.add(config.moderation.mute.role); await member.roles.add(config.moderation.mute.role);
await client.database.eventScheduler.schedule("unmuteRole", new Date().getTime() + muteTime * 1000, { await client.database.eventScheduler.schedule("naturalUnmute", (new Date().getTime() + muteTime * 1000).toString(), {
guild: interaction.guild.id, guild: interaction.guild.id,
user: user.id, user: member.id,
role: config.moderation.mute.role expires: new Date().getTime() + muteTime * 1000
}); });
} }
} catch (e) { } else {
console.log(e); status.timeout = true;
errors++;
} }
if (errors === 2) { } catch {
await interaction.editReply({ status.timeout = false;
embeds: [ }
new EmojiEmbed() try {
.setEmoji("PUNISH.MUTE.RED") if (config.moderation.mute.role !== null) {
.setTitle("Mute") await member.roles.add(config.moderation.mute.role);
.setDescription("Something went wrong and the user was not muted") await client.database.eventScheduler.schedule("unmuteRole", (new Date().getTime() + muteTime * 1000).toString(), {
.setStatus("Danger") guild: interaction.guild.id,
], user: member.id,
components: [] role: config.moderation.mute.role
}); // TODO: make this clearer });
if (dmd && dm) await dm.delete(); } else {
return; status.role = true;
} }
await client.database.history.create("mute", interaction.guild.id, member.user, interaction.user, reason); } catch {
const failed = !dmd && notify; status.role = false;
}
const countTrue = (items: (boolean | null)[]) => items.filter(item => item === true).length;
const requiredPunishments = countTrue([config.moderation.mute.timeout, config.moderation.mute.role !== null]);
const actualPunishments = countTrue([status.timeout, status.role]);
await client.database.history.create("mute", interaction.guild.id, member.user, interaction.user, reason);
if (requiredPunishments !== actualPunishments) {
const messages = [];
if (config.moderation.mute.timeout) messages.push(`The member was ${status.timeout ? "" : "not "}timed out`);
if (config.moderation.mute.role !== null) messages.push(`The member was ${status.role ? "" : "not "}given the mute role`);
messages.push(`The member was not sent a DM`);
if (dmMessage && actualPunishments === 0) await dmMessage.delete();
await interaction.editReply({ await interaction.editReply({
embeds: [ embeds: [
new EmojiEmbed() new EmojiEmbed()
.setEmoji(`PUNISH.MUTE.${failed ? "YELLOW" : "GREEN"}`) .setEmoji("PUNISH.MUTE." + (actualPunishments > 0 ? "YELLOW" : "RED"))
.setTitle("Mute") .setTitle("Mute")
.setDescription( .setDescription(
"The member was muted" + "Mute " + (actualPunishments > 0 ? "partially" : "failed") + ":\n" +
(failed ? ", but could not be notified" : "") + messages.map(message => `> ${message}`).join("\n")
(confirmation.components!["appeal"]!.response
? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
: "")
) )
.setStatus(failed ? "Warning" : "Success") .setStatus(actualPunishments > 0 ? "Warning" : "Danger")
],
components: []
});
const data = {
meta: {
type: "memberMute",
displayName: "Member Muted",
calculateType: "guildMemberPunish",
color: NucleusColors.yellow,
emoji: "PUNISH.WARN.YELLOW",
timestamp: new Date().getTime()
},
list: {
memberId: entry(member.user.id, `\`${member.user.id}\``),
name: entry(member.user.id, renderUser(member.user)),
mutedUntil: entry(
new Date().getTime() + muteTime * 1000,
renderDelta(new Date().getTime() + muteTime * 1000)
),
muted: entry(new Date().getTime(), renderDelta(new Date().getTime() - 1000)),
mutedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user)),
reason: entry(reason, reason ? reason : "*No reason provided*")
},
hidden: {
guild: interaction.guild.id
}
};
log(data);
} else {
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setEmoji("PUNISH.BAN.GREEN")
.setTitle("Softban")
.setDescription("No changes were made")
.setStatus("Success")
], ],
components: [] components: []
}); });
} }
const data = {
meta: {
type: "memberMute",
displayName: "Member Muted",
calculateType: "guildMemberPunish",
color: NucleusColors.yellow,
emoji: "PUNISH.WARN.YELLOW",
timestamp: new Date().getTime()
},
list: {
memberId: entry(member.user.id, `\`${member.user.id}\``),
name: entry(member.user.id, renderUser(member.user)),
mutedUntil: entry(
(new Date().getTime() + muteTime * 1000).toString(),
renderDelta(new Date().getTime() + muteTime * 1000)
),
muted: entry(new Date().getTime.toString(), renderDelta(new Date().getTime() - 1000)),
mutedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as Discord.User)),
reason: entry(reason, reason ? reason : "*No reason provided*")
},
hidden: {
guild: interaction.guild.id
}
};
log(data);
const failed = !status.dm && notify;
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setEmoji(`PUNISH.MUTE.${failed ? "YELLOW" : "GREEN"}`)
.setTitle("Mute")
.setDescription(
"The member was muted" + (failed ? ", but could not be notified" : "") +
(createAppealTicket
? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
: "")
)
.setStatus(failed ? "Warning" : "Success")
],
components: []
});
}; };
const check = (interaction: CommandInteraction) => { const check = (interaction: CommandInteraction) => {
if (!interaction.guild) return; if (!interaction.guild) return;
const member = interaction.member as GuildMember; const member = interaction.member as GuildMember;
const me = interaction.guild.me!; const me = interaction.guild.members.me!;
const apply = interaction.options.getMember("user") as GuildMember; const apply = interaction.options.getMember("user") as GuildMember;
const memberPos = member.roles.cache.size > 1 ? member.roles.highest.position : 0; const memberPos = member.roles.cache.size > 1 ? member.roles.highest.position : 0;
const mePos = me.roles.cache.size > 1 ? me.roles.highest.position : 0; const mePos = me.roles.cache.size > 1 ? me.roles.highest.position : 0;
@ -376,13 +384,13 @@ const check = (interaction: CommandInteraction) => {
// Check if Nucleus can mute the member // Check if Nucleus can mute the member
if (!(mePos > applyPos)) throw new Error("I do not have a role higher than that member"); if (!(mePos > applyPos)) throw new Error("I do not have a role higher than that member");
// Check if Nucleus has permission to mute // Check if Nucleus has permission to mute
if (!me.permissions.has("MODERATE_MEMBERS")) throw new Error("I do not have the *Moderate Members* permission"); if (!me.permissions.has("ModerateMembers")) throw new Error("I do not have the *Moderate Members* permission");
// Do not allow muting Nucleus // Do not allow muting Nucleus
if (member.id === me.id) throw new Error("I cannot mute myself"); if (member.id === me.id) throw new Error("I cannot mute myself");
// Allow the owner to mute anyone // Allow the owner to mute anyone
if (member.id === interaction.guild.ownerId) return true; if (member.id === interaction.guild.ownerId) return true;
// Check if the user has moderate_members permission // Check if the user has moderate_members permission
if (!member.permissions.has("MODERATE_MEMBERS")) if (!member.permissions.has("ModerateMembers"))
throw new Error("You do not have the *Moderate Members* permission"); throw new Error("You do not have the *Moderate Members* permission");
// Check if the user is below on the role list // Check if the user is below on the role list
if (!(memberPos > applyPos)) throw new Error("You do not have a role higher than that member"); if (!(memberPos > applyPos)) throw new Error("You do not have a role higher than that member");

@ -1,5 +1,5 @@
import { CommandInteraction } from "discord.js"; import type { CommandInteraction } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders"; import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import close from "../../actions/tickets/delete.js"; import close from "../../actions/tickets/delete.js";
const command = (builder: SlashCommandSubcommandBuilder) => builder.setName("close").setDescription("Closes a ticket"); const command = (builder: SlashCommandSubcommandBuilder) => builder.setName("close").setDescription("Closes a ticket");

@ -1,5 +1,5 @@
import { CommandInteraction } from "discord.js"; import type { CommandInteraction } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders"; import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import create from "../../actions/tickets/create.js"; import create from "../../actions/tickets/create.js";
const command = (builder: SlashCommandSubcommandBuilder) => const command = (builder: SlashCommandSubcommandBuilder) =>

@ -3,6 +3,7 @@ import convertCurlyBracketString from "../utils/convertCurlyBracketString.js";
import client from "../utils/client.js"; import client from "../utils/client.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js"; import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import { GuildChannel, GuildMember, BaseGuildTextChannel } from "discord.js"; import { GuildChannel, GuildMember, BaseGuildTextChannel } from "discord.js";
import singleNotify from "../utils/singleNotify.js";
export async function callback(_client: NucleusClient, member: GuildMember) { export async function callback(_client: NucleusClient, member: GuildMember) {
if (member.user.bot) return; if (member.user.bot) return;
@ -24,7 +25,7 @@ export async function callback(_client: NucleusClient, member: GuildMember) {
embeds: [new EmojiEmbed().setDescription(string).setStatus("Success")] embeds: [new EmojiEmbed().setDescription(string).setStatus("Success")]
}); });
} else { } else {
const channel: GuildChannel | null = await member.guild.channels.fetch(config.welcome.channel); const channel: GuildChannel | null = await member.guild.channels.fetch(config.welcome.channel) as GuildChannel | null;
if (!channel) return; // TODO: SEN if (!channel) return; // TODO: SEN
if (!(channel instanceof BaseGuildTextChannel)) return; if (!(channel instanceof BaseGuildTextChannel)) return;
if (channel.guild.id !== member.guild.id) return; if (channel.guild.id !== member.guild.id) return;
@ -34,7 +35,12 @@ export async function callback(_client: NucleusClient, member: GuildMember) {
content: (config.welcome.ping ? `<@${config.welcome.ping}>` : "") + `<@${member.id}>` content: (config.welcome.ping ? `<@${config.welcome.ping}>` : "") + `<@${member.id}>`
}); });
} catch (err) { } catch (err) {
console.error(err); // TODO: SEN singleNotify(
"welcomeChannelDeleted",
member.guild.id,
"The welcome channel has been deleted or is no longer accessible. Use /settings welcome to set a new one",
"Warning"
)
} }
} }
} }

@ -5,7 +5,6 @@ interface EmojisIndex {
} }
function getEmojiByName(name: string | null, format?: string): string { function getEmojiByName(name: string | null, format?: string): string {
console.log(name)
if (!name) return ""; if (!name) return "";
const parts = name.split("."); const parts = name.split(".");
let id: string | EmojisIndex | EmojisIndex[] | undefined = emojis; let id: string | EmojisIndex | EmojisIndex[] | undefined = emojis;

Loading…
Cancel
Save