discord.js-akinator-button
Version:
アキネーターのコマンドを作ることができます。
472 lines (444 loc) • 21.2 kB
JavaScript
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}`)
}
}