diff options
Diffstat (limited to 'handler')
-rwxr-xr-x | handler/button.js | 60 | ||||
-rwxr-xr-x | handler/command.js | 137 | ||||
-rwxr-xr-x | handler/errors.js | 44 | ||||
-rwxr-xr-x | handler/menu.js | 22 |
4 files changed, 263 insertions, 0 deletions
diff --git a/handler/button.js b/handler/button.js new file mode 100755 index 0000000..5d5fe03 --- /dev/null +++ b/handler/button.js @@ -0,0 +1,60 @@ +const fs = require('fs');
+const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
+
+module.exports = async (interaction) => {
+ keys = interaction.customId.split("|")
+
+ if (keys[0] === "result.report") {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle(l("Report an issue with", "Signaler un problème avec", interaction.user.id, interaction.guild.id) + " \"" + keys[1] + "\"")
+ .setDescription(l("If you think the result to your query is problematic, you can report it so that the developers fix the issue.", "Si vous pensez que le résultat donné est problématique, vous pouvez le signaler pour que les développeurs corrigent le problème.", interaction.user.id, interaction.guild.id))
+ ],
+ components: [
+ new MessageActionRow()
+ .addComponents(
+ new MessageSelectMenu()
+ .setCustomId('select')
+ .setPlaceholder(l("Select a type of issue", "Sélectionnez le type de problème", interaction.user.id, interaction.guild.id))
+ .addOptions([
+ {
+ label: l("Inappropriate", "Inapproprié", interaction.user.id, interaction.guild.id),
+ description: l("The result contains inappropriate content: chocking or violent.", "La réponse contient du contenu inapproprié à certains publics, choquant, ou violent.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.innapropriate|' + keys[1],
+ },
+ {
+ label: l("Off topic", "Hors sujet", interaction.user.id, interaction.guild.id),
+ description: l("The result contains info that is unrelated to the aforementioned character.", "La réponse contient du contenu n'ayant pas de rapport avec le personnage évoqué.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.off|' + keys[1],
+ },
+ {
+ label: l("Incoherent data", "Données incohérentes", interaction.user.id, interaction.guild.id),
+ description: l("The result contains incoherent data, due to a database error.", "La réponse contient des données incohérentes, dûes à une erreur dans la base de données.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.data|' + keys[1],
+ },
+ {
+ label: l("Wrong result", "Mauvais résultat", interaction.user.id, interaction.guild.id),
+ description: l("The given result is not what was expected with this query.", "La réponse donnée n'est pas la réponse attendue par rapport à la demande.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.wrong|' + keys[1],
+ },
+ {
+ label: l("Wrong image(s)", "Mauvaise(s) image(s)", interaction.user.id, interaction.guild.id),
+ description: l("One or more of the provided image(s) do(es)n't correspond to the shown character.", "Une ou plusieurs image(s) fournie(s) avec la réponse ne correspond(ent) pas au personnage affiché.", interaction.user.id, interaction.guild.id),
+ value: 'report.issue.image|' + keys[1],
+ },
+ {
+ label: l("Wrong information", "Information erronée", interaction.user.id, interaction.guild.id),
+ 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],
+ },
+ ]),
+ )
+ ]
+ });
+ } else {
+ throw new Error("Unknown Button ID");
+ }
+}
\ No newline at end of file diff --git a/handler/command.js b/handler/command.js new file mode 100755 index 0000000..c1cfe22 --- /dev/null +++ b/handler/command.js @@ -0,0 +1,137 @@ +const fs = require('fs');
+const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
+
+const getResult = require('../result');
+const getEmbed = require('../embed');
+
+module.exports = async (interaction) => {
+ if (interaction.commandName === 'lang') {
+ lang = interaction.options.getString('locale');
+ if (lang === "fr") {
+ langs[interaction.user.id] = "fr";
+ } else {
+ langs[interaction.user.id] = "en";
+ }
+ fs.writeFileSync("./userdata.json", JSON.stringify(langs, null, 4));
+ if (typeof servers[interaction.guild.id] !== "undefined") {
+ if (lang === "fr") {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Language settings", "Paramètres de langue", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Your preferred language is now **French**.\n\n> **Note:** This server enforces English for all users, your personal preferred language won't apply here.", "Votre langue principale est maintenant le **français**.\n\n> **Note :** Ce serveur oblige l'utilisation du français pour tous les utilisateurs, votre option de langue personelle ne s'appliquera pas ici.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ } else {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Language settings", "Paramètres de langue", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Your preferred language is now **English**.\n\n> **Note:** This server enforces English for all users, your personal preferred language won't apply here.", "Votre langue principale est maintenant le **anglais**.\n\n> **Note :** Ce serveur oblige l'utilisation du français pour tous les utilisateurs, votre option de langue personelle ne s'appliquera pas ici.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ }
+ } else {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Language settings", "Paramètres de langue", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Your preferred language is now **English**.", "Votre langue principale est maintenant le **français**.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ }
+ }
+
+ if (interaction.commandName === 'serverlang') {
+ lang = interaction.options.getString('locale');
+ if (lang === "fr") {
+ servers[interaction.guild.id] = "fr";
+ } else if (lang === "en") {
+ servers[interaction.guild.id] = "en";
+ } else {
+ delete servers[interaction.guild.id];
+ }
+ fs.writeFileSync("./servers.json", JSON.stringify(servers, null, 4));
+ if (lang === "en" || lang === "fr") {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Server language settings", "Paramètres de langue du serveur", interaction.user.id, interaction.guild.id))
+ .setDescription(l("This server's enforced language is now **English**.", "La langue forcée sur ce serveur est maintenant le **français**.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ } else {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Server language settings", "Paramètres de langue du serveur", interaction.user.id, interaction.guild.id))
+ .setDescription(l("This server's enforced language is the user's prefered language.", "La langue forcée sur ce serveur est la langue de l'utilisateur.", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ }
+ }
+
+ if (interaction.commandName === 'pony') {
+ query = interaction.options.getString('query');
+ result = getResult(query);
+
+ if (result.results.length > 0 && getEmbed(result.results[0], interaction.user.id, interaction.guild.id) !== false) {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ getEmbed(result.results[0], 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])),
+ new MessageButton()
+ .setCustomId("pony.pixel|" + result.results[0])
+ .setLabel("Pixel Art")
+ .setStyle("SECONDARY"),
+ new MessageButton()
+ .setCustomId("result.report|" + result.results[0])
+ .setLabel(l("Report an issue", "Signaler un problème", interaction.user.id, interaction.guild.id))
+ .setStyle("DANGER")
+ )
+ ]
+ });
+ } else {
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#dc2828')
+ .setTitle(l("Results for", "Résultats pour", interaction.user.id, interaction.guild.id) + " \"" + query + "\"")
+ .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")
+ )
+ ]
+ });
+ }
+ }
+}
\ No newline at end of file diff --git a/handler/errors.js b/handler/errors.js new file mode 100755 index 0000000..1bae519 --- /dev/null +++ b/handler/errors.js @@ -0,0 +1,44 @@ +const fs = require('fs');
+const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
+
+module.exports = async (interaction, e) => {
+ try {
+ await interaction.reply({
+ ephemeral: false,
+ 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")
+ )
+ ]
+ });
+ }
+}
\ No newline at end of file diff --git a/handler/menu.js b/handler/menu.js new file mode 100755 index 0000000..e2fd8c2 --- /dev/null +++ b/handler/menu.js @@ -0,0 +1,22 @@ +const fs = require('fs');
+const { MessageActionRow, MessageButton, MessageSelectMenu, MessageEmbed } = require('discord.js');
+
+module.exports = async (interaction) => {
+ keys = interaction.values[0].split("|")
+
+ 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)
+ await interaction.reply({
+ ephemeral: false,
+ embeds: [
+ new MessageEmbed()
+ .setColor('#28dc46')
+ .setTitle(l("Thanks for reporting an issue with", "Merci d'avoir signalé un problème avec", interaction.user.id, interaction.guild.id) + " \"" + keys[1] + "\"" + l("!", " !", interaction.user.id, interaction.guild.id))
+ .setDescription(l("Your report has been sent to the developers. They can contact you later if your settings allow this to ask you more about your issue.\nThanks for your help!", "Votre rapport a bien été envoyé aux développeurs. Ils pourront vous recontacter si vos paramètres le permettent afin de vous poser plus de questions sur le problème que vous rencontrez.\nMerci d'aider à améliorer notre système !", interaction.user.id, interaction.guild.id))
+ ]
+ });
+ } else {
+ throw new Error("Unknown Menu ID");
+ }
+}
\ No newline at end of file |