diff --git a/.env.example b/.env.example index d0e4a98..6a3f672 100644 --- a/.env.example +++ b/.env.example @@ -4,6 +4,7 @@ SERVER_ID= SAY_LOGS_CHANNEL= LOGS_CHANNEL= SIMULATED_BAN_SHARE_LOGS_CHANNEL= +BAN_LOGS_CHANNEL= # These arent needed outside of production MAVEN_REPO= diff --git a/src/handlers/button.handler.ts b/src/handlers/button.handler.ts index bc1a651..5da7552 100644 --- a/src/handlers/button.handler.ts +++ b/src/handlers/button.handler.ts @@ -2,37 +2,30 @@ import { ButtonBuilder, ButtonInteraction, Events, + Interaction, InteractionButtonComponentData, } from 'discord.js'; import { Handler } from '..'; -import { BaseSchema, Output } from 'valibot'; -import { error } from 'console'; // eslint-disable-next-line @typescript-eslint/no-explicit-any const buttonMap = new Map>(); -export class Button { +export class Button { id: string; - args?: ArgsType; _onPress?: (interaction: ButtonInteraction, args: ArgsType) => unknown; constructor( id: string, - args: ArgsType, - onPress: ( - interaction: ButtonInteraction, - args: Output - ) => unknown + onPress: (interaction: ButtonInteraction, args: ArgsType) => unknown ) { this.id = id; if (buttonMap.has(id)) console.error(`Button ${id} is already defined`); buttonMap.set(id, this); this._onPress = onPress; - this.args = args; } button( data: Partial, - args: Output + args: ArgsType ): ButtonBuilder { const button = new ButtonBuilder({ ...data, @@ -43,7 +36,7 @@ export class Button { } export const buttonHandler: Handler = (client) => { - client.on(Events.InteractionCreate, async (interaction) => { + client.on(Events.InteractionCreate, async (interaction: Interaction) => { if (!interaction.isButton()) return; const data = JSON.parse(interaction.customId); const args = data.args; @@ -51,9 +44,12 @@ export const buttonHandler: Handler = (client) => { if (!buttonMap.has(data.id)) return; const button = buttonMap.get(data.id); if (!button) return; - if (!button.args) throw error('No args set in button'); - const parsedArgs = button.args.parse(args); + if (!button._onPress) return; - button._onPress(interaction, parsedArgs); + try { + button._onPress(interaction, args); + } catch { + interaction.reply('error while executing'); + } }); }; diff --git a/src/logIssueAnalyzers/optifine.ts b/src/logIssueAnalyzers/optifine.ts index 70d69ca..32cb32e 100644 --- a/src/logIssueAnalyzers/optifine.ts +++ b/src/logIssueAnalyzers/optifine.ts @@ -9,7 +9,7 @@ export const optifineAnalyzer: Analyzer = async (log) => { if (matchesOptifine?.[1] == 'true') { return { name: 'Optifine Warning Disabled', - value: 'You appeared to have disabled the Optifine warning. Many issues you might encounter are caused by Optifine. You will most likely get any support due to this.', + value: 'You appeared to have disabled the Optifine warning. Many issues you might encounter are caused by Optifine. You will not get any support due to this.', }; } else { return { diff --git a/src/types/environment.d.ts b/src/types/environment.d.ts index 74cff88..37bd4b2 100644 --- a/src/types/environment.d.ts +++ b/src/types/environment.d.ts @@ -7,6 +7,7 @@ declare global { SERVER_ID: string; SAY_LOGS_CHANNEL: string; LOGS_CHANNEL: string; + BAN_LOGS_CHANNEL: string; MAVEN_REPO: string; GITHUB_STATUS_CHANNEL: string; GITHUB_SECRET: string; diff --git a/src/webserver/banshare.ts b/src/webserver/banshare.ts index 8c988c8..c1d1146 100644 --- a/src/webserver/banshare.ts +++ b/src/webserver/banshare.ts @@ -11,14 +11,12 @@ import { TextInputBuilder, } from 'discord.js'; import { Button } from '../handlers/button.handler'; -import { string, object } from 'valibot'; const banButton = new Button( 'ban', - object({ userId: string() }), - async (interaction, data) => { + async (interaction, data: { userId: string }) => { const reason = - 'aero banshare: ' + + 'simulated banshare: ' + (interaction.message.embeds[0].fields[3].value ?? 'no reason provided'); const modal = new ModalBuilder() @@ -32,20 +30,58 @@ const banButton = new Button( .setValue(reason) ) ); - interaction.showModal(modal); + await interaction.showModal(modal); interaction .awaitModalSubmit({ filter: (interaction) => interaction.customId == modal.data.custom_id, time: 300_000, }) - .then((modalResponse) => { + .then(async (modalResponse) => { interaction.guild?.bans.create(data.userId, { reason: modalResponse.components[0].components[0].value, }); - interaction.reply( - `<@${data.userId}> (\`${data.userId}\`) was banned.` - ); + await interaction.reply({ + content: `<@${data.userId}> (\`${data.userId}\`) was banned.`, + ephemeral: true, + }); + await interaction.update({ + components: [ + new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setLabel('ban') + .setStyle(ButtonStyle.Danger) + .setDisabled(true) + ), + ], + }); + if (interaction.guild != null) { + const channel = await interaction.guild.channels.fetch( + process.env.BAN_LOGS_CHANNEL + ); + if (channel?.isTextBased()) { + channel.send({ + embeds: [ + new EmbedBuilder() + .setTitle('User Banned via Banshare') + .setDescription( + `<@!${data.userId}> was banned!` + ) + .setFields([ + { + name: 'Reason', + value: modalResponse.components[0] + .components[0].value, + }, + { + name: 'By', + value: interaction.user.username, + }, + ]), + ], + }); + } + } }); } ); @@ -87,6 +123,7 @@ const handleBan = async (client: Client, req: Request) => { const embed = new EmbedBuilder() .setTitle(`Incoming ban from ${server}`) .addFields( + { name: 'User', value: `<@!${user.id}>` }, { name: 'Username', value: user.username }, { name: 'User ID', value: user.id }, { name: 'Present in server', value: `${present}` },