Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 17 additions & 76 deletions commands/button/validation-chall.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/*
* edited : Syxles (Syxless)
* author : Mizari (Mizari-W)
*/
const { ModalBuilder, ActionRowBuilder, TextInputBuilder, TextInputStyle } = require("discord.js");
const colors = require("../../functions/colors.js");

module.exports = {
name: "validation_btn",
Expand All @@ -11,11 +13,11 @@ module.exports = {
* @param {Client} client
* @param {CommandInteraction} interaction
*/
run: async(client, interaction) => {
const { channel, locale, user } = interaction;
run: async (client, interaction) => {
const { locale } = interaction;

// Create modal
let modal = new ModalBuilder({
// Show the modal immediately to stay within Discord's 3s response window.
const modal = new ModalBuilder({
title: "Challenge Validation",
customId: "validation_modal",
components: [
Expand All @@ -33,80 +35,19 @@ module.exports = {
]
});

// Get challenge in DB
let chall_response = await client.notion.databases.query({
database_id: process.env.CHALLENGES_DB,
filter: {
property: 'ThreadID',
text: {
contains: channel.id
}
}
});

// If challenge found
if (chall_response.results.length > 0){
// If player is chall author and no first blood yet, exit
if (channel.ownerId === user.id){
let page = chall_response.results[0];
if (page.properties["FirstBlood"].relation.length === 0){
interaction.reply({
content: {
"fr": "Veuillez attendre le first blood."
}[locale] || "Please wait for the First Blood",
ephemeral: true
});
return;
}
}

// Get member in DB
let member_response = await client.notion.databases.query({
database_id: process.env.MEMBERS_DB,
filter: {
property: 'MemberID',
text: {
contains: interaction.user.id
}
}
});

// If user found in DB
if (member_response.results.length > 0){
let member_page_id = member_response.results[0].id;
// If member is in flaggers of this challenge, exit
if (chall_response.results[0].properties["Flaggers"].relation.find(mem => mem.id === member_page_id)){
interaction.reply({
content: {
"fr": "Tu as déjà fait ce challenge."
}[locale] || "You already did this challenge",
ephemeral: true
});
return;
}
}

try {
// Show modal
interaction.showModal(modal);
} catch(err) {
interaction.reply({
content:{
"fr": "<:cross:1163970998605983848> Quelque chose s'est mal passé..."
try {
await interaction.showModal(modal);
} catch (err) {
if (!interaction.replied && !interaction.deferred) {
await interaction.reply({
content: {
fr: "<:cross:1163970998605983848> Quelque chose s'est mal passe..."
}[locale] || "<:cross:1163970998605983848> Something went wrong...",
ephemeral: true
});
//Logs
console.error(`[${colors.FgRed} Error ${colors.Reset}]\t❌ Le modal a planté ???`);
}).catch(() => {});
}
} else {
// Challenge not found
interaction.reply({
content:{
"fr": "<:cross:1163970998605983848> Quelque chose s'est mal passé..."
}[locale] || "<:cross:1163970998605983848> Something went wrong..."
});
console.error(`[${colors.FgRed} Error ${colors.Reset}]\t❌ Pas de challenge dans la DB... id : ${channel.id}`);

console.error(`[${colors.FgRed} Error ${colors.Reset}]\tFlag modal display failed`, err);
}
}
}
};
52 changes: 28 additions & 24 deletions commands/modal/config-chall.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
/*
* edited : Syxles (Syxless)
* author : Mizari (Mizari-W)
*/
const { ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js");
const colors = require('../../functions/colors.js');
const { createHash } = require('node:crypto');
const colors = require("../../functions/colors.js");
const { createHash } = require("node:crypto");

module.exports = {
name: "chall_modal",
Expand All @@ -13,41 +14,44 @@ module.exports = {
* @param {Client} client
* @param {CommandInteraction} interaction
*/
run: async(client, interaction) => {
interaction.deferReply().catch(err => console.error(`[${colors.FgRed} Error ${colors.Reset}]\t❌ `+err));
const { components, locale, message } = interaction;
var flag = components[0].components[0].value;
run: async (client, interaction) => {
const { locale, message } = interaction;
await interaction.deferReply().catch((err) => {
console.error(`[${colors.FgRed} Error ${colors.Reset}]\tFailed to defer challenge modal`, err);
});

const flag = interaction.fields.getTextInputValue("flag");

// on cherche le thread dans la db
var response = await client.notion.databases.query({
// find thread in db
let response = await client.notion.databases.query({
database_id: process.env.CHALLENGES_DB,
filter: {
property: 'ThreadID',
property: "ThreadID",
text: {
contains: interaction.channel.id
}
}
});

if (response.results.length > 0){
// on update le chall
if (response.results.length > 0) {
// update challenge flag
const pageId = response.results[0].id;
response = await client.notion.pages.update({
await client.notion.pages.update({
page_id: pageId,
properties: {
Flag: {
rich_text: [
{
text: {
content: createHash('sha256').update(flag).digest('hex')
content: createHash("sha256").update(flag).digest("hex")
}
}
]
}
}
});

let select = new ActionRowBuilder({
const select = new ActionRowBuilder({
components: [
new StringSelectMenuBuilder({
customId: "score",
Expand All @@ -56,41 +60,41 @@ module.exports = {
options: [
{
emoji: "🟢",
label: `Easy (5 points)`,
label: "Easy (5 points)",
value: "5"
},
{
emoji: "🟡",
label: `Middle (10 points)`,
label: "Middle (10 points)",
value: "10"
},
{
emoji: "🔴",
label: `Hard (15 points)`,
label: "Hard (15 points)",
value: "15"
},
{
emoji: "⚫",
label: `Xtrem (30 points)`,
label: "Xtrem (30 points)",
value: "30"
}
],
placeholder: {
"fr": "Sélectionnez une difficulté."
fr: "Selectionnez une difficulte."
}[locale] || "Select difficulty."
})
]
});

interaction.followUp({ components: [select] });
await interaction.followUp({ components: [select] });
} else {
interaction.followUp({
await interaction.followUp({
content: {
"fr": "<:cross:1163970998605983848> Quelque chose s'est mal passé..."
fr: "<:cross:1163970998605983848> Quelque chose s'est mal passe..."
}[locale] || "<:cross:1163970998605983848> Something went wrong..."
});
}

await message.delete();
await message.delete().catch(() => {});
}
}
};
Loading