startet currency system, think i added temporary ban and a give command
This commit is contained in:
@@ -15,7 +15,7 @@ Im going to make a To-do List for the features i want to implement for my Bot.
|
|||||||
- [ ] Allow admins to assign/remove roles with commands.
|
- [ ] Allow admins to assign/remove roles with commands.
|
||||||
|
|
||||||
3. **Moderation Tools**
|
3. **Moderation Tools**
|
||||||
- [ ] Add commands to mute, x kick, and ban users.
|
- [ ] Add commands to mute, x kick, and x temp_ban users.
|
||||||
- [ ] Create an auto-moderation feature to delete spam or inappropriate content.
|
- [ ] Create an auto-moderation feature to delete spam or inappropriate content.
|
||||||
- [ ] Implement a warning system with a strike counter.
|
- [ ] Implement a warning system with a strike counter.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// exampleCommand.js
|
||||||
|
const { SlashCommandBuilder } = require('discord.js');
|
||||||
|
const { connectToDatabase } = require('../../db.js');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
data: new SlashCommandBuilder()
|
||||||
|
.setName('give')
|
||||||
|
.setDescription('give somebody coins')
|
||||||
|
.addIntegerOption(option =>
|
||||||
|
option
|
||||||
|
.setName('amount')
|
||||||
|
.setDescription('amount of the coins')
|
||||||
|
.setRequired(true))
|
||||||
|
.addUserOption(option =>
|
||||||
|
option.setName('target')
|
||||||
|
.setDescription('The user to give coins to')
|
||||||
|
.setRequired(true)),
|
||||||
|
async execute(interaction) {
|
||||||
|
const dbClient = await connectToDatabase();
|
||||||
|
const target = interaction.options.getUser('target');
|
||||||
|
const amount = interaction.options.getInteger('amount');
|
||||||
|
|
||||||
|
// Choose a DB + Collection
|
||||||
|
const db = dbClient.db('discord');
|
||||||
|
const collection = db.collection('currency');
|
||||||
|
|
||||||
|
let targetData = await collection.findOne({ userID: target.id });
|
||||||
|
if (!targetData) {
|
||||||
|
await collection.insertOne({ userID: target.id, balance: 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform the transaction: subtract from sender and add to target.
|
||||||
|
await collection.updateOne({ userID: target.id }, { $inc: { balance: amount } }, { upsert: true });
|
||||||
|
|
||||||
|
return interaction.reply({ content: `You have given ${amount} coins to ${target.tag}.` });
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -19,26 +19,20 @@ module.exports = {
|
|||||||
.setName('reason')
|
.setName('reason')
|
||||||
.setDescription('The reason of the mute')),
|
.setDescription('The reason of the mute')),
|
||||||
async execute(interaction) {
|
async execute(interaction) {
|
||||||
// Get the user and duration from the command options
|
|
||||||
const target = interaction.options.getUser('target');
|
const target = interaction.options.getUser('target');
|
||||||
const duration = interaction.options.getInteger('duration');
|
const duration = interaction.options.getInteger('duration');
|
||||||
|
const reason = interaction.options.getString('reason');
|
||||||
|
|
||||||
// Convert duration to milliseconds
|
// Convert duration to milliseconds
|
||||||
const durationMs = duration * 60 * 1000;
|
const durationMs = duration * 60 * 1000;
|
||||||
|
|
||||||
try {
|
const guildmember = await interaction.guild.members.fetch(target.id);
|
||||||
// Apply the timeout
|
|
||||||
await target.timeout(durationMs);
|
|
||||||
|
|
||||||
await interaction.reply({
|
const muteRole = interaction.guild.roles.find(role => role.name === "mute");
|
||||||
content: `${target.tag} has been muted for ${duration} minutes.`
|
if (!muteRole) {
|
||||||
});
|
|
||||||
} catch (error) {
|
} else {
|
||||||
console.error(error);
|
await guildmember.roles.add(muteRole, reason);
|
||||||
await interaction.reply({
|
|
||||||
content: 'I was unable to mute the member.',
|
|
||||||
ephemeral: true,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||||
|
const { connectToDatabase } = require('../../db.js');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
mod: true,
|
||||||
|
data: new SlashCommandBuilder()
|
||||||
|
.setName("temp-ban")
|
||||||
|
.setDescription("Kick misbehaving people")
|
||||||
|
.addUserOption(option =>
|
||||||
|
option
|
||||||
|
.setName('target')
|
||||||
|
.setDescription('The member to kick')
|
||||||
|
.setRequired(true))
|
||||||
|
.addIntegerOption(option =>
|
||||||
|
option
|
||||||
|
.setName('durationms')
|
||||||
|
.setDescription('Duration of the temporary ban (in milliseconds).')
|
||||||
|
.setRequired(true))
|
||||||
|
.addStringOption(option =>
|
||||||
|
option
|
||||||
|
.setName('reason')
|
||||||
|
.setDescription('Reason for the ban')
|
||||||
|
.setRequired(true))
|
||||||
|
.addIntegerOption(option =>
|
||||||
|
option
|
||||||
|
.setName('delete-messages')
|
||||||
|
.setDescription('Number of days to delete messages')
|
||||||
|
.setMinValue(0).setMaxValue(7)),
|
||||||
|
async execute(interaction) {
|
||||||
|
const user = interaction.options.getUser('target');
|
||||||
|
const reason = interaction.options.getString('reason');
|
||||||
|
const durationms = interaction.options.getInteger('durationms');
|
||||||
|
const deleteMessages = interaction.options.getInteger('delete-messages');
|
||||||
|
|
||||||
|
// If you want to parse time like "1d", "10m", etc., use ms package:
|
||||||
|
let banUntil;
|
||||||
|
try {
|
||||||
|
banUntil = Date.now() + durationms;
|
||||||
|
} catch (e) {
|
||||||
|
// If parsing fails, handle error
|
||||||
|
return interaction.reply({
|
||||||
|
content: 'Invalid duration format. Please use something like "10m" or "1d".',
|
||||||
|
ephemeral: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// A function to send ephemeral messages
|
||||||
|
async function sendEphemeral(message) {
|
||||||
|
const embed = new EmbedBuilder()
|
||||||
|
.setColor("Blurple")
|
||||||
|
.setDescription(message);
|
||||||
|
|
||||||
|
return interaction.reply({ embeds: [embed], ephemeral: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user is already banned
|
||||||
|
const bans = await interaction.guild.bans.fetch();
|
||||||
|
if (bans.has(user.id)) {
|
||||||
|
return sendEphemeral("That user is already banned");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------- STORE BAN DATA IN MONGODB ---------
|
||||||
|
try {
|
||||||
|
// 1. Get or create the MongoDB client
|
||||||
|
const dbClient = await connectToDatabase();
|
||||||
|
|
||||||
|
// 2. Access a DB and a collection
|
||||||
|
const db = dbClient.db("discord");
|
||||||
|
const tempBanCollection = db.collection("tempban");
|
||||||
|
|
||||||
|
// 3. Insert the ban record
|
||||||
|
await tempBanCollection.insertOne({
|
||||||
|
guildId: interaction.guild.id,
|
||||||
|
userId: user.id,
|
||||||
|
banTime: banUntil,
|
||||||
|
reason: reason,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
return sendEphemeral("Could not insert ban record into DB.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------- BAN THE USER IN DISCORD ---------
|
||||||
|
let error = false;
|
||||||
|
try {
|
||||||
|
await interaction.guild.bans.create(user.id, {
|
||||||
|
reason: reason,
|
||||||
|
deleteMessageDays: deleteMessages,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
error = true;
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return sendEphemeral("Something went wrong banning the user.");
|
||||||
|
} else {
|
||||||
|
return sendEphemeral(
|
||||||
|
`${user} has been banned for **${durationms}** for *${reason}*`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ const rest = new REST().setToken(token);
|
|||||||
|
|
||||||
// The put method is used to fully refresh all commands in the guild with the current set
|
// The put method is used to fully refresh all commands in the guild with the current set
|
||||||
const data = await rest.put(
|
const data = await rest.put(
|
||||||
Routes.applicationGuildCommands(clientId, guildId),
|
Routes.applicationCommands(clientId),
|
||||||
{ body: commands },
|
{ body: commands },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
const { Events } = require('discord.js');
|
||||||
|
const { connectToDatabase } = require('../db.js');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: Events.ClientReady,
|
||||||
|
async execute(client) {
|
||||||
|
const dbClient = await connectToDatabase();
|
||||||
|
const db = dbClient.db('discord');
|
||||||
|
const tempBanCollection = db.collection('tempban');
|
||||||
|
|
||||||
|
// 2) Define a function to schedule unbans
|
||||||
|
async function scheduleUnban(banData) {
|
||||||
|
const delay = banData.banTime - Date.now();
|
||||||
|
|
||||||
|
if (delay <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setTimeout(async () => {
|
||||||
|
try {
|
||||||
|
const guild = await client.guilds.fetch(banData.guildId);
|
||||||
|
await guild.bans.remove(banData.userId);
|
||||||
|
|
||||||
|
await tempBanCollection.deleteOne({ _id: banData._id });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error unbanning member:', err);
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const allBans = await tempBanCollection.find({}).toArray();
|
||||||
|
allBans.forEach(scheduleUnban);
|
||||||
|
|
||||||
|
tempBanCollection.watch().on('change', (change) => {
|
||||||
|
if (change.operationType === 'insert') {
|
||||||
|
const newBan = change.fullDocument;
|
||||||
|
scheduleUnban(newBan);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error setting up unban system:', err);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user