aboutsummaryrefslogtreecommitdiff
path: root/handler
diff options
context:
space:
mode:
Diffstat (limited to 'handler')
-rw-r--r--[-rwxr-xr-x]handler/button.js72
-rw-r--r--[-rwxr-xr-x]handler/command.js168
-rw-r--r--[-rwxr-xr-x]handler/errors.js64
-rw-r--r--[-rwxr-xr-x]handler/menu.js4
4 files changed, 242 insertions, 66 deletions
diff --git a/handler/button.js b/handler/button.js
index 5d5fe03..8fc49f5 100755..100644
--- a/handler/button.js
+++ b/handler/button.js
@@ -1,12 +1,41 @@
const fs = require('fs');
-const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
+const path = require('path');
+const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed, MessageAttachment } = require('discord.js');
+
+const getPixel = require('../modules/pixel.js');
+const getEmbed = require("../modules/embed");
module.exports = async (interaction) => {
keys = interaction.customId.split("|")
- if (keys[0] === "result.report") {
+ if (keys[0] === "pony.display") {
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ getEmbed(keys[1], interaction.user.id, interaction.guild.id)
+ ],
+ components: [
+ new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setLabel(l("Read More", "Lire plus", interaction.user.id, interaction.guild.id))
+ .setStyle("LINK")
+ .setURL("https://mlp.fandom.com/wiki/" + encodeURI(keys[1])),
+ new MessageButton()
+ .setCustomId("pony.pixel|" + keys[1])
+ .setLabel("Pixel Art")
+ .setDisabled(!fs.existsSync("./pixel/" + keys[1].toLowerCase()))
+ .setStyle("SECONDARY"),
+ new MessageButton()
+ .setCustomId("result.report|" + keys[1])
+ .setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
+ .setStyle("DANGER")
+ )
+ ]
+ });
+ } else if (keys[0] === "result.report") {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#dc2828')
@@ -50,10 +79,47 @@ module.exports = async (interaction) => {
description: l("A provided info does not correspond to the real info from a reliable source.", "Une information fournie ne correspond pas à la réelle information depuis une source fiable.", interaction.user.id, interaction.guild.id),
value: 'report.issue.missinfo|' + keys[1],
},
+ {
+ label: l("Translation issue", "Problème de traduction", interaction.user.id, interaction.guild.id),
+ description: l("The English translation of a formerly French content is wrong and needs to be fixed.", "La version française d'un contenu originellement en anglais est erronée et doit être corrigée.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.translation|' + keys[1],
+ },
]),
)
]
});
+ } else if (keys[0] === "pony.pixel") {
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Pixel Art for", "Pixel Art correspondant à", interaction.user.id, interaction.guild.id) + " \"" + keys[1] + "\"")
+ ],
+ files: [
+ new MessageAttachment(fs.readFileSync(getPixel(keys[1])), path.basename(getPixel(keys[1])))
+ ],
+ components: [
+ new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setCustomId("result.report|" + getPixel(keys[1]))
+ .setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
+ .setStyle("DANGER")
+ )
+ ]
+ });
+ } else if (keys[0] === "result.suggest") {
+ fs.writeFileSync("./reports/Telemetry-Request-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n Pony Request Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n " + keys[1] + "\n\nReport Type:\n -");
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Thanks for suggesting", "Merci d'avoir proposé", interaction.user.id, interaction.guild.id) + " \"" + keys[1] + "\"" + l("!", " !", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Your suggestion has been sent to the developers. They can contact you later if your settings allow this to ask you more about your request.\nThanks for your help!", "Votre suggestion a bien été envoyée aux développeurs. Ils pourront vous recontacter si vos paramètres le permettent afin de vous poser plus de questions sur votre requête.\nMerci d'aider à améliorer notre système !", interaction.user.id, interaction.guild.id))
+ ]
+ });
} else {
throw new Error("Unknown Button ID");
}
diff --git a/handler/command.js b/handler/command.js
index c1cfe22..da345eb 100755..100644
--- a/handler/command.js
+++ b/handler/command.js
@@ -1,10 +1,96 @@
const fs = require('fs');
const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
-const getResult = require('../result');
-const getEmbed = require('../embed');
+const admin = fs.readFileSync("./config/admin.txt");
+
+const getResult = require('../modules/result');
+const getEmbed = require('../modules/embed');
+const getPixel = require("../modules/pixel");
+
+const official = fs.readFileSync("./config/official.txt").toString().replace(/\r\n/g, "\n").split("\n");
+const fpserver = fs.readFileSync("./config/fpserver.txt").toString().trim();
+
+function bytesToPretty(bytes) {
+ if (bytes > 1000) {
+ if (bytes > 1000000) {
+ return (bytes / 1000000).toFixed(2) + " MB";
+ } else {
+ return (bytes / 1000).toFixed(2) + " KB";
+ }
+ } else {
+ return bytes + " B";
+ }
+}
+
+function secondsToPretty(seconds) {
+ if (seconds > 60) {
+ if (seconds > 3600) {
+ if (seconds > 216000) {
+ return Math.floor(seconds / 216000) + " day" + (Math.floor(seconds / 216000) > 1 ? "s" : "");
+ } else {
+ return Math.floor(seconds / 3600) + " hour" + (Math.floor(seconds / 3600) > 1 ? "s" : "");
+ }
+ } else {
+ return Math.floor(seconds / 60) + " minute" + (Math.floor(seconds / 60) > 1 ? "s" : "");
+ }
+ } else {
+ return Math.floor(seconds) + " second" + (Math.floor(seconds) > 1 ? "s" : "");
+ }
+}
module.exports = async (interaction) => {
+ if (interaction.commandName === 'stats') {
+ let suffix = "";
+ if (official.includes(interaction.guild.id)) {
+ suffix = ".official-" + interaction.guild.id;
+ } else {
+ if (interaction.guild.id === fpserver) {
+ suffix = ".francoponies-epk" + fs.readFileSync("./config/fpexperience.txt").toString();
+ }
+ }
+
+ let size = 0;
+ for (let file of fs.readdirSync("./data")) size += fs.readFileSync("./data/" + file).length;
+ let sizep = bytesToPretty(size);
+
+ let fields = [
+ { name: l("Software version", "Version du logiciel"), value: "v" + fs.readFileSync("./config/version.txt") + "." + fs.readFileSync("./.git/refs/heads/trunk").toString().substr(0, 8) + suffix, inline: false },
+ { name: l("Kernel version", "Version du noyau"), value: process.version, inline: true },
+ { name: l("Experience channel", "Canal d'expériences"), value: channel, inline: true },
+ { name: l("Known ponies", "Poneys connus"), value: Object.keys(JSON.parse(fs.readFileSync("./data/data.json").toString())).length.toString(), inline: true },
+ { name: l("Awaiting issue reports", "Rapports de problèmes en attente"), value: fs.readdirSync("./reports").length.toString(), inline: true },
+ { name: l("Database size", "Taille de la base de données"), value: sizep, inline: true },
+ { name: l("Memory usage", "Utilisation de la mémoire"), value: bytesToPretty(process.memoryUsage().rss + process.memoryUsage().heapTotal + process.memoryUsage().external + process.memoryUsage().arrayBuffers), inline: true },
+ { name: l("Uptime", "Durée de fonctionnement"), value: secondsToPretty(process.uptime()), inline: true },
+ ];
+
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#d6dc28')
+ .setTitle(l("Bot stats", "Statistiques du robot", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Ponyfind is a Discord bot that helps you get easy and fast access to data relative to My Little Pony (generations 4 and 5).", "Ponyfind est un robot Discord qui vous aide à obtenir un accès simple et rapide à des données relatives à My Little Pony (générations 4 et 5).", interaction.user.id, interaction.guild.id))
+ .addFields(fields)
+ .setFooter(l("made with ♥ by Minteck, a My Little Pony fan", "fait avec ♥ par Minteck, une fan de My Little Pony", interaction.user.id, interaction.guild.id))
+ .setThumbnail(client.user.avatarURL())
+ ],
+ components: [
+ new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setURL(fs.readFileSync("./config/source.txt").toString())
+ .setLabel(l("Browse source code", "Explorer le code source", interaction.user.id, interaction.guild.id))
+ .setStyle("LINK"),
+ new MessageButton()
+ .setURL(fs.readFileSync("./config/invite.txt").toString())
+ .setLabel(l("Invite to your server", "Inviter sur votre serveur", interaction.user.id, interaction.guild.id))
+ .setStyle("LINK"),
+ )
+ ]
+ });
+ }
+
if (interaction.commandName === 'lang') {
lang = interaction.options.getString('locale');
if (lang === "fr") {
@@ -12,11 +98,11 @@ module.exports = async (interaction) => {
} else {
langs[interaction.user.id] = "en";
}
- fs.writeFileSync("./userdata.json", JSON.stringify(langs, null, 4));
+ fs.writeFileSync("./user/userdata.json", JSON.stringify(langs, null, 4));
if (typeof servers[interaction.guild.id] !== "undefined") {
if (lang === "fr") {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')
@@ -26,7 +112,7 @@ module.exports = async (interaction) => {
});
} else {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')
@@ -37,7 +123,7 @@ module.exports = async (interaction) => {
}
} else {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')
@@ -49,6 +135,19 @@ module.exports = async (interaction) => {
}
if (interaction.commandName === 'serverlang') {
+ if (!interaction.guild.members.resolve(interaction.user).permissions.has("MANAGE_SERVER") || interaction.user.id === admin) {
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle(l("Permission denied", "Accès refusé", interaction.user.id, interaction.guild.id))
+ .setDescription(l("You don't have sufficient permission to run this command. You need to be a bot administrator, or have the **Manage Server** permission.", "Vous ne disposez pas de permissions suffisantes pour exécuter cette commande. Vous devez être administrateur(ice) de robot, ou avoir la permission **Gérer le serveur**.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ return;
+ }
+
lang = interaction.options.getString('locale');
if (lang === "fr") {
servers[interaction.guild.id] = "fr";
@@ -57,10 +156,10 @@ module.exports = async (interaction) => {
} else {
delete servers[interaction.guild.id];
}
- fs.writeFileSync("./servers.json", JSON.stringify(servers, null, 4));
+ fs.writeFileSync("./user/servers.json", JSON.stringify(servers, null, 4));
if (lang === "en" || lang === "fr") {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')
@@ -70,7 +169,7 @@ module.exports = async (interaction) => {
});
} else {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')
@@ -87,23 +186,30 @@ module.exports = async (interaction) => {
if (result.results.length > 0 && getEmbed(result.results[0], interaction.user.id, interaction.guild.id) !== false) {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
- getEmbed(result.results[0], interaction.user.id, interaction.guild.id)
+ new MessageEmbed()
+ .setColor('#d6dc28')
+ .setTitle(l("Results for", "Résultats pour", interaction.user.id, interaction.guild.id) + " \"" + query + "\"")
+ .setDescription(l("Here are the 3 first results corresponding to your query.", "Voici les 3 premiers résultats correspondants à votre recherche.", interaction.user.id, interaction.guild.id))
],
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
- .setLabel(l("Read More", "Lire plus", interaction.user.id, interaction.guild.id))
- .setStyle("LINK")
- .setURL("https://mlp.fandom.com/wiki/" + encodeURI(result.results[0])),
+ .setCustomId("pony.display|" + result.first[0])
+ .setLabel(result.first[0])
+ .setStyle("PRIMARY"),
new MessageButton()
- .setCustomId("pony.pixel|" + result.results[0])
- .setLabel("Pixel Art")
- .setStyle("SECONDARY"),
+ .setCustomId("pony.display|" + result.first[1])
+ .setLabel(result.first[1])
+ .setStyle("PRIMARY"),
new MessageButton()
- .setCustomId("result.report|" + result.results[0])
+ .setCustomId("pony.display|" + result.first[2])
+ .setLabel(result.first[2])
+ .setStyle("PRIMARY"),
+ new MessageButton()
+ .setCustomId("result.report|" + query)
.setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
.setStyle("DANGER")
)
@@ -111,7 +217,7 @@ module.exports = async (interaction) => {
});
} else {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#dc2828')
@@ -119,18 +225,18 @@ module.exports = async (interaction) => {
.setDescription(l("No results found. Please try with other keywords.", "Aucun résultat trouvé. Essayez avec d'autres mots clés.", interaction.user.id, interaction.guild.id))
],
components: [
- new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setCustomId("result.suggest|" + query)
- .setLabel(l("Suggest a missing pony", "Proposer un poney manquant", interaction.user.id, interaction.guild.id))
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("result.report")
- .setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
- .setStyle("DANGER")
- )
- ]
+ new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setCustomId("result.suggest|" + query)
+ .setLabel(l("Suggest a missing pony", "Proposer un poney manquant", interaction.user.id, interaction.guild.id))
+ .setStyle("SECONDARY"),
+ new MessageButton()
+ .setCustomId("result.report|" + query)
+ .setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
+ .setStyle("DANGER")
+ )
+ ]
});
}
}
diff --git a/handler/errors.js b/handler/errors.js
index 1bae519..c816369 100755..100644
--- a/handler/errors.js
+++ b/handler/errors.js
@@ -2,43 +2,47 @@ const fs = require('fs');
const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
module.exports = async (interaction, e) => {
+ console.error(e);
+ fs.writeFileSync("./reports/Telemetry-Crash-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n System Crash Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n -\n\nReport Type:\n Automated Error Report\n\n-------------------------\n\n" + e.stack)
try {
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#dc2828')
.setTitle(l("An internal exception occurred", "Une erreur interne s'est produite", interaction.user.id, interaction.guild.id))
- .setDescription(l("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible.", "Ce n'est pas votre faute ! Les développeurs ont déjà été informés du problème et il sera corrigé aussi vite que possible.", interaction.user.id, interaction.guild.id) + "\n\n```\n" + e.stack + "\n```")
- ],
- components: [
- new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setCustomId("error.report")
- .setLabel(l("Send bug report", "Envoyer un rapport de bug", interaction.user.id, interaction.guild.id))
- .setStyle("DANGER")
- )
- ]
- });
- } catch (e) {
- await interaction.reply({
- ephemeral: false,
- embeds: [
- new MessageEmbed()
- .setColor('#dc2828')
- .setTitle("An internal exception occurred")
- .setDescription("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible.\n\n```\n" + e.stack + "\n```")
- ],
- components: [
- new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setCustomId("error.report")
- .setLabel("Send bug report")
- .setStyle("DANGER")
- )
+ .setDescription(l("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible.", "Ce n'est pas votre faute ! Les développeurs ont déjà été informés du problème et il sera corrigé aussi vite que possible.", interaction.user.id, interaction.guild.id))
]
});
+ } catch (e2) {
+ fs.writeFileSync("./reports/Telemetry-Crash-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n System Crash Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n -\n\nReport Type:\n Automated Error Report (chained with " + e.message + ")\n\n-------------------------\n\n" + e2.stack)
+ try {
+ await interaction.reply({
+ ephemeral: true,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle("2 internal exceptions occurred")
+ .setDescription("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible. We additionally weren't able to deliver you a localized error message.")
+ ]
+ });
+ } catch (e3) {
+ fs.writeFileSync("./reports/Telemetry-Crash-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n System Crash Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n -\n\nReport Type:\n Automated Error Report (chained with " + e.message + " and " + e2.message + ")\n\n-------------------------\n\n" + e3.stack)
+ try {
+ interaction.channel.send({embeds: [new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle("3 internal exceptions occurred")
+ .setDescription("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible. We additionally weren't able to deliver you a localized error message and/or through a reply to your command.")]
+ }).catch((e4) => {
+ fs.writeFileSync("./reports/Telemetry-Crash-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n System Crash Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n -\n\nReport Type:\n Automated Error Report (chained with " + e.message + ", " + e2.message + " and " + e3.message + ")\n\n-------------------------\n\n" + e4.stack)
+ interaction.user.send({
+ embeds: [new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle("4 internal exceptions occurred")
+ .setDescription("That's not your fault! The developers have already been informed about the issue and will resolve it as soon as possible. We additionally weren't able to deliver you a localized error message, through a reply to your command and/or through the channel you initially executed the command.")]
+ })
+ })
+ } catch (e) {}
+ }
}
} \ No newline at end of file
diff --git a/handler/menu.js b/handler/menu.js
index e2fd8c2..519aef6 100755..100644
--- a/handler/menu.js
+++ b/handler/menu.js
@@ -6,9 +6,9 @@ module.exports = async (interaction) => {
if (keys[0].startsWith("report.issue.")) {
item = keys[0].substr(13)
- fs.writeFileSync("./reports/PonyIssue-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------\nPonyfind Issue Report\n-------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n " + keys[1] + "\n\nReport Type:\n " + item)
+ fs.writeFileSync("./reports/Telemetry-Pony-" + (new Date().toISOString().replace(/[^a-zA-Z0-9]/gm, "-")) + ".txt", "-------------------------\nPonyfind Telemetry Report\n-------------------------\n\nReport Type:\n Pony Issue Report\n\n-------------------------\n\nReporter:\n " + interaction.user.tag + " (" + interaction.user.id + ")\n\nServer:\n " + interaction.guild.name + " (" + interaction.guild.id + ")\n\nChannel:\n " + interaction.channel.name + " (" + interaction.channel.id + ")\n\nItem:\n " + keys[1] + "\n\nReport Type:\n " + item)
await interaction.reply({
- ephemeral: false,
+ ephemeral: true,
embeds: [
new MessageEmbed()
.setColor('#28dc46')