A powerful and extendable Discord bot, with it's own module system :3
thevoid.cafe/projects/voidy
1import { PermissionFlagsBits } from "discord.js";
2import { Button } from "@voidy/framework";
3
4export default new Button({
5 id: "MemberLogging",
6
7 execute: async ({ interaction, args }) => {
8 const [action, targetId] = args(interaction.customId);
9
10 if (!action || !targetId) {
11 await interaction.reply({ content: "Invalid button data.", ephemeral: true });
12 return;
13 }
14
15 const member = await interaction.guild?.members.fetch(targetId).catch(() => null);
16
17 if (!member) {
18 await interaction.reply({ content: "Member not found in this server.", ephemeral: true });
19 return;
20 }
21
22 switch (action) {
23 case "Kick": {
24 if (!interaction.memberPermissions?.has(PermissionFlagsBits.KickMembers)) {
25 await interaction.reply({
26 content: "You need the **Kick Members** permission.",
27 ephemeral: true,
28 });
29 return;
30 }
31
32 if (!member.kickable) {
33 await interaction.reply({ content: "I cannot kick this member.", ephemeral: true });
34 return;
35 }
36
37 await member.kick(`Kicked by ${interaction.user.tag} via member logging`);
38 await interaction.reply({ content: `**${member.user.tag}** has been kicked.` });
39 break;
40 }
41 case "Ban": {
42 if (!interaction.memberPermissions?.has(PermissionFlagsBits.BanMembers)) {
43 await interaction.reply({
44 content: "You need the **Ban Members** permission.",
45 ephemeral: true,
46 });
47 return;
48 }
49
50 if (!member.bannable) {
51 await interaction.reply({ content: "I cannot ban this member.", ephemeral: true });
52 return;
53 }
54
55 await member.ban({ reason: `Banned by ${interaction.user.tag} via member logging` });
56 await interaction.reply({ content: `**${member.user.tag}** has been banned.` });
57 break;
58 }
59 default:
60 await interaction.reply({ content: "Unknown action.", ephemeral: true });
61 }
62 },
63});