mirror of
https://github.com/aydenjahola/discord-multipurpose-bot.git
synced 2024-11-25 02:05:56 +00:00
add action items command
This commit is contained in:
parent
acd1c35bd3
commit
9453225b23
1 changed files with 147 additions and 0 deletions
147
commands/moderation/actionItems.js
Normal file
147
commands/moderation/actionItems.js
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
data: new SlashCommandBuilder()
|
||||||
|
.setName("actionitems")
|
||||||
|
.setDescription(
|
||||||
|
"Create multiple action items and assign them to different users"
|
||||||
|
)
|
||||||
|
.addStringOption((option) =>
|
||||||
|
option
|
||||||
|
.setName("assignments")
|
||||||
|
.setDescription(
|
||||||
|
"List of tasks in the format @user: task1, @user2: task2"
|
||||||
|
)
|
||||||
|
.setRequired(true)
|
||||||
|
),
|
||||||
|
|
||||||
|
async execute(interaction) {
|
||||||
|
// Check if the command is used in the allowed channel
|
||||||
|
const allowedChannelId = "1299134735330836521";
|
||||||
|
if (interaction.channelId !== allowedChannelId) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: `This command can only be used in the designated channel.`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const assignmentsInput = interaction.options.getString("assignments");
|
||||||
|
const assignments = assignmentsInput
|
||||||
|
.split(",")
|
||||||
|
.map((assignment) => assignment.trim());
|
||||||
|
|
||||||
|
const userTaskMap = new Map();
|
||||||
|
const completedTasksMap = new Map();
|
||||||
|
|
||||||
|
// Parse each assignment to map users and tasks
|
||||||
|
for (const assignment of assignments) {
|
||||||
|
const [userMention, task] = assignment
|
||||||
|
.split(":")
|
||||||
|
.map((part) => part.trim());
|
||||||
|
|
||||||
|
const userId = userMention.match(/<@!?(\d+)>/)?.[1];
|
||||||
|
if (!userId || !task) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: `Invalid format. Please use "@user: task" format. Example: @User1: Task 1, @User2: Task 2`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const user = await interaction.guild.members.fetch(userId);
|
||||||
|
if (!user) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: `User ${userMention} not found.`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!userTaskMap.has(user)) {
|
||||||
|
userTaskMap.set(user, []);
|
||||||
|
completedTasksMap.set(user, new Set());
|
||||||
|
}
|
||||||
|
userTaskMap.get(user).push(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate initial task list message
|
||||||
|
let messageContent = `📝 **Action Items:**\n\n`;
|
||||||
|
userTaskMap.forEach((tasks, user) => {
|
||||||
|
messageContent += `👤 **Assigned to:** ${user}\n`;
|
||||||
|
tasks.forEach((task, index) => {
|
||||||
|
messageContent += `**${index + 1}.** ${task}\n`;
|
||||||
|
});
|
||||||
|
messageContent += "\n";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fetch the specific channel to send the action items message
|
||||||
|
const targetChannelId = "1164670538006933505";
|
||||||
|
const targetChannel = await interaction.guild.channels.fetch(
|
||||||
|
targetChannelId
|
||||||
|
);
|
||||||
|
if (!targetChannel) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: `Unable to find the target channel.`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the action items message to the specified channel
|
||||||
|
const actionMessage = await targetChannel.send({
|
||||||
|
content: messageContent + `✅ React with a checkmark to complete tasks!`,
|
||||||
|
});
|
||||||
|
|
||||||
|
await actionMessage.react("✅");
|
||||||
|
|
||||||
|
// Create reaction collector
|
||||||
|
const filter = (reaction, user) => {
|
||||||
|
return reaction.emoji.name === "✅" && userTaskMap.has(user);
|
||||||
|
};
|
||||||
|
|
||||||
|
const collector = actionMessage.createReactionCollector({
|
||||||
|
filter,
|
||||||
|
dispose: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
collector.on("collect", async (reaction, user) => {
|
||||||
|
const tasks = userTaskMap.get(user);
|
||||||
|
const completedTasks = completedTasksMap.get(user);
|
||||||
|
|
||||||
|
if (completedTasks.size < tasks.length) {
|
||||||
|
const nextTaskIndex = completedTasks.size;
|
||||||
|
completedTasks.add(nextTaskIndex);
|
||||||
|
|
||||||
|
// Update message content
|
||||||
|
let updatedMessageContent = `📝 **Action Items:**\n\n`;
|
||||||
|
userTaskMap.forEach((userTasks, assignedUser) => {
|
||||||
|
updatedMessageContent += `👤 **Assigned to:** ${assignedUser}\n`;
|
||||||
|
userTasks.forEach((task, idx) => {
|
||||||
|
updatedMessageContent += `**${idx + 1}.** ${task}\n`;
|
||||||
|
});
|
||||||
|
updatedMessageContent += "\n";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Edit the message to reflect the completion
|
||||||
|
await actionMessage.edit({
|
||||||
|
content:
|
||||||
|
updatedMessageContent +
|
||||||
|
`✅ React with a checkmark to complete tasks!`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Notify the user about the completion
|
||||||
|
await interaction.followUp({
|
||||||
|
content: `${user} has completed task **${tasks[nextTaskIndex]}**!`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
collector.on("end", () => {
|
||||||
|
console.log("Collector ended");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Confirm action items have been posted to the target channel
|
||||||
|
await interaction.reply({
|
||||||
|
content: `Action items have been successfully posted in <#${targetChannelId}>.`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
Loading…
Reference in a new issue