feat(bot-discord): mute and unmute command

This commit is contained in:
GramingFoxTeam
2023-08-07 13:15:19 +03:00
parent d11ee5f01f
commit e5cf9f214e
13 changed files with 605 additions and 6 deletions

View File

@@ -0,0 +1,74 @@
import parse from 'parse-duration'
import setMuteTimeout from './setMuteTimeout.js';
parse['mo'] = parse['month']
export default async function muteMember(config, member, { duration, reason, supportMute }) {
const parsedDuration = parse(duration);
const expires = Date.now() + parsedDuration;
const takenRoles = [];
for (const takeRole of supportMute ?
config.discord.mute.supportTakeRoles :
config.discord.mute.takeRoles
) {
if (member.roles.cache.get(takeRole)) {
takenRoles.push(takeRoles);
}
}
const existingMute = await member.client.db.collection('mute').findOne({
guild_id: member.guild.id,
user_id: member.id
});
if (existingMute) {
// Update existing mute
await member.client.db.collection('mute').updateOne({
guild_id: member.guild.id,
user_id: member.id
}, {
$set: {
reason,
expires,
support_mute: supportMute
}
});
if (client.mutes.has(member.id)) {
clearTimeout(client.mutes.get(member.id))
client.mutes.delete(member.id);
}
} else {
await member.client.db.collection('mute').insert({
guild_id: member.guild.id,
user_id: member.id,
taken_roles: takenRoles,
expires,
reason,
support_mute: supportMute
});
}
// Remove the roles, give defined roles.
if (!existingMute) {
member.roles.remove(takenRoles);
member.roles.add(supportMute ?
config.discord.mute.giveRoles :
config.discord.mute.supportGiveRoles
);
}
// Start a timeout.
setMuteTimeout({
guild_id: member.guild.id,
user_id: member.id,
taken_roles: takenRoles,
expires,
support_mute: supportMute
}, member.client.mutes);
// Return parsed time for the mute command to resolve.
return expires;
}

View File

@@ -3,9 +3,12 @@ import { EmbedBuilder, messageLink } from 'discord.js';
export default async function reportToLogs(config, client, action, message, { reason, expire, actionTo, actionBy }, msgChannel) {
const channel = await client.channels.fetch(config.logs.channelId);
const thread = await channel.threads.fetch(config.logs.threadId);
const actionUpper = action.charAt(0).toUpperCase() + action.slice(1);
const actionTitle = `${actionUpper} ${actionTo.tag}`;
const actionEmbed = new EmbedBuilder()
.setThumbnail(actionTo.user.avatarURL());
.setThumbnail(actionTo.user.avatarURL())
.setTitle(actionTitle);
const fields = [
{ name: 'Action', value: `${actionTo.toString()} was ${action} by ${actionBy.toString()}` }

View File

@@ -0,0 +1,19 @@
export default async function setMuteTimeout(mute, mutes) {
const duration = Date.now() - mute.expires;
mutes.set(mute.user_id, setTimeout(async() => {
const guild = await client.guilds.fetch(mute.guild_id);
let member;
try {
member = await guild.members.fetch(mute.user_id);
} catch (_) {
return;
}
member.roles.add(mute.taken_roles);
member.roles.remove(
mute.support_mute ?
config.discord.mute.supportGiveRoles :
config.discord.mute.giveRoles
);
}, duration));
}

View File

@@ -0,0 +1,22 @@
export default async function unmuteMember(config, member) {
const mute = await member.client.db.collection('mute').findOne({
guild_id: member.guild.id,
user_id: member.id
});
if (!mute) return false;
member.roles.remove(mute.support_mute ?
config.mute.supportGiveRoles :
config.mute.giveRoles
);
member.roles.add(mute.taken_roles);
await member.client.db.collection('mute').remove({
guild_id: member.guild.id,
user_id: member.id
});
return true;
}