diff --git a/database/3.2.4/1732973911304-createAutoKickConfig/Down/01-AutoKickConfig.sql b/database/3.2.4/1732973911304-createAutoKickConfig/Down/01-AutoKickConfig.sql new file mode 100644 index 0000000..8412a02 --- /dev/null +++ b/database/3.2.4/1732973911304-createAutoKickConfig/Down/01-AutoKickConfig.sql @@ -0,0 +1 @@ +DROP TABLE auto_kick_config; diff --git a/database/3.2.4/1732973911304-createAutoKickConfig/Up/01-AutoKickConfig-Table.sql b/database/3.2.4/1732973911304-createAutoKickConfig/Up/01-AutoKickConfig-Table.sql new file mode 100644 index 0000000..e7d377a --- /dev/null +++ b/database/3.2.4/1732973911304-createAutoKickConfig/Up/01-AutoKickConfig-Table.sql @@ -0,0 +1,10 @@ +CREATE TABLE auto_kick_config ( + Id varchar(255) NOT NULL, + WhenCreated datetime NOT NULL, + WhenUpdated datetime NOT NULL, + ServerId varchar(255) NOT NULL, + RoleId varchar(255) NOT NULL, + KickTime int NOT NULL, + NoticeTime int NULL, + NoticeChannelId varchar(255) NULL +); diff --git a/database/3.2.4/1732973911304-createAutoKickConfig/Up/02-AutoKickConfig-Key.sql b/database/3.2.4/1732973911304-createAutoKickConfig/Up/02-AutoKickConfig-Key.sql new file mode 100644 index 0000000..e3fec43 --- /dev/null +++ b/database/3.2.4/1732973911304-createAutoKickConfig/Up/02-AutoKickConfig-Key.sql @@ -0,0 +1,2 @@ +ALTER TABLE auto_kick_config + ADD PRIMARY KEY (Id); diff --git a/src/commands/autokick.ts b/src/commands/autokick.ts new file mode 100644 index 0000000..09318b3 --- /dev/null +++ b/src/commands/autokick.ts @@ -0,0 +1,54 @@ +import {CommandInteraction, PermissionFlagsBits, SlashCommandBuilder} from "discord.js"; +import {Command} from "../type/command"; + +export default class Autokick extends Command { + constructor() { + super(); + + this.CommandBuilder = new SlashCommandBuilder() + .setName("autokick") + .setDescription("Configure the auto kick functionality") + .setDefaultMemberPermissions(PermissionFlagsBits.KickMembers) + .addSubcommand(x => x + .setName("set") + .setDescription("Set the configuration") + .addRoleOption(y => y + .setName("role") + .setDescription("The role the user needs to be auto kicked") + .setRequired(true)) + .addStringOption(y => y + .setName("kicktime") + .setDescription("The time with the role before being kicked (Ex: 2h 30m)") + .setRequired(true)) + .addStringOption(y => y + .setName("noticetime") + .setDescription("The time before being kicked when a notification is sent (Ex: 2h 30m)")) + .addChannelOption(y => y + .setName("noticechannel") + .setDescription("The channel to send the notification to"))) + .addSubcommand(x => x + .setName("unset") + .setDescription("Unset the current configuration")); + } + + public override async execute(interaction: CommandInteraction) { + if (!interaction.isChatInputCommand()) return; + + const subcommand = interaction.options.getSubcommand(); + + switch (subcommand) { + case "set": + await this.set(interaction); + break; + case "unset": + await this.unset(interaction); + break; + } + } + + private async set(interaction: CommandInteraction) { + } + + private async unset(interaction: CommandInteraction) { + } +} diff --git a/src/database/entities/AutoKickConfig.ts b/src/database/entities/AutoKickConfig.ts new file mode 100644 index 0000000..1ee3625 --- /dev/null +++ b/src/database/entities/AutoKickConfig.ts @@ -0,0 +1,50 @@ +import {Column, Entity} from "typeorm"; +import AppDataSource from "../dataSources/appDataSource"; +import BaseEntity from "../../contracts/BaseEntity"; + +@Entity() +export default class AutoKickConfig extends BaseEntity { + constructor(serverId: string, roleId: string, kickTime: number, noticeTime?: number, noticeChannelId?: string) { + super(); + + this.ServerId = serverId; + this.RoleId = roleId; + this.KickTime = kickTime; + this.NoticeTime = noticeTime; + this.NoticeChannelId = noticeChannelId; + } + + @Column() + ServerId: string; + + @Column() + RoleId: string; + + @Column({ type: "int" }) + KickTime: number; + + @Column({ type: "int", nullable: true }) + NoticeTime?: number; + + @Column({ nullable: true }) + NoticeChannelId?: string; + + public UpdateBasicDetails(roleId: string, kickTime: number, noticeTime?: number, noticeChannelId?: string) { + this.RoleId = roleId; + this.KickTime = kickTime; + this.NoticeTime = noticeTime; + this.NoticeChannelId = noticeChannelId; + } + + public static async FetchOneByServerIdAndRoleId(serverId: string, roleId: string): Promise { + const repository = AppDataSource.getRepository(AutoKickConfig); + + const query = repository + .createQueryBuilder("config") + .where("config.serverId = :serverId", { serverId }) + .andWhere("config.roleId = :roleId", { roleId }) + .getOne(); + + return query; + } +} diff --git a/src/database/migrations/3.2.4/1732973911304-createAutoKickConfig.ts b/src/database/migrations/3.2.4/1732973911304-createAutoKickConfig.ts new file mode 100644 index 0000000..c4e9a74 --- /dev/null +++ b/src/database/migrations/3.2.4/1732973911304-createAutoKickConfig.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; +import MigrationHelper from "../../../helpers/MigrationHelper"; + +export class CreateAutoKickConfig1732973911304 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + MigrationHelper.Up("1732973911304-createAutoKickConfig", "3.2.4", [ + "01-AutoKickConfig-Table", + "02-AutoKickConfig-Key", + ], queryRunner) + } + + public async down(queryRunner: QueryRunner): Promise { + MigrationHelper.Down("1732973911304-createAutoKickConfig", "3.2.4", [ + "01-AutoKickConfig", + ], queryRunner) + } + +}