Added warn reason! (w.i.p.)

This commit is contained in:
CorwinDev 2023-01-09 19:30:34 +01:00
parent 3d622cc370
commit 09315185b1
10 changed files with 276 additions and 84 deletions

View file

@ -11,10 +11,19 @@ module.exports = async (client, interaction, args) => {
if (perms == false) return; if (perms == false) return;
var member = interaction.options.getUser('user'); var member = interaction.options.getUser('user');
var Case = interaction.options.getInteger('case');
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
data.Warns -= 1; var warn = data.Warnings.find(x => x.Case == Case);
if (!warn) {
client.errNormal({
error: "This user doesn't have a warning with this case number!",
type: 'editreply'
}, interaction);
return;
}
data.Warnings.splice(data.Warnings.indexOf(warn), 1);
data.save(); data.save();
} }
else { else {

View file

@ -1,27 +1,59 @@
const Discord = require('discord.js'); const Discord = require('discord.js');
const Schema = require("../../database/models/warnings"); const Schema = require("../../database/models/warnings");
const Case = require("../../database/models/warnCase");
module.exports = async (client, interaction, args) => { module.exports = async (client, interaction, args) => {
const perms = await client.checkUserPerms({ const perms = await client.checkUserPerms({
flags: [Discord.PermissionsBitField.Flags.ManageMessages], flags: [Discord.PermissionsBitField.Flags.ManageMessages],
perms: [Discord.PermissionsBitField.Flags.ManageMessages] perms: [Discord.PermissionsBitField.Flags.ManageMessages]
}, interaction); }, interaction);
if (perms == false) return; if (perms == false) {
client.errNormal({
error: "You don't have the required permissions to use this command!",
type: 'editreply'
}, interaction);
return;
}
var member = interaction.options.getUser('user'); var member = interaction.options.getUser('user');
var reason = interaction.options.getString('reason');
var caseNumber;
await Case.findOne({ Guild: interaction.guild.id }).then(async data => {
if (!data) {
new Case({
Guild: interaction.guild.id,
Case: 1
}).save();
caseNumber = 1;
}
else {
data.Case += 1;
data.save();
caseNumber = data.Case;
}
});
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
data.Warns += 1 data.Warnings.push({
Moderator: interaction.user.id,
Reason: reason,
Date: Date.now(),
Case: caseNumber
});
data.save(); data.save();
} }
else { else {
new Schema({ new Schema({
Guild: interaction.guild.id, Guild: interaction.guild.id,
User: member.id, User: member.id,
Warns: 1 Warnings: [{
Moderator: interaction.user.id,
Reason: reason,
Date: Date.now(),
Case: caseNumber
}]
}).save(); }).save();
} }
}) })
@ -35,10 +67,15 @@ module.exports = async (client, interaction, args) => {
value: interaction.user.tag, value: interaction.user.tag,
inline: true inline: true
}, },
{
name: "📄┆Reason",
value: reason,
inline: true
}
] ]
}, member).catch(() => {}) }, member).catch(() => { })
client.emit('warnAdd', member, interaction.user) client.emit('warnAdd', member, interaction.user, reason)
client.succNormal({ client.succNormal({
text: `User has received a warning!`, text: `User has received a warning!`,
fields: [ fields: [
@ -46,6 +83,16 @@ module.exports = async (client, interaction, args) => {
name: "👤┆User", name: "👤┆User",
value: `${member}`, value: `${member}`,
inline: true inline: true
},
{
name: "👤┆Moderator",
value: `${interaction.user}`,
inline: true
},
{
name: "📄┆Reason",
value: reason,
inline: false
} }
], ],
type: 'editreply' type: 'editreply'

View file

@ -8,22 +8,36 @@ module.exports = async (client, interaction, args) => {
perms: [Discord.PermissionsBitField.Flags.ManageMessages] perms: [Discord.PermissionsBitField.Flags.ManageMessages]
}, interaction); }, interaction);
if (perms == false) return; if (perms == false) {
client.errNormal({
error: "You don't have the required permissions to use this command!",
type: 'editreply'
}, interaction);
return;
}
const member = interaction.options.getUser('user'); const member = interaction.options.getUser('user');
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
var fields = [];
data.Warnings.forEach(element => {
fields.push({
name: "Warning **" + element.Case + "**",
value: "Reason: " + element.Reason + "\nModerator <@!" + element.Moderator + ">",
inline: true
})
});
client.embed({ client.embed({
title: `${client.emotes.normal.error}・Warnings`, title: `${client.emotes.normal.error}・Warnings`,
desc: `The warnings of **${member.tag}**`, desc: `The warnings of **${member.tag}**`,
fields: [ fields: [
{ {
name: "Total", name: "Total",
value: `${data.Warns}`, value: `${data.Warnings.length}`,
inline: false },
} ...fields
], ],
type: 'editreply' type: 'editreply'
}, interaction) }, interaction)
@ -31,18 +45,10 @@ module.exports = async (client, interaction, args) => {
else { else {
client.embed({ client.embed({
title: `${client.emotes.normal.error}・Warnings`, title: `${client.emotes.normal.error}・Warnings`,
desc: `The warnings of **${member.tag}**`, desc: `User ${member.user.tag} has no warnings!`,
fields: [
{
name: "Total",
value: "0",
inline: false
}
],
type: 'editreply' type: 'editreply'
}, interaction) }, interaction)
} }
}) })
} }

