Much more typing

pull/8/head
pineafan 3 years ago
parent 3a02ea3d34
commit 0f5cc78ff6
No known key found for this signature in database
GPG Key ID: 0AEF25BAA0FB1C74

@ -29,7 +29,7 @@
"build": "tsc", "build": "tsc",
"start": "node --experimental-json-modules --enable-source-maps dist/index.js", "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", "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/src/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": "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-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", "lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint .; echo 'To view errors in more detail, please run `yarn lint`'; true",

@ -1,14 +1,17 @@
import type { GuildAuditLogsEntry, GuildBan } from 'discord.js';
import { purgeByUser } from "../actions/tickets/delete.js"; import { purgeByUser } from "../actions/tickets/delete.js";
import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js"; import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "guildBanAdd"; export const event = "guildBanAdd";
export async function callback(client, ban) { export async function callback(client: HaikuClient, ban: GuildBan) {
await statsChannelRemove(client, ban.user); await statsChannelRemove(client, undefined, ban.guild, ban.user);
purgeByUser(ban.user.id, ban.guild); purgeByUser(ban.user.id, ban.guild);
const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = ban.user.client.logger; const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = client.logger;
const auditLog = await getAuditLog(ban.guild, "MEMBER_BAN_ADD"); const auditLog = await getAuditLog(ban.guild, "MEMBER_BAN_ADD");
const audit = auditLog.entries.filter((entry) => entry.target.id === ban.user.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === ban.user.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
await client.database.history.create("ban", ban.guild.id, ban.user, audit.executor, audit.reason); await client.database.history.create("ban", ban.guild.id, ban.user, audit.executor, audit.reason);
const data = { const data = {

@ -1,14 +1,15 @@
import type { GuildAuditLogsEntry, GuildBan } from 'discord.js';
import { purgeByUser } from "../actions/tickets/delete.js"; import { purgeByUser } from "../actions/tickets/delete.js";
import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js"; // @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "guildBanRemove"; export const event = "guildBanRemove";
export async function callback(client, ban) { export async function callback(client: HaikuClient, ban: GuildBan) {
await statsChannelRemove(client, ban.user);
purgeByUser(ban.user.id, ban.guild); purgeByUser(ban.user.id, ban.guild);
const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = ban.user.client.logger; const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = client.logger;
const auditLog = await getAuditLog(ban.guild, "MEMBER_BAN_REMOVE"); const auditLog = await getAuditLog(ban.guild, "MEMBER_BAN_REMOVE");
const audit = auditLog.entries.filter((entry) => entry.target.id === ban.user.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === ban.user.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
await client.database.history.create("unban", ban.guild.id, ban.user, audit.executor, audit.reason); await client.database.history.create("unban", ban.guild.id, ban.user, audit.executor, audit.reason);
const data = { const data = {

@ -1,10 +1,14 @@
import type { GuildAuditLogsEntry, GuildMember } from "discord.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "guildMemberUpdate"; export const event = "guildMemberUpdate";
export async function callback(client, before, after) { export async function callback(client: HaikuClient, before: GuildMember, after: GuildMember) {
try { try {
const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = after.client.logger; const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = client.logger;
const auditLog = await getAuditLog(after.guild, "MEMBER_UPDATE"); const auditLog = await getAuditLog(after.guild, "MEMBER_UPDATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === after.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === after.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
if (before.nickname !== after.nickname) { if (before.nickname !== after.nickname) {
await client.database.history.create( await client.database.history.create(
@ -13,8 +17,8 @@ export async function callback(client, before, after) {
after.user, after.user,
audit.executor, audit.executor,
null, null,
before.nickname || before.user.username, before.nickname ?? before.user.username,
after.nickname || after.user.username after.nickname ?? after.user.username
); );
const data = { const data = {
meta: { meta: {
@ -39,8 +43,8 @@ export async function callback(client, before, after) {
}; };
log(data); log(data);
} else if ( } else if (
before.communicationDisabledUntilTimestamp < new Date().getTime() && (before.communicationDisabledUntilTimestamp ?? 0) < new Date().getTime() &&
after.communicationDisabledUntil > new Date().getTime() (after.communicationDisabledUntil ?? 0) > new Date().getTime() // TODO: test this
) { ) {
await client.database.history.create( await client.database.history.create(
"mute", "mute",

@ -1,14 +1,17 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { Guild, GuildAuditLogsEntry } from 'discord.js';
import { callback as statsChannelUpdate } from "../reflex/statsChannelUpdate.js"; import { callback as statsChannelUpdate } from "../reflex/statsChannelUpdate.js";
export const event = "guildUpdate"; export const event = "guildUpdate";
export async function callback(client, before, after) { export async function callback(client: HaikuClient, before: Guild, after: Guild) {
await statsChannelUpdate(client, after.me); await statsChannelUpdate(client, after.me!);
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = after.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
const auditLog = await getAuditLog(after, "GUILD_UPDATE"); const auditLog = await getAuditLog(after, "GUILD_UPDATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === after.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === after.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const list = {}; const list: Record<string, ReturnType<typeof entry>> = {};
const verificationLevels = { const verificationLevels = {
NONE: "Unrestricted", NONE: "Unrestricted",
@ -28,32 +31,34 @@ export async function callback(client, before, after) {
NONE: "None", NONE: "None",
ELEVATED: "Enabled" ELEVATED: "Enabled"
}; };
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.name !== after.name) list["name"] = entry([before.name, after.name], `${before.name} -> ${after.name}`);
if (before.icon !== after.icon) if (before.icon !== after.icon)
list.icon = entry([before.icon, after.icon], `[Before](${before.iconURL()}) -> [After](${after.iconURL()})`); list["icon"] = entry([before.icon, after.icon], `[Before](${before.iconURL()}) -> [After](${after.iconURL()})`);
if (before.splash !== after.splash) if (before.splash !== after.splash)
list.splash = entry( list["splash"] = entry(
[before.splash, after.splash], [before.splash, after.splash],
`[Before](${before.splashURL()}) -> [After](${after.splashURL()})` `[Before](${before.splashURL()}) -> [After](${after.splashURL()})`
); );
if (before.banner !== after.banner) if (before.banner !== after.banner)
list.banner = entry( list["banner"] = entry(
[before.banner, after.banner], [before.banner, after.banner],
`[Before](${before.bannerURL()}) -> [After](${after.bannerURL()})` `[Before](${before.bannerURL()}) -> [After](${after.bannerURL()})`
); );
if (before.owner !== after.owner) if (beforeOwner !== afterOwner)
list.owner = entry( list["owner"] = entry(
[before.owner, after.owner], [beforeOwner, afterOwner],
`${renderUser(before.owner.user)} -> ${renderUser(after.owner.user)}` `${renderUser(beforeOwner.user)} -> ${renderUser(afterOwner.user)}`
); );
if (before.verificationLevel !== after.verificationLevel) if (before.verificationLevel !== after.verificationLevel)
list.verificationLevel = entry( list["verificationLevel"] = entry(
[verificationLevels[before.verificationLevel], verificationLevels[after.verificationLevel]], [verificationLevels[before.verificationLevel], verificationLevels[after.verificationLevel]],
`${verificationLevels[before.verificationLevel]} -> ${verificationLevels[after.verificationLevel]}` `${verificationLevels[before.verificationLevel]} -> ${verificationLevels[after.verificationLevel]}`
); );
if (before.explicitContentFilter !== after.explicitContentFilter) if (before.explicitContentFilter !== after.explicitContentFilter)
list.explicitContentFilter = entry( list["explicitContentFilter"] = entry(
[ [
explicitContentFilterLevels[before.explicitContentFilter], explicitContentFilterLevels[before.explicitContentFilter],
explicitContentFilterLevels[after.explicitContentFilter] explicitContentFilterLevels[after.explicitContentFilter]
@ -69,8 +74,8 @@ export async function callback(client, before, after) {
); );
if (!Object.keys(list).length) return; if (!Object.keys(list).length) return;
list.updated = entry(new Date().getTime(), renderDelta(new Date().getTime())); list["updated"] = entry(new Date().getTime(), renderDelta(new Date().getTime()));
list.updatedBy = entry(audit.executor.id, renderUser(audit.executor)); list["updatedBy"] = entry(audit.executor.id, renderUser(audit.executor));
const data = { const data = {
meta: { meta: {
type: "guildUpdate", type: "guildUpdate",

@ -5,10 +5,13 @@ import close from "../actions/tickets/delete.js";
import createTranscript from "../premium/createTranscript.js"; import createTranscript from "../premium/createTranscript.js";
import Fuse from "fuse.js"; import Fuse from "fuse.js";
import { autocomplete as tagAutocomplete } from "../commands/tag.js"; import { autocomplete as tagAutocomplete } from "../commands/tag.js";
import type { AutocompleteInteraction, Interaction, MessageComponentInteraction } from "discord.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "interactionCreate"; export const event = "interactionCreate";
function getAutocomplete(typed: string, options: string[]): object[] { 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. options = options.filter((option) => option.length <= 100); // thanks discord. 6000 character limit on slash command inputs but only 100 for autocomplete.
if (!typed) if (!typed)
return options return options
@ -23,7 +26,7 @@ function getAutocomplete(typed: string, options: string[]): object[] {
return fuse.slice(0, 25).map((option) => ({ name: option.item, value: option.item })); return fuse.slice(0, 25).map((option) => ({ name: option.item, value: option.item }));
} }
function generateStatsChannelAutocomplete(typed) { function generateStatsChannelAutocomplete(typed: string) {
const validReplacements = ["serverName", "memberCount", "memberCount:bots", "memberCount:humans"]; const validReplacements = ["serverName", "memberCount", "memberCount:bots", "memberCount:humans"];
const autocompletions = []; const autocompletions = [];
const beforeLastOpenBracket = typed.match(/(.*){[^{}]{0,15}$/); const beforeLastOpenBracket = typed.match(/(.*){[^{}]{0,15}$/);
@ -38,7 +41,7 @@ function generateStatsChannelAutocomplete(typed) {
} }
return getAutocomplete(typed, autocompletions); return getAutocomplete(typed, autocompletions);
} }
function generateWelcomeMessageAutocomplete(typed) { function generateWelcomeMessageAutocomplete(typed: string) {
const validReplacements = [ const validReplacements = [
"serverName", "serverName",
"memberCount", "memberCount",
@ -61,14 +64,15 @@ function generateWelcomeMessageAutocomplete(typed) {
return getAutocomplete(typed, autocompletions); return getAutocomplete(typed, autocompletions);
} }
async function interactionCreate(interaction) { async function interactionCreate(interaction: Interaction) {
if (interaction.componentType === "BUTTON") { if (interaction.type === "MESSAGE_COMPONENT" && (interaction as MessageComponentInteraction).componentType === "BUTTON") {
switch (interaction.customId) { const int = (interaction as MessageComponentInteraction)
switch (int.customId) {
case "rolemenu": { case "rolemenu": {
return await roleMenu(interaction); return await roleMenu(interaction);
} }
case "verifybutton": { case "verifybutton": {
return verify(interaction); return verify(int);
} }
case "createticket": { case "createticket": {
return create(interaction); return create(interaction);
@ -77,32 +81,33 @@ async function interactionCreate(interaction) {
return close(interaction); return close(interaction);
} }
case "createtranscript": { case "createtranscript": {
return createTranscript(interaction); return createTranscript(int);
} }
} }
} else if (interaction.type === "APPLICATION_COMMAND_AUTOCOMPLETE") { } else if (interaction.type === "APPLICATION_COMMAND_AUTOCOMPLETE") {
const int = (interaction as AutocompleteInteraction)
switch ( switch (
`${interaction.commandName} ${interaction.options.getSubcommandGroup( `${int.commandName} ${int.options.getSubcommandGroup(
false false
)} ${interaction.options.getSubcommand(false)}` )} ${int.options.getSubcommand(false)}`
) { ) {
case "tag null null": { case "tag null null": {
return interaction.respond( return int.respond(
getAutocomplete(interaction.options.getString("tag"), await tagAutocomplete(interaction)) getAutocomplete(int.options.getString("tag") ?? "", await tagAutocomplete(int))
); );
} }
case "settings null stats": { case "settings null stats": {
return interaction.respond(generateStatsChannelAutocomplete(interaction.options.getString("name"))); return int.respond(generateStatsChannelAutocomplete(int.options.getString("name") ?? ""));
} }
case "settings null welcome": { case "settings null welcome": {
return interaction.respond( return int.respond(
generateWelcomeMessageAutocomplete(interaction.options.getString("message")) generateWelcomeMessageAutocomplete(int.options.getString("message") ?? "")
); );
} }
} }
} }
} }
export async function callback(client, interaction) { export async function callback(_client: HaikuClient, interaction: Interaction) {
await interactionCreate(interaction); await interactionCreate(interaction);
} }

@ -1,10 +1,15 @@
import type { GuildAuditLogsEntry, Invite } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "inviteCreate"; export const event = "inviteCreate";
export async function callback(client, invite) { export async function callback(client: HaikuClient, invite: Invite) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = invite.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(invite.guild, "INVITE_CREATE"); const auditLog = await getAuditLog(invite.guild, "INVITE_CREATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === invite.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {
@ -23,7 +28,7 @@ export async function callback(client, invite) {
created: entry(invite.createdTimestamp, renderDelta(invite.createdTimestamp)) created: entry(invite.createdTimestamp, renderDelta(invite.createdTimestamp))
}, },
hidden: { hidden: {
guild: invite.guild.id guild: invite.guild!.id
} }
}; };
log(data); log(data);

@ -1,10 +1,15 @@
import type { GuildAuditLogsEntry, Invite } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "inviteDelete"; export const event = "inviteDelete";
export async function callback(client, invite) { export async function callback(client: HaikuClient, invite: Invite) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = invite.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(invite.guild, "INVITE_DELETE"); const auditLog = await getAuditLog(invite.guild, "INVITE_DELETE");
const audit = auditLog.entries.filter((entry) => entry.target.id === invite.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === invite.inviterId).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {
@ -23,7 +28,7 @@ export async function callback(client, invite) {
deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())) deleted: entry(new Date().getTime(), renderDelta(new Date().getTime()))
}, },
hidden: { hidden: {
guild: invite.guild.id guild: invite.guild!.id
} }
}; };
log(data); log(data);

@ -1,13 +1,15 @@
import type { GuildMember } from "discord.js";
import { callback as statsChannelAdd } from "../reflex/statsChannelUpdate.js"; import { callback as statsChannelAdd } from "../reflex/statsChannelUpdate.js";
import { callback as welcome } from "../reflex/welcome.js"; import { callback as welcome } from "../reflex/welcome.js";
import client from "../utils/client.js"; // @ts-expect-error
import type { HaikuClient } from "jshaiku";
export const event = "guildMemberAdd"; export const event = "guildMemberAdd";
export async function callback(_, member) { export async function callback(client: HaikuClient, member: GuildMember) {
welcome(_, member); welcome(client, member);
statsChannelAdd(_, member); statsChannelAdd(client, member);
const { log, NucleusColors, entry, renderUser, renderDelta } = member.client.logger; const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
await client.database.history.create("join", member.guild.id, member.user, null, null); await client.database.history.create("join", member.guild.id, member.user, null, null);
const data = { const data = {
meta: { meta: {

@ -1,14 +1,18 @@
import type { GuildAuditLogsEntry, GuildMember } from "discord.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import { purgeByUser } from "../actions/tickets/delete.js"; import { purgeByUser } from "../actions/tickets/delete.js";
import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js"; import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js";
export const event = "guildMemberRemove"; export const event = "guildMemberRemove";
export async function callback(client, member) { export async function callback(client: HaikuClient, member: GuildMember) {
purgeByUser(member.id, member.guild); purgeByUser(member.id, member.guild);
await statsChannelRemove(client, member); await statsChannelRemove(client, member);
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = member.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
const auditLog = await getAuditLog(member.guild, "MEMBER_KICK"); const auditLog = await getAuditLog(member.guild, "MEMBER_KICK");
const audit = auditLog.entries.filter((entry) => entry.target.id === member.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === member.id).first();
let type = "leave"; let type = "leave";
if (audit) { if (audit) {
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
@ -50,7 +54,7 @@ export async function callback(client, member) {
displayName: "Member Left", displayName: "Member Left",
calculateType: "guildMemberUpdate", calculateType: "guildMemberUpdate",
color: NucleusColors.red, color: NucleusColors.red,
emoji: "MEMBER." + (member.bot ? "BOT." : "") + "LEAVE", emoji: "MEMBER." + (member.user.bot ? "BOT." : "") + "LEAVE",
timestamp: new Date().getTime() timestamp: new Date().getTime()
}, },
list: { list: {

@ -5,7 +5,7 @@ import logAttachment from "../premium/attachmentLogs.js";
import createLogException from "../utils/createLogException.js"; import createLogException from "../utils/createLogException.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";
import { callback as a } from "../reflex/statsChannelUpdate.js"; import { callback as statsChannelUpdate } from "../reflex/statsChannelUpdate.js";
import { Message, ThreadChannel } from "discord.js"; import { Message, ThreadChannel } from "discord.js";
export const event = "messageCreate"; export const event = "messageCreate";
@ -15,7 +15,7 @@ export async function callback(_client: HaikuClient, message: Message) {
if (message.author.bot) return; if (message.author.bot) return;
if (message.channel.type === "DM") return; if (message.channel.type === "DM") return;
try { try {
await a(client, await message.guild.members.fetch(message.author.id)); await statsChannelUpdate(client, await message.guild.members.fetch(message.author.id));
} catch (e) { } catch (e) {
console.log(e); console.log(e);
} }

@ -1,17 +1,20 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { GuildAuditLogsEntry, Message } from "discord.js";
export const event = "messageDelete"; export const event = "messageDelete";
export async function callback(client, message) { export async function callback(client: HaikuClient, message: Message) {
try { try {
if (message.author.id === client.user.id) return; if (message.author.id === client.user.id) return;
if (client.noLog.includes(`${message.guild.id}/${message.channel.id}/${message.id}`)) return; if (client.noLog.includes(`${message.id}/${message.channel.id}/${message.id}`)) return;
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
message.channel.client.logger;
const auditLog = await getAuditLog(message.guild, "MEMBER_BAN_ADD"); const auditLog = await getAuditLog(message.guild, "MEMBER_BAN_ADD");
const audit = auditLog.entries.filter((entry) => 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) {
if (audit.createdAt - 100 < new Date().getTime()) return; if (audit.createdAt - 100 < new Date().getTime()) return;
} }
message.reference = message.reference || {}; const replyTo = message.reference;
let content = message.cleanContent; let content = message.cleanContent;
content.replace("`", "\\`"); content.replace("`", "\\`");
if (content.length > 256) content = content.substring(0, 253) + "..."; if (content.length > 256) content = content.substring(0, 253) + "...";
@ -23,7 +26,7 @@ export async function callback(client, message) {
) ?? [] ) ?? []
).length; ).length;
let attachmentJump = ""; let attachmentJump = "";
const config = (await client.database.guilds.read(message.guild.id)).logging.attachments.saved[ const config = (await client.database.guilds.read(message.guild!.id)).logging.attachments.saved[
message.channel.id + message.id message.channel.id + message.id
]; ];
if (config) { if (config) {
@ -49,14 +52,14 @@ export async function callback(client, message) {
mentions: message.mentions.users.size, mentions: message.mentions.users.size,
attachments: entry(attachments, attachments + attachmentJump), attachments: entry(attachments, attachments + attachmentJump),
repliedTo: entry( repliedTo: entry(
message.reference.messageId || null, replyTo,
message.reference.messageId replyTo
? `[[Jump to message]](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.reference.messageId})` ? `[[Jump to message]](https://discord.com/channels/${message.guild!.id}/${message.channel.id}/${replyTo.messageId})`
: "None" : "None"
) )
}, },
hidden: { hidden: {
guild: message.channel.guild.id guild: message.guild!.id
} }
}; };
log(data); log(data);

@ -1,10 +1,14 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { Message, MessageReference } from "discord.js";
export const event = "messageUpdate"; export const event = "messageUpdate";
export async function callback(client, oldMessage, newMessage) { export async function callback(client: HaikuClient, oldMessage: Message, newMessage: Message) {
if (newMessage.author.id === client.user.id) return; if (newMessage.author.id === client.user.id) return;
const { log, NucleusColors, entry, renderUser, renderDelta, renderNumberDelta, renderChannel } = if (!newMessage.guild) return;
newMessage.channel.client.logger; const { log, NucleusColors, entry, renderUser, renderDelta, renderNumberDelta, renderChannel } = client.logger;
newMessage.reference = newMessage.reference || {}; const replyTo: MessageReference | null = newMessage.reference;
let newContent = newMessage.cleanContent.replaceAll("`", ""); let newContent = newMessage.cleanContent.replaceAll("`", "");
let oldContent = oldMessage.cleanContent.replaceAll("`", ""); let oldContent = oldMessage.cleanContent.replaceAll("`", "");
let attachmentJump = ""; let attachmentJump = "";
@ -37,8 +41,8 @@ export async function callback(client, oldMessage, newMessage) {
renderDelta(new Date(newMessage.createdTimestamp)) renderDelta(new Date(newMessage.createdTimestamp))
), ),
published: entry( published: entry(
new Date(newMessage.editedTimestamp), new Date(newMessage.editedTimestamp!),
renderDelta(new Date(newMessage.editedTimestamp)) renderDelta(new Date(newMessage.editedTimestamp!))
), ),
mentions: renderNumberDelta(oldMessage.mentions.users.size, newMessage.mentions.users.size), mentions: renderNumberDelta(oldMessage.mentions.users.size, newMessage.mentions.users.size),
attachments: entry( attachments: entry(
@ -47,7 +51,7 @@ export async function callback(client, oldMessage, newMessage) {
) )
}, },
hidden: { hidden: {
guild: newMessage.channel.guild.id guild: newMessage.guild.id
} }
}; };
return log(data); return log(data);
@ -87,14 +91,14 @@ export async function callback(client, oldMessage, newMessage) {
renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size) + attachmentJump renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size) + attachmentJump
), ),
repliedTo: entry( repliedTo: entry(
newMessage.reference.messageId || null, replyTo,
newMessage.reference.messageId replyTo
? `[[Jump to message]](https://discord.com/channels/${newMessage.guild.id}/${newMessage.channel.id}/${newMessage.reference.messageId})` ? `[[Jump to message]](https://discord.com/channels/${newMessage.guild.id}/${newMessage.channel.id}/${replyTo.messageId})`
: "None" : "None"
) )
}, },
hidden: { hidden: {
guild: newMessage.channel.guild.id guild: newMessage.guild.id
} }
}; };
log(data); log(data);

@ -1,10 +1,14 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { GuildAuditLogsEntry, Role } from "discord.js";
export const event = "roleCreate"; export const event = "roleCreate";
export async function callback(client, role) { export async function callback(client: HaikuClient, role: Role) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderRole } = role.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderRole } = client.logger;
if (role.managed) return; if (role.managed) return;
const auditLog = await getAuditLog(role.guild, "ROLE_CREATE"); const auditLog = await getAuditLog(role.guild, "ROLE_CREATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === role.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === role.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {

@ -1,12 +1,15 @@
import getEmojiByName from "../utils/getEmojiByName.js"; import getEmojiByName from "../utils/getEmojiByName.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import type { GuildAuditLogsEntry, Role } from "discord.js";
export const event = "roleDelete"; export const event = "roleDelete";
export async function callback(client, role) { export async function callback(client: HaikuClient, role: Role) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = role.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
if (role.managed) return; if (role.managed) return;
const auditLog = await getAuditLog(role.guild, "ROLE_DELETE"); const auditLog = await getAuditLog(role.guild, "ROLE_DELETE");
const audit = auditLog.entries.filter((entry) => entry.target.id === role.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === role.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {

@ -1,15 +1,18 @@
import type { Role } from "discord.js";
// @ts-expect-error
import type { HaikuClient } from "jshaiku";
import getEmojiByName from "../utils/getEmojiByName.js"; import getEmojiByName from "../utils/getEmojiByName.js";
export const event = "roleUpdate"; export const event = "roleUpdate";
export async function callback(client, or, nr) { export async function callback(client: HaikuClient, or: Role, nr: Role) {
const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser, renderRole } = client.logger; const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser, renderRole } = client.logger;
const auditLog = await getAuditLog(nr.guild, "ROLE_UPDATE"); const auditLog = await getAuditLog(nr.guild, "ROLE_UPDATE");
const audit = auditLog.entries.first(); const audit = auditLog.entries.first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const changes = { const changes: Record<string, ReturnType<typeof entry>> = {
roleId: entry(nr.id, `\`${nr.id}\``), roleId: entry(nr.id, `\`${nr.id}\``),
role: entry(nr.id, renderRole(nr)), role: entry(nr.id, renderRole(nr)),
edited: entry(new Date().getTime(), renderDelta(new Date().getTime())), edited: entry(new Date().getTime(), renderDelta(new Date().getTime())),
@ -21,14 +24,14 @@ export async function callback(client, or, nr) {
mentionable[1] = nr.mentionable ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`; mentionable[1] = nr.mentionable ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`;
hoist[0] = or.hoist ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`; hoist[0] = or.hoist ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`;
hoist[1] = nr.hoist ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`; hoist[1] = nr.hoist ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`;
if (or.name !== nr.name) changes.name = entry([or.name, nr.name], `${or.name} -> ${nr.name}`); if (or.name !== nr.name) changes["name"] = entry([or.name, nr.name], `${or.name} -> ${nr.name}`);
if (or.position !== nr.position) if (or.position !== nr.position)
changes.position = entry([or.position, nr.position], `${or.position} -> ${nr.position}`); changes["position"] = entry([or.position, nr.position], `${or.position} -> ${nr.position}`);
if (or.hoist !== nr.hoist) changes.showInMemberList = entry([or.hoist, nr.hoist], `${hoist[0]} -> ${hoist[1]}`); if (or.hoist !== nr.hoist) changes["showInMemberList"] = entry([or.hoist, nr.hoist], `${hoist[0]} -> ${hoist[1]}`);
if (or.mentionable !== nr.mentionable) if (or.mentionable !== nr.mentionable)
changes.mentionable = entry([or.mentionable, nr.mentionable], `${mentionable[0]} -> ${mentionable[1]}`); changes["mentionable"] = entry([or.mentionable, nr.mentionable], `${mentionable[0]} -> ${mentionable[1]}`);
if (or.hexColor !== nr.hexColor) if (or.hexColor !== nr.hexColor)
changes.color = entry([or.hexColor, nr.hexColor], `\`${or.hexColor}\` -> \`${nr.hexColor}\``); changes["color"] = entry([or.hexColor, nr.hexColor], `\`${or.hexColor}\` -> \`${nr.hexColor}\``);
if (Object.keys(changes).length === 4) return; if (Object.keys(changes).length === 4) return;

@ -1,9 +1,13 @@
export const event = "stickerCreate"; // @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { GuildAuditLogsEntry, Sticker } from "discord.js";
export async function callback(client, emoji) { export const event = "stickerDelete";
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = emoji.client.logger;
export async function callback(client: HaikuClient, emoji: Sticker) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
const auditLog = await getAuditLog(emoji.guild, "STICKER_CREATE"); const auditLog = await getAuditLog(emoji.guild, "STICKER_CREATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === emoji.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === emoji.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {
@ -21,7 +25,7 @@ export async function callback(client, emoji) {
created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp)) created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp))
}, },
hidden: { hidden: {
guild: emoji.guild.id guild: emoji.guild!.id
} }
}; };
log(data); log(data);

@ -1,9 +1,13 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { GuildAuditLogsEntry, Sticker } from "discord.js";
export const event = "stickerDelete"; export const event = "stickerDelete";
export async function callback(client, emoji) { export async function callback(client: HaikuClient, emoji: Sticker) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = emoji.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
const auditLog = await getAuditLog(emoji.guild, "STICKER_DELETE"); const auditLog = await getAuditLog(emoji.guild, "STICKER_DELETE");
const audit = auditLog.entries.filter((entry) => entry.target.id === emoji.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === emoji.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const data = { const data = {
meta: { meta: {
@ -22,7 +26,7 @@ export async function callback(client, emoji) {
deleted: entry(audit.createdTimestamp, renderDelta(audit.createdTimestamp)) deleted: entry(audit.createdTimestamp, renderDelta(audit.createdTimestamp))
}, },
hidden: { hidden: {
guild: emoji.guild.id guild: emoji.guild!.id
} }
}; };
log(data); log(data);

@ -1,17 +1,21 @@
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
import type { Sticker } from "discord.js";
export const event = "stickerUpdate"; export const event = "stickerUpdate";
export async function callback(client, oe, ne) { export async function callback(client: HaikuClient, oe: Sticker, ne: Sticker) {
const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser } = client.logger; const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser } = client.logger;
if (oe.name === ne.name) return; if (oe.name === ne.name) return;
const auditLog = await getAuditLog(ne.guild, "EMOJI_UPDATE"); const auditLog = await getAuditLog(ne.guild, "STICKER_UPDATE");
const audit = auditLog.entries.first(); const audit = auditLog.entries.first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const changes = { const changes = {
stickerId: entry(ne.id, `\`${ne.id}\``), stickerId: entry(ne.id, `\`${ne.id}\``),
edited: entry(ne.createdTimestamp, renderDelta(ne.createdTimestamp)), edited: entry(ne.createdTimestamp, renderDelta(ne.createdTimestamp)),
editedBy: entry(audit.executor.id, renderUser((await ne.guild.members.fetch(audit.executor.id)).user)), editedBy: entry(audit.executor.id, renderUser((await ne.guild!.members.fetch(audit.executor.id)).user)),
name: entry([oe.name, ne.name], `\`:${oe.name}:\` -> \`:${ne.name}:\``) name: entry([oe.name, ne.name], `\`:${oe.name}:\` -> \`:${ne.name}:\``)
}; };
const data = { const data = {
@ -25,7 +29,7 @@ export async function callback(client, oe, ne) {
}, },
list: changes, list: changes,
hidden: { hidden: {
guild: ne.guild.id guild: ne.guild!.id
} }
}; };
log(data); log(data);

@ -1,11 +1,19 @@
import type { GuildAuditLogsEntry, ThreadChannel } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
export const event = "threadCreate"; export const event = "threadCreate";
export async function callback(client, thread) { export async function callback(client: HaikuClient, thread: ThreadChannel) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = thread.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(thread.guild, "THREAD_CREATE"); const auditLog = await getAuditLog(thread.guild, "THREAD_CREATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === thread.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === thread.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const category = thread.parent ? entry(
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
) : entry(null, "Uncategorised")
const data = { const data = {
meta: { meta: {
type: "channelCreate", type: "channelCreate",
@ -19,13 +27,10 @@ export async function callback(client, thread) {
threadId: entry(thread.id, `\`${thread.id}\``), threadId: entry(thread.id, `\`${thread.id}\``),
name: entry(thread.name, renderChannel(thread)), name: entry(thread.name, renderChannel(thread)),
parentChannel: entry(thread.parentId, renderChannel(thread.parent)), parentChannel: entry(thread.parentId, renderChannel(thread.parent)),
category: entry( category: category,
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
),
autoArchiveDuration: entry( autoArchiveDuration: entry(
thread.autoArchiveDuration, thread.autoArchiveDuration,
humanizeDuration(thread.autoArchiveDuration * 60 * 1000, { humanizeDuration((thread.autoArchiveDuration ?? 0) * 60 * 1000, {
round: true round: true
}) })
), ),

@ -1,11 +1,19 @@
import type { GuildAuditLogsEntry, ThreadChannel } from "discord.js";
// @ts-expect-error
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
// @ts-expect-error
import type { HaikuClient } from "jshaiku"
export const event = "threadDelete"; export const event = "threadDelete";
export async function callback(client, thread) { export async function callback(client: HaikuClient, thread: ThreadChannel) {
const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = thread.client.logger; const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger;
const auditLog = await getAuditLog(thread.guild, "THREAD_UPDATE"); const auditLog = await getAuditLog(thread.guild, "THREAD_UPDATE");
const audit = auditLog.entries.filter((entry) => entry.target.id === thread.id).first(); const audit = auditLog.entries.filter((entry: GuildAuditLogsEntry) => entry.target!.id === thread.id).first();
if (audit.executor.id === client.user.id) return; if (audit.executor.id === client.user.id) return;
const category = thread.parent ? entry(
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
) : entry(null, "Uncategorised")
const data = { const data = {
meta: { meta: {
type: "channelDelete", type: "channelDelete",
@ -18,14 +26,11 @@ export async function callback(client, thread) {
list: { list: {
threadId: entry(thread.id, `\`${thread.id}\``), threadId: entry(thread.id, `\`${thread.id}\``),
name: entry(thread.name, thread.name), name: entry(thread.name, thread.name),
parentChannel: entry(thread.parentId, renderChannel(thread.parent)), parentChannel: entry(thread.parentId, thread.parent ? renderChannel(thread.parent) : "*None*"),
category: entry( category: category,
thread.parent.parent ? thread.parent.parent.name : "None",
thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
),
autoArchiveDuration: entry( autoArchiveDuration: entry(
thread.autoArchiveDuration, thread.autoArchiveDuration,
humanizeDuration(thread.autoArchiveDuration * 60 * 1000, { humanizeDuration((thread.autoArchiveDuration ?? 0) * 60 * 1000, {
round: true round: true
}) })
), ),

@ -1,4 +1,4 @@
import { CommandInteraction, GuildMember, Message, MessageActionRow, MessageButton, TextChannel } from "discord.js"; import { CommandInteraction, GuildMember, Message, MessageActionRow, MessageButton, MessageComponentInteraction, TextChannel } from "discord.js";
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 { PasteClient, Publicity, ExpireDate } from "pastebin-api"; import { PasteClient, Publicity, ExpireDate } from "pastebin-api";
@ -7,7 +7,7 @@ import client from "../utils/client.js";
const pbClient = new PasteClient(config.pastebinApiKey); const pbClient = new PasteClient(config.pastebinApiKey);
export default async function (interaction: CommandInteraction) { export default async function (interaction: CommandInteraction | MessageComponentInteraction) {
if (interaction.channel === null) return; if (interaction.channel === null) return;
if (!(interaction.channel instanceof TextChannel)) return; if (!(interaction.channel instanceof TextChannel)) return;
const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger; const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;

@ -1,3 +1,4 @@
import type { Guild, User } from 'discord.js';
// @ts-expect-error // @ts-expect-error
import type { HaikuClient } from "jshaiku"; import type { HaikuClient } from "jshaiku";
import type { GuildMember } from "discord.js"; import type { GuildMember } from "discord.js";
@ -9,28 +10,29 @@ interface PropSchema {
name: string; name: string;
} }
export async function callback(client: HaikuClient, member: GuildMember) { export async function callback(client: HaikuClient, member?: GuildMember, guild?: Guild, user?: User) {
const guild = await client.guilds.fetch(member.guild.id); if (!member && !guild) return;
guild = await client.guilds.fetch(member ? member.guild.id : guild!.id);
if (!guild) return;
user = user ?? member!.user
const config = await client.database.guilds.read(guild.id); const config = await client.database.guilds.read(guild.id);
Object.entries(config.getKey("stats")).forEach(async ([channel, props]) => { Object.entries(config.getKey("stats")).forEach(async ([channel, props]) => {
if ((props as PropSchema).enabled) { if ((props as PropSchema).enabled) {
let string = (props as PropSchema).name; let string = (props as PropSchema).name;
if (!string) return; if (!string) return;
string = await convertCurlyBracketString(string, member.id, member.displayName, guild.name, guild.members); string = await convertCurlyBracketString(string, user!.id, user!.username, guild!.name, guild!.members);
let fetchedChannel; let fetchedChannel;
try { try {
fetchedChannel = await guild.channels.fetch(channel); fetchedChannel = await guild!.channels.fetch(channel);
} catch (e) { } catch (e) {
fetchedChannel = null; fetchedChannel = null;
} }
if (!fetchedChannel) { if (!fetchedChannel) {
const deleted = config.getKey("stats")[channel]; const deleted = config.getKey("stats")[channel];
console.log(`stats.${channel}`); await client.database.guilds.write(guild!.id, null, `stats.${channel}`);
console.log(guild.id);
await client.database.guilds.write(guild.id, null, `stats.${channel}`);
return singleNotify( return singleNotify(
"statsChannelDeleted", "statsChannelDeleted",
guild.id, guild!.id,
"One or more of your stats channels have been deleted. Please use `/settings stats` if you wish to add the channel again.\n" + "One or more of your stats channels have been deleted. Please use `/settings stats` if you wish to add the channel again.\n" +
`The channels name was: ${deleted.name}`, `The channels name was: ${deleted.name}`,
"Critical" "Critical"

@ -1,5 +1,5 @@
import { LoadingEmbed } from "./../utils/defaultEmbeds.js"; import { LoadingEmbed } from "./../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, GuildMember, Interaction, Permissions, Role } from "discord.js"; import Discord, { CommandInteraction, GuildMember, Interaction, MessageComponentInteraction, Permissions, Role } from "discord.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js"; import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import fetch from "node-fetch"; import fetch from "node-fetch";
import { TestString, NSFWCheck } from "./scanners.js"; import { TestString, NSFWCheck } from "./scanners.js";
@ -21,7 +21,7 @@ function step(i: number) {
return "\n\n" + createPageIndicator(5, i); return "\n\n" + createPageIndicator(5, i);
} }
export default async function (interaction: CommandInteraction) { export default async function (interaction: CommandInteraction | MessageComponentInteraction) {
const verify = client.verify; const verify = client.verify;
await interaction.reply({ await interaction.reply({
embeds: LoadingEmbed, embeds: LoadingEmbed,

@ -13,6 +13,6 @@
"skipLibCheck": true, "skipLibCheck": true,
"noImplicitReturns": false "noImplicitReturns": false
}, },
"include": ["src/**/*", "*.js"], "include": ["src/**/*"],
"exclude": [] "exclude": []
} }

Loading…
Cancel
Save