Skip to content

Commit

Permalink
automod permit
Browse files Browse the repository at this point in the history
  • Loading branch information
Kathund committed Jul 30, 2024
1 parent bcea998 commit 9633c83
Show file tree
Hide file tree
Showing 10 changed files with 173 additions and 6 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/config.json
node_modules/
logs/
build/
build/
data/
4 changes: 3 additions & 1 deletion config.example.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@
"teamRole": "TEAM_ROLE_ID",
"devRole": "DEV_ROLE_ID",
"contributorsRole": "CONTRIBUTORS_ROLE_ID",
"supportCategory": "SUPPORT_CATEGORY_ID"
"supportCategory": "SUPPORT_CATEGORY_ID",
"autoModBypassRole": "AUTOMOD_BYPASS_ROLE_ID",
"serverId": "SERVER_ID"
}
4 changes: 2 additions & 2 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Client, Events, GatewayIntentBits } from 'discord.js';
import deployCommands from './src/functions/deployCommands';
import DeployCommands from './src/functions/DeployCommands';
import { execute } from './src/events/ready';
import { token } from './config.json';

Expand All @@ -12,7 +12,7 @@ const client: Client = new Client({
]
});

deployCommands(client);
DeployCommands(client);

client.on(Events.ClientReady, () => {
execute(client);
Expand Down
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,16 @@
"discord.js": "^14.15.3",
"discord.js-docs": "^0.3.0",
"mongoose": "^8.5.1",
"ms": "^2.1.3",
"node-cron": "^3.0.3",
"winston": "^3.13.1"
},
"devDependencies": {
"@eslint/js": "^9.8.0",
"@types/eslint": "^9.6.0",
"@types/ms": "^0.7.34",
"@types/node": "^22.0.0",
"@types/node-cron": "^3.0.11",
"eslint": "^9.8.0",
"eslint-config-prettier": "^9.1.0",
"globals": "^15.8.0",
Expand Down
36 changes: 36 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

96 changes: 96 additions & 0 deletions src/commands/automod.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { ChatInputCommandInteraction, GuildMemberRoleManager, SlashCommandBuilder, EmbedBuilder } from 'discord.js';
import { contributorsRole, teamRole, devRole, autoModBypassRole } from '../../config.json';
import { readFileSync, writeFileSync } from 'fs';
import ms from 'ms';

export const data = new SlashCommandBuilder()
.setName('automod')
.setDescription('Manage AutoMod')
.addSubcommand((subcommand) =>
subcommand
.setName('permit')
.setDescription('Allow someone to bypass automod')
.addUserOption((option) => option.setName('user').setDescription('The user to permit').setRequired(true))
.addStringOption((option) =>
option.setName('time').setDescription('The Message link to reply with the tag').setRequired(false)
)
);

export interface Permit {
id: string;
removeTime: number;
}

export async function execute(interaction: ChatInputCommandInteraction): Promise<void> {
try {
if (!interaction.member || !interaction.guild) return;
const subCommand = interaction.options.getSubcommand();
const memberRoles = (interaction.member.roles as GuildMemberRoleManager).cache.map((role) => role.id);
switch (subCommand) {
case 'permit': {
if (!memberRoles.some((role) => [contributorsRole, teamRole, devRole].includes(role))) {
await interaction.reply({
content: 'You do not have permission to use this command',
ephemeral: true
});
}
const permitData = readFileSync('data/permit.json');
if (!permitData) {
await interaction.reply({
content: 'The linked data file does not exist. Please contact an administrator.'
});
}

const permit = JSON.parse(permitData.toString());
if (!permit) {
await interaction.reply({
content: 'The linked data file is malformed. Please contact an administrator.'
});
}
const user = interaction.options.getUser('user');
const time = interaction.options.getString('time') || '10m';
if (!user) {
await interaction.reply({
content: 'Please provide a valid user',
ephemeral: true
});
return;
}
const guildUser = await interaction.guild.members.fetch(user.id);
const msTime = ms(time);
const removeTime = Math.floor((new Date().getTime() + msTime) / 1000);
permit.push({
id: user.id,
removeTime
});
writeFileSync('data/permit.json', JSON.stringify(permit));
guildUser.roles.add(autoModBypassRole);
const embed = new EmbedBuilder()
.setTitle('User permitted')
.setDescription(`User ${user} has been permitted to <t:${removeTime}:t> (<t:${removeTime}:R>)`);
await interaction.reply({ embeds: [embed] });
break;
}
default: {
const embed = new EmbedBuilder()
.setTitle('Invalid subcommand')
.setDescription('Please provide a valid subcommand');
await interaction.reply({ embeds: [embed] });
}
}
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
if (interaction.replied || interaction.deferred) {
await interaction.followUp({
content: 'Something went wrong. Please try again later.',
ephemeral: true
});
return;
}
await interaction.reply({
content: 'Something went wrong. Please try again later.',
ephemeral: true
});
}
}
7 changes: 5 additions & 2 deletions src/events/ready.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import deployEvents from '../functions/deployEvents';
import CheckPermits from '../functions/CheckPermits';
import DeployEvents from '../functions/DeployEvents';
import { eventMessage } from '../functions/logger';
import { connectDB } from '../functions/mongo';
import { Client } from 'discord.js';
import cron from 'node-cron';

export function execute(client: Client): void {
try {
eventMessage(`Logged in as ${client.user?.username} (${client.user?.id})!`);
deployEvents(client);
DeployEvents(client);
connectDB();
cron.schedule(`* * * * *`, () => CheckPermits(client));
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
Expand Down
25 changes: 25 additions & 0 deletions src/functions/CheckPermits.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { serverId, autoModBypassRole } from '../../config.json';
import { readFileSync, writeFileSync } from 'fs';
import { Permit } from '../commands/automod';
import { Client } from 'discord.js';

export default async function CheckPermits(client: Client) {
const guild = await client.guilds.fetch(serverId);
const permitData = readFileSync('data/permit.json');
if (!permitData) return;
const permit = JSON.parse(permitData.toString());
if (!permit) return;

const currentTime = Math.floor(new Date().getTime() / 1000);
permit.forEach((user: Permit) => {
if (user.removeTime < currentTime) {
const guildMember = guild.members.cache.get(user.id);
if (guildMember) {
guildMember.roles.remove(autoModBypassRole);
}
permit.splice(permit.indexOf(user), 1);
}
});

writeFileSync('data/permit.json', JSON.stringify(permit));
}
File renamed without changes.
File renamed without changes.

0 comments on commit 9633c83

Please sign in to comment.