View file

@ -0,0 +1,8 @@
const mongoose = require('mongoose');
const Schema = new mongoose.Schema({
Guild: String,
Case: Number
});
module.exports = mongoose.model("warnCase", Schema);

View file

@ -3,7 +3,7 @@ const mongoose = require('mongoose');
const Schema = new mongoose.Schema({ const Schema = new mongoose.Schema({
Guild: String, Guild: String,
User: String, User: String,
Warns: Number Warnings: [Object]
}); });
module.exports = mongoose.model("warnings", Schema); module.exports = mongoose.model("warnings", Schema);

View file

@ -1,6 +1,13 @@
const discord = require('discord.js'); const discord = require('discord.js');
module.exports = async (client, user, mod) => { /**
* @param {discord.Client} client
* @param {discord.GuildMember} user
* @param {discord.User} mod
* @param {string} reason
* @returns
*/
module.exports = async (client, user, mod, reason) => {
const logsChannel = await client.getLogs(user.guild.id); const logsChannel = await client.getLogs(user.guild.id);
if (!logsChannel) return; if (!logsChannel) return;
@ -23,7 +30,13 @@ module.exports = async (client, user, mod) => {
{ {
name: `> Moderator`, name: `> Moderator`,
value: `${mod} (${mod.id})` value: `${mod} (${mod.id})`
},
{
name: `> Reason`,
value: `${reason}`
} }
] ]
}, logsChannel).catch(() => { }) }, logsChannel).catch(() => {
console.log
})
}; };

View file

