Fix various issues pre-switching-to-bun

pull/17/head
Skyler Grey 3 years ago
parent a402d1cb13
commit f21323a0b7
Signed by: Minion3665
GPG Key ID: 1AFD10256B3C714D

@ -4,7 +4,7 @@
"es2020": true,
"node": true
},
"ignorePatterns": ["dist/"],
"ignorePatterns": ["dist/", "src/Unfinished/"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/strict", "prettier"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
@ -23,8 +23,6 @@
"caughtErrorsIgnorePattern": "^_"
}
],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-unnecessary-condition": "off", // TODO: remove this rule
"no-constant-condition": "off"
"@typescript-eslint/no-explicit-any": "error"
}
}

@ -28,11 +28,11 @@
"scripts": {
"build": "tsc",
"start": "node --experimental-json-modules --enable-source-maps dist/index.js",
"dev": "rm -rf dist && eslint . --fix && tsc && node --experimental-json-modules --enable-source-maps dist/index.js",
"force-dev": "rm -rf dist && eslint . --fix; tsc-suppress && node --experimental-json-modules --enable-source-maps dist/index.js",
"lint": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint .; echo 'To auto-fix everything possible, please run `yarn lint-fix`'; true",
"lint-fix": "echo 'Fixing eslint issues...'; eslint . --fix; echo 'Reformatting...'; prettier --write --loglevel warn --cache .; true",
"lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint .; echo 'To view errors in more detail, please run `yarn lint`'; true",
"dev": "rm -rf dist && eslint src --fix && tsc && node --experimental-json-modules --enable-source-maps dist/index.js",
"force-dev": "rm -rf dist && eslint src --fix; tsc-suppress && node --experimental-json-modules --enable-source-maps dist/index.js",
"lint": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To auto-fix everything possible, please run `yarn lint-fix`'; true",
"lint-fix": "echo 'Fixing eslint issues...'; eslint src --fix; echo 'Reformatting...'; prettier --write --loglevel warn --cache .; true",
"lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To view errors in more detail, please run `yarn lint`'; true",
"setup": "node Installer.js"
},
"repository": {
@ -56,6 +56,7 @@
"@typescript-eslint/parser": "^5.32.0",
"eslint-config-prettier": "^8.5.0",
"prettier": "^2.7.1",
"prettier-eslint": "^15.0.1",
"tsc-suppress": "^1.0.7"
}
}

