DM answers with better system

This commit is contained in:
danbulant 2020-09-02 20:52:42 +02:00
parent 74736b098e
commit 22b9c0076e
2 changed files with 99 additions and 40 deletions

View file

@ -1,6 +1,6 @@
const config = require("./config.json"); const config = require("./config.json");
const discord = require("discord.js"); const discord = require("discord.js");
const { app, answers, messages, challenge, points } = require("./src"); const { app, answers, challenge, points } = require("./src");
const client = new discord.Client({ const client = new discord.Client({
presence: { presence: {
@ -27,7 +27,7 @@ client.on("message", async msg => {
function check(member, bonus = 0) { function check(member, bonus = 0) {
var pointNum = bonus + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0); var pointNum = bonus + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0);
if(points.get(member.user.id) === pointNum) return; if(points.get(member.user.id) === pointNum) return;
if(points.get(member.user.id) && points.get(member.user.id) > 1) return; if(points.get(member.user.id) && pointNum < points.get(member.user.id)) return;
var diff = pointNum - (points.get(member.user.id) || 0); var diff = pointNum - (points.get(member.user.id) || 0);
points.set(pointNum); points.set(pointNum);
member.setNickname(member.displayName.replace(/\[([0-9.]+)\]/, (match, num) => { member.setNickname(member.displayName.replace(/\[([0-9.]+)\]/, (match, num) => {
@ -35,80 +35,106 @@ function check(member, bonus = 0) {
})); }));
} }
client.on("messageDelete", msg => { /**
if(messages.get(msg.id)) { * @param {discord.Collection<string, any>} arr
messages.delete(msg.id); * @param {(val: any) => boolean} predicate
messages.delete(msg.id); * @returns {discord.Collection<string, any>}
var an = answers.get(msg.author.id) || 0; *//**
if(an) answers.set(msg.author.id, an - 1); * @param {discord.Collection<string, discord.Message>} arr
check(msg.member); * @param {(val: discord.Message) => boolean} predicate
* @returns {discord.Collection<string, discord.Message>}
*/
async function asyncFilter(arr, predicate) {
var mapped = arr.mapValues(predicate);
var keys = Array.from(mapped.keys());
const results = await Promise.all(mapped.values());
var col = new discord.Collection();
for(var key in results) {
col.set(keys[key], results[key]);
} }
});
return arr.filter((_v, index) => col.get(index));
}
client.on("messageReactionAdd", async (react, user) => { client.on("messageReactionAdd", async (react, user) => {
if(react.message.channel.id !== "745989024099074068") return; if(react.message.channel.id !== "750720332943458648") return;
if(user.id !== "694395936809418816") {
if(user.id !== client.user.id) {
await react.users.remove(user);
}
return;
}
if(user.id === client.user.id) return; if(user.id === client.user.id) return;
if(!react.message.embeds.length) return;
if(react.emoji.name !== "❌" && react.emoji.name !== "✅") return; if(react.emoji.name !== "❌" && react.emoji.name !== "✅") return;
if(react.emoji.name === "✅") { if(react.emoji.name === "✅") {
var r = await react.message.reactions.resolve("❌"); var r = await react.message.reactions.resolve("❌");
await r.remove(); await r.remove();
var points = 0; var points = 0;
var hint = false;
if(challenge.get("hint")) { if(challenge.get("hint")) {
var msg = await react.message.channel.messages.fetch(challenge.get("hint")); var msg = await react.message.channel.messages.fetch(challenge.get("hint"));
if(msg.createdTimestamp < react.message.createdTimestamp) { if(msg.createdTimestamp < react.message.createdTimestamp) {
points -= 0.5; points -= 0.5;
hint = true;
} }
} }
if(!challenge.get("answered")) { if(!challenge.get("answered")) {
challenge.set("answered", 0); challenge.set("answered", 0);
} }
var member = await react.message.guild.members.fetch(react.message.embeds[0].footer.text);
switch(challenge.get("answered")) { switch(challenge.get("answered")) {
case 0: case 0:
points += 2; points += 2;
member.user.send(`Congratulations! You got the first place at the challenge #${challenge.get("type")} for your answer. ${hint ? "(However you lost 0.5 points because you're answer is given after the ADVANCED HINT)." : ""} You got ${points + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0)} points!`);
break; break;
case 1: case 1:
points += 1.5; points += 1.5;
member.user.send(`Congratulations! You got the second place at the challenge #${challenge.get("type")} for your answer. ${hint ? "(However you lost 0.5 points because you're answer is given after the ADVANCED HINT)." : ""} You got ${points + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0)} points!`);
break; break;
case 2: case 2:
points += 1; points += 1;
member.user.send(`Congratulations! You got the third place at the challenge #${challenge.get("type")} for your answer. ${hint ? "(However you lost 0.5 points because you're answer is given after the ADVANCED HINT)." : ""} You got ${points + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0)} points!`);
break; break;
default: default:
points += 0.5; points += 0.5;
member.user.send(`Congratulations! You got the right answer for challenge #${challenge.get("type")}. ${hint ? "(However you lost 0.5 points because you're answer is given after the ADVANCED HINT)." : ""} You got ${points + (answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0)} points!`);
} }
challenge.set("answered", challenge.get("answered") + 1); challenge.set("answered", challenge.get("answered") + 1);
if(points > 0) { if(points > 0) {
check(react.message.member, points); check(member, points);
} }
react.message.channel.messages.cache.filter(val => val.author.id === react.message.author.id) react.message.channel.messages.cache.filter(val => val.author.id === val.client.user.id)
.filter(val => val.embeds)
.filter(val => val.embeds[0].footer.text === react.message.embeds[0].footer.text)
.filter(val => val.id !== react.message.id) .filter(val => val.id !== react.message.id)
.forEach(msg => msg.reactions.removeAll()); .forEach(msg => msg.reactions.removeAll());
} else { } else {
var r = await react.message.reactions.resolve("✅"); var r = await react.message.reactions.resolve("✅");
await r.remove(); await r.remove();
}
})
client.on("messageUpdate", (msg, msg2) => { var preFiltered = react.message.channel.messages.cache.filter(val => val.author.id === val.client.user.id)
if(msg.channel.id === "745989024099074068") { .filter(val => val.embeds)
if(messages.get(msg.id)) { .filter(val => val.embeds[0].footer.text === react.message.embeds[0].footer.text)
messages.delete(msg.id); .filter(val => val.embeds[0].fields[1].value === react.message.embeds[0].fields[1].value)
var an = answers.get(msg.author.id) || 0; .filter(val => val.id !== react.message.id);
if(an) answers.set(msg.author.id, an - 1);
check(msg.member); var wrong = (await asyncFilter(
preFiltered,
val => {
var r = val.reactions.resolve("✅");
console.log("r", !r?.count);
return !r?.count;
}
)).size;
if(wrong + 1 >= answers.get(react.message.embeds[0].footer.text)) {
var member = await react.message.guild.members.fetch(react.message.embeds[0].footer.text);
await member.user.send(`Sadly, none of your answers are correct. But as a gift for joining the challenge #${react.message.embeds[0].fields[1].value}, you still get ${(answers.get(member.user.id) ? (0.5 + ((challenge.get("num") || 1) * 0.5)) : 0)} points!`);
} }
msg.author.send("You've edited the messages so it got deleted.");
msg.delete(); check(react.message.member, 0);
} }
}); });

View file

@ -1,17 +1,17 @@
const { MessageEmbed } = require("discord.js");
const App = require("../lib/middleware"); const App = require("../lib/middleware");
const app = new App(); const app = new App();
const answers = new Map(); const answers = new Map();
const messages = new Map();
const challenge = new Map(); const challenge = new Map();
const points = new Map(); const points = new Map();
app app
.use(msg => !msg.author.bot) // ignore bots .use(msg => !msg.author.bot) // ignore bots
.use(async msg => { .use(async msg => {
if(!challenge.get("type")) challenge.set("type", "0");
if(msg.author.id === "694395936809418816" && msg.content === "!reset") { if(msg.author.id === "694395936809418816" && msg.content === "!reset") {
answers.clear(); answers.clear();
messages.clear();
challenge.clear(); challenge.clear();
msg.reply("done."); msg.reply("done.");
return false; return false;
@ -22,11 +22,16 @@ app
return false; return false;
} }
challenge.set("num", num); challenge.set("num", num);
challenge.set("type", msg.content.split(" ")[1]);
msg.reply("challenge type set."); msg.reply("challenge type set.");
return false; return false;
} }
}) })
.use(msg => msg.channel.id === "745989024099074068") .use(msg => msg.channel.type === "dm")
.use(async msg => {
msg.cguild = await msg.client.guilds.fetch("745985920116850781");
msg.cmember = await msg.cguild.members.fetch(msg.author.id);
})
.use(msg => { .use(msg => {
if(challenge.get("hint")) return; if(challenge.get("hint")) return;
if(msg.author.id === "694395936809418816") { if(msg.author.id === "694395936809418816") {
@ -35,9 +40,27 @@ app
} }
}) })
.use(msg => { .use(msg => {
if(!/^\[[0-9.]+\]/.test(msg.member.displayName)) { if(!/^\[[0-9.]+\]/.test(msg.cmember.displayName)) {
msg.author.send("You must register first"); msg.author.send("You must register first");
msg.delete(); return false;
}
})
.use(msg => {
if(!challenge.get("type")) {
msg.author.send("No challenge is currently active.");
return false;
}
})
.use(msg => {
var answerCount = answers.get(msg.author.id) || 0;
if(answerCount >= 3) {
msg.author.send("You've already used all your attempts for challenge `" + challenge.get("type") + "`.");
return false;
}
})
.use(msg => {
if(!msg.content.startsWith(challenge.get("type") + ". ")) {
msg.author.send("Invalid format. The question must start with challenge number: `" + challenge.get("type") + ". <answer>`.");
return false; return false;
} }
}) })
@ -48,11 +71,21 @@ app
if(answerCount > 3) return await msg.delete(); if(answerCount > 3) return await msg.delete();
if(answerCount === 3) { if(answerCount === 3) {
await msg.author.send("You've used all your 3 answers, you won't be able to add any more."); await msg.author.send("You've used all your 3 answers, you won't be able to add any more.");
} else {
await msg.author.send("Answer recorded, wait for results.");
} }
console.log("New answer:", msg.content, "by", msg.member.displayName); console.log("New answer:", msg.content, "by", msg.cmember.displayName);
messages.set(msg.id, 1); var channel = msg.cguild.channels.resolve("750720332943458648");
msg.react("✅"); var embed = new MessageEmbed();
msg.react("❌"); embed.setTitle("New answer");
embed.setDescription(msg.content.match(/[0-9]+\. (.*)/)[1]);
embed.setAuthor(msg.cmember.displayName, msg.author.avatarURL());
embed.setFooter(msg.author.id);
embed.addField("Try", answerCount, true);
embed.addField("Challenge", challenge.get("type"), true);
var m = await channel.send(embed);
m.react("✅");
m.react("❌");
}) })
module.exports = { app, answers, messages, challenge, points }; module.exports = { app, answers, challenge, points };