@ -105,12 +105,14 @@ module.exports = {
.setName('warn') .setName('warn')
.setDescription('Warn a user') .setDescription('Warn a user')
.addUserOption(option => option.setName('user').setDescription('Select a user').setRequired(true)) .addUserOption(option => option.setName('user').setDescription('Select a user').setRequired(true))
.addStringOption(option => option.setName('reason').setDescription('The reason for the warn').setRequired(true))
) )
.addSubcommand(subcommand => .addSubcommand(subcommand =>
subcommand subcommand
.setName('unwarn') .setName('unwarn')
.setDescription('Unwarn a user') .setDescription('Unwarn a user')
.addUserOption(option => option.setName('user').setDescription('Select a user').setRequired(true)) .addUserOption(option => option.setName('user').setDescription('Select a user').setRequired(true))
.addIntegerOption(option => option.setName('case').setDescription('Give a case number').setRequired(true))
) )
.addSubcommand(subcommand => .addSubcommand(subcommand =>
subcommand subcommand

View file

@ -16,54 +16,88 @@ module.exports = {
*/ */
run: async (client, interaction, args) => { run: async (client, interaction, args) => {
await interaction.deferReply({ fetchReply: true });
const perms = await client.checkPerms({ const perms = await client.checkPerms({
flags: [Discord.PermissionsBitField.Flags.ManageMessages], flags: [Discord.PermissionsBitField.Flags.ManageMessages],
perms: [Discord.PermissionsBitField.Flags.ManageMessages] perms: [Discord.PermissionsBitField.Flags.ManageMessages]
}, interaction) }, interaction)
if (perms == false) return; if (perms == false) {
client.errNormal({
error: "You don't have the required permissions to use this command!",
type: 'ephemeral'
}, interaction);
return;
}
await interaction.deferReply({ ephemeral: true });
const member = interaction.guild.members.cache.get(interaction.targetId); const member = interaction.guild.members.cache.get(interaction.targetId);
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
data.Warns -= 1; const menu = new Discord.StringSelectMenuBuilder()
data.save(); .setCustomId('unwarn')
} .setPlaceholder('Select a warning to remove');
else { // Get all warnings and add them to a stringselectmenu
data.Warnings.forEach(element => {
menu.addOptions({
label: `Case ${element.Case}`,
value: element.Case.toString(),
description: "Reason: " + element.Reason
})
});
// Create a new message with the menu
client.embed({
title: `🔨・Unwarn`,
desc: `Select a warning to remove from **${member.user.tag}**`,
components: [new Discord.ActionRowBuilder().addComponents(menu)],
type: 'ephemeraledit'
}, interaction);
// Create a new collector for the menu
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
collector.on('collect', async i => {
if (i.customId === 'unwarn') {
// Remove the warning from the database
data.Warnings.splice(data.Warnings.findIndex(element => element.Case == i.values[0]), 1);
data.save();
// Remove the menu from the message
i.update({
components: []
});
// Send a success message
client.succNormal({
text: `The warning has been successfully removed`,
fields: [
{
name: "👤┆User",
value: `${member}`,
inline: true
}
],
type: 'ephemeraledit'
}, interaction);
client.emit('warnRemove', member, interaction.user)
client.embed({
title: `🔨・Unwarn`,
desc: `You've been unwarned in **${interaction.guild.name}**`,
fields: [
{
name: "👤┆Moderator",
value: interaction.user.tag,
inline: true
},
]
}, member).catch(() => { })
}
});
} else {
client.errNormal({ client.errNormal({
error: "User has no warnings!", error: "User has no warnings!",
type: 'editreply' type: 'ephemeraledit'
}, interaction); }, interaction);
} }
}) })
client.embed({
title: `🔨・Unwarn`,
desc: `You've been unwarned in **${interaction.guild.name}**`,
fields: [
{
name: "👤┆Moderator",
value: interaction.user.tag,
inline: true
},
]
}, member).catch(() => { })
client.emit('warnRemove', member, interaction.user)
client.succNormal({
text: `The user's warning has been successfully removed`,
fields: [
{
name: "👤┆User",
value: `${member}`,
inline: true
}
],
type: 'editreply'
}, interaction);
}, },
}; };

View file

@ -3,6 +3,7 @@ const { ContextMenuCommandBuilder } = require('discord.js');
const Discord = require('discord.js'); const Discord = require('discord.js');
const Schema = require("../../database/models/warnings"); const Schema = require("../../database/models/warnings");
const Case = require("../../database/models/warnCase");
module.exports = { module.exports = {
data: new ContextMenuCommandBuilder() data: new ContextMenuCommandBuilder()
@ -14,28 +15,80 @@ module.exports = {
* @param {CommandInteraction} interaction * @param {CommandInteraction} interaction
* @param {String[]} args * @param {String[]} args
*/ */
run: async (client, interaction, args) => { run: async (client, interaction, args) => {
await interaction.deferReply({ fetchReply: true });
const perms = await client.checkPerms({ const perms = await client.checkPerms({
flags: [Discord.PermissionsBitField.Flags.ManageMessages], flags: [Discord.PermissionsBitField.Flags.ManageMessages],
perms: [Discord.PermissionsBitField.Flags.ManageMessages] perms: [Discord.PermissionsBitField.Flags.ManageMessages]
}, interaction) }, interaction)
if (perms === false) {
client.errNormal({
error: `You don't have the required permissions to use this command!`,
type: 'ephemeral'
}, interaction);
return;
}
// Create modal to give a reason
const modal = new Discord.ModalBuilder()
.setTitle('Warn')
.setCustomId('warn')
.addComponents(
new Discord.ActionRowBuilder().addComponents(
new Discord.TextInputBuilder()
.setCustomId('reason')
.setPlaceholder('Reason')
.setLabel('Reason')
.setMinLength(1)
.setStyle(Discord.TextInputStyle.Short)
.setMaxLength(100)),
);
await interaction.showModal(modal);
if (perms == false) return; const submitted = await interaction.awaitModalSubmit({
time: 60000,
filter: i => i.user.id === interaction.user.id,
}).catch(() => { });
if (!submitted) {
return;
}
const member = interaction.guild.members.cache.get(interaction.targetId); const member = interaction.guild.members.cache.get(interaction.targetId);
var caseNumber;
await Case.findOne({ Guild: interaction.guild.id }).then(async data => {
if(!data) {
new Case({
Guild: interaction.guild.id,
Case: 1
}).save();
caseNumber = 1;
}
else {
data.Case += 1;
data.save();
caseNumber = data.Case;
}
});
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
data.Warns += 1 data.Warnings.push({
Moderator: interaction.user.id,
Reason: submitted.fields.getTextInputValue("reason"),
Date: Date.now(),
Case: caseNumber
});
data.save(); data.save();
} }
else { else {
new Schema({ new Schema({
Guild: interaction.guild.id, Guild: interaction.guild.id,
User: member.id, User: member.id,
Warns: 1 Warnings: [{
Moderator: interaction.user.id,
Reason: submitted.fields.getTextInputValue("reason"),
Date: Date.now(),
Case: caseNumber
}]
}).save(); }).save();
} }
}) })
@ -49,10 +102,15 @@ module.exports = {
value: interaction.user.tag, value: interaction.user.tag,
inline: true inline: true
}, },
{
name: "📄┆Reason",
value: submitted.fields.getTextInputValue("reason"),
inline: true
}
] ]
}, member).catch(() => {}) }, member).catch(() => { })
client.emit('warnAdd', member, interaction.user) client.emit('warnAdd', member, interaction.user, submitted.fields.getTextInputValue("reason"));
client.succNormal({ client.succNormal({
text: `User has received a warning!`, text: `User has received a warning!`,
fields: [ fields: [
@ -60,11 +118,20 @@ module.exports = {
name: "👤┆User", name: "👤┆User",
value: `${member}`, value: `${member}`,
inline: true inline: true
},
{
name: "👤┆Moderator",
value: `${interaction.user}`,
inline: true
},
{
name: "📄┆Reason",
value: submitted.fields.getTextInputValue("reason"),
inline: false
} }
], ],
type: 'editreply' type: 'ephemeral'
}, interaction); }, submitted);
}, },
}; };