@ -176,11 +176,12 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
if (all) {
members.forEach((member) => {
let applies = true;
filters.forEach((filter) => {
for (const filter of filters) {
if (!filter.check(member)) {
applies = false;
break;
}
}
});
if (applies) {
affected.push(member);
}
@ -188,11 +189,12 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
} else {
members.forEach((member) => {
let applies = false;
filters.forEach((filter) => {
for (const filter of filters) {
if (filter.check(member)) {
applies = true;
break;
}
}
});
if (applies) {
affected.push(member);
}

@ -67,7 +67,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
fetchReply: true
})) as Message;
const options = {
enabled: interaction.options.getString("enabled") as string | boolean,
enabled: interaction.options.getString("enabled") as string | boolean | null,
category: interaction.options.getChannel("category"),
maxtickets: interaction.options.getNumber("maxticketsperuser"),
supportping: interaction.options.getRole("supportrole")

@ -82,7 +82,9 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
})) as Message;
let page = 0;
let selectPaneOpen = false;
while (true) {
let cancelled = false;
let timedOut = false;
while (!cancelled && !timedOut) {
let selectPane: MessageActionRow[] = [];
if (selectPaneOpen) {
@ -136,7 +138,8 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
try {
i = await m.awaitMessageComponent({ time: 300000 });
} catch (e) {
break;
timedOut = true;
continue;
}
i.deferUpdate();
if ((i.component as MessageActionRowComponent).customId === "left") {
@ -151,66 +154,18 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
page = parseInt((i as SelectMenuInteraction).values[0]!);
selectPaneOpen = false;
} else {
const em = new Discord.MessageEmbed(pages[page]!.embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message closed");
await interaction.editReply({
embeds: [em],
components: [
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("left")
.setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("select")
.setEmoji(getEmojiByName("CONTROL.MENU", "id"))
.setStyle(selectPaneOpen ? "PRIMARY" : "SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("right")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("close")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
.setStyle("DANGER")
.setDisabled(true)
])
]
});
return;
cancelled = true;
}
}
const em = new Discord.MessageEmbed(pages[page]!.embed);
if (timedOut) {
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message timed out");
} else {
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message closed");
}
await interaction.editReply({
embeds: [em],
components: [
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("left")
.setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("select")
.setEmoji(getEmojiByName("CONTROL.MENU", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("right")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("close")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
.setStyle("DANGER")
.setDisabled(true)
])
]
components: []
});
};

@ -1,4 +1,4 @@
import type { GuildAuditLogsEntry, GuildBan } from 'discord.js';
import type { GuildAuditLogsEntry, GuildBan } from "discord.js";
import { purgeByUser } from "../actions/tickets/delete.js";
import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js";
// @ts-expect-error

@ -1,4 +1,4 @@
import type { GuildAuditLogsEntry, GuildBan } from 'discord.js';
import type { GuildAuditLogsEntry, GuildBan } from "discord.js";
import { purgeByUser } from "../actions/tickets/delete.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";

@ -1,6 +1,6 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { Guild, GuildAuditLogsEntry } from 'discord.js';
import type { Guild, GuildAuditLogsEntry } from "discord.js";
import { callback as statsChannelUpdate } from "../reflex/statsChannelUpdate.js";
export const event = "guildUpdate";
@ -31,8 +31,8 @@ export async function callback(client: HaikuClient, before: Guild, after: Guild)
NONE: "None",
ELEVATED: "Enabled"
};
const beforeOwner = await before.fetchOwner()
const afterOwner = await after.fetchOwner()
const beforeOwner = await before.fetchOwner();
const afterOwner = await after.fetchOwner();
if (before.name !== after.name) list["name"] = entry([before.name, after.name], `${before.name} -> ${after.name}`);
if (before.icon !== after.icon)

