diff --git a/.env.example b/.env.example index b55205c..92d0bc0 100644 --- a/.env.example +++ b/.env.example @@ -20,4 +20,7 @@ WEATHERSTACK_KEY= STRANGE_API_KEY= # Required for gemini command (https://aistudio.google.com/app/prompts/new_chat) -GEMINI_API= \ No newline at end of file +GEMINI_API= + +# Required for few anime commands (https://docs.waifu.it) +WAIFU_IT_KEY= \ No newline at end of file diff --git a/README.md b/README.md index e8dceb1..8eb505d 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,9 @@ STRANGE_API_KEY= # Required for gemini command (https://aistudio.google.com/app/prompts/new_chat) GEMINI_API= + +# Required for few anime commands (https://docs.waifu.it) +WAIFU_IT_KEY= ``` kalau dapet error sama lavaclient plugin coba ganti ```package.json``` yang ada di ```node_modules/@lavaclient/plugin-queue/``` yang awal nya seperti ini: diff --git a/package-lock.json b/package-lock.json index c9e2b07..fc131be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,8 @@ "string-progressbar": "^1.0.4", "table": "^6.8.1", "timestamp-to-date": "^1.1.0", - "twemoji-parser": "^14.0.0" + "twemoji-parser": "^14.0.0", + "waifu.it": "^1.2.1" }, "devDependencies": { "eslint": "^8.56.0", @@ -942,6 +943,15 @@ "node": ">=6" } }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1609,6 +1619,12 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -1930,6 +1946,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3206,6 +3242,18 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "license": "MIT" }, + "node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "license": "MIT", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4289,6 +4337,16 @@ "node": ">= 0.8" } }, + "node_modules/waifu.it": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/waifu.it/-/waifu.it-1.2.1.tgz", + "integrity": "sha512-INWQnzwXK8124sHKGx/o8mkE5FjsaFVdLnRNs/jzk4Z0vPWGsKE9GYRETPpT6rrO4FdtbBZZE++qMU9ocG7JRg==", + "license": "AGPL-3.0", + "dependencies": { + "eventemitter3": "^4.0.7", + "phin": "^3.7.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index cfccf92..532f7cc 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,8 @@ "string-progressbar": "^1.0.4", "table": "^6.8.1", "timestamp-to-date": "^1.1.0", - "twemoji-parser": "^14.0.0" + "twemoji-parser": "^14.0.0", + "waifu.it": "^1.2.1" }, "optionalDependencies": { "bufferutil": "^4.0.8", diff --git a/src/commands/anime/animefact.js b/src/commands/anime/animefact.js new file mode 100644 index 0000000..1e63219 --- /dev/null +++ b/src/commands/anime/animefact.js @@ -0,0 +1,50 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("@root/config"); +const Client = require("waifu.it"); +const api = new Client(process.env.WAIFU_IT_KEY); + + +/** + * @type {import("@structures/Command")} + */ +module.exports = { + name: "animefact", + description: "get a random anime fact", + enabled: true, + category: "ANIME", + cooldown: 5, + command: { + enabled: true, + }, + slashCommand: { + enabled: true, + options: [], + }, + + async messageRun(message) { + const embed = await genFact(message.author); + await message.safeReply({ embeds: [embed] }); + }, + + async interactionRun(interaction) { + const embed = await genFact(interaction); + await interaction.followUp({ embeds: [embed] }); + }, +}; + +const genFact = async (user) => { + try { + const data = await api.getFact(); + return new EmbedBuilder() + .setTitle("Anime Fact:") + .setDescription(`${data.fact}`) + .setColor("Random") + .setThumbnail("https://tenor.com/view/anime-idea-i-have-a-plan-i-have-an-idea-gif-14108957") + .setFooter({ text: `Requested by ${user.user.username}` }); + } catch (ex) { + return new EmbedBuilder() + .setColor(EMBED_COLORS.ERROR) + .setDescription("Failed to fetch. Try again!") + .setFooter({ text: `Requested by ${user.user.username}` }); + } +}; \ No newline at end of file diff --git a/src/commands/anime/animequote.js b/src/commands/anime/animequote.js new file mode 100644 index 0000000..755c20a --- /dev/null +++ b/src/commands/anime/animequote.js @@ -0,0 +1,49 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("@root/config"); +const Client = require("waifu.it"); +const api = new Client(process.env.WAIFU_IT_KEY); + + +/** + * @type {import("@structures/Command")} + */ +module.exports = { + name: "animequote", + description: "get a radom anime quote", + enabled: true, + category: "ANIME", + cooldown: 5, + command: { + enabled: true, + }, + slashCommand: { + enabled: true, + options: [], + }, + + async messageRun(message) { + const embed = await genQuote(message.author); + await message.safeReply({ embeds: [embed] }); + }, + + async interactionRun(interaction) { + const embed = await genQuote(interaction); + await interaction.followUp({ embeds: [embed] }); + }, +}; + +const genQuote = async (user) => { + try { + const data = await api.getQuote(); + return new EmbedBuilder() + .setTitle(`${data.author} said:`) + .setDescription(`${data.quote}`) + .setColor("Random") + .setFooter({ text: `Anime: ${data.anime}` }); + } catch (ex) { + return new EmbedBuilder() + .setColor(EMBED_COLORS.ERROR) + .setDescription("Failed to fetch. Try again!") + .setFooter({ text: `Requested by ${user.user.username}` }); + } +}; \ No newline at end of file diff --git a/src/commands/anime/waifu.js b/src/commands/anime/waifu.js new file mode 100644 index 0000000..402bccc --- /dev/null +++ b/src/commands/anime/waifu.js @@ -0,0 +1,50 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("@root/config"); +const Client = require("waifu.it"); +const api = new Client(process.env.WAIFU_IT_KEY); + +/** + * @type {import("@structures/Command")} + */ +module.exports = { + name: "waifu", + description: "get a anime waifu", + enabled: true, + category: "ANIME", + cooldown: 5, + command: { + enabled: true, + }, + slashCommand: { + enabled: true, + options: [], + }, + + async messageRun(message) { + const embed = await genWaifu(message.author); + await message.safeReply({ embeds: [embed] }); + }, + + async interactionRun(interaction) { + const embed = await genWaifu(interaction); + await interaction.followUp({ embeds: [embed] }); + }, +}; + +const genWaifu = async (user) => { + try { + const waifu = await api.getWaifu(); + return new EmbedBuilder() + .setTitle(waifu.name.full) + .setDescription(`Anime: ${waifu.media.nodes[0].title.romaji}`) + .setImage(waifu.image.large) + .setColor("Random") + .setFooter({ text: `❤️ ${waifu.favourites}` }); + } catch (ex) { + return new EmbedBuilder() + .setColor(EMBED_COLORS.ERROR) + .setDescription("Failed to fetch. Try again!") + .setFooter({ text: `Requested by ${user.user.username}` }); + } +}; +