View file

@ -14,29 +14,42 @@ module.exports = {
* @param {CommandInteraction} interaction * @param {CommandInteraction} interaction
* @param {String[]} args * @param {String[]} args
*/ */
run: async (client, interaction, args) => { run: async (client, interaction, args) => {
await interaction.deferReply({ fetchReply: true });
const perms = await client.checkPerms({ const perms = await client.checkPerms({
flags: [Discord.PermissionsBitField.Flags.ManageMessages], flags: [Discord.PermissionsBitField.Flags.ManageMessages],
perms: [Discord.PermissionsBitField.Flags.ManageMessages] perms: [Discord.PermissionsBitField.Flags.ManageMessages]
}, interaction) }, interaction)
if (perms == false) return; if (perms == false){
client.errNormal({
error: "You don't have the required permissions to use this command!",
type: 'ephemeral'
}, interaction);
return;
}
await interaction.deferReply({ ephemeral: false });
const member = interaction.guild.members.cache.get(interaction.targetId); const member = interaction.guild.members.cache.get(interaction.targetId);
Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => { Schema.findOne({ Guild: interaction.guild.id, User: member.id }, async (err, data) => {
if (data) { if (data) {
var fields = [];
data.Warnings.forEach(element => {
fields.push({
name: "Warning **" + element.Case + "**",
value: "Reason: " + element.Reason + "\nModerator <@!" + element.Moderator + ">",
inline: true
})
});
client.embed({ client.embed({
title: `${client.emotes.normal.error}・Warnings`, title: `${client.emotes.normal.error}・Warnings`,
desc: `The warnings of **${member.tag}**`, desc: `The warnings of **${member.user.tag}**`,
fields: [ fields: [
{ {
name: "Total", name: "Total",
value: `${data.Warns}`, value: `${data.Warnings.length}`,
innline: false },
} ...fields
], ],
type: 'editreply' type: 'editreply'
}, interaction) }, interaction)
@ -44,14 +57,7 @@ module.exports = {
else { else {
client.embed({ client.embed({
title: `${client.emotes.normal.error}・Warnings`, title: `${client.emotes.normal.error}・Warnings`,
desc: `The warnings of **${member.tag}**`, desc: `User ${member.user.tag} has no warnings!`,
fields: [
{
name: "Total",
value: "0",
innline: false
}
],
type: 'editreply' type: 'editreply'
}, interaction) }, interaction)
} }