UNPKG

discord.js-akinator-button

Version:

アキネーターのコマンドを作ることができます。

472 lines (444 loc) 21.2 kB
const Discord = require("discord.js"); const discord = require("discord.js"); const { Aki } = require("aki-api"); const games = new Set(); const attemptingGuess = new Set(); /** * @param {Discord.Message} message The Message Sent by the User. * @param {Discord.Client} client The Discord Client. * @param {"en" | "ar" | "cn" | "de" | "es" | "fr" | "il" | "it" | "jp" | "kr" | "nl" | "pl" | "pt" | "ru" | "tr" | "id"} region (OPTIONAL): The Region/Language Code you want Akinator to Use. Defaults to "en". * @returns Discord.js Akinator Game * @async * @example * const Discord = require("discord.js"); * const client = new Discord.Client(); * const akinator = require("discord.js-akinator"); * * const PREFIX = "!"; * * client.on("message", async message => { * if(message.content.startsWith(`${PREFIX}akinator`)) { * akinator(message, client) * } * }); */ module.exports = async function(message, client, region) { try { // error handling if (!message) return console.log("Discord.js Akinator Error: メッセージ引数がundefined(nullish)です'"); if (!client) return console.log("Discord.js Akinator Error: Client引数がundefined(nullish)です"); if (!region) region = "jp" if (!message.id || !message.channel || !message.channel.id || !message.author) throw new Error("メッセージ引数の値が間違っています") if (!client.user.id || !client.user) throw new Error("Client引数の値が間違っています") if (!message.guild) throw new Error("DMでは使えません") // defining for easy use let usertag = message.author.tag let avatar = message.author.displayAvatarURL() // check if a game is being hosted by the player if (games.has(message.author.id)) { let alreadyPlayingEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`❌あなたはすでにゲームをプレイしています`) .setDescription("**あなたはすでにゲームが始まっています。停止ボタンを押すことで停止できます。**") .setColor("RED") return message.channel.send({ embeds: [alreadyPlayingEmbed] }) } // adding the player into the game games.add(message.author.id) let startingEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`ゲームスタート中`) .setDescription("**あと3秒でゲームが始まります。**") .setColor("RANDOM") let startingMessage = await message.channel.send({ embeds: [startingEmbed] }) // starts the game let aki = new Aki(region) await aki.start(); let notFinished = true; let stepsSinceLastGuess = 0; let hasGuessed = false; let noResEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`ゲーム終了`) .setDescription(`**${message.author.username}、1分間操作がなかったためゲームが終了しました。**`) .setColor("RANDOM") let akiEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`質問 ${aki.currentStep + 1}`) .setDescription(`**進行状況: 0%\n${aki.question}**`) .addField("ボタンを押してください", ":o:はい\n:x:いいえ\n**i** または **IDK**(わからない)\n**p** または **Probably**(たぶんそう/一部そう)\n**pn** または **Probably Not**(多分違う/一部違う)\n**b** または **Back**(戻る)") .setFooter(`「S」か「Stop」でゲーム終了`) .setColor("RANDOM") let yesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい"); let noButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ"); let idkButton = new discord.MessageButton() .setCustomId("aki_idk") .setStyle("SECONDARY") .setEmoji("❓") .setLabel("わからない") let probablyButton = new discord.MessageButton() .setCustomId("aki_probably") .setStyle("SECONDARY") .setEmoji("▶️") .setLabel("たぶんそう/一部そう"); let probablyNotButton = new discord.MessageButton() .setCustomId("aki_probablynot") .setStyle("SECONDARY") .setEmoji("◀️") .setLabel("たぶんちがう/一部違う"); let backButton = new discord.MessageButton() .setCustomId("aki_back") .setStyle("DANGER") .setEmoji("🔙") .setLabel("戻る"); let stopButton = new discord.MessageButton() .setCustomId("aki_stop") .setStyle("DANGER") .setEmoji("⏹️") .setLabel("やめる"); let answerActionRow = new discord.MessageActionRow().addComponents([yesButton, noButton, idkButton, probablyButton, probablyNotButton]); let backActionRow = new discord.MessageActionRow().addComponents([backButton, stopButton]); await startingMessage.delete(); let akiMessage = await message.channel.send({ embeds: [akiEmbed], components: [answerActionRow, backActionRow] }); // if message was deleted, quit the player from the game client.on("messageDelete", async deletedMessage => { if (deletedMessage.id == akiMessage.id) { notFinished = false; games.delete(message.author.id) attemptingGuess.delete(message.guild.id) await aki.win() return; } }) // repeat while the game is not finished while (notFinished) { if (!notFinished) return; stepsSinceLastGuess = stepsSinceLastGuess + 1 if (((aki.progress >= 95 && (stepsSinceLastGuess >= 10 || hasGuessed == false)) || aki.currentStep >= 78) && (!attemptingGuess.has(message.guild.id))) { attemptingGuess.add(message.guild.id) await aki.win(); stepsSinceLastGuess = 0; hasGuessed = true; let guessEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`私は${Math.round(aki.progress)}%完了して考えたキャラクターは...`) .setDescription(`**${aki.answers[0].name}**\n${aki.answers[0].description}\n\nこのキャラクターですか? **(y/Yes か n/No で回答)**`) .addField("ランキング", `**${aki.answers[0].ranking}位**`, true) .addField("質問数", `**${aki.currentStep}**`, true) .setImage(aki.answers[0].absolute_picture_path) .setColor("RANDOM") let disabledIdkButton = new discord.MessageButton() .setCustomId("aki_idk") .setStyle("SECONDARY") .setEmoji("❓") .setLabel("わからない") .setDisabled(); let disabledProbablyButton = new discord.MessageButton() .setCustomId("aki_probably") .setStyle("SECONDARY") .setEmoji("▶️") .setLabel("たぶんそう/一部そう") .setDisabled(); let disabledProbablyNotButton = new discord.MessageButton() .setCustomId("aki_probablynot") .setStyle("SECONDARY") .setEmoji("◀️") .setLabel("たぶんちがう/一部違う") .setDisabled(); let disabledBackButton = new discord.MessageButton() .setCustomId("aki_back") .setStyle("DANGER") .setEmoji("🔙") .setLabel("戻る") .setDisabled(); let disabledStopButton = new discord.MessageButton() .setCustomId("aki_stop") .setStyle("DANGER") .setEmoji("⏹️") .setLabel("やめる") .setDisabled(); let partialDisabledAnswerActionRow = new discord.MessageActionRow().addComponents([yesButton, noButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); let disabledBackActionRow = new discord.MessageActionRow().addComponents([disabledBackButton, disabledStopButton]); await akiMessage.edit({ embeds: [guessEmbed], components: [partialDisabledAnswerActionRow, disabledBackActionRow] }); // valid answers if the akinator sends the last question const guessFilter = x => { return (x.user.id === message.author.id); } await akiMessage.awaitMessageComponent({ filter: guessFilter, time: 60000, componentType: "BUTTON" }) .then(async responses => { const guessAnswer = responses.customId.slice(4); attemptingGuess.delete(message.guild.id) // if they answered yes if (guessAnswer == "yes") { let disabledYesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい") .setDisabled(); let disabledNoButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ") .setDisabled(); let disabledAnswerActionRow = new discord.MessageActionRow().addComponents([disabledYesButton, disabledNoButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); let finishedGameCorrect = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`よくやった!`) .setDescription(`**${message.author.username}、私はもう一度正しいと思いました!**`) .addField("キャラクター", `**${aki.answers[0].name}**`, true) .addField("ランキング", `**#${aki.answers[0].ranking}**`, true) .addField("何番目の質問?", `**${aki.currentStep}**`, true) .setColor("RANDOM") await akiMessage.edit({ embeds: [finishedGameCorrect], components: [disabledAnswerActionRow, disabledBackActionRow] }); notFinished = false; games.delete(message.author.id) return; // otherwise } else if (guessAnswer == "no") { if (aki.currentStep >= 78) { let finishedGameDefeated = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`よくやった!`) .setDescription(`**${message.author.username}、ブラボー!あなたに負けてしまった...**`) .setColor("RANDOM") let disabledYesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい") .setDisabled(); let disabledNoButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ") .setDisabled(); let disabledAnswerActionRow = new discord.MessageActionRow().addComponents([disabledYesButton, disabledNoButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); await responses.update({ embeds: [finishedGameDefeated], components: [disabledAnswerActionRow, disabledBackActionRow]}); notFinished = false; games.delete(message.author.id) } else { aki.progress = 50 } } }) .catch(err => { let disabledYesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい") .setDisabled(); let disabledNoButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ") .setDisabled(); let disabledIdkButton = new discord.MessageButton() .setCustomId("aki_idk") .setStyle("SECONDARY") .setEmoji("❓") .setLabel("わからない") .setDisabled(); let disabledProbablyButton = new discord.MessageButton() .setCustomId("aki_probably") .setStyle("SECONDARY") .setEmoji("▶️") .setLabel("たぶんそう/一部そう") .setDisabled(); let disabledProbablyNotButton = new discord.MessageButton() .setCustomId("aki_probablynot") .setStyle("SECONDARY") .setEmoji("◀️") .setLabel("たぶんちがう/一部違う") .setDisabled(); let disabledBackButton = new discord.MessageButton() .setCustomId("aki_back") .setStyle("DANGER") .setEmoji("🔙") .setLabel("戻る") .setDisabled(); let disabledStopButton = new discord.MessageButton() .setCustomId("aki_stop") .setStyle("DANGER") .setEmoji("⏹️") .setLabel("やめる") .setDisabled(); let disabledBackActionRow = new discord.MessageActionRow().addComponents([disabledBackButton, disabledStopButton]); let disabledAnswerActionRow = new discord.MessageActionRow().addComponents([disabledYesButton, disabledNoButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); return akiMessage.edit({ embeds: [noResEmbed], components: [disabledAnswerActionRow, disabledBackActionRow]}); }); } if (!notFinished) return; let updatedAkiEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`質問${aki.currentStep + 1}`) .setDescription(`**進行状況${Math.round(aki.progress)}%\n${aki.question}**`) .addField("送信してください", "**y** または **Yes**(はい)\n**n** または **No**(いいえ)\n**i** または **IDK**(わからない)\n**p** または **Probably**(たぶんそう/一部そう)\n**pn** または **Probably Not**(多分違う/一部違う)\n**b** または **Back**(戻る)") .setFooter(`\`S\`または\`Stop\`でゲーム終了`) .setColor("RANDOM") akiMessage.edit({ embeds: [updatedAkiEmbed], components: [answerActionRow, backActionRow]}) // all valid answers when answering a regular akinator question const filter = x => { return (x.user.id === message.author.id); } await akiMessage.awaitMessageComponent({filter: filter, time: 60000, componentType: "BUTTON" }) .then(async responses => { if (!responses) { } const answer = responses.customId.slice(4); // assign points for the possible answers given const answers = { "yes": 0, "no": 1, "idk": 2, "probably": 3, "probablynot": 4, } let disabledYesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい") .setDisabled(); let disabledNoButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ") .setDisabled(); let disabledIdkButton = new discord.MessageButton() .setCustomId("aki_idk") .setStyle("SECONDARY") .setEmoji("❓") .setLabel("わからない") .setDisabled(); let disabledProbablyButton = new discord.MessageButton() .setCustomId("aki_probably") .setStyle("SECONDARY") .setEmoji("▶️") .setLabel("たぶんそう/一部そう") .setDisabled(); let disabledProbablyNotButton = new discord.MessageButton() .setCustomId("aki_probablynot") .setStyle("SECONDARY") .setEmoji("◀️") .setLabel("たぶんちがう/一部違う") .setDisabled(); let disabledBackButton = new discord.MessageButton() .setCustomId("aki_back") .setStyle("DANGER") .setEmoji("🔙") .setLabel("戻る") .setDisabled(); let disabledStopButton = new discord.MessageButton() .setCustomId("aki_stop") .setStyle("DANGER") .setEmoji("⏹️") .setLabel("やめる") .setDisabled(); let disabledBackActionRow = new discord.MessageActionRow().addComponents([disabledBackButton, disabledStopButton]); let disabledAnswerActionRow = new discord.MessageActionRow().addComponents([disabledYesButton, disabledNoButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); let thinkingEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`質問${aki.currentStep + 1}`) .setDescription(`**進行状況: ${Math.round(aki.progress)}%\n${aki.question}**`) .addField("送信してください", "**y** または **Yes**(はい)\n**n** または **No**(いいえ)\n**i** または **IDK**(わからない)\n**p** または **Probably**(たぶんそう/一部そう)\n**pn** または **Probably Not**(多分違う/一部違う)\n**b** または **Back**(戻る)") .setFooter(`考え中です...少し待ってね`) .setColor("RANDOM") await responses.update({ embeds: [thinkingEmbed], components: [disabledAnswerActionRow, disabledBackActionRow]}); if (answer == "back") { if (aki.currentStep >= 1) { await aki.back(); } // stop the game if the user selected to stop } else if (answer == "stop") { games.delete(message.author.id) let stopEmbed = new Discord.MessageEmbed() .setAuthor(usertag, avatar) .setTitle(`ゲーム終了`) .setDescription(`**${message.author.username}、ゲームを終了しました!**`) .setColor("RANDOM") await aki.win() await akiMessage.edit({ embeds: [stopEmbed] }) notFinished = false; } else { await aki.step(answers[answer]); } if (!notFinished) return; }) .catch(async err => { console.log(err) let disabledYesButton = new discord.MessageButton() .setCustomId("aki_yes") .setStyle("SECONDARY") .setEmoji("⭕") .setLabel("はい") .setDisabled(); let disabledNoButton = new discord.MessageButton() .setCustomId("aki_no") .setStyle("SECONDARY") .setEmoji("❌") .setLabel("いいえ") .setDisabled(); let disabledIdkButton = new discord.MessageButton() .setCustomId("aki_idk") .setStyle("SECONDARY") .setEmoji("❓") .setLabel("わからない") .setDisabled(); let disabledProbablyButton = new discord.MessageButton() .setCustomId("aki_probably") .setStyle("SECONDARY") .setEmoji("▶️") .setLabel("たぶんそう/一部そう") .setDisabled(); let disabledProbablyNotButton = new discord.MessageButton() .setCustomId("aki_probablynot") .setStyle("SECONDARY") .setEmoji("◀️") .setLabel("たぶんちがう/一部違う") .setDisabled(); let disabledBackButton = new discord.MessageButton() .setCustomId("aki_back") .setStyle("DANGER") .setEmoji("🔙") .setLabel("戻る") .setDisabled(); let disabledStopButton = new discord.MessageButton() .setCustomId("aki_stop") .setStyle("DANGER") .setEmoji("⏹️") .setLabel("やめる") .setDisabled(); let disabledBackActionRow = new discord.MessageActionRow().addComponents([disabledBackButton, disabledStopButton]); let disabledAnswerActionRow = new discord.MessageActionRow().addComponents([disabledYesButton, disabledNoButton, disabledIdkButton, disabledProbablyButton, disabledProbablyNotButton]); await aki.win() notFinished = false; games.delete(message.author.id) return akiMessage.edit({ embeds: [noResEmbed], components: [disabledAnswerActionRow, disabledBackActionRow]}); }); } } catch (e) { // log any errors that come attemptingGuess.delete(message.guild.id) games.delete(message.guild.id) if (e == "DiscordAPIError: Unknown Message") return; console.log(`Discord.js Akinator Error: ${e}`) } }