@ -11,7 +11,7 @@ import type { HaikuClient } from "jshaiku";
export const event = "interactionCreate";
function getAutocomplete(typed: string, options: string[]): {name: string, value: string}[] {
function getAutocomplete(typed: string, options: string[]): { name: string; value: string }[] {
options = options.filter((option) => option.length <= 100); // thanks discord. 6000 character limit on slash command inputs but only 100 for autocomplete.
if (!typed)
return options
@ -65,8 +65,11 @@ function generateWelcomeMessageAutocomplete(typed: string) {
}
async function interactionCreate(interaction: Interaction) {
if (interaction.type === "MESSAGE_COMPONENT" && (interaction as MessageComponentInteraction).componentType === "BUTTON") {
const int = (interaction as MessageComponentInteraction)
if (
interaction.type === "MESSAGE_COMPONENT" &&
(interaction as MessageComponentInteraction).componentType === "BUTTON"
) {
const int = interaction as MessageComponentInteraction;
switch (int.customId) {
case "rolemenu": {
return await roleMenu(interaction);
@ -85,24 +88,16 @@ async function interactionCreate(interaction: Interaction) {
}
}
} else if (interaction.type === "APPLICATION_COMMAND_AUTOCOMPLETE") {
const int = (interaction as AutocompleteInteraction)
switch (
`${int.commandName} ${int.options.getSubcommandGroup(
false
)} ${int.options.getSubcommand(false)}`
) {
const int = interaction as AutocompleteInteraction;
switch (`${int.commandName} ${int.options.getSubcommandGroup(false)} ${int.options.getSubcommand(false)}`) {
case "tag null null": {
return int.respond(
getAutocomplete(int.options.getString("tag") ?? "", await tagAutocomplete(int))
);
return int.respond(getAutocomplete(int.options.getString("tag") ?? "", await tagAutocomplete(int)));
}
case "settings null stats": {
return int.respond(generateStatsChannelAutocomplete(int.options.getString("name") ?? ""));
}
case "settings null welcome": {
return int.respond(
generateWelcomeMessageAutocomplete(int.options.getString("message") ?? "")
);
return int.respond(generateWelcomeMessageAutocomplete(int.options.getString("message") ?? ""));
}
}
}

@ -9,7 +9,9 @@ export const event = "inviteCreate";
export async function callback(client: HaikuClient, invite: Invite) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(invite.guild, "INVITE_CREATE");
const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId).first();
const audit = auditLog.entries
.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId)
.first();
if (audit.executor.id === client.user.id) return;
const data = {
meta: {

@ -9,7 +9,9 @@ export const event = "inviteDelete";
export async function callback(client: HaikuClient, invite: Invite) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(invite.guild, "INVITE_DELETE");
const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId).first();
const audit = auditLog.entries
.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId)
.first();
if (audit.executor.id === client.user.id) return;
const data = {
meta: {

@ -10,7 +10,9 @@ export async function callback(client: HaikuClient, message: Message) {
if (client.noLog.includes(`${message.id}/${message.channel.id}/${message.id}`)) return;
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(message.guild, "MEMBER_BAN_ADD");
const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === message.author.id).first();
const audit = auditLog.entries
.filter((entry: GuildAuditLogsEntry) => entry.target!.id === message.author.id)
.first();
if (audit) {
if (audit.createdAt - 100 < new Date().getTime()) return;
}
@ -54,7 +56,9 @@ export async function callback(client: HaikuClient, message: Message) {
repliedTo: entry(
replyTo,
replyTo
? `[[Jump to message]](https://discord.com/channels/${message.guild!.id}/${message.channel.id}/${replyTo.messageId})`
? `[[Jump to message]](https://discord.com/channels/${message.guild!.id}/${
message.channel.id
}/${replyTo.messageId})`
: "None"
)
},

@ -1,5 +1,5 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { HaikuClient } from "jshaiku";
import type { GuildAuditLogsEntry, Sticker } from "discord.js";
export const event = "stickerDelete";

@ -1,5 +1,5 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { HaikuClient } from "jshaiku";
import type { GuildAuditLogsEntry, Sticker } from "discord.js";
export const event = "stickerDelete";

@ -1,5 +1,5 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { HaikuClient } from "jshaiku";
import type { Sticker } from "discord.js";
export const event = "stickerUpdate";

@ -2,7 +2,7 @@ import type { GuildAuditLogsEntry, ThreadChannel } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { HaikuClient } from "jshaiku";
export const event = "threadCreate";
export async function callback(client: HaikuClient, thread: ThreadChannel) {
@ -10,10 +10,12 @@ export async function callback(client: HaikuClient, thread: ThreadChannel) {
const auditLog = await getAuditLog(thread.guild, "THREAD_CREATE");
const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === thread.id).first();
if (audit.executor.id === client.user.id) return;
const category = thread.parent ? entry(
const category = thread.parent
? entry(
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
) : entry(null, "Uncategorised")
)
: entry(null, "Uncategorised");
const data = {
meta: {
type: "channelCreate",

@ -2,7 +2,7 @@ import type { GuildAuditLogsEntry, ThreadChannel } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { HaikuClient } from "jshaiku";
export const event = "threadDelete";
export async function callback(client: HaikuClient, thread: ThreadChannel) {
@ -10,10 +10,12 @@ export async function callback(client: HaikuClient, thread: ThreadChannel) {
const auditLog = await getAuditLog(thread.guild, "THREAD_UPDATE");
const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === thread.id).first();
if (audit.executor.id === client.user.id) return;
const category = thread.parent ? entry(
const category = thread.parent
? entry(
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
) : entry(null, "Uncategorised")
)
: entry(null, "Uncategorised");
const data = {
meta: {
type: "channelDelete",

@ -32,7 +32,9 @@ export async function callback(client: HaikuClient, before: ThreadChannel, after
if (before.rateLimitPerUser !== after.rateLimitPerUser) {
list["slowmode"] = entry(
[before.rateLimitPerUser, after.rateLimitPerUser],
`${humanizeDuration((before.rateLimitPerUser ?? 0) * 1000)} -> ${humanizeDuration((after.rateLimitPerUser ?? 0) * 1000)}`
`${humanizeDuration((before.rateLimitPerUser ?? 0) * 1000)} -> ${humanizeDuration(
(after.rateLimitPerUser ?? 0) * 1000
)}`
);
}
if (!(Object.keys(list).length - 3)) return;

@ -15,25 +15,34 @@ export async function callback(client: HaikuClient, channel: Discord.GuildChanne
auditLogUpdate,
auditLogDelete
]);
const auditCreate = auditLogCreate.entries.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false
return (entry.target! as Webhook).channelId === channel.id}
).first();
const auditUpdate = auditLogUpdate.entries.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false
return (entry.target! as Webhook).channelId === channel.id}
).first();
const auditDelete = auditLogDelete.entries.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false
return (entry.target! as Webhook).channelId === channel.id}
).first();
const auditCreate = auditLogCreate.entries
.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false;
return (entry.target! as Webhook).channelId === channel.id;
})
.first();
const auditUpdate = auditLogUpdate.entries
.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false;
return (entry.target! as Webhook).channelId === channel.id;
})
.first();
const auditDelete = auditLogDelete.entries
.filter((entry: GuildAuditLogsEntry | null) => {
if (entry === null) return false;
return (entry.target! as Webhook).channelId === channel.id;
})
.first();
if (!auditCreate && !auditUpdate && !auditDelete) return;
let audit = auditCreate;
let action: "Create" | "Update" | "Delete" = "Create";
let list: Record<string, ReturnType<typeof entry> | string> = {};
if (auditUpdate && auditUpdate.createdTimestamp > audit.createdTimestamp) {
const { before, after } = auditUpdate.changes.reduce(
(acc: {before: Record<string, string>, after: Record<string, string>}, change: {key: string, new: string, old: string}) => {
(
acc: { before: Record<string, string>; after: Record<string, string> },
change: { key: string; new: string; old: string }
) => {
acc.before[change.key] = change.old;
acc.after[change.key] = change.new;
return acc;
@ -50,14 +59,20 @@ export async function callback(client: HaikuClient, channel: Discord.GuildChanne
renderChannel(await client.channels.fetch(after.channel_id))
);
if (!Object.keys(list).length) return;
list["created"] = entry(auditUpdate.target.createdTimestamp, renderDelta(auditUpdate.target.createdTimestamp));
list["created"] = entry(
auditUpdate.target.createdTimestamp,
renderDelta(auditUpdate.target.createdTimestamp)
);
list["edited"] = entry(after.editedTimestamp, renderDelta(new Date().getTime()));
list["editedBy"] = entry(auditUpdate.executor.id, renderUser(auditUpdate.executor));
audit = auditUpdate;
action = "Update";
} else if (auditDelete && auditDelete.createdTimestamp > audit.createdTimestamp) {
const { before } = auditDelete.changes.reduce(
(acc: {before: Record<string, string>, after: Record<string, string>}, change: {key: string, new: string, old: string}) => {
(
acc: { before: Record<string, string>; after: Record<string, string> },
change: { key: string; new: string; old: string }
) => {
acc.before[change.key] = change.old;
acc.after[change.key] = change.new;
return acc;
@ -78,7 +93,10 @@ export async function callback(client: HaikuClient, channel: Discord.GuildChanne
action = "Delete";
} else {
const { before } = auditDelete.changes.reduce(
(acc: {before: Record<string, string>, after: Record<string, string>}, change: {key: string, new: string, old: string}) => {
(
acc: { before: Record<string, string>; after: Record<string, string> },
change: { key: string; new: string; old: string }
) => {
acc.before[change.key] = change.old;
acc.after[change.key] = change.new;
return acc;

@ -1,4 +1,12 @@
import { CommandInteraction, GuildMember, Message, MessageActionRow, MessageButton, MessageComponentInteraction, TextChannel } from "discord.js";
import {
CommandInteraction,
GuildMember,
Message,
MessageActionRow,
MessageButton,
MessageComponentInteraction,
TextChannel
} from "discord.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import getEmojiByName from "../utils/getEmojiByName.js";
import { PasteClient, Publicity, ExpireDate } from "pastebin-api";

@ -230,7 +230,9 @@ export default async (guild: Guild, interaction?: CommandInteraction) => {
let selectPaneOpen = false;
while (true) {
let cancelled = false;
let timedOut = false;
while (!cancelled && !timedOut) {
let selectPane: MessageActionRow[] = [];
if (selectPaneOpen) {
@ -297,7 +299,8 @@ export default async (guild: Guild, interaction?: CommandInteraction) => {
time: 300000
});
} catch (e) {
break;
timedOut = true;
continue;
}
i.deferUpdate();
if (!("customId" in i.component)) {
@ -314,38 +317,10 @@ export default async (guild: Guild, interaction?: CommandInteraction) => {
page = parseInt((i as SelectMenuInteraction).values[0]!);
selectPaneOpen = false;
} else {
if (interaction) {
const em = new Discord.MessageEmbed(pages[page]!.embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
em.setFooter({ text: "Message closed" });
interaction.editReply({
embeds: [em],
components: [
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("left")
.setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("select")
.setEmoji(getEmojiByName("CONTROL.MENU", "id"))
.setStyle(selectPaneOpen ? "PRIMARY" : "SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("right")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
.setDisabled(true)
])
]
});
} else {
m.delete();
}
return;
cancelled = true;
}
}
if (timedOut) {
if (interaction) {
const em = new Discord.MessageEmbed(pages[page]!.embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page)).setFooter({
@ -353,25 +328,7 @@ export default async (guild: Guild, interaction?: CommandInteraction) => {
});
await interaction.editReply({
embeds: [em],
components: [
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("left")
.setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("select")
.setEmoji(getEmojiByName("CONTROL.MENU", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("right")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
.setDisabled(true)
])
]
components: []
});
} else {
const em = new Discord.MessageEmbed(pages[page]!.embed);
@ -380,25 +337,20 @@ export default async (guild: Guild, interaction?: CommandInteraction) => {
});
await m.edit({
embeds: [em],
components: [
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("left")
.setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("select")
.setEmoji(getEmojiByName("CONTROL.MENU", "id"))
.setStyle("SECONDARY")
.setDisabled(true),
new MessageButton()
.setCustomId("right")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
.setDisabled(true)
])
]
components: []
});
}
} else {
if (interaction) {
const em = new Discord.MessageEmbed(pages[page]!.embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
em.setFooter({ text: "Message closed" });
interaction.editReply({
embeds: [em],
components: []
});
} else {
m.delete();
}
}
};

@ -1,4 +1,4 @@
import type { Guild, User } from 'discord.js';
import type { Guild, User } from "discord.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { GuildMember } from "discord.js";
@ -14,7 +14,7 @@ export async function callback(client: HaikuClient, member?: GuildMember, guild?
if (!member && !guild) return;
guild = await client.guilds.fetch(member ? member.guild.id : guild!.id);
if (!guild) return;
user = user ?? member!.user
user = user ?? member!.user;
const config = await client.database.guilds.read(guild.id);
Object.entries(config.getKey("stats")).forEach(async ([channel, props]) => {
if ((props as PropSchema).enabled) {

@ -1,5 +1,12 @@
import { LoadingEmbed } from "./../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, GuildMember, Interaction, MessageComponentInteraction, Permissions, Role } from "discord.js";
import Discord, {
CommandInteraction,
GuildMember,
Interaction,
MessageComponentInteraction,
Permissions,
Role
} from "discord.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import fetch from "node-fetch";
import { TestString, NSFWCheck } from "./scanners.js";
@ -175,20 +182,17 @@ export default async function (interaction: CommandInteraction | MessageComponen
let length = 5;
let itt = 0;
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
while (true) {
do {
itt += 1;
code = "";
for (let i = 0; i < length; i++) {
code += chars.charAt(Math.floor(Math.random() * chars.length));
}
if (code in verify) continue;
if (itt > 1000) {
itt = 0;
length += 1;
continue;
}
break;
}
} while (code in verify);
const role: Role | null = await interaction.guild!.roles.fetch(config.verify.role);
if (!role) {
await interaction.editReply({

@ -1,4 +0,0 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
export type AsyncReturnType<T extends (...args: any[]) => Promise<any>> = T extends (...args: any[]) => Promise<infer X>
? X
: unknown;
Loading…
Cancel
Save