From 46d822da73913e14d79cc6884baa1f03f6565da3 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sun, 14 May 2023 21:10:16 +0900 Subject: [PATCH 01/90] =?UTF-8?q?=E4=B8=BB=E3=81=AB=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=82=BD=E3=83=BC=E3=83=AB=E3=81=A8=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 14 +++--- deploy-commands.js | 56 +++++++++++----------- events/misc/slashcommand.js | 5 +- index.js | 93 ++++++++++++++++++++++++++----------- package-lock.json | 11 +++++ package.json | 1 + 6 files changed, 112 insertions(+), 68 deletions(-) diff --git a/.env b/.env index 9c29a1a..5978d80 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ -TOKEN=token -clientId=clientid +TOKEN=NzYxNjE2Njg5OTE3MDY3Mjc0.GoyLpW.y2XpN3iSLn4ZZRkRDJP4kyH97izQJcGjHgrDHQ +clientId=761616689917067274 URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text -db_password = "test"#text +db_password = "root"#text db_port = 3306#int db_limit = 5#int(接続を試みる時間) -db_name = "test"#DBの名前(SQLにログインしてcreate database hogeで作成) +db_name = "newer-kuronekochanbot"#DBの名前(SQLにログインしてcreate database hogeで作成) core_host="s52.coreserver.jp" core_account="kuronekoserver.kuronekobot" -core_password="japak82issKWIOQ" +core_password=""#"japak82issKWIOQ" core_port="21" voicevox="http://127.0.0.1:50021" COEIROINK="http://127.0.0.1:50031" @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" +errorwebhook="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT" version="1.0.3"#上がるタイミング分からんけど書いとく Proxy="プロキシ" diff --git a/deploy-commands.js b/deploy-commands.js index 5932290..f750225 100644 --- a/deploy-commands.js +++ b/deploy-commands.js @@ -1,34 +1,30 @@ -const fs = require('fs'); -const path = require('path'); -const { REST, Routes } = require('discord.js'); -const { TOKEN, clientId } = process.env; -const chalk = require('chalk'); +const { REST, Routes } = require("discord.js"); +const fs = require("fs"); const option = require("./helpers/optionslash.json"); -const commands = []; -commands.push(option); -fs.readdirSync('./commands/').forEach(async dir => { - const commandsPath = path.join(__dirname, `./commands/${dir}`); - const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); +module.exports = async (logger) => { + const Log = logger.createChild("dep-cmd"); - for (const file of commandFiles) { - const command = require(`./commands/${dir}/${file}`); - commands.push(command.data.toJSON()); - }; -}); + const commands = []; + commands.push(option); -const rest = new REST({ version: '10' }).setToken(TOKEN); - -(async () => { - try { - console.log(chalk.green("[ロード開始]"), `${commands.length} 個のアプリケーション (/) コマンドをロードします。`); - const data = await rest.put( - Routes.applicationCommands(clientId), - { body: commands }, - ); - - console.log(chalk.green("[成功]"), `${data.length} 個のアプリケーション (/) コマンドをロードしました。`); - } catch (error) { - console.error(error); - } -})(); \ No newline at end of file + fs.readdirSync("./commands/").forEach(async (dir) => { + const commandsPath = `./commands/${dir}`; + const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + for (const file of commandFiles) { + const command = require(`./commands/${dir}/${file}`); + commands.push(command.data.toJSON()); + }; + }); + + Log.debug(`${commands.length}個のアプリケーションコマンドをロードしています...`); + const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); + rest.put( + Routes.applicationCommands(process.env.clientId), + { body: commands }, + ).then((data) => { + Log.debug(`${data.length}個のアプリケーションコマンドをロードしました。`); + }).catch((error) => { + Log.error(error.message); + }); +}; \ No newline at end of file diff --git a/events/misc/slashcommand.js b/events/misc/slashcommand.js index b40bb7a..73608fe 100644 --- a/events/misc/slashcommand.js +++ b/events/misc/slashcommand.js @@ -1,5 +1,4 @@ const { Events, EmbedBuilder, Colors } = require('discord.js'); -const chalk = require('chalk'); const permissions_embed = new EmbedBuilder() .setTitle("⚠️エラー") .setDescription("権限が足りません。\nBOTに権限を与えてください") @@ -9,6 +8,7 @@ const { send } = require("../../helpers/sendwebhook"); module.exports = { name: Events.InteractionCreate, async execute(interaction) { + const Log = interaction.client.logger.createChannel("interaction"); if (interaction.isAutocomplete()) { const command = interaction.client.commands.get(interaction.commandName); if (!command) return; @@ -24,9 +24,8 @@ module.exports = { try { await command.execute(interaction); } catch (err) { - console.log(chalk.red(`[エラー] ${err.message}`)); + Log.error(err.message + "\n" + err.stack) if (err.message === "Missing Permissions") return await interaction.reply({ embeds: [permissions_embed], ephemeral: true }).catch(() => { }); - send({ title: "interactionエラー", description: `${err.message}`, time: new Date(), color: Colors.Red }); const unknown_embed = new EmbedBuilder() .setTitle("⚠️エラー") .setDescription(`不明なエラーが発生しました。\n詳細:${err.message}\n運営に問い合わせていただけると幸いです。`) diff --git a/index.js b/index.js index 259d596..3bd0a7a 100644 --- a/index.js +++ b/index.js @@ -1,47 +1,86 @@ +const fs = require("fs"); +const path = require("path"); + +const { Client, GatewayIntentBits, Collection, Partials, Colors } = require("discord.js"); const { EnkaClient } = require("enka-network-api"); -const { Client, GatewayIntentBits, Collection, Partials, Colors } = require('discord.js'); +const axios = require("axios"); +const chalk = require("chalk"); +const { Logger } = require("dd-logger"); + +require("dotenv").config(); + +// Loggerのセットアップ +const logger = new Logger({ + levels: ["info", "warn", "error", "debug"], + writeLog(data) { + const { lineText, level: _level, time, location } = data; + let level = `[${_level}]`; + switch (_level) { + case "INFO": + break; + case "WARN": + level = chalk.magenta(level); + break; + case "ERROR": + level = chalk.red(level); + send({ + title: "エラー", + description: `[${location.join("][")}]\n${lineText}`, + time: new Date(), + color: Colors.DarkRed + }); + break; + case "DEBUG": + level = chalk.yellow(level); + break; + } + + console.log(`[${time}][${location.join("][")}] ${level} ${lineText}`); + } +}); +const Log = logger.createChannel("main"); + const client = new Client({ intents: Object.values(GatewayIntentBits), - partials: [Partials.Message, Partials.Channel, Partials.Reaction], rest: 60000 + partials: [Partials.Message, Partials.Channel, Partials.Reaction], + rest: 60000 }); -const chalk = require('chalk'); -require('dotenv').config(); -const fs = require('fs'); -const path = require('path'); -const axios = require('axios'); +client.logger = logger; + const { send } = require("./helpers/sendwebhook"); -require('./deploy-commands.js'); +require("./deploy-commands")(Log); + globalThis.voice_channel = []; globalThis.ylivechat = {}; globalThis.tlivechat = {}; + +// EnkaNetworkのcacheをアップデートする +const enka = new EnkaClient({ showFetchCacheLog: true }); + // イベントハンドラー client.events = new Collection(); -fs.readdirSync('./events/').forEach(async dir => { - const eventsPath = path.join(__dirname, `./events/${dir}`); - const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js')); +fs.readdirSync("./events/").forEach(async (dir) => { + const eventsPath = `./events/${dir}`; + const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith(".js")); for (const file of eventFiles) { - const filePath = path.join(eventsPath, file); - const event = require(filePath); - client.on(event.name, (...args) => event.execute(...args)); + const event = require(`${eventsPath}/${file}`); + client.on(event.name, event.execute); }; }); -//EnkaNetworkのcacheをアップデートする -const enka = new EnkaClient({ showFetchCacheLog: true }); - // スラッシュコマンドハンドラー client.commands = new Collection(); -fs.readdirSync('./commands/').forEach(async dir => { - const commandsPath = path.join(__dirname, `./commands/${dir}`); - const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); +fs.readdirSync("./commands/").forEach(async (dir) => { + const commandsPath = `./commands/${dir}`; + const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); + const filePath = `${commandsPath}/${file}`; const command = require(filePath); - if ('data' in command && 'execute' in command) { + if ("data" in command && "execute" in command) { client.commands.set(command.data.name, command); } else { - console.log(chalk.red("[警告]"), `${filePath}はdataかexecuteプロパティが設定されていません。`); + Log.warn(`${filePath}はdataかexecuteプロパティが設定されていません。`) }; }; }); @@ -50,18 +89,16 @@ fs.readdirSync('./commands/').forEach(async dir => { setInterval(() => { axios.get(process.env.URL) .then(response => { - console.log(chalk.green(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`)); + Log.info(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); }) .catch(error => { - console.log(chalk.red(`[GETリクエストエラー] ${error.config.url} - ${error.message}`)); - send({ title: "GETリクエストエラー", description: `${error.config.url} - ${error.message}`, time: new Date(), color: Colors.DarkRed }) + Log.warn(`[GETリクエスト] ${error.config.url} - ${error.message}`) }); }, 10000); // エラー後も処理継続 process.on("uncaughtException", (reason, promise) => { - console.log(chalk.red(`[エラー] ${reason}\n`) + chalk.yellow(`日時:${new Date()}`)); - send({ title: "その他のエラー", description: `[エラー] ${reason}`, time: new Date(), color: Colors.DarkRed }) + Log.error(`${reason}`); }); client.login(process.env.TOKEN); diff --git a/package-lock.json b/package-lock.json index d03e41d..b2c6c8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@vitalets/google-translate-api": "^9.1.0", "axios": "^1.3.4", "chalk": "^4.1.2", + "dd-logger": "^2.1.0", "discord-html-transcripts": "^3.1.3", "discord.js": "^14.9.0", "discord.js-pages": "^1.4.4", @@ -813,6 +814,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/dd-logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dd-logger/-/dd-logger-2.1.0.tgz", + "integrity": "sha512-E/UpStVpzZhpKXscZ0DBBX+AQoxLohdiMoIMKBy7iIob7Jo2TEGJw0IHX1PBirsQP1L0Uxlr54wARbOU02P6/Q==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3427,6 +3433,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "dd-logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dd-logger/-/dd-logger-2.1.0.tgz", + "integrity": "sha512-E/UpStVpzZhpKXscZ0DBBX+AQoxLohdiMoIMKBy7iIob7Jo2TEGJw0IHX1PBirsQP1L0Uxlr54wARbOU02P6/Q==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", diff --git a/package.json b/package.json index a71f21b..58ae934 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@vitalets/google-translate-api": "^9.1.0", "axios": "^1.3.4", "chalk": "^4.1.2", + "dd-logger": "^2.1.0", "discord-html-transcripts": "^3.1.3", "discord.js": "^14.9.0", "discord.js-pages": "^1.4.4", From 5c79d07b143d7f9e835e64051568b3e71be2ca5f Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sun, 14 May 2023 21:24:18 +0900 Subject: [PATCH 02/90] =?UTF-8?q?=E9=96=93=E9=81=95=E3=81=88=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 申し訳ございません。 --- .env | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.env b/.env index 5978d80..1262d6f 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ -TOKEN=NzYxNjE2Njg5OTE3MDY3Mjc0.GoyLpW.y2XpN3iSLn4ZZRkRDJP4kyH97izQJcGjHgrDHQ -clientId=761616689917067274 +TOKEN=token +clientId=clientid URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text -db_password = "root"#text +db_password = "test"#text db_port = 3306#int db_limit = 5#int(接続を試みる時間) -db_name = "newer-kuronekochanbot"#DBの名前(SQLにログインしてcreate database hogeで作成) +db_name = "test"#DBの名前(SQLにログインしてcreate database hogeで作成) core_host="s52.coreserver.jp" core_account="kuronekoserver.kuronekobot" -core_password=""#"japak82issKWIOQ" +core_password="japak82issKWIOQ" core_port="21" voicevox="http://127.0.0.1:50021" COEIROINK="http://127.0.0.1:50031" @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT" +errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" version="1.0.3"#上がるタイミング分からんけど書いとく -Proxy="プロキシ" +Proxy="プロキシ" \ No newline at end of file From 6a218dc1ef877999ff23980c402e5eb5c2dae91c Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sun, 14 May 2023 22:03:37 +0900 Subject: [PATCH 03/90] =?UTF-8?q?server-info=E3=82=921024=E6=96=87?= =?UTF-8?q?=E5=AD=97=E3=81=BE=E3=81=A7=E3=81=AB=E5=88=B6=E9=99=90=E3=81=97?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=A8=E6=80=9D=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/misc/miscellaneous/serverinfo.js | 55 ++++++++++++++--------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/commands/misc/miscellaneous/serverinfo.js b/commands/misc/miscellaneous/serverinfo.js index f27ac7f..a15d939 100644 --- a/commands/misc/miscellaneous/serverinfo.js +++ b/commands/misc/miscellaneous/serverinfo.js @@ -38,31 +38,44 @@ module.exports = async (interaction) => { const stickers = interaction.guild.stickers.cache; const owner = await interaction.guild.fetchOwner(); + const fields = [ + { name: '基本情報', value: '\u200b' }, + { name: 'サーバー名・ID', value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, + { name: 'オーナー名・ID', value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, + { name: '言語', value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, + { name: 'ブーストレベル', value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, + { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, + { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, + { name: 'その他のチャンネル', value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, + { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes('everyone')).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(','))}` }, + { name: '\u200b', value: '\u200b' }, + { name: '高度な情報', value: '\u200b' }, + { name: 'メディアコンテンツフィルター', value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, + { name: '認証レベル', value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, + { name: '認証サーバー', value: `${codeBlock(verified[interaction.guild.verified])} ` }, + { name: 'パートナープログラム', value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, + { name: '\u200b', value: '\u200b' }, + { name: 'メンバーと絵文字(ステッカー)', value: '\u200b' }, + { name: `メンバー[${interaction.guild.memberCount}]`, value: `${codeBlock(`ユーザー:${members.filter(member => !member.user.bot).size}\nボット:${members.filter(member => member.user.bot).size}`)}`, inline: true }, + { name: `絵文字[${emojis.size}]`, value: `${codeBlock(`通常:${emojis.filter(emoji => !emoji.animated).size}\nアニメーション:${emojis.filter(emoji => emoji.animated).size}\nステッカー:${stickers.size}`)}`, inline: true } + ]; + + function limitString(str, maxLength) { + if (str.length >= maxLength) { + return str; + } else { + return str.substring(0, maxLength - 3) + "..."; + } + } + const editedFields = fields.map((field) => { + return { name: field.name, value: limitString(field.value, 1024) }; + }); + const embed = new EmbedBuilder() .setTitle('✅サーバー情報') .setColor(Colors.Green) .setThumbnail(interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })) - .addFields( - { name: '基本情報', value: '\u200b' }, - { name: 'サーバー名・ID', value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, - { name: 'オーナー名・ID', value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, - { name: '言語', value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, - { name: 'ブーストレベル', value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, - { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, - { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, - { name: 'その他のチャンネル', value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, - { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes('everyone')).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(','))}` }, - { name: '\u200b', value: '\u200b' }, - { name: '高度な情報', value: '\u200b' }, - { name: 'メディアコンテンツフィルター', value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, - { name: '認証レベル', value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, - { name: '認証サーバー', value: `${codeBlock(verified[interaction.guild.verified])} ` }, - { name: 'パートナープログラム', value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, - { name: '\u200b', value: '\u200b' }, - { name: 'メンバーと絵文字(ステッカー)', value: '\u200b' }, - { name: `メンバー[${interaction.guild.memberCount}]`, value: `${codeBlock(`ユーザー:${members.filter(member => !member.user.bot).size}\nボット:${members.filter(member => member.user.bot).size}`)}`, inline: true }, - { name: `絵文字[${emojis.size}]`, value: `${codeBlock(`通常:${emojis.filter(emoji => !emoji.animated).size}\nアニメーション:${emojis.filter(emoji => emoji.animated).size}\nステッカー:${stickers.size}`)}`, inline: true } - ) + .addFields(editedFields) .setTimestamp(new Date()) .setFooter({ text: `${interaction.guild.name}`, From f6fdb349dad0a8b99e650bcc3f72f8361259e433 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Mon, 15 May 2023 18:30:27 +0900 Subject: [PATCH 04/90] =?UTF-8?q?=E3=82=81=E3=81=A3=E3=81=A1=E3=82=83?= =?UTF-8?q?=E5=A4=89=E3=81=88=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ロガーをdd-loggerから独自のものにした。 エベントハンドラーとコマンドハンドラーを別ファイルにした。 コンソールをwebhookに送信 --- .gitignore | 3 +- deploy-commands.js | 30 ---------- events/misc/ready.js | 4 +- events/misc/slashcommand.js | 43 +++++++------- helpers/sendwebhook.js | 1 - index.js | 101 ++++++++++++++------------------ libs/EventHandler.js | 22 +++++++ libs/Logger.js | 113 ++++++++++++++++++++++++++++++++++++ libs/SlashCommandHandler.js | 38 ++++++++++++ libs/index.js | 5 ++ package-lock.json | 11 ---- package.json | 1 - 12 files changed, 248 insertions(+), 124 deletions(-) delete mode 100644 deploy-commands.js create mode 100644 libs/EventHandler.js create mode 100644 libs/Logger.js create mode 100644 libs/SlashCommandHandler.js create mode 100644 libs/index.js diff --git a/.gitignore b/.gitignore index 3eb75cb..1a5a662 100644 --- a/.gitignore +++ b/.gitignore @@ -102,4 +102,5 @@ dist # TernJS port file .tern-port -.env \ No newline at end of file +.env +.env diff --git a/deploy-commands.js b/deploy-commands.js deleted file mode 100644 index f750225..0000000 --- a/deploy-commands.js +++ /dev/null @@ -1,30 +0,0 @@ -const { REST, Routes } = require("discord.js"); -const fs = require("fs"); -const option = require("./helpers/optionslash.json"); - -module.exports = async (logger) => { - const Log = logger.createChild("dep-cmd"); - - const commands = []; - commands.push(option); - - fs.readdirSync("./commands/").forEach(async (dir) => { - const commandsPath = `./commands/${dir}`; - const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); - for (const file of commandFiles) { - const command = require(`./commands/${dir}/${file}`); - commands.push(command.data.toJSON()); - }; - }); - - Log.debug(`${commands.length}個のアプリケーションコマンドをロードしています...`); - const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); - rest.put( - Routes.applicationCommands(process.env.clientId), - { body: commands }, - ).then((data) => { - Log.debug(`${data.length}個のアプリケーションコマンドをロードしました。`); - }).catch((error) => { - Log.error(error.message); - }); -}; \ No newline at end of file diff --git a/events/misc/ready.js b/events/misc/ready.js index a14f629..f59fe6d 100644 --- a/events/misc/ready.js +++ b/events/misc/ready.js @@ -3,10 +3,10 @@ const chalk = require('chalk'); module.exports = { name: Events.ClientReady, - async execute(client) { + async execute(client, Log) { setInterval(() => { client.user.setPresence({ activities: [{ name: `/help`, type: ActivityType.Streaming }] }); }, 300 * 1000); - console.log(chalk.green('[成功]'), `${client.user.tag}にログインしました。`) + Log.info(`Logged in as ${client.user.tag}`); } } \ No newline at end of file diff --git a/events/misc/slashcommand.js b/events/misc/slashcommand.js index 73608fe..c2eb4f1 100644 --- a/events/misc/slashcommand.js +++ b/events/misc/slashcommand.js @@ -1,38 +1,37 @@ -const { Events, EmbedBuilder, Colors } = require('discord.js'); -const permissions_embed = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("権限が足りません。\nBOTに権限を与えてください") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | SlashCommand" }) - .setColor(Colors.Red); -const { send } = require("../../helpers/sendwebhook"); +const { Events, EmbedBuilder, Colors } = require("discord.js"); + module.exports = { name: Events.InteractionCreate, async execute(interaction) { - const Log = interaction.client.logger.createChannel("interaction"); + const { client } = interaction; + if (interaction.isAutocomplete()) { - const command = interaction.client.commands.get(interaction.commandName); + const command = client.commands.get(interaction.commandName); if (!command) return; - try { - await command.autocomplete(interaction); + await command.autocomplete(interaction, command.logger); } catch (error) { - console.error(error); - }; + command.logger.error(`${error.message}\n${error.stack}`); + } } else { - const command = interaction.client.commands.get(interaction.commandName); + const command = client.commands.get(interaction.commandName); if (!command) return; try { - await command.execute(interaction); - } catch (err) { - Log.error(err.message + "\n" + err.stack) - if (err.message === "Missing Permissions") return await interaction.reply({ embeds: [permissions_embed], ephemeral: true }).catch(() => { }); - const unknown_embed = new EmbedBuilder() + await command.execute(interaction, command.logger); + } catch (error) { + command.logger.error(`${error.message}\n${error.stack}`); + const embed = new EmbedBuilder() .setTitle("⚠️エラー") - .setDescription(`不明なエラーが発生しました。\n詳細:${err.message}\n運営に問い合わせていただけると幸いです。`) .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | SlashCommand" }) .setColor(Colors.Red); - await interaction?.reply({ embeds: [unknown_embed], ephemeral: true }).catch(() => { }); - }; + if (error.message === "Missing Permissions") { + embed.setDescription("権限が足りません。\nBOTに権限を与えてください") + interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); + } else { + embed.setDescription(`不明なエラーが発生しました。\n詳細:${error.message}\n運営に問い合わせていただけると幸いです。`) + interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); + } + } } } }; \ No newline at end of file diff --git a/helpers/sendwebhook.js b/helpers/sendwebhook.js index acfc495..544cb6c 100644 --- a/helpers/sendwebhook.js +++ b/helpers/sendwebhook.js @@ -1,7 +1,6 @@ const { WebhookClient } = require('discord.js'); const webhookClient = new WebhookClient({ url: process.env.errorwebhook }); - module.exports = { async send(error) { await webhookClient.send({ embeds: [{ title: error.title, description: "```" + error.description + "```", color: error.color, timestamp: error.time }] }).catch((erx) => { }); diff --git a/index.js b/index.js index 3bd0a7a..03f171d 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,53 @@ -const fs = require("fs"); -const path = require("path"); -const { Client, GatewayIntentBits, Collection, Partials, Colors } = require("discord.js"); +const { Client, GatewayIntentBits, Partials, WebhookClient } = require("discord.js"); const { EnkaClient } = require("enka-network-api"); +const path = require("path"); const axios = require("axios"); const chalk = require("chalk"); -const { Logger } = require("dd-logger"); + +const { + Logger, + EventHandler, + SlashCommandHandler +} = require("./libs"); require("dotenv").config(); -// Loggerのセットアップ +const client = new Client({ + intents: Object.values(GatewayIntentBits), + partials: [Partials.Message, Partials.Channel, Partials.Reaction], + rest: 60000 +}); + +const errorWebhook = new WebhookClient({ url: process.env.errorwebhook }); +const logQueue = ["接続しました。"]; +setInterval(() => { + if (logQueue.length === 0) return; + let data = logQueue.shift(); + if (data.length > 2000) { + logQueue.unshift(data.slice(2000)); + data = data.slice(0, 2000); + } else { + for (let i = 0;logQueue.length > 0;i++) { + if (data.length + logQueue[0].length > 1999) break; + data += "\n" + logQueue.shift(); + } + } + errorWebhook.send(data).catch((error) => { console.error(error) }); +}, 1000); const logger = new Logger({ levels: ["info", "warn", "error", "debug"], writeLog(data) { - const { lineText, level: _level, time, location } = data; + let { lines, level: _level, time, location } = data; + const errors = lines.filter(line => line instanceof Error); + if (errors.length > 0) { + const lineStr = errors + .map(error => error.message + "\n" + error.stack) + .join("\n"); + lines = [ "\n" + lineStr ]; + } let level = `[${_level}]`; + logQueue.push(`[${time}][${location.join("][")}] ${level} ${lines}`); switch (_level) { case "INFO": break; @@ -23,69 +56,26 @@ const logger = new Logger({ break; case "ERROR": level = chalk.red(level); - send({ - title: "エラー", - description: `[${location.join("][")}]\n${lineText}`, - time: new Date(), - color: Colors.DarkRed - }); break; case "DEBUG": level = chalk.yellow(level); break; } - - console.log(`[${time}][${location.join("][")}] ${level} ${lineText}`); + console.log(`[${time}][${location.join("][")}] ${level} ${lines}`); } }); const Log = logger.createChannel("main"); - -const client = new Client({ - intents: Object.values(GatewayIntentBits), - partials: [Partials.Message, Partials.Channel, Partials.Reaction], - rest: 60000 -}); client.logger = logger; -const { send } = require("./helpers/sendwebhook"); -require("./deploy-commands")(Log); +EventHandler(client, path.resolve(__dirname, "./events")); +client.commands = SlashCommandHandler(client, path.resolve(__dirname, "./commands")); globalThis.voice_channel = []; globalThis.ylivechat = {}; globalThis.tlivechat = {}; -// EnkaNetworkのcacheをアップデートする const enka = new EnkaClient({ showFetchCacheLog: true }); -// イベントハンドラー -client.events = new Collection(); -fs.readdirSync("./events/").forEach(async (dir) => { - const eventsPath = `./events/${dir}`; - const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith(".js")); - for (const file of eventFiles) { - const event = require(`${eventsPath}/${file}`); - client.on(event.name, event.execute); - }; -}); - -// スラッシュコマンドハンドラー -client.commands = new Collection(); -fs.readdirSync("./commands/").forEach(async (dir) => { - const commandsPath = `./commands/${dir}`; - const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); - for (const file of commandFiles) { - const filePath = `${commandsPath}/${file}`; - const command = require(filePath); - - if ("data" in command && "execute" in command) { - client.commands.set(command.data.name, command); - } else { - Log.warn(`${filePath}はdataかexecuteプロパティが設定されていません。`) - }; - }; -}); - -// 10秒ごとにURLにGETリクエストを送信する setInterval(() => { axios.get(process.env.URL) .then(response => { @@ -94,11 +84,10 @@ setInterval(() => { .catch(error => { Log.warn(`[GETリクエスト] ${error.config.url} - ${error.message}`) }); -}, 10000); +}, 10 * 1000); -// エラー後も処理継続 -process.on("uncaughtException", (reason, promise) => { - Log.error(`${reason}`); +process.on("uncaughtException", (error) => { + Log.error(error) }); client.login(process.env.TOKEN); diff --git a/libs/EventHandler.js b/libs/EventHandler.js new file mode 100644 index 0000000..c2a0f9e --- /dev/null +++ b/libs/EventHandler.js @@ -0,0 +1,22 @@ +const fs = require("fs"); +const path = require("path"); + +function EventHandler(client, eventsPath) { + const Log = client.logger.createChannel("event"); + Log.debug("Loading..."); + const events = []; + fs.readdirSync(eventsPath).forEach((dir) => { + const eventPath = path.resolve(eventsPath, dir); + const eventFiles = fs.readdirSync(eventPath).filter(file => file.endsWith(".js")); + for (const file of eventFiles) { + const event = require(path.resolve(eventPath, file)); + event.logger = Log.createChild(event.name); + client.on(event.name, (...args) => event.execute(...args, event.logger)); + events.push(event); + } + }); + Log.debug(`Loaded ${events.length} events`); + return events; +} + +module.exports = EventHandler; \ No newline at end of file diff --git a/libs/Logger.js b/libs/Logger.js new file mode 100644 index 0000000..d30ec41 --- /dev/null +++ b/libs/Logger.js @@ -0,0 +1,113 @@ +function padZero(num, length) { + return num.toString().padStart(length, "0"); +} + +const defaultOption = { + levels: ["fatal", "error", "warn", "info", "debug"], + timeFormat: (d) => `${padZero(d.getHours(), 2)}:${padZero(d.getMinutes(), 2)}:${padZero(d.getSeconds(), 2)}`, + writeLog: (data) => { + const { lines, level, time, location } = data; + console.log(`[${time}][${location.join("][")}] [${level}] ${lines.join(" ")}`); + return true; + } +}; + +/** + * @typedef {Object} LoggerOption + * @property {string[]} levels + * @property {(d: Date) => string} timeFormat + * @property {(data: { lineText: string, level: string, time: string, location: string[] }) => any} writeLog + */ + +class Logger { + /** + * @param {LoggerOption} option + */ + constructor(option) { + this.setOption(option); + } + + /** + * @type {LoggerOption} + */ + option = defaultOption; + + /** + * @type {Channel[]} + */ + channels = []; + + /** + * @param {LoggerOption} option + * @returns {LoggerOption} + */ + setOption(option) { + return this.option = { + levels: (option.levels ?? this.option.levels).map(level => level.toUpperCase()), + timeFormat: option.timeFormat ?? this.option.timeFormat, + writeLog: option.writeLog ?? this.option.writeLog + }; + } + /** + * @param {string} locationStr + * @returns {Channel} + */ + createChannel(locationStr) { + const location = [locationStr]; + return new Channel(this, location, this.option); + } +} + +class Channel { + /** + * @param {Logger} logger + * @param {string[]} location + * @param {LoggerOption} option + */ + constructor(logger, location, option) { + this.logger = logger; + this.option = option; + this.location = location.map(str => str.toLowerCase()); + this.option.levels.forEach(level => { + this[level.toLowerCase()] = function (...lines) { + const data = { + lines, + level, + time: this.option.timeFormat(new Date()), + location: this.location + }; + return this.option.writeLog(data); + }; + }); + } + + /** + * @type {Logger} + */ + logger; + + /** + * @type {LoggerOption} + */ + option; + + /** + * @type {Channel[]} + */ + childs = []; + + /** + * @type {string[]} + */ + location = []; + + + createChild(locationStr) { + const location = [...this.location, locationStr]; + const channel = new Channel(this.logger, location, this.option); + this.childs.push(channel); + return channel; + } +} + +module.exports = Logger; \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js new file mode 100644 index 0000000..3c205ba --- /dev/null +++ b/libs/SlashCommandHandler.js @@ -0,0 +1,38 @@ +const { Collection, REST, Routes } = require("discord.js"); +const fs = require("fs"); +const path = require("path"); +const option = require("../helpers/optionslash.json"); + +function SlashCommandHandler(client, commandsPath) { + const Log = client.logger.createChannel("command"); + Log.debug("Loading..."); + const commands = new Collection(); + fs.readdirSync(commandsPath).forEach((categoryDir) => { + const categoryPath = path.resolve(commandsPath, categoryDir); + const categoryLog = Log.createChild(categoryDir); + const commandFiles = fs.readdirSync(categoryPath).filter(file => file.endsWith(".js")); + for (const file of commandFiles) { + const commandPath = path.resolve(categoryPath, file); + const command = require(commandPath); + if (!("data" in command) || !("execute" in command)) { + Log.warn(`${commandPath}はdataかexecuteプロパティが設定されていないため、ロードしていません。`); + return; + } + const name = command.data.name; + command.logger = categoryLog.createChild(name); + commands.set(name, command); + } + }); + Log.debug(`Loaded ${commands.size} commands`); + Log.debug("Deploying..."); + const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); + rest.put( + Routes.applicationCommands(process.env.clientId), + { body: [option, ...commands.map(command => command.data.toJSON())] }, + ).then((data) => { + Log.debug(`Deployed ${data.length} commands`); + }).catch(Log.error); + return commands; +} + +module.exports = SlashCommandHandler; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js new file mode 100644 index 0000000..fce9e7b --- /dev/null +++ b/libs/index.js @@ -0,0 +1,5 @@ +module.exports = { + Logger: require("./Logger"), + EventHandler: require("./EventHandler"), + SlashCommandHandler: require("./SlashCommandHandler") +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b2c6c8c..d03e41d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@vitalets/google-translate-api": "^9.1.0", "axios": "^1.3.4", "chalk": "^4.1.2", - "dd-logger": "^2.1.0", "discord-html-transcripts": "^3.1.3", "discord.js": "^14.9.0", "discord.js-pages": "^1.4.4", @@ -814,11 +813,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, - "node_modules/dd-logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dd-logger/-/dd-logger-2.1.0.tgz", - "integrity": "sha512-E/UpStVpzZhpKXscZ0DBBX+AQoxLohdiMoIMKBy7iIob7Jo2TEGJw0IHX1PBirsQP1L0Uxlr54wARbOU02P6/Q==" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3433,11 +3427,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, - "dd-logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dd-logger/-/dd-logger-2.1.0.tgz", - "integrity": "sha512-E/UpStVpzZhpKXscZ0DBBX+AQoxLohdiMoIMKBy7iIob7Jo2TEGJw0IHX1PBirsQP1L0Uxlr54wARbOU02P6/Q==" - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", diff --git a/package.json b/package.json index 58ae934..a71f21b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@vitalets/google-translate-api": "^9.1.0", "axios": "^1.3.4", "chalk": "^4.1.2", - "dd-logger": "^2.1.0", "discord-html-transcripts": "^3.1.3", "discord.js": "^14.9.0", "discord.js-pages": "^1.4.4", From 6bcfd4e35c78750cd8a5657b54ed8754b1a9758e Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 01:08:53 +0900 Subject: [PATCH 05/90] =?UTF-8?q?=E9=80=94=E4=B8=AD=E7=B5=8C=E9=81=8E?= =?UTF-8?q?=EF=BC=81=E5=8B=95=E3=81=8D=E3=81=BE=E3=81=9B=E3=82=93=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/misc/bot/status.js | 4 +- commands/misc/genshin.js | 4 +- commands/misc/help.js | 2 +- commands/misc/jobpanel/add.js | 22 +- commands/misc/jobpanel/autoremove.js | 18 +- commands/misc/jobpanel/copy.js | 14 +- commands/misc/jobpanel/create.js | 14 +- commands/misc/jobpanel/delete.js | 12 +- commands/misc/jobpanel/edit.js | 10 +- commands/misc/jobpanel/refresh.js | 12 +- commands/misc/jobpanel/remove.js | 22 +- commands/misc/jobpanel/selected.js | 8 +- commands/misc/log.js | 20 +- commands/misc/miscellaneous/channel.js | 2 +- commands/misc/miscellaneous/reserve.js | 4 +- commands/misc/miscellaneous/role.js | 4 +- commands/misc/miscellaneous/screenshot.js | 8 +- commands/misc/miscellaneous/translate.js | 6 +- commands/misc/miscellaneous/userinfo.js | 4 +- commands/misc/miscellaneous/wikipedia.js | 4 +- commands/misc/poll.js | 406 +++++++----------- commands/misc/poll/create.js | 44 -- commands/misc/poll/excreate.js | 44 -- commands/misc/poll/sum.js | 32 -- commands/misc/server-manage.js | 96 +---- commands/misc/server-manage/ban.js | 106 +++-- commands/misc/server-manage/clear.js | 79 +++- commands/misc/server-manage/kick.js | 89 ++-- commands/misc/server-manage/mute.js | 44 +- commands/misc/server-manage/show.js | 100 +++-- commands/misc/server-manage/unban.js | 84 ++-- commands/misc/server-manage/unmute.js | 33 +- commands/misc/speak/dictionary_add.js | 12 +- commands/misc/speak/dictionary_export.js | 8 +- commands/misc/speak/dictionary_import.js | 16 +- commands/misc/speak/dictionary_remove.js | 12 +- commands/misc/speak/dictionary_reset.js | 12 +- commands/misc/speak/dictionary_username.js | 10 +- commands/misc/speak/disconnect.js | 6 +- commands/misc/speak/exvoice.js | 10 +- commands/misc/speak/join.js | 6 +- commands/misc/speak/live_read.js | 26 +- commands/misc/speak/live_read_stop.js | 18 +- commands/misc/speak/read_through.js | 10 +- .../misc/speak/server_auto-join-delete.js | 12 +- commands/misc/speak/server_auto-join.js | 8 +- commands/misc/speak/server_exvoice-word.js | 16 +- commands/misc/speak/server_exvoice.js | 10 +- commands/misc/speak/server_force-guild.js | 14 +- commands/misc/speak/server_read-bot.js | 10 +- commands/misc/speak/server_read-user.js | 10 +- commands/misc/speak/server_read.js | 14 +- commands/misc/speak/server_reset.js | 8 +- .../misc/speak/server_user-dictionary-list.js | 10 +- commands/misc/speak/server_vc-only-tts.js | 10 +- commands/misc/speak/server_voice-setting.js | 36 +- commands/misc/speak/server_voice.js | 10 +- commands/misc/speak/setting-show.js | 6 +- commands/misc/speak/setvoice.js | 10 +- commands/misc/speak/skip.js | 14 +- commands/misc/speak/user_reset.js | 8 +- commands/misc/speak/user_voice-setting.js | 36 +- commands/misc/sub/mcbedrock.js | 6 +- commands/misc/sub/mcjava.js | 6 +- commands/misc/sub/mcuser.js | 6 +- commands/misc/ticket.js | 216 +++++----- events/misc/admincommand.js | 22 +- events/misc/clear.js | 51 --- events/misc/genshin_modal.js | 10 +- events/misc/genshin_select.js | 2 +- events/misc/guildbanadd.js | 4 +- events/misc/guildbanremove.js | 4 +- events/misc/job_reaction_add.js | 6 +- events/misc/job_reaction_remove.js | 6 +- events/misc/messageDelete.js | 4 +- events/misc/messageUpdate.js | 4 +- events/misc/poll.js | 35 +- events/misc/ready.js | 3 +- events/misc/report.js | 2 +- events/misc/select_job.js | 14 +- events/misc/setvoice.js | 8 +- events/misc/slashcommand.js | 4 +- events/misc/speakmessage.js | 2 +- events/misc/ticket.js | 20 +- events/misc/voiceautojoin.js | 2 +- events/misc/voicemember.js | 2 +- helpers/permissions.js | 90 ---- helpers/read.js | 2 +- helpers/utils.js | 224 ---------- index.js | 60 +-- libs/EmbedUtil.js | 64 +++ libs/EventHandler.js | 3 +- libs/GetLogger.js | 53 +++ libs/Permissions.js | 90 ++++ libs/SlashCommandHandler.js | 5 +- libs/Utils.js | 238 ++++++++++ libs/index.js | 22 +- package-lock.json | 295 ++++++++----- package.json | 2 +- 99 files changed, 1663 insertions(+), 1663 deletions(-) delete mode 100644 commands/misc/poll/create.js delete mode 100644 commands/misc/poll/excreate.js delete mode 100644 commands/misc/poll/sum.js delete mode 100644 events/misc/clear.js delete mode 100644 helpers/permissions.js delete mode 100644 helpers/utils.js create mode 100644 libs/EmbedUtil.js create mode 100644 libs/GetLogger.js create mode 100644 libs/Permissions.js create mode 100644 libs/Utils.js diff --git a/commands/misc/bot/status.js b/commands/misc/bot/status.js index be7fd9d..84c34d5 100644 --- a/commands/misc/bot/status.js +++ b/commands/misc/bot/status.js @@ -5,7 +5,7 @@ const cpuModel = os.cpus()[0].model; const wait = new EmbedBuilder() .setTitle("✅処理中..") .setDescription(`計測しています`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | status" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | status" }) .setColor(Colors.Green); module.exports = async (interaction) => { await interaction.reply({ embeds: [wait], ephemeral: true }); @@ -29,7 +29,7 @@ module.exports = async (interaction) => { { name: 'バージョン', value: `\`${process.env.version}\``, inline: true }, ) .setTimestamp(new Date()) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | status" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | status" }); await interaction.editReply({ embeds: [embed], ephemeral: true }); }); }; \ No newline at end of file diff --git a/commands/misc/genshin.js b/commands/misc/genshin.js index 92b8cb7..fc66eaa 100644 --- a/commands/misc/genshin.js +++ b/commands/misc/genshin.js @@ -1,5 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder, Colors, ActionRowBuilder, StringSelectMenuBuilder, ButtonStyle, ButtonBuilder, TextInputBuilder, TextInputStyle, ModalBuilder } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const { EnkaClient } = require("enka-network-api"); const enka = new EnkaClient(); @@ -70,7 +70,7 @@ module.exports = { .setDescription(`${user.enkaProfile?.bio || "自己紹介なし"}\n**螺旋**\n${user.abyssFloor || "取得失敗"}層 ${user.abyssChamber || "取得失敗"}間\n**アチーブメント数**\n${user.achievements || "取得失敗"}`) .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) .setImage(`https://enka.network/ui/${user.profileCard.pictures[1].name}.png`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | genshin" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); await interaction.followUp({ embeds: [success], components: [type, characters, delete_button] }); }; diff --git a/commands/misc/help.js b/commands/misc/help.js index 16b8951..24659b8 100644 --- a/commands/misc/help.js +++ b/commands/misc/help.js @@ -97,7 +97,7 @@ module.exports = { ), ]) .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | help" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | help" }) .setPaginationFormat() .build(); } diff --git a/commands/misc/jobpanel/add.js b/commands/misc/jobpanel/add.js index 883f2f7..d8e8df9 100644 --- a/commands/misc/jobpanel/add.js +++ b/commands/misc/jobpanel/add.js @@ -1,28 +1,28 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const basic_emojis = ['🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮', '🇯', '🇰', '🇱', '🇲', '🇳', '🇴', '🇵', '🇶', '🇷']; const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("選択されたリアクションはつけることができません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常にパネルが作成されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルの選択更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { //可読性皆無(すまん) const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); @@ -47,7 +47,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(msg.embeds[0]?.data?.title || "役職パネル") .setDescription(roles.slice(0, basic_emojis.length).map((role, index) => `${emojis[index]}:${interaction.guild.roles.cache.get(role) || role}`).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage(msg.embeds[0]?.data?.image?.url || null) .setColor(msg.embeds[0]?.data?.color || Colors.Green); await msg.edit({ @@ -57,7 +57,7 @@ module.exports = async (interaction) => { const content = new EmbedBuilder() .setTitle(msg.embeds[0]?.data?.title || "役職パネル") .setDescription(roles.slice(basic_emojis.length).map((role, index) => `${emojis[index]}:${interaction.guild.roles.cache.get(role) || role}`).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage(msg.embeds[0]?.data?.image?.url || null) .setColor(msg.embeds[0]?.data?.color || Colors.Green); const new_msg = await msg.channel.send({ @@ -76,7 +76,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(msg.embeds[0]?.data?.title || "役職パネル") .setDescription(roles.map((role, index) => `${emojis[index]}:${interaction.guild.roles.cache.get(role) || role}`).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage(msg.embeds[0]?.data?.image?.url || null) .setColor(msg.embeds[0]?.data?.color || Colors.Green); for (const emoji of emojis) { diff --git a/commands/misc/jobpanel/autoremove.js b/commands/misc/jobpanel/autoremove.js index 845d08d..e016d2e 100644 --- a/commands/misc/jobpanel/autoremove.js +++ b/commands/misc/jobpanel/autoremove.js @@ -1,27 +1,27 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常に役職パネルが編集されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("選択されたリアクションは消すことができません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const remove_react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("削除する項目がありませんでした。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (!getdata[0][0]?.guildid) return ({ embeds: [error], ephemeral: true }); @@ -52,7 +52,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(option.getString("title") || msg.embeds[0]?.data?.title) .setDescription(content_result.map(content => content).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage((option.getString("attachmentoption") == "true") ? null : option.getAttachment("image")?.attachment || msg.embeds[0]?.data?.image?.url) .setColor(Colors[option.getString("color")] || msg.embeds[0]?.data?.color); await msg.edit({ embeds: [edit] }); diff --git a/commands/misc/jobpanel/copy.js b/commands/misc/jobpanel/copy.js index 700777a..7ca87c6 100644 --- a/commands/misc/jobpanel/copy.js +++ b/commands/misc/jobpanel/copy.js @@ -1,22 +1,22 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("パネルのコピーに成功しました!\nこのギルドではこのパネルが選択中です。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルの選択更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (!getdata[0][0]?.guildid) return ({ embeds: [error], ephemeral: true }); @@ -29,7 +29,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(msg.embeds[0]?.data?.title || "役職パネル") .setDescription(old_roles.map((role, index) => `${old_emojis[index]}:${interaction.guild.roles.cache.get(role) || role}`).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage(msg.embeds[0]?.data?.image?.url || null) .setColor(msg.embeds[0]?.data?.color || Colors.Green); const new_msg = await interaction.channel.send({ diff --git a/commands/misc/jobpanel/create.js b/commands/misc/jobpanel/create.js index b760c8b..05e63ee 100644 --- a/commands/misc/jobpanel/create.js +++ b/commands/misc/jobpanel/create.js @@ -1,22 +1,22 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常にパネルが作成されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("この絵文字はつかえません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルの選択更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const role = await interaction.options.getRole("role"); const emoji = await interaction.options.getString("emoji"); @@ -26,7 +26,7 @@ module.exports = async (interaction) => { const panel = new EmbedBuilder() .setTitle(title || "役職パネル") .setDescription(`${emoji || '🇦'}:${role}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors[color] || Colors.Green) .setImage(image); const msg = await interaction.channel.send({ embeds: [panel] }); diff --git a/commands/misc/jobpanel/delete.js b/commands/misc/jobpanel/delete.js index 8bcb9ad..95529e2 100644 --- a/commands/misc/jobpanel/delete.js +++ b/commands/misc/jobpanel/delete.js @@ -1,22 +1,22 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルのデータ削除に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常に役職パネルが削除されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); diff --git a/commands/misc/jobpanel/edit.js b/commands/misc/jobpanel/edit.js index 14a26b2..32c9039 100644 --- a/commands/misc/jobpanel/edit.js +++ b/commands/misc/jobpanel/edit.js @@ -1,17 +1,17 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常に役職パネルが編集されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); @@ -26,7 +26,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(option.getString("title") || msg.embeds[0]?.data?.title) .setDescription(old_roles.map((role, index) => `${old_emojis[index]}:${interaction.guild.roles.cache.get(role) || role}`).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage((option.getString("attachmentoption") == "true") ? null : option.getAttachment("image")?.attachment || msg.embeds[0]?.data?.image?.url) .setColor(Colors[option.getString("color")] || msg.embeds[0]?.data?.color); await msg.edit({ embeds: [edit] }); diff --git a/commands/misc/jobpanel/refresh.js b/commands/misc/jobpanel/refresh.js index 416e80c..2277ed5 100644 --- a/commands/misc/jobpanel/refresh.js +++ b/commands/misc/jobpanel/refresh.js @@ -1,22 +1,22 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常に役職パネルがリフレッシュされました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("選択されたリアクションはつけることができません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (!getdata[0][0]?.guildid) return ({ embeds: [error], ephemeral: true }); diff --git a/commands/misc/jobpanel/remove.js b/commands/misc/jobpanel/remove.js index ab1a6b0..cf5a04b 100644 --- a/commands/misc/jobpanel/remove.js +++ b/commands/misc/jobpanel/remove.js @@ -1,32 +1,32 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("正常に役職パネルが編集されました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("選択されたリアクションは消すことができません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const remove_react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("選択肢は少なくとも一つある必要があります。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const null_react_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("対象のロールがパネルに含まれていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (!getdata[0][0]?.guildid) return ({ embeds: [error], ephemeral: true }); @@ -58,7 +58,7 @@ module.exports = async (interaction) => { const edit = new EmbedBuilder() .setTitle(option.getString("title") || msg.embeds[0]?.data?.title) .setDescription(content_result.map(content => content).join('\n')) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setImage((option.getString("attachmentoption") == "true") ? null : option.getAttachment("image")?.attachment || msg.embeds[0]?.data?.image?.url) .setColor(Colors[option.getString("color")] || msg.embeds[0]?.data?.color); await msg.edit({ embeds: [edit] }); diff --git a/commands/misc/jobpanel/selected.js b/commands/misc/jobpanel/selected.js index 8d08d73..e49a62a 100644 --- a/commands/misc/jobpanel/selected.js +++ b/commands/misc/jobpanel/selected.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルが選択されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = async (interaction) => { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (!getdata[0][0]?.guildid) return ({ embeds: [error], ephemeral: true }); @@ -17,7 +17,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`https://discord.com/channels/${getdata[0][0]?.guildid}/${getdata[0][0]?.channelid}/${getdata[0][0]?.messageid}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); return ({ embeds: [success], ephemeral: true }); }; \ No newline at end of file diff --git a/commands/misc/log.js b/commands/misc/log.js index 9db5458..e01106c 100644 --- a/commands/misc/log.js +++ b/commands/misc/log.js @@ -1,27 +1,27 @@ const { SlashCommandBuilder, ChannelType, EmbedBuilder, Colors, PermissionFlagsBits } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const ERROREmbed = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データの保存に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); const delete_embed = new EmbedBuilder() .setTitle("✅成功") .setDescription("データの削除に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) .setColor(Colors.Green); const undefined_embed = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データが見つかりませんでした。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); const delete_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データの削除に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); module.exports = { data: new SlashCommandBuilder() .setName('log') @@ -43,7 +43,7 @@ module.exports = { const update_embed = new EmbedBuilder() .setTitle(`✅logチャンネル`) .setDescription(`logチャンネルを${interaction.options.getChannel("channel")}に変更しました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) .setColor(Colors.Green); if (!update) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) await interaction.reply({ embeds: [update_embed], ephemeral: true }); @@ -52,7 +52,7 @@ module.exports = { const add_embed = new EmbedBuilder() .setTitle(`✅logチャンネル`) .setDescription(`logチャンネルを${interaction.options.getChannel("channel")}に設定しました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | log" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) .setColor(Colors.Green); if (!add) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) await interaction.reply({ embeds: [add_embed], ephemeral: true }); diff --git a/commands/misc/miscellaneous/channel.js b/commands/misc/miscellaneous/channel.js index 9d02fb2..2b452e7 100644 --- a/commands/misc/miscellaneous/channel.js +++ b/commands/misc/miscellaneous/channel.js @@ -14,7 +14,7 @@ module.exports = async (interaction) => { { name: `スローモード (秒)`, value: `${(channel.rateLimitPerUser == 0) ? `${channel.rateLimitPerUser}秒` : "なし"}` }, { name: `説明文`, value: `${channel.topic || "なし"}` }, ) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | role" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | role" }) .setColor(Colors.Green); await interaction.reply({ embeds: [success], ephemeral: true }); }; \ No newline at end of file diff --git a/commands/misc/miscellaneous/reserve.js b/commands/misc/miscellaneous/reserve.js index 18fc042..8190d6e 100644 --- a/commands/misc/miscellaneous/reserve.js +++ b/commands/misc/miscellaneous/reserve.js @@ -3,14 +3,14 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅予約送信`) .setDescription(`${interaction.options.getString("content")}\nを${interaction.options.getInteger("secound")}秒後に送信します。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | reserve" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | reserve" }) .setColor(Colors.Green); await interaction.reply({ embeds: [success], ephemeral: true }); setTimeout(async () => { const embed = new EmbedBuilder() .setTitle(`${interaction.user.tag}の予約送信`) .setDescription(`${interaction.options.getString("content")}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | reserve" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | reserve" }) .setColor(Colors.Green); await interaction.channel.send({ embeds: [embed], ephemeral: true }); }, interaction.options.getInteger("secound") * 1000); diff --git a/commands/misc/miscellaneous/role.js b/commands/misc/miscellaneous/role.js index 0b72281..fd9ff08 100644 --- a/commands/misc/miscellaneous/role.js +++ b/commands/misc/miscellaneous/role.js @@ -16,7 +16,7 @@ module.exports = async (interaction) => { { name: '作成日時', value: `${createdAt.getFullYear()}年${createdAt.getMonth() + 1}月${createdAt.getDate()}日` }, { name: `メンバー(${members.size})`, value: `${members.map(member => member.user.username).join("") || "なし"}` }, ) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | role" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | role" }) .setColor(Colors.Green); await interaction.reply({ embeds: [success], ephemeral: true }); } else { @@ -35,7 +35,7 @@ module.exports = async (interaction) => { .setTitle('✅役職情報') .setPages(content) .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | role" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | role" }) .setPaginationFormat() .build(); }; diff --git a/commands/misc/miscellaneous/screenshot.js b/commands/misc/miscellaneous/screenshot.js index 8e6d632..7f8ea1d 100644 --- a/commands/misc/miscellaneous/screenshot.js +++ b/commands/misc/miscellaneous/screenshot.js @@ -1,16 +1,16 @@ const { Colors, EmbedBuilder, AttachmentBuilder } = require('discord.js'); const puppeteer = require('puppeteer'); const ERROREmbed = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("URL先のページが見つかりませんでした。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | screenshot" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | screenshot" }); module.exports = async (interaction) => { const { options } = interaction; const wait = new EmbedBuilder() .setTitle(`✅撮影中...`) .setDescription(`${options.getString("url")}\nのページを撮影しています。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | screenshot" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | screenshot" }) .setColor(Colors.Green); await interaction.reply({ embeds: [wait], ephemeral: true }); const url = options.getString("url"); @@ -29,7 +29,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${options.getString("url")}\nのページを撮影しました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | screenshot" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | screenshot" }) .setImage("attachment://screen.png") .setColor(Colors.Green); await interaction.editReply({ embeds: [success], files: [attachment], ephemeral: true }) diff --git a/commands/misc/miscellaneous/translate.js b/commands/misc/miscellaneous/translate.js index 2ad107d..947bb99 100644 --- a/commands/misc/miscellaneous/translate.js +++ b/commands/misc/miscellaneous/translate.js @@ -10,7 +10,7 @@ module.exports = async (interaction) => { const embed = new EmbedBuilder() .setTitle(`翻訳(${to})`) .setDescription(`${result?.output}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | translate" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | translate" }) .setColor(Colors.Green); await interaction.reply({ embeds: [embed], ephemeral: true }); } else { @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const embed = new EmbedBuilder() .setTitle(`翻訳(自動英語)`) .setDescription(`${result?.output || "見つかりません"}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | translate" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | translate" }) .setColor(Colors.Green); await interaction.reply({ embeds: [embed], ephemeral: true }); } else { @@ -30,7 +30,7 @@ module.exports = async (interaction) => { const embed = new EmbedBuilder() .setTitle(`翻訳(自動日本語)`) .setDescription(`${result?.output || "見つかりません"}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | translate" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | translate" }) .setColor(Colors.Green); await interaction.reply({ embeds: [embed], ephemeral: true }); }; diff --git a/commands/misc/miscellaneous/userinfo.js b/commands/misc/miscellaneous/userinfo.js index 6fd1dca..13447f6 100644 --- a/commands/misc/miscellaneous/userinfo.js +++ b/commands/misc/miscellaneous/userinfo.js @@ -1,5 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder, Colors } = require('discord.js'); -const { ja } = require('../../../helpers/permissions'); +const { ja } = require('../../../libs/Permissions'); const status = { key: { desktop: "デスクトップ", @@ -18,7 +18,7 @@ module.exports = async (interaction) => { .setTitle(`✅${member.user.username}の情報`) .setThumbnail((member.user.avatar) ? `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp` : "https://discord.com/assets/7c8f476123d28d103efe381543274c25.png") .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | userinfo" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | userinfo" }) .addFields( { name: '名前(ID)', value: `${member.user.tag}(${member.user.id})` }, { name: 'サーバー参加日', value: `()` }, diff --git a/commands/misc/miscellaneous/wikipedia.js b/commands/misc/miscellaneous/wikipedia.js index 5206c58..83f5ec2 100644 --- a/commands/misc/miscellaneous/wikipedia.js +++ b/commands/misc/miscellaneous/wikipedia.js @@ -33,7 +33,7 @@ module.exports = async (interaction) => { }, ) .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | Wikipedia" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | Wikipedia" }) .setFooter({ text: `${interaction.user.tag}` }); await interaction.reply({ embeds: [embed] }); } else { @@ -55,7 +55,7 @@ module.exports = async (interaction) => { ) .setColor(Colors.Green) .setImage(json.originalimage.source) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | Wikipedia" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | Wikipedia" }); await interaction.reply({ embeds: [embed2] }); }; } \ No newline at end of file diff --git a/commands/misc/poll.js b/commands/misc/poll.js index 359a065..73f58d3 100644 --- a/commands/misc/poll.js +++ b/commands/misc/poll.js @@ -1,265 +1,153 @@ -const { SlashCommandBuilder } = require('discord.js'); -const create = require("./poll/create"); -const excreate = require("./poll/excreate"); -const sum = require("./poll/sum"); +const { Colors } = require("discord.js"); +const { CustomEmbed, getEmbedName, ColorsChoice } = require("../../../libs"); +const poll = require("../../events/misc/poll"); + module.exports = { - data: new SlashCommandBuilder() + subcommands: [pollCreate, pollSum], + builder: (builder) => builder .setName("poll") + .setDescription("アンケートを実施する。") .setDMPermission(false) - .setDescription("アンケートを実施する") - .addSubcommand(subcommand => - subcommand - .setName("create") - .setDescription("アンケートを作成します") - .addStringOption( - option => option - .setName("title") - .setDescription("タイトル").setRequired(true)) - .addStringOption( - option => option - .setName("choice1") - .setDescription("選択肢1").setRequired(true)) - .addStringOption( - option => option - .setName("emoji1") - .setDescription("絵文字1")) - .addStringOption( - option => option - .setName("choice2") - .setDescription("選択肢2")) - .addStringOption( - option => option - .setName("emoji2") - .setDescription("絵文字2")) - .addStringOption( - option => option - .setName("choice3") - .setDescription("選択肢3")) - .addStringOption( - option => option - .setName("emoji3") - .setDescription("絵文字3")) - .addStringOption( - option => option - .setName("choice4") - .setDescription("選択肢4")) - .addStringOption( - option => option - .setName("emoji4") - .setDescription("絵文字4")) - .addStringOption( - option => option - .setName("choice5") - .setDescription("選択肢5")) - .addStringOption( - option => option - .setName("emoji5") - .setDescription("絵文字5")) - .addStringOption( - option => option - .setName("choice6") - .setDescription("選択肢6")) - .addStringOption( - option => option - .setName("emoji6") - .setDescription("絵文字6")) - .addStringOption( - option => option - .setName("choice7") - .setDescription("選択肢7")) - .addStringOption( - option => option - .setName("emoji7") - .setDescription("絵文字7")) - .addStringOption( - option => option - .setName("choice8") - .setDescription("選択肢8")) - .addStringOption( - option => option - .setName("emoji8") - .setDescription("絵文字8")) - .addStringOption( - option => option - .setName("choice9") - .setDescription("選択肢9")) - .addStringOption( - option => option - .setName("emoji9") - .setDescription("絵文字9")) - .addStringOption( - option => option - .setName("choice10") - .setDescription("選択肢10")) - .addStringOption( - option => option - .setName("emoji10") - .setDescription("絵文字10")) - .addAttachmentOption(option => option.setName("image").setDescription("表示したい画像")) - .addStringOption(option => option.setName("color").setDescription("色を決められます").setChoices( - { name: "赤色", value: "Red" }, - { name: "白色", value: "White" }, - { name: "水色", value: "Aqua" }, - { name: "緑色", value: "Green" }, - { name: "青色", value: "Blue" }, - { name: "黄色", value: "Yellow" }, - { name: "蛍光ピンク色", value: "LuminousVividPink" }, - { name: "紫色", value: "Purple" }, - { name: "赤紫色", value: "Fuchsia" }, - { name: "金色", value: "Gold" }, - { name: "オレンジ色", value: "Orange" }, - { name: "灰色", value: "Grey" }, - { name: "濃紺色", value: "Navy" }, - { name: "濃い水色", value: "DarkAqua" }, - { name: "濃い緑色", value: "DarkGreen" }, - { name: "濃い青色", value: "DarkBlue" }, - { name: "濃い紫色", value: "DarkPurple" }, - { name: "濃い蛍光ピンク色", value: "DarkVividPink" }, - { name: "濃い金色", value: "DarkGold" }, - { name: "濃いオレンジ色", value: "DarkOrange" }, - { name: "濃い赤色", value: "DarkRed" }, - { name: "濃い灰色", value: "DarkGrey" }, - { name: "明るい灰色", value: "LightGrey" }, - { name: "濃い紺色", value: "DarkNavy" }, - { name: "青紫色", value: "Blurple" } - ))) - .addSubcommand(subcommand => - subcommand - .setName("excreate") - .setDescription("一人一つの投票にします") - .addStringOption( - option => option - .setName("title") - .setDescription("タイトル").setRequired(true)) - .addStringOption( - option => option - .setName("choice1") - .setDescription("選択肢1").setRequired(true)) - .addStringOption( - option => option - .setName("emoji1") - .setDescription("絵文字1")) - .addStringOption( - option => option - .setName("choice2") - .setDescription("選択肢2")) - .addStringOption( - option => option - .setName("emoji2") - .setDescription("絵文字2")) - .addStringOption( - option => option - .setName("choice3") - .setDescription("選択肢3")) - .addStringOption( - option => option - .setName("emoji3") - .setDescription("絵文字3")) - .addStringOption( - option => option - .setName("choice4") - .setDescription("選択肢4")) - .addStringOption( - option => option - .setName("emoji4") - .setDescription("絵文字4")) - .addStringOption( - option => option - .setName("choice5") - .setDescription("選択肢5")) - .addStringOption( - option => option - .setName("emoji5") - .setDescription("絵文字5")) - .addStringOption( - option => option - .setName("choice6") - .setDescription("選択肢6")) - .addStringOption( - option => option - .setName("emoji6") - .setDescription("絵文字6")) - .addStringOption( - option => option - .setName("choice7") - .setDescription("選択肢7")) - .addStringOption( - option => option - .setName("emoji7") - .setDescription("絵文字7")) - .addStringOption( - option => option - .setName("choice8") - .setDescription("選択肢8")) - .addStringOption( - option => option - .setName("emoji8") - .setDescription("絵文字8")) - .addStringOption( - option => option - .setName("choice9") - .setDescription("選択肢9")) - .addStringOption( - option => option - .setName("emoji9") - .setDescription("絵文字9")) - .addStringOption( - option => option - .setName("choice10") - .setDescription("選択肢10")) - .addStringOption( - option => option - .setName("emoji10") - .setDescription("絵文字10")) - .addAttachmentOption(option => option.setName("image").setDescription("表示したい画像")) - .addStringOption(option => option.setName("color").setDescription("色を決められます").setChoices( - { name: "赤色", value: "Red" }, - { name: "白色", value: "White" }, - { name: "水色", value: "Aqua" }, - { name: "緑色", value: "Green" }, - { name: "青色", value: "Blue" }, - { name: "黄色", value: "Yellow" }, - { name: "蛍光ピンク色", value: "LuminousVividPink" }, - { name: "紫色", value: "Purple" }, - { name: "赤紫色", value: "Fuchsia" }, - { name: "金色", value: "Gold" }, - { name: "オレンジ色", value: "Orange" }, - { name: "灰色", value: "Grey" }, - { name: "濃紺色", value: "Navy" }, - { name: "濃い水色", value: "DarkAqua" }, - { name: "濃い緑色", value: "DarkGreen" }, - { name: "濃い青色", value: "DarkBlue" }, - { name: "濃い紫色", value: "DarkPurple" }, - { name: "濃い蛍光ピンク色", value: "DarkVividPink" }, - { name: "濃い金色", value: "DarkGold" }, - { name: "濃いオレンジ色", value: "DarkOrange" }, - { name: "濃い赤色", value: "DarkRed" }, - { name: "濃い灰色", value: "DarkGrey" }, - { name: "明るい灰色", value: "LightGrey" }, - { name: "濃い紺色", value: "DarkNavy" }, - { name: "青紫色", value: "Blurple" } - )) + , + execute(...args) { + return args; + } +}; + +const maxChoice = 10; +const ExampleEmojis = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"]; +const bar = "=========================>"; //4% = 1文字 + +const pollCreate = { + builder: (builder) => { + builder + .setName("create") + .setDescription("アンケート画面を作成します。") + .addStringOption(option => option + .setName("title") + .setDescription("アンケート画面のタイトル") + .setRequired(true) + ) + .addAttachmentOption(option => option + .setName("image") + .setDescription("アンケート画面の画像") + ) + .addStringOption(option => option + .setName("color") + .setDescription("アンケート画面の色") + .setChoices(...ColorsChoice) + ) + .addIntegerOption(option => option + .setName("maxchoice") + .setDescription("アンケートの選択肢の最大数") + .setMaxValue(maxChoice) + .setMinValue(1) + .setRequired(true) + ); + for (let i = 1; i <= maxChoice; i++) { + builder + .addStringOption(option => option + .setName(`choice${i}`) + .setDescription(`アンケートの${i}番目の選択肢`) + ) + .addStringOption(option => option + .setName(`emoji${i}`) + .setDescription(`アンケートの${i}番目の絵文字`) + ); + } + return builder; + }, + async execute(interaction) { + const { options } = interaction; + const title = options.getString("title"); + const color = options.getString("color") ?? "Blue"; + const image = options.getAttachment("image"); + const maxChoice = options.getInteger("maxchoice"); + const choices = []; + const emojis = []; + const nonSelectEmoji = Array.from(ExampleEmojis); + for (let i = 1; i <= maxChoice; i++) { + const choice = options.getString(`choice${i}`); + let emoji = options.getString(`emoji${i}`); + if (!choice) break; + choices.push(choice); + if (!emoji) emoji = nonSelectEmoji.shift(); + else emoji.trim(); + emojis.push(emoji); + } + + const loadEmbed = new CustomEmbed("poll") + .setTitle("処理中..."); + const message = await interaction.channel.send({ embeds: [loadEmbed] }); + for (const emoji of emojis) { + const check = await message.react(emoji).catch((error) => { }); + if (!check) { + await message.delete(); + const embed = new CustomEmbed("poll").typeError() + .setDescription("絵文字の追加中にエラーが発生しました。") + return interaction.reply({ embeds: [embed], ephemeral: true }); + } + } + let description = choices.map((c, i) => `${emojis[i]} ${c}`).join("\n"); + description += `\n\n 📊 **/poll sum messageid:${message.id} channelid:${message.channel.id}**`; + const pollEmbed = new CustomEmbed(`poll${maxChoice ?? ""}`) + .setTitle(title) + .setDescription(description) + .setColor(Colors[color]) + if (image) pollEmbed.setImage(image.attachment); + message.edit({ embeds: [pollEmbed] }) + } +}; + +const pollSum = { + builder: (builder) => builder + .setName("sum") + .setDescription("アンケートの集計を行います。") + .addStringOption(option => option + .setName("messageid") + .setDescription("対象のメッセージID") + .setRequired(true) + ) + .addStringOption(option => option + .setName("channelid") + .setDescription("対象のチャンネルID") ) - .addSubcommand(subcommand => - subcommand - .setName("sum") - .addStringOption(option => option.setName("messageid").setDescription("対象のメッセージID").setRequired(true)) - .addStringOption(option => option.setName("channelid").setDescription("対象のチャンネルID")) - .setDescription("集計します") - ), + , async execute(interaction) { - const sub = interaction.options.getSubcommand(); - //create - if (sub === "create") { - await create(interaction); - }; - //excreate - if (sub === "excreate") { - await excreate(interaction); - }; - //sum - if (sub === "sum") { - await sum(interaction); - }; + const { options, guild } = interaction; + const messageId = options.getString("messageid"); + const channelId = options.getString("channelid"); + let message, channel; + try { + channel = channelId ? await guild.channels.fetch(channelId) : interaction.channel; + message = await channel.messages.fetch(messageId); + if (!message.embeds[0] || getEmbedName(message.embeds[0]).startsWith("poll")) throw new Error(); + } catch (error) { + const embed = new CustomEmbed("poll").typeError() + .setDescription("pollメッセージが取得できませんでした。") + return interaction.reply({ embeds: [embed], ephemeral: true }); + } + const pollEmbed = message.embeds[0]; + const reactions = message.reactions.cache; + const contents = pollEmbed.description.split("\n").slice(0, -2); + let allCount = 0; + const data = contents + .map((content) => { + const [emoji, ...textArr] = content.split(" "); + const text = textArr.join(" "); + const count = reactions.get(emoji)?.count ?? 0; + allCount += count; + return { emoji, text, count }; + }) + .map((data) => { + data.percent = ((data.count / allCount) * 100).toFixed(1); + data.bar = bar.slice(0, (bar.length - 1 - Math.floor(data.count / (allCount / (bar.length - 1))))) + }); + const text = data.map(d => `${d.emoji} ${d.text} **${d.percent}% (${d.count}票)**\n${d.bar}`).join("\n"); + const embed = new CustomEmbed("sumpoll") + .setTitle(pollEmbed.title) + .setDescription(`${text}\n\n[元のアンケート](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.id})`) + .setColor(Colors.Green); + interaction.reply({ embeds: [embed], ephemeral: true }); } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/commands/misc/poll/create.js b/commands/misc/poll/create.js deleted file mode 100644 index 169d1f9..0000000 --- a/commands/misc/poll/create.js +++ /dev/null @@ -1,44 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const basic_emojis = ['🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮', '🇯', '🇰', '🇱', '🇲', '🇳', '🇴', '🇵', '🇶', '🇷', '🇸', '🇹']; -const success_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("チケットの作成に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }) - .setColor(Colors.Green); -const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("選択されたリアクションはつけることができません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); -const load_embed = new EmbedBuilder() - .setTitle("✅処理中") - .setDescription("しばらくお待ちください") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }) - .setColor(Colors.Green); -module.exports = async (interaction) => { - const color = interaction.options.getString("color"); - const image = interaction.options.getAttachment("image")?.attachment; - const data = interaction.options._hoistedOptions.map(choice => { - if (choice.name.startsWith("choice")) return choice.value; - }).filter((c) => c); - const emoji_list = interaction.options._hoistedOptions.map(choice => { - if (choice.name.startsWith("emoji")) return choice.value; - }).filter((c) => c); - const emojis = [...new Set(emoji_list.slice(0, basic_emojis.length).concat(basic_emojis))] - const msg = await interaction.channel.send({ embeds: [load_embed] }); - for (const emoji of emojis.slice(0, data.length)) { - const check = await msg.react(emoji).catch(ex => { }); - if (!check) { - await msg.delete(); - return await interaction.reply({ embeds: [react_error], ephemeral: true }); - }; - }; - const poll_embed = new EmbedBuilder() - .setTitle(interaction.options.getString("title")) - .setDescription(data.filter(x => x).map((c, i) => `${emojis[i]} ${c}`).join('\n') + `\n\n 📊 \`/poll sum messageid:${msg.id} channelid:${msg.channel.id}\``) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }) - .setColor(Colors[color || "Green"]) - .setImage(image); - await msg.edit({ embeds: [poll_embed] }) - await interaction.reply({ embeds: [success_embed], ephemeral: true }); -}; \ No newline at end of file diff --git a/commands/misc/poll/excreate.js b/commands/misc/poll/excreate.js deleted file mode 100644 index ee77eb4..0000000 --- a/commands/misc/poll/excreate.js +++ /dev/null @@ -1,44 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const basic_emojis = ['🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮', '🇯', '🇰', '🇱', '🇲', '🇳', '🇴', '🇵', '🇶', '🇷', '🇸', '🇹']; -const success_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("チケットの作成に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }) - .setColor(Colors.Green); -const react_error = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("選択されたリアクションはつけることができません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); -const load_embed = new EmbedBuilder() - .setTitle("✅処理中") - .setDescription("しばらくお待ちください") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | expoll" }) - .setColor(Colors.Green); -module.exports = async (interaction) => { - const color = interaction.options.getString("color"); - const image = interaction.options.getAttachment("image")?.attachment; - const data = interaction.options._hoistedOptions.map(choice => { - if (choice.name.startsWith("choice")) return choice.value; - }).filter((c) => c); - const emoji_list = interaction.options._hoistedOptions.map(choice => { - if (choice.name.startsWith("emoji")) return choice.value; - }).filter((c) => c); - const emojis = [...new Set(emoji_list.slice(0, basic_emojis.length).concat(basic_emojis))] - const msg = await interaction.channel.send({ embeds: [load_embed] }); - for (const emoji of emojis.slice(0, data.length)) { - const check = await msg.react(emoji).catch(ex => { }); - if (!check) { - await msg.delete(); - return await interaction.reply({ embeds: [react_error], ephemeral: true }); - }; - }; - const poll_embed = new EmbedBuilder() - .setTitle(interaction.options.getString("title")) - .setDescription(data.filter(x => x).map((c, i) => `${emojis[i]} ${c}`).join('\n') + `\n\n\`\`\`/poll sum messageid:${msg.id} channelid:${msg.channel.id}\`\`\``) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | expoll" }) - .setColor(Colors[color || "Green"]) - .setImage(image); - await msg.edit({ embeds: [poll_embed] }) - await interaction.reply({ embeds: [success_embed], ephemeral: true }); -}; \ No newline at end of file diff --git a/commands/misc/poll/sum.js b/commands/misc/poll/sum.js deleted file mode 100644 index 50a0c24..0000000 --- a/commands/misc/poll/sum.js +++ /dev/null @@ -1,32 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const bar = "▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉"; -const c_error = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("メッセージが見つかりません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }); -const msg_error = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("メッセージがBOTの物ではありません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }); -module.exports = async (interaction) => { - const id = interaction.options.getString("messageid"); - const channel = interaction.options.getString("channelid"); - try { - const message = (channel) ? await (await interaction.guild.channels?.fetch(channel))?.messages?.fetch(id) : await interaction.channel.messages?.fetch(id); - const check = message.embeds[0]?.data; - if (!(check?.footer?.text !== "©️ 2023 KURONEKOSERVER | poll" || check?.footer?.text !== "©️ 2023 KURONEKOSERVER | expoll")) return await interaction.reply({ embeds: [msg_error], ephemeral: true });; - const reactions = message.reactions.cache; - let i = 0; - const text = reactions.map(reaction => `**${check.description.split("\n")[i++]}(${reaction.count}票)**\n\`${((reaction.count / reactions.size) * 100).toFixed(1)}%\` ${bar.substr(0, ((reaction.count / reactions.size) * 100) / 4)}`) - const success_embed = new EmbedBuilder() - .setTitle(check.title) - .setDescription(`${text.join("\n")}\n\n[アンケートへ戻る](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.id})`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | poll" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success_embed], ephemeral: true }); - } catch (ex) { - return await interaction.reply({ embeds: [c_error], ephemeral: true }); - }; -}; \ No newline at end of file diff --git a/commands/misc/server-manage.js b/commands/misc/server-manage.js index be8ee34..d0eca84 100644 --- a/commands/misc/server-manage.js +++ b/commands/misc/server-manage.js @@ -1,91 +1,15 @@ -const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js'); -const ban = require("./server-manage/ban"); -const kick = require("./server-manage/kick"); -const unban = require("./server-manage/unban"); -const clear = require("./server-manage/clear"); -const mute = require("./server-manage/mute"); -const unmute = require("./server-manage/unmute"); -const show = require("./server-manage/show"); +const { PermissionFlagsBits } = require("discord.js"); +const path = require("path"); + module.exports = { - data: new SlashCommandBuilder() + subcommands: path.resolve(__dirname, "./server-manage"), + builder: (builder) => builder .setName("server-manage") - .setDescription("サーバー管理系") + .setDescription("サーバーの管理用") .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .setDMPermission(false) - .addSubcommand(subcommand => - subcommand - .setName("ban") - .setDescription("ユーザーをBANします") - .addUserOption(option => option.setName("member").setDescription("指定したユーザーをBANします").setRequired(true)) - .addIntegerOption(option => option.setName("day").setDescription("特定の期間BANします(日)").setMinValue(1)) - .addStringOption(option => option.setName("理由").setDescription("BAN理由を書いてください")) - ) - .addSubcommand(subcommand => - subcommand - .setName("kick") - .setDescription("ユーザーをkickします") - .addUserOption(option => option.setName("member").setDescription("指定したユーザーをkickします").setRequired(true)) - .addStringOption(option => option.setName("理由").setDescription("kick理由を書いてください")) - ) - .addSubcommand(subcommand => - subcommand - .setName("unban") - .setDescription("ユーザーのBANを解除します") - .addStringOption(option => option.setName("memberid").setDescription("指定したユーザーのBANを解除します").setRequired(true)) - ) - .addSubcommand(subcommand => - subcommand - .setName("clear") - .setDescription("指定の数のメッセージを削除します") - .addIntegerOption(option => option.setName("message").setDescription("1~300まで 0はすべて削除").setRequired(true).setMaxValue(300).setMinValue(0)) - ) - .addSubcommand(subcommand => - subcommand - .setName("mute") - .setDescription("指定したユーザーをミュートにします") - .addUserOption(option => option.setName("member").setDescription("ユーザーを指定してください").setRequired(true)) - .addIntegerOption(option => option.setName("time").setDescription("秒").setRequired(true).setMinValue(1)) - ) - .addSubcommand(subcommand => - subcommand - .setName("unmute") - .addUserOption(option => option.setName("member").setDescription("ユーザーを指定してください").setRequired(true)) - .setDescription("指定したユーザーのミュートを解除") - ) - .addSubcommand(subcommand => - subcommand - .setName("show") - .setDescription("設定の表示") - ), - async execute(interaction) { - const sub = interaction.options.getSubcommand(); - //ban - if (sub === "ban") { - await ban(interaction); - }; - //kick - if (sub === "kick") { - await kick(interaction); - }; - //unban - if (sub === "unban") { - await unban(interaction); - }; - //clear - if (sub === "clear") { - await clear(interaction); - }; - //mute - if (sub === "mute") { - await mute(interaction); - }; - //unmute - if (sub === "ummute") { - await unmute(interaction); - }; - //show - if (sub === "show") { - await show(interaction); - }; + , + execute(...args) { + return args; } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/commands/misc/server-manage/ban.js b/commands/misc/server-manage/ban.js index b72ed39..cf7b69e 100644 --- a/commands/misc/server-manage/ban.js +++ b/commands/misc/server-manage/ban.js @@ -1,30 +1,78 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -module.exports = async (interaction) => { - const user = interaction.options.getUser("member"); - const day = interaction.options.getInteger("day"); - const reason = interaction.options.getString("理由"); - const member = await interaction.guild.members.fetch(user.id); - member.ban({ days: day, reason: reason }) - .then(async () => { - const success = new EmbedBuilder() - .setTitle("✅成功") - .setDescription(`${member}をBANしました\n詳細\n期間:${day || "infinity"}日\n理由:${reason || "なし"}\n対象ユーザーのID:${member.id}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ban" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success], ephemeral: true }); - }) - .catch(async ex => { - const permissonerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`${member}をBANできませんでした。\n理由:権限不足\n対象ユーザーのID:${member.id}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ban" }); - if (ex.code === 50013) return await interaction.reply({ embeds: [permissonerror], ephemeral: true }); - const banerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`${member}をBANできませんでした。\n詳細:${ex}\n対象ユーザーのID:${member.id}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ban" }); - await interaction.reply({ embeds: [banerror], ephemeral: true }); - }); +const { Colors } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("ban") + .setDescription("ユーザーをBANします。") + .addUserOption(option => option + .setName("user") + .setDescription("BANするユーザー") + .setRequired(true) + ) + .addIntegerOption(option => option + .setName("day") + .setDescription("BANを行う日数(永久の場合は入力しない)") + .setMinValue(1) + ) + .addStringOption(option => option + .setName("reason") + .setDescription("BANする理由") + ) + , + async execute(interaction, logger) { + const user = interaction.options.getUser("user"); + const day = interaction.options.getInteger("day"); + const reason = interaction.options.getString("reason"); + + const embed = new CustomEmbed("ban") + .addFields( + { + name: "実行者", + value: `${interaction.user}`, + inline: true + }, + { + name: "対象ユーザー", + value: `${member} (${member.id})`, + inline: true + } + ); + + const member = await interaction.guild.members.fetch(user.id); + member.ban({ days: day, reason: reason }) + .then(() => { + embed.typeSuccess() + .setDescription(`${member}をBANしました。`) + .addFields( + { + name: "期間", + value: day ? `${day}日` : "永久", + inline: true + }, + { + name: "理由", + value: reason || "なし", + inline: true + } + ); + interaction.reply({ embeds: [embed], ephemeral: true }); + }) + .catch(async error => { + embed.typeError() + .setDescription(`${member}をBANできませんでした。`); + if (error.code === 50013) { + embed.addFields({ + name: "エラー理由", + value: "権限不足", + }); + } else { + embed.addFields({ + name: "エラー理由", + value: `不明なエラー\n${error.message}`, + }); + } + interaction.reply({ embeds: [embed], ephemeral: true }); + }); + } }; \ No newline at end of file diff --git a/commands/misc/server-manage/clear.js b/commands/misc/server-manage/clear.js index d985015..50563bc 100644 --- a/commands/misc/server-manage/clear.js +++ b/commands/misc/server-manage/clear.js @@ -1,23 +1,60 @@ -const { EmbedBuilder, Colors, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); -module.exports = async (interaction) => { - const message = interaction.options.getInteger("message"); - const button = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`clear${message}`) - .setLabel("削除する") - .setStyle(ButtonStyle.Danger), +const { Colors, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("clear") + .setDescription("複数のメッセージを削除します。") + .addIntegerOption(option => option + .setName("count") + .setDescription("削除するメッセージの数 (指定しない場合はすべてのメッセージを削除します)") + .setMaxValue(300) + .setMinValue(0) ) - .addComponents( - new ButtonBuilder() - .setCustomId(`clearcancel`) - .setLabel("キャンセルする") - .setStyle(ButtonStyle.Secondary), - ); - const clear_check = new EmbedBuilder() - .setTitle("⚠️確認") - .setDescription(`${(message === 0) ? "すべてのメッセージ" : `${message}件のメッセージ`}を削除しますか?`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | kick" }); - await interaction.reply({ embeds: [clear_check], components: [button] }); + , + execute(interaction) { + const deleteCount = interaction.options.getInteger("count"); + const component = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("clear") + .setLabel("削除") + .setStyle(ButtonStyle.Danger), + ) + .addComponents( + new ButtonBuilder() + .setCustomId(`clearcancel`) + .setLabel("キャンセル") + .setStyle(ButtonStyle.Secondary), + ); + const embed = new CustomEmbed("clear") + .setTitle("⚠確認 (30秒後に自動キャンセルされます)") + .setDescription(`${(deleteCount === 0) ? "すべてのメッセージ" : `${deleteCount}件のメッセージ`}を削除しますか?`) + .setColor(Colors.Red); + interaction.reply({ embeds: [embed], components: [component] }) + .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 30 * 1000}) + .then(async (i) => { + const embed = new CustomEmbed("clear").typeSuccess(); + let message; + if (i.customId === "clear") { + if (deleteCount === 0) { + const cloned = await interaction.channel.clone(); + await cloned.setPosition(interaction.channel.position); + await interaction.channel.delete(); + embed.setDescription("すべてのメッセージを削除しました。"); + message = cloned.send({ embeds: [embed] }); + } else { + await interaction.delete(); + await interaction.channel.bulkDelete(deleteCount); + embed.setDescription(`${deleteCount}件のメッセージを削除しました。`); + message = interaction.channel.send({ embeds: [embed] }) + } + } else { + embed.setDescription("キャンセルしました。"); + message = interaction.update({ embeds: [embed], components: [] }); + } + await message; + setTimeout(message.delete, 3 * 1000); + }); + }, }; \ No newline at end of file diff --git a/commands/misc/server-manage/kick.js b/commands/misc/server-manage/kick.js index 8da63f2..9b261cb 100644 --- a/commands/misc/server-manage/kick.js +++ b/commands/misc/server-manage/kick.js @@ -1,29 +1,62 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -module.exports = async (interaction) => { - const user = interaction.options.getUser("member"); - const reason = interaction.options.getString("理由"); - const member = await interaction.guild.members.fetch(user.id); - member.kick({ reason: reason }) - .then(async () => { - const success = new EmbedBuilder() - .setTitle("✅成功") - .setDescription(`${member}をKICKしました\n理由:${reason || "なし"}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | kick" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success], ephemeral: true }); - }) - .catch(async ex => { - const permissonerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`${member}をKICKできませんでした。\n理由:権限不足`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | kick" }); - if (ex.code === 50013) return await interaction.reply({ embeds: [permissonerror], ephemeral: true }); - const kickerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`${member}をKICKできませんでした。\n詳細:${ex}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | kick" }); - await interaction.reply({ embeds: [kickerror], ephemeral: true }); - }); +const { Colors } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("kick") + .setDescription("ユーザーをkickします。") + .addUserOption(option => option + .setName("user") + .setDescription("kickするユーザー") + .setRequired(true) + ) + .addStringOption(option => option + .setName("reason") + .setDescription("kickする理由") + ) + , + async execute(interaction) { + const user = interaction.options.getUser("user"); + const reason = interaction.options.getString("reason"); + const member = await interaction.guild.members.fetch(user.id); + + const embed = new CustomEmbed("kick") + .addFields( + { + name: "実行者", + value: `${interaction.user}` + }, + { + name: "対象ユーザー", + value: `${member} (${member.id})` + } + ) + + member.kick({ reason: reason }) + .then(() => { + const embed = new CustomEmbed("kick").typeSuccess() + .setDescription(`${member}をkickしました。`) + .addFields({ + name: "理由", + value: reason || "なし" + }); + interaction.reply({ embeds: [embed], ephemeral: true }); + }) + .catch((error) => { + const embed = new CustomEmbed("kick").typeError() + .setDescription(`${member}をkickできませんでした。`); + if (error.code === 50013) { + embed.addFields({ + name: "エラー理由", + value: "権限不足" + }); + } else { + embed.addFields({ + name: "エラー理由", + value: `不明なエラー\n${error.message}` + }); + } + interaction.reply({ embeds: [embed], ephemeral: true }); + }); + } }; \ No newline at end of file diff --git a/commands/misc/server-manage/mute.js b/commands/misc/server-manage/mute.js index d48be1d..4176368 100644 --- a/commands/misc/server-manage/mute.js +++ b/commands/misc/server-manage/mute.js @@ -1,13 +1,33 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -module.exports = async (interaction) => { - const user = interaction.options.getUser("member"); - const time = interaction.options.getInteger("time"); - const member = await interaction.guild.members.fetch(user.id); - await member.timeout(time); - const success = new EmbedBuilder() - .setTitle("✅成功") - .setDescription(`${member}をミュートしました\n期間:${time}秒`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | mute" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success], ephemeral: true }); +const { Colors } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("mute") + .setDescription("指定したユーザーをミュートにします。") + .addUserOption(option => option + .setName("user") + .setDescription("ミュートにするユーザー") + .setRequired(true) + ) + .addIntegerOption(option => option + .setName("time") + .setDescription("期間 (秒)") + .setRequired(true) + .setMinValue(1) + ) + , + async execute(interaction) { + const user = interaction.options.getUser("user"); + const time = interaction.options.getInteger("time"); + const member = await interaction.guild.members.fetch(user.id); + await member.timeout(time); + const embed = new CustomEmbed("mute").typeSuccess() + .setDescription(`${member}をミュートしました。`) + .addFields({ + name: "期間", + value: `${time}秒` + }); + interaction.reply({ embeds: [embed], ephemeral: true }); + } }; \ No newline at end of file diff --git a/commands/misc/server-manage/show.js b/commands/misc/server-manage/show.js index 187f18b..00eef9a 100644 --- a/commands/misc/server-manage/show.js +++ b/commands/misc/server-manage/show.js @@ -1,43 +1,59 @@ -const { EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../../helpers/utils"); -const { escape } = require("mysql2") -module.exports = async (interaction) => { - const ticketdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - const logdata = await sql(`select * from log_channel where guildid=${escape(interaction.guild.id)};`); - const jobpanel = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); - const dictionary = await sql(`select * from dictionary where guildid=${escape(interaction.guild.id)};`); - const server_speak = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); - const read_user = await sql(`select * from read_user where guildid=${escape(interaction.guild.id)};`); - const exvoiceword = await sql(`select * from exvoiceword where guildid=${escape(interaction.guild.id)};`); - const embed = new EmbedBuilder() - .setTitle(`✅サーバーの情報`) - .addFields( - { name: 'Ticketlogチャンネル', value: `${ticketdata[0][0]?.guildid ? interaction.guild.channels.cache.get(ticketdata[0][0]?.channelid) || ticketdata[0][0]?.channelid : "未設定"}` }, - { name: 'logチャンネル', value: `${logdata[0][0]?.guildid ? interaction.guild.channels.cache.get(logdata[0][0]?.channelid) || logdata[0][0]?.channelid : "未設定"}` }, - { name: '役職パネル', value: `${jobpanel[0][0]?.guildid ? `対象チャンネル:${interaction.guild.channels.cache.get(jobpanel[0][0]?.channelid) || logdata[0][0]?.channelid}\n対象メッセージ:[messagelink](https://discord.com/channels/${logdata[0][0]?.guildid}/${logdata[0][0]?.channelid}/${logdata[0][0]?.messageid})` : "未設定"}` }, - { name: '**スピーク関係**', value: "スピーク関係のデータ一覧" }, - { name: '辞書機能', value: `${dictionary[0][0]?.guildid ? "設定済み" : "未設定"}` }, - { name: '自動入室チャンネル(voice)', value: `${server_speak[0][0]?.auto_voice_channel ? interaction.guild.channels.cache.get(server_speak[0][0]?.auto_voice_channel) || server_speak[0][0]?.auto_voice_channel : "未設定"}` }, - { name: '自動入室チャンネル(text)', value: `${server_speak[0][0]?.auto_text_channel ? interaction.guild.channels.cache.get(server_speak[0][0]?.auto_text_channel) || server_speak[0][0]?.auto_text_channel : "未設定"}` }, - { name: '話者名', value: `${server_speak[0][0]?.speakname ? server_speak[0][0]?.speakname : "未設定(ずんだもん)"}` }, - { name: '話者ID', value: `${server_speak[0][0]?.speakid ? server_speak[0][0]?.speakid : "未設定(3)"}` }, - { name: 'ピッチ', value: `${server_speak[0][0]?.pitch ? server_speak[0][0]?.pitch : "未設定(0)"}` }, - { name: 'イントネーション', value: `${server_speak[0][0]?.intonation ? server_speak[0][0]?.intonation : "未設定(1)"}` }, - { name: 'イントネーション', value: `${server_speak[0][0]?.speed ? server_speak[0][0]?.speed : "未設定(1)"}` }, - { name: 'BOTの読み上げ', value: `${server_speak[0][0]?.bot_read ? "読み上げる" : "読み上げない"}` }, - { name: 'ユーザー名の読み上げ', value: `${server_speak[0][0]?.read_username ? "読み上げる" : "読み上げない"}` }, - { name: '入退室の読み上げ', value: `${server_speak[0][0]?.read_joinremove ? "読み上げる" : "読み上げない"}` }, - { name: 'ボイス設定の強制', value: `${server_speak[0][0]?.force_args ? "強制する" : "強制しない"}` }, - { name: '話者の強制', value: `${server_speak[0][0]?.force_voice ? "強制する" : "強制しない"}` }, - { name: 'exvoiceの有効化', value: `${server_speak[0][0]?.exvoice ? "無効" : "未設定(有効)"}` }, - { name: 'ユーザー名の辞書適応', value: `${server_speak[0][0]?.dictionary_username ? "適応する" : "適応しない"}` }, - { name: 'チャンネルにいないユーザーも読み上げるか', value: `${server_speak[0][0]?.only_tts ? "読み上げる" : "読み上げない"}` }, - { name: 'Discordのメッセージを読み上げるか', value: `${server_speak[0][0]?.read_through ? "読み上ない" : "読み上げる"}` }, - { name: '優先的に読み上げるユーザー(BOT)', value: `${read_user[0][0]?.guildid ? "設定済み" : "未設定"}` }, - { name: 'exvoiceの部分無効', value: `${exvoiceword[0][0]?.guildid ? "設定済み" : "未設定"}` }, - { name: 'サポートサーバー', value: `https://discord.gg/Y6w5Jv3EAR` } - ) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | botinfo" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [embed], ephemeral: true }); +const { Colors } = require("discord.js"); +const { CustomEmbed, Utils } = require("../../../libs"); +const { escape } = require("mysql2"); + +module.exports = { + builder: (builder) => builder + .setName("show") + .setDescription("サーバーの設定を表示します。") + , + async execute(interaction) { + const dataNames = ["ticket_channel", "log_channel", "job_message", "dictionary", "server_speak", "read_user", "exvoiceword"]; + const data = {}; + const promises = dataNames.map((name) => { + return Utils.sql(`select * from ${name} where guildid=${escape(interaction.guild.id)};`) + .then((res) => data[name] = res[0][0]); + }); + await Promise.all(promises); + + const normalFieldData = [ + ["Ticketlogチャンネル", `${data.ticket_channel?.guildid ? interaction.guild.channels.cache.get(data.ticket_channel?.channelid) || data.ticket_channel?.channelid : "未設定"}`], + ["logチャンネル", `${data.log_channel?.guildid ? interaction.guild.channels.cache.get(data.log_channel?.channelid) || data.log_channel?.channelid : "未設定"}`], + ["役職パネル", `${data.job_message?.guildid ? `対象チャンネル:${interaction.guild.channels.cache.get(data.job_message?.channelid) || data.log_channel?.channelid}\n対象メッセージ:[messagelink](https://discord.com/channels/${data.log_channel?.guildid}/${data.log_channel?.channelid}/${data.log_channel?.messageid})` : "未設定"}`], + ]; + + const speakFieldData = [ + ["辞書機能", `${data.dictionary?.guildid ? "設定済み" : "未設定"}`], + ["自動入室チャンネル(voice)", `${data.server_speak?.auto_voice_channel ? interaction.guild.channels.cache.get(data.server_speak?.auto_voice_channel) || data.server_speak?.auto_voice_channel : "未設定"}`], + ["自動入室チャンネル(text)", `${data.server_speak?.auto_text_channel ? interaction.guild.channels.cache.get(data.server_speak?.auto_text_channel) || data.server_speak?.auto_text_channel : "未設定"}`], + ["話者名", `${data.server_speak?.speakname ? data.server_speak?.speakname : "未設定(ずんだもん)"}`], + ["話者ID", `${data.server_speak?.speakid ? data.server_speak?.speakid : "未設定(3)"}`], + ["ピッチ", `${data.server_speak?.pitch ? data.server_speak?.pitch : "未設定(0)"}`], + ["イントネーション", `${data.server_speak?.intonation ? data.server_speak?.intonation : "未設定(1)"}`], + ["スピード", `${data.server_speak?.speed ? data.server_speak?.speed : "未設定(1)"}`], + ["BOTの読み上げ", `${data.server_speak?.bot_read ? "読み上げる" : "読み上げない"}`], + ["ユーザー名の読み上げ", `${data.server_speak?.read_username ? "読み上げる" : "読み上げない"}`], + ["入退室の読み上げ", `${data.server_speak?.read_joinremove ? "読み上げる" : "読み上げない"}`], + ["ボイス設定の強制", `${data.server_speak?.force_args ? "強制する" : "強制しない"}`], + ["話者の強制", `${data.server_speak?.force_voice ? "強制する" : "強制しない"}`], + ["exvoiceの有効化", `${data.server_speak?.exvoice ? "無効" : "未設定(有効)"}`], + ["ユーザー名の辞書適応", `${data.server_speak?.dictionary_username ? "適応する" : "適応しない"}`], + ["チャンネルにいないユーザーも読み上げるか", `${data.server_speak?.only_tts ? "読み上げる" : "読み上げない"}`], + ["Discordのメッセージを読み上げるか", `${data.server_speak?.read_through ? "読み上げない" : "読み上げる"}`], + ["優先的に読み上げるユーザー(bot)", `${data.read_user?.guildid ? "設定済み" : "未設定"}`], + ["exvoiceの部分無効", `${data.exvoiceword?.guildid ? "設定済み" : "未設定"}`] + ]; + + const fieldData = []; + normalFieldData.forEach((data) => fieldData.push({ name: data[0], value: data[1], inline: true })); + fieldData.push({ name: "\u200b", value: ">> **スピークの設定** <<"}); + speakFieldData.forEach((data) => fieldData.push({ name: data[0], value: data[1], inline: true })); + + const embed = new CustomEmbed("show") + .setTitle("✅サーバーの情報") + .setDescription(`[サポートサーバー]https://discord.gg/Y6w5Jv3EAR`) + .addFields(fieldData) + .setColor(Colors.Green); + interaction.reply({ embeds: [embed], ephemeral: true }); + } }; \ No newline at end of file diff --git a/commands/misc/server-manage/unban.js b/commands/misc/server-manage/unban.js index 2316e6a..d7e0421 100644 --- a/commands/misc/server-manage/unban.js +++ b/commands/misc/server-manage/unban.js @@ -1,39 +1,47 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const permissonerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`BANを解除できませんでした。\n理由:権限不足`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unban" }); -const alreadyerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`BANを解除できませんでした。\n理由:すでに解除されています`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unban" }); -const unknownerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`BANを解除できませんでした。\n理由:ユーザーが見つかりません`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unban" }); -module.exports = async (interaction) => { - const id = interaction.options.getString("memberid"); - interaction.guild.members.unban(id) - .then(async (user) => { - const success = new EmbedBuilder() - .setTitle("✅成功") - .setDescription(`${user}のBANを解除しました`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unban" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success], ephemeral: true }); - }) - .catch(async ex => { - if (ex.code === 50013) return await interaction.reply({ embeds: [permissonerror], ephemeral: true }); - if (ex.code === 50035) return await interaction.reply({ embeds: [unknownerror], ephemeral: true }); - if (ex.code === 10026) return await interaction.reply({ embeds: [alreadyerror], ephemeral: true }); - const kickerror = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription(`BANを解除できませんでした。\n詳細:${ex}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unban" }); - await interaction.reply({ embeds: [kickerror], ephemeral: true }); - }); +const { Colors } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("unban") + .setDescription("ユーザーのBANを解除します。") + .addStringOption(option => option + .setName("userid") + .setDescription("BANを解除するユーザーのid") + .setRequired(true) + ) + , + execute(interaction) { + const id = interaction.options.getString("userid"); + interaction.guild.members.unban(id) + .then((user) => { + const embed = new CustomEmbed("unban").typeSuccess() + .setDescription(`${user}(${user.id})のBANを解除しました。`); + interaction.reply({ embeds: [embed], ephemeral: true }); + }) + .catch((error) => { + let errorReason; + switch (error.code) { + case 50013: + errorReason = "権限不足です。"; + break; + case 50035: + errorReason = "ユーザーが見つかりませんでした。"; + break; + case 10026: + errorReason = "すでにBANが解除されています。"; + break; + default: + errorReason = `不明なエラーが発生しました。\n${error.message}`; + break; + } + const embed = new CustomEmbed("unban").typeError() + .setDescription("BANを解除できませんでした。") + .addFields({ + name: "エラー理由", + value: errorReason + }); + interaction.reply({ embeds: [embed], ephemeral: true }); + }); + } }; \ No newline at end of file diff --git a/commands/misc/server-manage/unmute.js b/commands/misc/server-manage/unmute.js index 3235386..a10bb4c 100644 --- a/commands/misc/server-manage/unmute.js +++ b/commands/misc/server-manage/unmute.js @@ -1,12 +1,23 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -module.exports = async (interaction) => { - const user = interaction.options.getUser("member"); - const member = await interaction.guild.members.fetch(user.id); - await member.timeout(0); - const success = new EmbedBuilder() - .setTitle("✅成功") - .setDescription(`${member}のミュートを解除しました`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | unmute" }) - .setColor(Colors.Green); - await interaction.reply({ embeds: [success], ephemeral: true }); +const { Colors } = require("discord.js"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("unmute") + .setDescription("指定したユーザーのミュートを解除します。") + .addUserOption(option => option + .setName("user") + .setDescription("ミュートを解除するユーザー") + .setRequired(true) + ) + , + async execute(interaction) { + const user = interaction.options.getUser("user"); + const time = interaction.options.getInteger("time"); + const member = await interaction.guild.members.fetch(user.id); + await member.timeout(0); + const embed = new CustomEmbed("unmute").typeSuccess() + .setDescription(`${member}のミュートを解除しました。`); + interaction.reply({ embeds: [embed], ephemeral: true }); + } }; \ No newline at end of file diff --git a/commands/misc/speak/dictionary_add.js b/commands/misc/speak/dictionary_add.js index 445d68b..79aa392 100644 --- a/commands/misc/speak/dictionary_add.js +++ b/commands/misc/speak/dictionary_add.js @@ -1,16 +1,16 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const size_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("合わせて20文字以内になるようにしてください。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const before = interaction.options.getString("before"); const after = interaction.options.getString("after"); @@ -26,7 +26,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`辞書を更新しました!\n単語:${before}\n読み:${after}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; \ No newline at end of file diff --git a/commands/misc/speak/dictionary_export.js b/commands/misc/speak/dictionary_export.js index 9683a7e..755301d 100644 --- a/commands/misc/speak/dictionary_export.js +++ b/commands/misc/speak/dictionary_export.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors, AttachmentBuilder } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("対象の単語が登録されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from dictionary where guildid=${escape(interaction.guild.id)}`); if (!getdata[0][0]?.guildid) return ({ embeds: [error] }); @@ -15,7 +15,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`添付ファイルをご確認ください。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success], files: [new AttachmentBuilder().setFile(Buffer.from(text)).setName(`export.${format}`)] }); }; \ No newline at end of file diff --git a/commands/misc/speak/dictionary_import.js b/commands/misc/speak/dictionary_import.js index c65053a..eb78121 100644 --- a/commands/misc/speak/dictionary_import.js +++ b/commands/misc/speak/dictionary_import.js @@ -1,28 +1,28 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { getJson } = require("../../../helpers/HttpUtils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`インポートが完了しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("ファイルフォーマットが無効です。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const size_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("合わせて20文字以内になるようにしてください。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const { data } = await getJson(interaction.options.getAttachment("file").attachment); try { diff --git a/commands/misc/speak/dictionary_remove.js b/commands/misc/speak/dictionary_remove.js index c16e8a9..5fa127d 100644 --- a/commands/misc/speak/dictionary_remove.js +++ b/commands/misc/speak/dictionary_remove.js @@ -1,17 +1,17 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("対象の単語が登録されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const delete_text = interaction.options.getString("delete"); const getdata = await sql(`select * from dictionary where guildid=${escape(interaction.guild.id)} and before_text=${escape(delete_text)};`); @@ -22,7 +22,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`辞書を削除しました!\n単語:${delete_text}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; \ No newline at end of file diff --git a/commands/misc/speak/dictionary_reset.js b/commands/misc/speak/dictionary_reset.js index 573486a..2edede6 100644 --- a/commands/misc/speak/dictionary_reset.js +++ b/commands/misc/speak/dictionary_reset.js @@ -1,17 +1,17 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("対象の単語が登録されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from dictionary where guildid=${escape(interaction.guild.id)};`); if (getdata[0][0]?.guildid) { @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`辞書を削除しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; \ No newline at end of file diff --git a/commands/misc/speak/dictionary_username.js b/commands/misc/speak/dictionary_username.js index b48ec33..35ea1e9 100644 --- a/commands/misc/speak/dictionary_username.js +++ b/commands/misc/speak/dictionary_username.js @@ -1,21 +1,21 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`ユーザー名に辞書を適応します!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const success_delete = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`ユーザー名に辞書を適応しないようにしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const boolean = interaction.options.getString("toggle"); diff --git a/commands/misc/speak/disconnect.js b/commands/misc/speak/disconnect.js index 3a47603..98d7e08 100644 --- a/commands/misc/speak/disconnect.js +++ b/commands/misc/speak/disconnect.js @@ -3,12 +3,12 @@ const { getVoiceConnection } = require('@discordjs/voice'); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ボイスチャンネルにから退出しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const undefined_channel = new EmbedBuilder() - .setTitle(`⚠️エラー`) + .setTitle(`⚠エラー`) .setDescription("ボイスチャンネルに参加していません。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Red); module.exports = async (interaction) => { diff --git a/commands/misc/speak/exvoice.js b/commands/misc/speak/exvoice.js index 232734d..ab80dcf 100644 --- a/commands/misc/speak/exvoice.js +++ b/commands/misc/speak/exvoice.js @@ -1,18 +1,18 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const { PagesManager } = require('discord.js-pages'); const pagesManager = new PagesManager(); const url = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`https://kuroneko6423.com/exvoice`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データが見つかりません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const name = interaction.options.getString("話者"); const select = interaction.options.getString("select"); @@ -28,7 +28,7 @@ module.exports = async (interaction) => { .setTitle('読み上げないテキスト一覧') .setPages(content) .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setPaginationFormat() .build(); return "exception"; diff --git a/commands/misc/speak/join.js b/commands/misc/speak/join.js index 258a549..7e00732 100644 --- a/commands/misc/speak/join.js +++ b/commands/misc/speak/join.js @@ -4,12 +4,12 @@ const { joinVoiceChannel } = require('@discordjs/voice'); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ボイスチャンネルに参加しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const undefined_channel = new EmbedBuilder() - .setTitle(`⚠️エラー`) + .setTitle(`⚠エラー`) .setDescription("貴方が参加しているボイスチャンネルを見つけることができませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Red); module.exports = async (interaction) => { diff --git a/commands/misc/speak/live_read.js b/commands/misc/speak/live_read.js index f6aa8d6..fef2b3f 100644 --- a/commands/misc/speak/live_read.js +++ b/commands/misc/speak/live_read.js @@ -3,40 +3,40 @@ const { read } = require("../../../helpers/read"); const tmi = require('tmi.js'); const { LiveChat } = require("youtube-chat") const nojoin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("BOTがボイスチャンネルに参加していません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("ボイスチャンネルのデータが取得できません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("貴方と参加しているボイスチャンネルが違います。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const already_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("すでに再生済みです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const nourl_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("URLが指定されていません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`接続されました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const vi_undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("動画が見つかりません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { if (!interaction?.guild?.members?.me?.voice?.channel?.id) return ({ embeds: [nojoin_error] }); if (!globalThis.voice_channel[interaction.guild.id]) return ({ embeds: [undefined_error] }); diff --git a/commands/misc/speak/live_read_stop.js b/commands/misc/speak/live_read_stop.js index 54d37ba..bf87e02 100644 --- a/commands/misc/speak/live_read_stop.js +++ b/commands/misc/speak/live_read_stop.js @@ -1,28 +1,28 @@ const { EmbedBuilder, Colors } = require("discord.js"); const nojoin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("BOTがボイスチャンネルに参加していません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("ボイスチャンネルのデータが取得できません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("貴方と参加しているボイスチャンネルが違います。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const noalready_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("何も再生していません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const stop_success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`切断されました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { if (!interaction?.guild?.members?.me?.voice?.channel?.id) return ({ embeds: [nojoin_error] }); diff --git a/commands/misc/speak/read_through.js b/commands/misc/speak/read_through.js index f9f0116..d96797f 100644 --- a/commands/misc/speak/read_through.js +++ b/commands/misc/speak/read_through.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); const boolean = interaction.options.getString("toggle"); @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("Discordの読み上げを無効にしました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -36,7 +36,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("Discordの読み上げを有効にしました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/speak/server_auto-join-delete.js b/commands/misc/speak/server_auto-join-delete.js index bae72ed..9b83e36 100644 --- a/commands/misc/speak/server_auto-join-delete.js +++ b/commands/misc/speak/server_auto-join-delete.js @@ -1,21 +1,21 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const undefiend_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データが見つかりません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const remove_success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`正常に削除されました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); diff --git a/commands/misc/speak/server_auto-join.js b/commands/misc/speak/server_auto-join.js index e159283..bce737a 100644 --- a/commands/misc/speak/server_auto-join.js +++ b/commands/misc/speak/server_auto-join.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const text = interaction.options.getChannel("textchannel"); const voice = interaction.options.getChannel("voicechannel"); @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`autochannelを更新しました!\nテキストチャンネル:${text}\nボイスチャンネル:${voice}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; \ No newline at end of file diff --git a/commands/misc/speak/server_exvoice-word.js b/commands/misc/speak/server_exvoice-word.js index 7b37ca2..68a6fa6 100644 --- a/commands/misc/speak/server_exvoice-word.js +++ b/commands/misc/speak/server_exvoice-word.js @@ -1,23 +1,23 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const { PagesManager } = require('discord.js-pages'); const pagesManager = new PagesManager(); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const url = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`https://kuroneko6423.com/exvoice`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データが見つかりません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const name = interaction.options.getString("話者"); const select = interaction.options.getString("select"); @@ -25,7 +25,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${name.split(",").join("(")})を追加しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const getdata = await sql(`select * from exvoiceword where guildid=${escape(interaction.guild.id)} and speakname=${escape(name.split(",")[1])} and word=${escape(name.split(",")[0])};`); if (!getdata[0][0]?.word) { @@ -38,7 +38,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${name.split(",").join("(")})を削除しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const getdata = await sql(`select * from exvoiceword where guildid=${escape(interaction.guild.id)} and speakname=${escape(name.split(",")[1])} and word=${escape(name.split(",")[0])};`); if (getdata[0][0]?.word) { diff --git a/commands/misc/speak/server_exvoice.js b/commands/misc/speak/server_exvoice.js index 26194c5..25b3771 100644 --- a/commands/misc/speak/server_exvoice.js +++ b/commands/misc/speak/server_exvoice.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid="${interaction.guild.id}";`); const boolean = interaction.options.getString("toggle"); @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("exvoiceを有効にしました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -36,7 +36,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("exvoiceを無効にしました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/speak/server_force-guild.js b/commands/misc/speak/server_force-guild.js index ebffa35..07cc6be 100644 --- a/commands/misc/speak/server_force-guild.js +++ b/commands/misc/speak/server_force-guild.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); const boolean = interaction.options.getString("toggle"); @@ -23,7 +23,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("サーバー話者を強制しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -38,7 +38,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("サーバー話者の強制を解除しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -55,7 +55,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("サーバー設定を強制しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -70,7 +70,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("サーバー設定の強制を解除しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/speak/server_read-bot.js b/commands/misc/speak/server_read-bot.js index 3fa76b4..497a2eb 100644 --- a/commands/misc/speak/server_read-bot.js +++ b/commands/misc/speak/server_read-bot.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); const boolean = interaction.options.getString("toggle"); @@ -21,7 +21,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("BOTを読み上げるようになりました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -36,7 +36,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("BOTを読み上げないようになりました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/speak/server_read-user.js b/commands/misc/speak/server_read-user.js index 45a9f43..b78dfaa 100644 --- a/commands/misc/speak/server_read-user.js +++ b/commands/misc/speak/server_read-user.js @@ -1,21 +1,21 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ユーザーを読み上げ対象に入れました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const remove_success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ユーザーを読み上げ対象から外しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const getdata = await sql(`select * from read_user where guildid=${escape(interaction.guild.id)};`); diff --git a/commands/misc/speak/server_read.js b/commands/misc/speak/server_read.js index 83bc71e..86d6c0b 100644 --- a/commands/misc/speak/server_read.js +++ b/commands/misc/speak/server_read.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const boolean = interaction.options.getString("toggle"); const ope = interaction.options.getString("操作"); @@ -23,7 +23,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ユーザー名を読み上げるようになりました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -38,7 +38,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ユーザー名を読み上げないようになりました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -48,7 +48,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`入退出時にユーザー名を読み上げるようにしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); if (getdata[0][0]?.guildid) { const set = await sql(`update server_speak set read_joinremove=true where guildid=${escape(interaction.guild.id)};`); @@ -63,7 +63,7 @@ module.exports = async (interaction) => { const success_delete = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`入退出時にユーザー名を読み上げないようにしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); if (getdata[0][0]?.guildid) { const set = await sql(`update server_speak set read_joinremove=null where guildid=${escape(interaction.guild.id)};`); diff --git a/commands/misc/speak/server_reset.js b/commands/misc/speak/server_reset.js index 9fa4de9..10e7058 100644 --- a/commands/misc/speak/server_reset.js +++ b/commands/misc/speak/server_reset.js @@ -1,16 +1,16 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`削除しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const dictionary_getdata = await sql(`select * from dictionary where guildid=${escape(interaction.guild.id)};`); diff --git a/commands/misc/speak/server_user-dictionary-list.js b/commands/misc/speak/server_user-dictionary-list.js index 89deb9c..ae641be 100644 --- a/commands/misc/speak/server_user-dictionary-list.js +++ b/commands/misc/speak/server_user-dictionary-list.js @@ -1,14 +1,14 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const { PagesManager } = require('discord.js-pages'); const pagesManager = new PagesManager(); const undefiend_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データが見つかりませんでした。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const select = interaction.options.getString("select"); if (select === "user") { @@ -23,7 +23,7 @@ module.exports = async (interaction) => { .setTitle('読み上げを行わないユーザー一覧') .setPages(content) .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setPaginationFormat() .build(); return "exception"; @@ -41,7 +41,7 @@ module.exports = async (interaction) => { .setTitle('辞書一覧') .setPages(content) .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setPaginationFormat() .build(); return "exception"; diff --git a/commands/misc/speak/server_vc-only-tts.js b/commands/misc/speak/server_vc-only-tts.js index 5352ae0..579de8b 100644 --- a/commands/misc/speak/server_vc-only-tts.js +++ b/commands/misc/speak/server_vc-only-tts.js @@ -1,21 +1,21 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`入室していないユーザーを読み上げるようになりました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const success_delete = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`入退出時にユーザー名を読み上げないようにしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const boolean = interaction.options.getString("toggle"); diff --git a/commands/misc/speak/server_voice-setting.js b/commands/misc/speak/server_voice-setting.js index fa5a6e8..a14b8aa 100644 --- a/commands/misc/speak/server_voice-setting.js +++ b/commands/misc/speak/server_voice-setting.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from server_speak where guildid=${escape(interaction.guild.id)};`); const select = interaction.options.getString("args"); @@ -14,15 +14,15 @@ module.exports = async (interaction) => { const speed = interaction.options.getNumber("number"); if (speed) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は4.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は0.5までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (speed > 4.0) return ({ embeds: [sizemax_error] }); if (speed < 0.5) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.guildid) { @@ -44,7 +44,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("スピードを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -52,15 +52,15 @@ module.exports = async (interaction) => { const pitch = interaction.options.getNumber("number"); if (pitch) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は0.15までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は-0.15までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (pitch > 0.15) return ({ embeds: [sizemax_error] }); if (pitch < -0.15) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.guildid) { @@ -82,7 +82,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ピッチを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -90,15 +90,15 @@ module.exports = async (interaction) => { const intonation = interaction.options.getNumber("number"); if (intonation) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は2.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は0.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (intonation > 2) return ({ embeds: [sizemax_error] }); if (intonation < 0) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.guildid) { @@ -120,7 +120,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("イントネーションを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/speak/server_voice.js b/commands/misc/speak/server_voice.js index e9b9f57..68f43ff 100644 --- a/commands/misc/speak/server_voice.js +++ b/commands/misc/speak/server_voice.js @@ -1,8 +1,8 @@ const { EmbedBuilder, Colors, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js"); const undefined_choice = new EmbedBuilder() - .setTitle(`⚠️エラー`) + .setTitle(`⚠エラー`) .setDescription("何も選択されていません。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Red); const voicevox_array = require("../../../helpers/voicelist/allvoicevoxlist.json"); const coeiroink_array = require("../../../helpers/voicelist/allcoeiroinklist.json"); @@ -12,7 +12,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("voicevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( @@ -30,7 +30,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("coeiroink話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( @@ -48,7 +48,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("sharevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( diff --git a/commands/misc/speak/setting-show.js b/commands/misc/speak/setting-show.js index ffdf0a7..756739a 100644 --- a/commands/misc/speak/setting-show.js +++ b/commands/misc/speak/setting-show.js @@ -1,5 +1,5 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") module.exports = async (interaction) => { @@ -27,7 +27,7 @@ module.exports = async (interaction) => { { name: '自動入室チャンネル', value: data[0][0]?.auto_voice_channel ? `${interaction.guild.channels.cache.get(data[0][0]?.auto_voice_channel) || "取得失敗"}=>${interaction.guild.channels.cache.get(data[0][0]?.auto_text_channel) || "取得失敗"}` : "なし", inline: true }, ) .setTimestamp(new Date()) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); return ({ embeds: [embed] }); }; if (ope === "user") { @@ -43,7 +43,7 @@ module.exports = async (interaction) => { { name: '標準のイントネーション', value: data[0][0]?.intonation || "1", inline: true }, ) .setTimestamp(new Date()) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); return ({ embeds: [embed] }); }; }; \ No newline at end of file diff --git a/commands/misc/speak/setvoice.js b/commands/misc/speak/setvoice.js index 9f8245d..c9a0c34 100644 --- a/commands/misc/speak/setvoice.js +++ b/commands/misc/speak/setvoice.js @@ -1,8 +1,8 @@ const { EmbedBuilder, Colors, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js"); const undefined_choice = new EmbedBuilder() - .setTitle(`⚠️エラー`) + .setTitle(`⚠エラー`) .setDescription("何も選択されていません。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Red); const voicevox_array = require("../../../helpers/voicelist/allvoicevoxlist.json"); const coeiroink_array = require("../../../helpers/voicelist/allcoeiroinklist.json"); @@ -12,7 +12,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("voicevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( @@ -30,7 +30,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("coeiroink話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( @@ -48,7 +48,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`${interaction.options.getString("sharevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const select = new ActionRowBuilder() .addComponents( diff --git a/commands/misc/speak/skip.js b/commands/misc/speak/skip.js index dcc0b0c..0acc385 100644 --- a/commands/misc/speak/skip.js +++ b/commands/misc/speak/skip.js @@ -1,24 +1,24 @@ const { EmbedBuilder, Colors } = require("discord.js"); const { read } = require("../../../helpers/read"); const nojoin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("BOTがボイスチャンネルに参加していません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("ボイスチャンネルのデータが取得できません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("貴方と参加しているボイスチャンネルが違います。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`スキップしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { if (!interaction?.guild?.members?.me?.voice?.channel?.id) return ({ embeds: [nojoin_error] }); diff --git a/commands/misc/speak/user_reset.js b/commands/misc/speak/user_reset.js index 9996ab7..be1bff1 100644 --- a/commands/misc/speak/user_reset.js +++ b/commands/misc/speak/user_reset.js @@ -1,16 +1,16 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`削除しました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); module.exports = async (interaction) => { const getdata = await sql(`select * from user_speak where userid=${escape(interaction.user.id)};`); diff --git a/commands/misc/speak/user_voice-setting.js b/commands/misc/speak/user_voice-setting.js index b0127bf..0093cda 100644 --- a/commands/misc/speak/user_voice-setting.js +++ b/commands/misc/speak/user_voice-setting.js @@ -1,12 +1,12 @@ const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../../helpers/utils"); +const { sql } = require("../../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); module.exports = async (interaction) => { const getdata = await sql(`select * from user_speak where userid=${escape(interaction.user.id)};`); const select = interaction.options.getString("args"); @@ -14,15 +14,15 @@ module.exports = async (interaction) => { const intonation = interaction.options.getNumber("number"); if (intonation) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は2.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は0.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (intonation > 2) return ({ embeds: [sizemax_error] }); if (intonation < 0) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.userid) { @@ -44,7 +44,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("イントネーションを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -52,15 +52,15 @@ module.exports = async (interaction) => { const speed = interaction.options.getNumber("number"); if (speed) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は4.0までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は0.5までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (speed > 4.0) return ({ embeds: [sizemax_error] }); if (speed < 0.5) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.userid) { @@ -82,7 +82,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("スピードを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; @@ -90,15 +90,15 @@ module.exports = async (interaction) => { const pitch = interaction.options.getNumber("number"); if (pitch) { const sizemax_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最高は0.15までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const sizemin_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("最低は-0.15までです。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); if (pitch > 0.15) return ({ embeds: [sizemax_error] }); if (pitch < -0.15) return ({ embeds: [sizemin_error] }); if (getdata[0][0]?.userid) { @@ -120,7 +120,7 @@ module.exports = async (interaction) => { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ピッチを変更しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); return ({ embeds: [success] }); }; diff --git a/commands/misc/sub/mcbedrock.js b/commands/misc/sub/mcbedrock.js index e6bc9df..64638a9 100644 --- a/commands/misc/sub/mcbedrock.js +++ b/commands/misc/sub/mcbedrock.js @@ -1,9 +1,9 @@ const { EmbedBuilder, Colors } = require("discord.js"); const { getJson } = require("../../../helpers/HttpUtils"); const error = new EmbedBuilder() - .setTitle(`⚠️注意`) + .setTitle(`⚠注意`) .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Red); module.exports = async (query) => { const response = await getJson(`https://api.mcstatus.io/v2/status/bedrock/${query}`); @@ -29,7 +29,7 @@ module.exports = async (query) => { }, ) .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Green); return ({ embeds: [embed], ephemeral: true }); }; \ No newline at end of file diff --git a/commands/misc/sub/mcjava.js b/commands/misc/sub/mcjava.js index 4adb800..ebbae1b 100644 --- a/commands/misc/sub/mcjava.js +++ b/commands/misc/sub/mcjava.js @@ -1,9 +1,9 @@ const { EmbedBuilder, Colors } = require("discord.js"); const { getJson } = require("../../../helpers/HttpUtils"); const error = new EmbedBuilder() - .setTitle(`⚠️注意`) + .setTitle(`⚠注意`) .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Red); module.exports = async (query) => { const response = await getJson(`https://api.mcstatus.io/v2/status/java/${query}`); @@ -29,7 +29,7 @@ module.exports = async (query) => { }, ) .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Green); return ({ embeds: [embed], ephemeral: true }); diff --git a/commands/misc/sub/mcuser.js b/commands/misc/sub/mcuser.js index 8180de5..477dd3f 100644 --- a/commands/misc/sub/mcuser.js +++ b/commands/misc/sub/mcuser.js @@ -1,9 +1,9 @@ const { EmbedBuilder, Colors } = require("discord.js"); const { getJson } = require("../../../helpers/HttpUtils"); const error = new EmbedBuilder() - .setTitle(`⚠️注意`) + .setTitle(`⚠注意`) .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Red); module.exports = async (query) => { const response = await getJson(`https://api.mojang.com/user/profile/agent/minecraft/name/${query}`); @@ -26,7 +26,7 @@ module.exports = async (query) => { } ) .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | minecraft" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) .setColor(Colors.Green); return ({ embeds: [embed], ephemeral: true }); }; diff --git a/commands/misc/ticket.js b/commands/misc/ticket.js index a7a7600..ae6e0f5 100644 --- a/commands/misc/ticket.js +++ b/commands/misc/ticket.js @@ -1,114 +1,120 @@ -const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, PermissionFlagsBits, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionFlagsBits, Colors, ChannelType } = require("discord.js"); +const { CustomEmbed, ColorsChoice } = require("../../libs/CustomEmbed"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") -const success_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("チケットの作成に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); -const delete_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("データの削除に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); -const ERROREmbed = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("データの保存に失敗しました。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }); -const undefined_embed = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("データが見つかりませんでした。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }); -const delete_error = new EmbedBuilder() - .setTitle("⚠️エラー") - .setDescription("データの削除に失敗しました。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }); module.exports = { - data: new SlashCommandBuilder() - .setName('ticket') - .addSubcommand(subcommand => - subcommand - .setName("create") - .setDescription("チケットを作成します") - .addStringOption(option => option.setName("title").setDescription("タイトルを設定")) - .addStringOption(option => option.setName("description").setDescription("説明を設定")) - .addStringOption(option => option.setName("label").setDescription("ボタンの名前")) - .addChannelOption(option => option.addChannelTypes(ChannelType.GuildText).setName("log").setDescription("logを残したいチャンネルを選択")) - .addAttachmentOption(option => option.setName("image").setDescription("表示したい画像")) - .addStringOption(option => option.setName("color").setDescription("色を決められます").setChoices( - { name: "赤色", value: "Red" }, - { name: "白色", value: "White" }, - { name: "水色", value: "Aqua" }, - { name: "緑色", value: "Green" }, - { name: "青色", value: "Blue" }, - { name: "黄色", value: "Yellow" }, - { name: "蛍光ピンク色", value: "LuminousVividPink" }, - { name: "紫色", value: "Purple" }, - { name: "赤紫色", value: "Fuchsia" }, - { name: "金色", value: "Gold" }, - { name: "オレンジ色", value: "Orange" }, - { name: "灰色", value: "Grey" }, - { name: "濃紺色", value: "Navy" }, - { name: "濃い水色", value: "DarkAqua" }, - { name: "濃い緑色", value: "DarkGreen" }, - { name: "濃い青色", value: "DarkBlue" }, - { name: "濃い紫色", value: "DarkPurple" }, - { name: "濃い蛍光ピンク色", value: "DarkVividPink" }, - { name: "濃い金色", value: "DarkGold" }, - { name: "濃いオレンジ色", value: "DarkOrange" }, - { name: "濃い赤色", value: "DarkRed" }, - { name: "濃い灰色", value: "DarkGrey" }, - { name: "明るい灰色", value: "LightGrey" }, - { name: "濃い紺色", value: "DarkNavy" }, - { name: "青紫色", value: "Blurple" } - ))) - .addSubcommand(subcommand => - subcommand - .setName('delete') - .setDescription('チケットログチャンネルを削除します') - ) + subcommands: [ticketCreate, ticketDelete], + builder: (builder) => builder + .setName("ticket") + .setDescription("チケットを作成します。") .setDMPermission(false) .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) - .setDescription('チケットを作成します'), - async execute(interaction) { - const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - const sub = interaction.options.getSubcommand(); - if (sub === "create") { - const options = interaction.options; - const ticket_button = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('ticket_button') - .setLabel(options.getString("label") || '🎫チケット発行') - .setStyle(ButtonStyle.Success) - ); - const ticket_embed = new EmbedBuilder() - .setTitle(options.getString("title") || "お問い合わせ") - .setDescription(options.getString("description") || "サポートとのチケットを発行します。\n発行後、メンションしたチャンネルにて質問などをご記入ください。") - .setColor(Colors[options.getString("color") || "Green"]) - .setImage(options.getAttachment("image")?.attachment) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }); - if (interaction.options.getChannel("log")?.id) { - if (getdata[0][0]?.guildid) { - const update = await sql(`update ticket_channel set channelid=${escape(interaction.options.getChannel("log").id)} where guildid=${escape(interaction.guild.id)};`); - if (!update) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) - } else { - const add = await sql(`insert into ticket_channel values (${escape(interaction.guild.id)},${escape(interaction.options.getChannel("log").id)});`); - if (!add) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) - }; + , + async execute(interaction, ...args) { + const data = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); + return [interaction, data[0][0], ...args] + } +}; + +const ticketCreate = { + builder: (builder) => builder + .setName("create") + .setDescription("チケット作成画面を作成します。") + .addStringOption(option => option + .setName("title") + .setDescription("チケット作成画面のタイトル") + .setRequired(true) + ) + .addStringOption(option => option + .setName("description") + .setDescription("チケット作成画面の説明文") + ) + .addAttachmentOption(option => option + .setName("image") + .setDescription("チケット作成画面の画像") + ) + .addStringOption(option => option + .setName("color") + .setDescription("チケット作成画面の色") + .setChoices(...ColorsChoice) + ) + .addStringOption(option => option + .setName("label") + .setDescription("チケットを作成するボタンのラベル") + ) + .addChannelOption(option => option + .setName("log") + .addChannelTypes(ChannelType.GuildText) + .setDescription("ログを送信するチャンネル") + ) + , + async execute(interaction, data) { + const { options, guild } = interaction; + const title = options.getString("title"); + const description = options.getString("description"); + const image = options.getAttachment("image"); + const color = options.getString("color") || "Green"; + const label = options.getString("label") || "🎫チケット発行"; + const log = options.getChannel("log"); + + const embed = new CustomEmbed("ticket") + + if (log) { + let promise; + if (data?.guildid) { + promise = sql(`update ticket_channel set channelid=${escape(log.id)} where guildid=${escape(guild.id)};`); + } else { + promise = sql(`insert into ticket_channel values (${escape(guild.id)},${escape(log.id)});`); }; - await interaction.channel.send({ embeds: [ticket_embed], components: [ticket_button] }); - await interaction.reply({ embeds: [success_embed], ephemeral: true }); + if (!await promise) { + embed.typeError() + .setDescription("データの保存に失敗しました。"); + return interaction.reply({ embeds: [embed], ephemeral: true }) + } }; - if (sub === "delete") { - if (!getdata[0][0]?.guildid) return await interaction.reply({ embeds: [undefined_embed], ephemeral: true }); - const sql_delete = await sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(interaction.guild.id)};`); - if (!sql_delete) return await interaction.reply({ embeds: [delete_error], ephemeral: true }); - await interaction.reply({ embeds: [delete_embed], ephemeral: true }); + + const component = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("ticket_button") + .setLabel(label) + .setStyle(ButtonStyle.Success) + ); + const ticketEmbed = new CustomEmbed() + .setTitle(title) + .setColor(Colors[color]) + if (description) ticketEmbed.setDescription(description); + if (image) ticketEmbed.setImage(image.attachment); + await interaction.channel.send({ embeds: [ticketEmbed], components: [component] }); + + embed.typeSuccess() + .setDescription("チケット作成画面を作成しました。"); + interaction.reply({ embeds: [success_embed], ephemeral: true }); + } +}; + +const ticketDelete = { + builder: (builder) => builder + .setName("delete") + .setDescription("チケット作成画面を削除します。") + , + async execute(interaction, data) { + const embed = new CustomEmbed("ticket"); + + if (!data?.guildid) { + embed.typeError() + .setDescription("データが見つかりませんでした。"); + } else { + const sqlDelete = await sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(interaction.guild.id)};`); + if (!sqlDelete) { + embed.typeError() + .setDescription("データの削除に失敗しました。"); + } else { + embed.typeSuccess() + .setDescription("データの削除に成功しました。"); + } } - }, + interaction.reply({ embeds: [embed], ephemeral: true }); + } }; \ No newline at end of file diff --git a/events/misc/admincommand.js b/events/misc/admincommand.js index 37e60c1..54f19ee 100644 --- a/events/misc/admincommand.js +++ b/events/misc/admincommand.js @@ -1,24 +1,24 @@ -const { Events, ChannelType } = require('discord.js'); +const { Events, ChannelType, EmbedBuilder, Colors } = require("discord.js"); const admin = require("../../admin.json"); -const { EmbedBuilder, Colors } = require("discord.js"); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const quotation = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("単語削除にダブルクォーテーションがは使えません。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const size_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("合わせて20文字以内になるようにしてください。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); + module.exports = { name: Events.MessageCreate, async execute(message) { @@ -41,7 +41,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`global辞書を更新しました!\n単語:${before}\n読み:${after}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | admincommand" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | admincommand" }) .setColor(Colors.Green); await message.channel.send({ embeds: [success] }); }; @@ -56,7 +56,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`辞書を削除しました!\n単語:${delete_text}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | admincommand" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | admincommand" }) .setColor(Colors.Green); return message.channel.send({ embeds: [success] }); } diff --git a/events/misc/clear.js b/events/misc/clear.js deleted file mode 100644 index 2c8e6c3..0000000 --- a/events/misc/clear.js +++ /dev/null @@ -1,51 +0,0 @@ -const { Events, EmbedBuilder, Colors } = require('discord.js'); -const cancel = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`キャンセルしました`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | clear" }) - .setColor(Colors.Green); -async function deleteMessages(channel, amount) { - let deleted = 0; - while (deleted < amount) { - const limit = Math.min(amount - deleted, 100); - const messages = await channel.messages.fetch({ limit: limit }); - if (messages.size === 0) { - break; - }; - await channel.bulkDelete(messages, true); - deleted += messages.size; - }; - return deleted; -}; -module.exports = { - name: Events.InteractionCreate, - async execute(interaction) { - if (!interaction.isButton()) return; - if (interaction.customId.startsWith("clear")) { - if (interaction.customId === "clearcancel") { - await interaction.update({ embeds: [cancel], components: [] }); - } else { - const message = Number(interaction.customId.split("clear")[1]); - if (message === 0) { - const cloned = await interaction.channel.clone(); - await cloned.setPosition(interaction.channel.position); - await interaction.channel.delete(); - const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`すべてのメッセージを削除しました`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | clear" }) - .setColor(Colors.Green); - await cloned.send({ embeds: [success] }).then(msg => setTimeout(() => msg.delete(), 3 * 1000)); - } else { - const size = await deleteMessages(interaction.channel, message); - const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`${size}件のメッセージを削除しました`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | clear" }) - .setColor(Colors.Green); - await interaction.channel.send({ embeds: [success] }).then(i => setTimeout(async () => await i.delete(), 3000)) - }; - }; - }; - } -} \ No newline at end of file diff --git a/events/misc/genshin_modal.js b/events/misc/genshin_modal.js index f381ede..7e6da57 100644 --- a/events/misc/genshin_modal.js +++ b/events/misc/genshin_modal.js @@ -1,5 +1,5 @@ const { EmbedBuilder, Colors, ActionRowBuilder, StringSelectMenuBuilder, ButtonStyle, ButtonBuilder,Events } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const { EnkaClient } = require("enka-network-api"); @@ -13,13 +13,13 @@ const delete_button = new ActionRowBuilder() .setStyle(ButtonStyle.Danger), ); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | genshin" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }); const wait = new EmbedBuilder() .setTitle(`処理中...`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | genshin" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); module.exports = { name: Events.InteractionCreate, @@ -59,7 +59,7 @@ module.exports = { .setDescription(`${user.enkaProfile?.bio || "自己紹介なし"}\n**螺旋**\n${user?.abyssFloor || "取得失敗"}層 ${user?.abyssChamber || "取得失敗"}間\n**アチーブメント数**\n${user.achievements || "取得失敗"}`) .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) .setImage(`https://enka.network/ui/${user.profileCard.pictures[1].name}.png`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | genshin" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); await interaction.editReply({ embeds: [success], components: [type, characters, delete_button] }); } diff --git a/events/misc/genshin_select.js b/events/misc/genshin_select.js index 999392a..b4fab04 100644 --- a/events/misc/genshin_select.js +++ b/events/misc/genshin_select.js @@ -13,7 +13,7 @@ const delete_button = new ActionRowBuilder() ); const wait = new EmbedBuilder() .setTitle(`処理中...`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | genshin" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); const math = { "ATTACK": "[攻撃%] + [会心率*2] + [会心ダメージ]", diff --git a/events/misc/guildbanadd.js b/events/misc/guildbanadd.js index 34b7f15..028ca90 100644 --- a/events/misc/guildbanadd.js +++ b/events/misc/guildbanadd.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -13,7 +13,7 @@ module.exports = { .setTitle("✅BAN") .setDescription(`${member.user || member.user?.tag}がBANされました`) .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | BANadd" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | BANadd" }); await channel.send({ embeds: [Embed] }); } catch (error) { await sql(`DELETE FROM log_channel WHERE guildid = ${escape(member.guild.id)};`); diff --git a/events/misc/guildbanremove.js b/events/misc/guildbanremove.js index 0d0c2ac..3607896 100644 --- a/events/misc/guildbanremove.js +++ b/events/misc/guildbanremove.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -13,7 +13,7 @@ module.exports = { .setTitle("✅BAN解除") .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | BANremove" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | BANremove" }); await channel.send({ embeds: [Embed] }); } catch (error) { await sql(`DELETE FROM log_channel WHERE guildid = ${escape(member.guild.id)};`); diff --git a/events/misc/job_reaction_add.js b/events/misc/job_reaction_add.js index fc5935a..1b19bc8 100644 --- a/events/misc/job_reaction_add.js +++ b/events/misc/job_reaction_add.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -22,7 +22,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`ロールを付与しました。\n付与ロール:${role}\n対象ユーザー:${member}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const msg = await react.message.channel.send({ embeds: [success] }); setTimeout(async () => await msg.delete(), 3 * 1000); @@ -31,7 +31,7 @@ module.exports = { const faild = new EmbedBuilder() .setTitle(`注意`) .setDescription(`ロールの付与に失敗しました。\n付与ロール:${role}\n対象ユーザー:${member}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const msg = await react.message.channel.send({ embeds: [faild] }); setTimeout(async () => await msg.delete(), 3 * 1000); diff --git a/events/misc/job_reaction_remove.js b/events/misc/job_reaction_remove.js index c573906..f06d0b4 100644 --- a/events/misc/job_reaction_remove.js +++ b/events/misc/job_reaction_remove.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -20,7 +20,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription(`ロールを削除しました。\n削除ロール:${role}\n対象ユーザー:${member}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const msg = await react.message.channel.send({ embeds: [success] }); setTimeout(async () => await msg.delete(), 3 * 1000); @@ -29,7 +29,7 @@ module.exports = { const faild = new EmbedBuilder() .setTitle(`注意`) .setDescription(`ロールの削除に失敗しました。\n削除ロール:${role}\n対象ユーザー:${member}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) .setColor(Colors.Green); const msg = await react.message.channel.send({ embeds: [faild] }); setTimeout(async () => await msg.delete(), 3 * 1000); diff --git a/events/misc/messageDelete.js b/events/misc/messageDelete.js index a1d0135..edc2802 100644 --- a/events/misc/messageDelete.js +++ b/events/misc/messageDelete.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -14,7 +14,7 @@ module.exports = { .setTitle("✅メッセージの削除") .setDescription(`メッセージユーザー:${message.author || message.author.tag}\n**対象チャンネル**${message.channel}**\n削除したメッセージ**\n${message.content}`) .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | messagedelete" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | messagedelete" }); await channel.send({ embeds: [Embed] }); } catch (error) { await sql(`DELETE FROM log_channel WHERE guildid = ${escape(message.guild.id)};`); diff --git a/events/misc/messageUpdate.js b/events/misc/messageUpdate.js index f098316..26a9394 100644 --- a/events/misc/messageUpdate.js +++ b/events/misc/messageUpdate.js @@ -1,5 +1,5 @@ const { Events, EmbedBuilder, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { @@ -14,7 +14,7 @@ module.exports = { .setTitle("✅メッセージの編集") .setDescription(`メッセージユーザー:${oldMessage.author || oldMessage.author.tag}\n**対象チャンネル**:${newMessage.channel}\n**編集前のメッセージ**\n${oldMessage.content}\n**編集後のメッセージ**\n${newMessage.content}`) .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | messageUpdate" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | messageUpdate" }); await channel.send({ embeds: [Embed] }); } catch (error) { await sql(`DELETE FROM log_channel WHERE guildid = ${escape(oldMessage.guild.id)};`); diff --git a/events/misc/poll.js b/events/misc/poll.js index 6a02ae6..af73ee5 100644 --- a/events/misc/poll.js +++ b/events/misc/poll.js @@ -1,23 +1,22 @@ -const { Events } = require('discord.js'); +const { Events } = require("discord.js"); +const { getEmbedName } = require("../../libs"); module.exports = { name: Events.MessageReactionAdd, - async execute(react, user) { - const react_channel = await react.message.guild.channels.fetch(react.message.channel.id); - const react_message = await react_channel.messages.fetch(react.message.id); - if (react_message.author.id !== process.env.clientId) return; - if (!react_message.embeds) return; - if (user.id === process.env.clientId) return; - const reaction = react_message.reactions.cache.get(react._emoji.name); - if (react_message.embeds[0]?.data?.footer?.text === "©️ 2023 KURONEKOSERVER | poll") { - if (!reaction) return await react.remove(); - if (!reaction.me) return await react.remove(); - }; - if (react_message.embeds[0]?.data?.footer?.text === "©️ 2023 KURONEKOSERVER | expoll") { - if (!reaction) return await react.remove(); - if (!reaction.me) return await react.remove(); - const reactions = react_message.reactions.cache.filter(r => r.users.cache.has(user.id)); - if (reactions.size > 1) return await react.users.remove(user.id); - }; + async execute(react, user, Log) { + const { client, message, emoji, users } = react; + if ( + message.author.id !== client.user.id || + user.id === client.user.id || + !message.embeds?.length + ) return; + const name = getEmbedName(message.embeds[0]) ?? ""; + if (!name.startsWith("poll")) return; + const reactions = message.reactions.cache; + const maxCount = name.slice(0, 4); + if (!reactions.has(emoji.name)) return react.remove(); + if (maxCount === "") return; + const reacted = reactions.filter(reaction => reaction.users.cache.has(user.id)); + if (reacted.size > maxCount) return await users.remove(); } } \ No newline at end of file diff --git a/events/misc/ready.js b/events/misc/ready.js index f59fe6d..c282ed6 100644 --- a/events/misc/ready.js +++ b/events/misc/ready.js @@ -1,5 +1,4 @@ -const { Events, ActivityType } = require('discord.js'); -const chalk = require('chalk'); +const { Events, ActivityType } = require("discord.js"); module.exports = { name: Events.ClientReady, diff --git a/events/misc/report.js b/events/misc/report.js index 5a2ac5c..6a1da73 100644 --- a/events/misc/report.js +++ b/events/misc/report.js @@ -5,7 +5,7 @@ const embed = new EmbedBuilder() .setDescription("レポートが送信されました") .setColor(Colors.Green) .setTimestamp(new Date()) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | status" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | status" }); module.exports = { name: Events.InteractionCreate, async execute(interaction) { diff --git a/events/misc/select_job.js b/events/misc/select_job.js index e63e864..e57ba1e 100644 --- a/events/misc/select_job.js +++ b/events/misc/select_job.js @@ -1,29 +1,29 @@ const { Events, Colors, EmbedBuilder } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルの選択更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const undefined_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("パネルを検知できませんでした。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); const success = new EmbedBuilder() .setTitle("✅成功") .setDescription("パネルを選択しました!") .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | jobpanel" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }); module.exports = { name: Events.InteractionCreate, async execute(interaction) { if (interaction.commandName === "パネルを選択") { const msg = await interaction.channel.messages.fetch(interaction.targetId); if (msg.author.id === interaction.client.user.id) { - if (msg.embeds[0]?.data.footer.text === "©️ 2023 KURONEKOSERVER | jobpanel") { + if (msg.embeds[0]?.data.footer.text === "© 2023 KURONEKOSERVER | jobpanel") { const getdata = await sql(`select * from job_message where guildid=${escape(interaction.guild.id)};`); if (getdata[0][0]?.guildid) { const set = await sql(`update job_message set messageid=${escape(msg.id)},channelid=${escape(msg.channel.id)} where guildid=${escape(interaction.guild.id)};`); diff --git a/events/misc/setvoice.js b/events/misc/setvoice.js index 7016e58..936263c 100644 --- a/events/misc/setvoice.js +++ b/events/misc/setvoice.js @@ -1,17 +1,17 @@ const { Events, Colors, EmbedBuilder } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const success = new EmbedBuilder() .setTitle(`✅完了`) .setDescription("ボイスがセットされました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) .setColor(Colors.Green); const db_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("データ更新に失敗しました。") .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | speak" }); + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); const db_set = async (data, interaction) => { //サーバー設定か(配列の3番目に値がある場合はサーバー設定[IDが格納]) if (data[3]) { diff --git a/events/misc/slashcommand.js b/events/misc/slashcommand.js index c2eb4f1..de39036 100644 --- a/events/misc/slashcommand.js +++ b/events/misc/slashcommand.js @@ -21,8 +21,8 @@ module.exports = { } catch (error) { command.logger.error(`${error.message}\n${error.stack}`); const embed = new EmbedBuilder() - .setTitle("⚠️エラー") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | SlashCommand" }) + .setTitle("⚠エラー") + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | SlashCommand" }) .setColor(Colors.Red); if (error.message === "Missing Permissions") { embed.setDescription("権限が足りません。\nBOTに権限を与えてください") diff --git a/events/misc/speakmessage.js b/events/misc/speakmessage.js index 515c10b..f4701e0 100644 --- a/events/misc/speakmessage.js +++ b/events/misc/speakmessage.js @@ -1,5 +1,5 @@ const { Events, ChannelType } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") const { read } = require("../../helpers/read"); diff --git a/events/misc/ticket.js b/events/misc/ticket.js index 9162a01..248a02d 100644 --- a/events/misc/ticket.js +++ b/events/misc/ticket.js @@ -1,5 +1,5 @@ const { Events, Colors, PermissionsBitField, ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); -const { ticket_timer, sql } = require("../../helpers/utils"); +const { ticket_timer, sql } = require("../../libs/Utils"); const { escape } = require("mysql2") /* @@ -8,27 +8,27 @@ const { escape } = require("mysql2") const wait_embed = new EmbedBuilder() .setTitle("お問い合わせ") .setDescription("スタッフが来るまでお待ちください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Green); const cancel_embed = new EmbedBuilder() .setTitle("Ticket") .setDescription("チケットの削除がキャンセルされました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Green); const confirmation_embed = new EmbedBuilder() .setTitle("Ticket") .setDescription("5秒後にチケットが削除されます。\nキャンセルするには下記のキャンセルボタンを押してください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Red); const permissions_embed = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription("権限が足りません。\nBOTに権限を与えてください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Red); const sql_embed = new EmbedBuilder() .setTitle("✅成功") .setDescription("データベースからTicket情報を削除しました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Green); /* button @@ -83,7 +83,7 @@ module.exports = { const create_embed = new EmbedBuilder() .setTitle("チケットが作成されました") .setDescription(`チャンネル:${new_channel.name}\nユーザー:${interaction.user}\n日時:${new Date()}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Green); const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); if (getdata[0][0]?.guildid) await (await interaction.guild.channels.fetch(getdata[0][0].channelid)).send({ embeds: [create_embed] }); @@ -108,9 +108,9 @@ module.exports = { }; } catch (error) { const other_error = new EmbedBuilder() - .setTitle("⚠️エラー") + .setTitle("⚠エラー") .setDescription(`不明なエラー:${error}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "©️ 2023 KURONEKOSERVER | ticket" }) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) .setColor(Colors.Red); if (error.message === "Missing Permissions") return await interaction.reply({ embeds: [permissions_embed], ephemeral: true }).catch(() => { }); await interaction.reply({ embeds: [other_error], ephemeral: true }).catch(() => { }); diff --git a/events/misc/voiceautojoin.js b/events/misc/voiceautojoin.js index 400af31..bc2b2a4 100644 --- a/events/misc/voiceautojoin.js +++ b/events/misc/voiceautojoin.js @@ -1,6 +1,6 @@ const { Events } = require('discord.js'); const { getVoiceConnection, joinVoiceChannel } = require('@discordjs/voice'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); const { escape } = require("mysql2") module.exports = { diff --git a/events/misc/voicemember.js b/events/misc/voicemember.js index dd8fb6a..d865ae3 100644 --- a/events/misc/voicemember.js +++ b/events/misc/voicemember.js @@ -1,5 +1,5 @@ const { Events } = require('discord.js'); -const { sql } = require("../../helpers/utils"); +const { sql } = require("../../libs/Utils"); //読み上げ const { read } = require("../../helpers/read"); const { escape } = require("mysql2") diff --git a/helpers/permissions.js b/helpers/permissions.js deleted file mode 100644 index 1bbd74d..0000000 --- a/helpers/permissions.js +++ /dev/null @@ -1,90 +0,0 @@ -//MikanBot Discord Utilities -//Licenced to KuronekoServer under the MIT License -//© 2023 MikanDev All Rights Reserved - -module.exports = { - AddReactions: "Add Reactions", - Administrator: "Administrator", - AttachFiles: "Attach files", - BanMembers: "Ban members", - ChangeNickname: "Change nickname", - Connect: "Connect", - CreateInstantInvite: "Create instant invite", - CreatePrivateThreads: "Create private threads", - CreatePublicThreads: "Create public threads", - DeafenMembers: "Deafen members", - EmbedLinks: "Embed links", - KickMembers: "Kick members", - ManageChannels: "Manage channels", - ManageEmojisAndStickers: "Manage emojis and stickers", - ManageEvents: "Manage Events", - ManageGuild: "Manage server", - ManageMessages: "Manage messages", - ManageNicknames: "Manage nicknames", - ManageRoles: "Manage roles", - ManageThreads: "Manage Threads", - ManageWebhooks: "Manage webhooks", - MentionEveryone: "Mention everyone", - ModerateMembers: "Moderate Members", - MoveMembers: "Move members", - MuteMembers: "Mute members", - PrioritySpeaker: "Priority speaker", - ReadMessageHistory: "Read message history", - RequestToSpeak: "Request to Speak", - SendMessages: "Send messages", - SendMessagesInThreads: "Send Messages In Threads", - SendTTSMessages: "Send TTS messages", - Speak: "Speak", - Stream: "Video", - UseApplicationCommands: "Use Application Commands", - UseEmbeddedActivities: "Use Embedded Activities", - UseExternalEmojis: "Use External Emojis", - UseExternalStickers: "Use External Stickers", - UseVAD: "Use voice activity", - ViewAuditLog: "View audit log", - ViewChannel: "View channel", - ViewGuildInsights: "View server insights", - ja: { - AddReactions: "リアクションの追加", - Administrator: "管理者", - AttachFiles: "ファイルを添付", - BanMembers: "メンバーをBAN", - ChangeNickname: "ニックネームの変更", - Connect: "接続", - CreateInstantInvite: "招待を作成", - CreatePrivateThreads: "プライベートスレッドの作成", - CreatePublicThreads: "公開スレッドの作成", - DeafenMembers: "メンバーのスピーカーをミュート", - EmbedLinks: "埋め込みリンク", - KickMembers: "メンバーをキック", - ManageChannels: "チャンネルの管理", - ManageEmojisAndStickers: "絵文字・スタンプの管理", - ManageEvents: "イベントの管理", - ManageGuild: "サーバーの管理", - ManageMessages: "メッセージの管理", - ManageNicknames: "ニックネームの管理", - ManageRoles: "ロールの管理", - ManageThreads: "スレッドの管理", - ManageWebhooks: "ウェブフックの管理", - MentionEveryone: "@everyone、@here、すべてのロールにメンション", - ModerateMembers: "メンバーの管理", - MoveMembers: "メンバーを移動", - MuteMembers: "メンバーをミュート", - PrioritySpeaker: "優先スピーカー", - ReadMessageHistory: "メッセージ履歴を読む", - RequestToSpeak: "音声検出を使用", - SendMessages: "メッセージを送信", - SendMessagesInThreads: "スレッドでメッセージを送信", - SendTTSMessages: "Send TTS messages", - Speak: "発言", - Stream: "WEBカメラ", - UseApplicationCommands: "アプリコマンドを使う", - UseEmbeddedActivities: "Use Embedded Activities", - UseExternalEmojis: "外部絵文字を使用する", - UseExternalStickers: "外部スタンプを使用する", - UseVAD: "ユーザーアクティビティ", - ViewAuditLog: "監視ログを表示", - ViewChannel: "チャンネルを見る", - ViewGuildInsights: "View server insights", - } -}; \ No newline at end of file diff --git a/helpers/read.js b/helpers/read.js index 73a554f..f5664b2 100644 --- a/helpers/read.js +++ b/helpers/read.js @@ -1,5 +1,5 @@ const http = require('http'); -const { sql } = require("./utils"); +const { sql } = require("../libs/Utils"); const { escape } = require("mysql2") const { createAudioPlayer, createAudioResource, getVoiceConnection, AudioPlayerStatus } = require('@discordjs/voice'); const fs = require("node:fs"); diff --git a/helpers/utils.js b/helpers/utils.js deleted file mode 100644 index 2d8ee59..0000000 --- a/helpers/utils.js +++ /dev/null @@ -1,224 +0,0 @@ -//MikanBot Discord Utilities -//Licenced to KuronekoServer under the MIT -//© 2023 MikanDev All Rights Reserved -const { Colors, EmbedBuilder } = require('discord.js'); -const Client = require('ftp'); -const ftp = new Client(); -const tmp = new Set(); -const { COLORS } = require("../data.json"); -const { escape } = require("mysql2") -const { readdirSync, lstatSync } = require("node:fs"); -const { join, extname } = require("node:path"); -const permissions = require("./permissions"); -const discordTranscripts = require('discord-html-transcripts'); -const chalk = require('chalk'); -const { send } = require("../helpers/sendwebhook"); -const ftp_option = { host: process.env.core_host, port: process.env.core_port, user: process.env.core_account, password: process.env.core_password } -const mysql = require('mysql2/promise'); - -ftp.on("error", (e) => { - send({ title: "ftpエラー", description: `${e}`, time: new Date(), color: Colors.Purple }) - ftp.connect(ftp_option); - console.log(chalk.red("[注意]"), `FTPの非常自動再接続しました。\n${e}`); -}) -module.exports = class Utils { - /** - * Checks if a string contains a URL - * @param {string} text - */ - static containsLink(text) { - return /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/.test( - text - ); - } - - /** - * Checks if a string is a valid discord invite - * @param {string} text - */ - static containsDiscordInvite(text) { - return /(https?:\/\/)?(www.)?(discord.(gg|io|me|li|link|plus)|discorda?p?p?.com\/invite|invite.gg|dsc.gg|urlcord.cf)\/[^\s/]+?(?=\b)/.test( - text - ); - } - - /** - * Returns a random number below a max - * @param {number} max - */ - static getRandomInt(max) { - return Math.floor(Math.random() * max); - } - - /** - * Checks if a string is a valid Hex color - * @param {string} text - */ - static isHex(text) { - return /^#[0-9A-F]{6}$/i.test(text); - } - - /** - * Checks if a string is a valid Hex color - * @param {string} text - */ - static isValidColor(text) { - if (COLORS.indexOf(text) > -1) { - return true; - } else return false; - } - - /** - * Returns hour difference between two dates - * @param {Date} dt2 - * @param {Date} dt1 - */ - static diffHours(dt2, dt1) { - let diff = (dt2.getTime() - dt1.getTime()) / 1000; - diff /= 60 * 60; - return Math.abs(Math.round(diff)); - } - - /** - * Returns remaining time in days, hours, minutes and seconds - * @param {number} timeInSeconds - */ - static timeformat(timeInSeconds) { - const days = Math.floor((timeInSeconds % 31536000) / 86400); - const hours = Math.floor((timeInSeconds % 86400) / 3600); - const minutes = Math.floor((timeInSeconds % 3600) / 60); - const seconds = Math.round(timeInSeconds % 60); - return ( - (days > 0 ? `${days} days, ` : "") + - (hours > 0 ? `${hours} hours, ` : "") + - (minutes > 0 ? `${minutes} minutes, ` : "") + - (seconds > 0 ? `${seconds} seconds` : "") - ); - } - - /** - * Converts duration to milliseconds - * @param {string} duration - */ - static durationToMillis(duration) { - return ( - duration - .split(":") - .map(Number) - .reduce((acc, curr) => curr + acc * 60) * 1000 - ); - } - - /** - * Returns time remaining until provided date - * @param {Date} timeUntil - */ - static getRemainingTime(timeUntil) { - const seconds = Math.abs((timeUntil - new Date()) / 1000); - const time = Utils.timeformat(seconds); - return time; - } - - /** - * @param {import("discord.js").PermissionResolvable[]} perms - */ - static parsePermissions(perms) { - const permissionWord = `permission${perms.length > 1 ? "s" : ""}`; - return "`" + perms.map((perm) => permissions[perm]).join(", ") + "` " + permissionWord; - } - - /** - * Recursively searches for a file in a directory - * @param {string} dir - * @param {string[]} allowedExtensions - */ - static recursiveReadDirSync(dir, allowedExtensions = [".js"]) { - const filePaths = []; - const readCommands = (dir) => { - const files = readdirSync(join(process.cwd(), dir)); - files.forEach((file) => { - const stat = lstatSync(join(process.cwd(), dir, file)); - if (stat.isDirectory()) { - readCommands(join(dir, file)); - } else { - const extension = extname(file); - if (!allowedExtensions.includes(extension)) return; - const filePath = join(process.cwd(), dir, file); - filePaths.push(filePath); - } - }); - }; - readCommands(dir); - return filePaths; - } - - /** - * SQLコマンドを使用する - * @param {string} command - SQLコマンドの文字列 - * @example - * const command = "CREATE TABLE table_name (id int, name varchar(10), address varchar(10));" - * @returns {any} - 出力データ - */ - static async sql(command) { - try { - const connection = await mysql.createConnection({ - host: process.env.db_host, - user: process.env.db_user, - password: process.env.db_password, - database: process.env.db_name, - port: process.env.db_port, - }); - const result = await connection.query(command); - await connection.end(); - return result; - } catch (ex) { - send({ title: "mariadbエラー", description: `${ex}`, time: new Date(), color: Colors.Yellow }) - console.error(chalk.red("[警告]"), "SQLでエラーが発生しました。"); - console.error("エラー内容:", ex); - }; - }; - /** - * タイマーチケット - * @param {string} interactiondata.action - アクション - * @param {"delete"|"cancel"} interactiondata.type - タイプ - * @returns {undefined} - */ - static async ticket_timer(data) { - if (data.type === "delete") setTimeout(async () => { - if (tmp.has(data.action.channel.id)) return tmp.delete(data.action.channel.id); - const attachment = await discordTranscripts.createTranscript(data.action.channel, { - limit: -1, - returnType: 'buffer', - saveImages: true, - footerText: "Exported {number} message{s}", - poweredBy: false - }); - const date = new Date(); - ftp.connect(ftp_option); - ftp.on("ready", async () => { - ftp.put(attachment, `./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`, (err) => { - if (err?.message?.includes("No such file or directory")) { - ftp.mkdir(`./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`, (err) => { }); - ftp.put(attachment, `./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`, (err) => { }); - }; - }); - const create_embed = new EmbedBuilder() - .setTitle("チケットが削除されました") - .setDescription(`チャンネル:${data.action.channel.name}\nユーザー:${data.action.user}\n日時:${new Date()}\n詳細:https://kuronekobot.kuroneko6423.com/${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`) - .setColor(Colors.Green); - await data.action.channel.delete().catch(() => { }); - const getdata = await sql(`select * from ticket_channel where guildid=${escape(data.action.guild.id)};`); - if (getdata[0][0]?.guildid) { - try { - const channel = await data.action.guild.channels.fetch(getdata[0][0].channelid) - await channel.send({ embeds: [create_embed] }); - } catch (error) { - await sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(data.action.guild.id)};`); - } - } - await data.action.user.send({ embeds: [create_embed] }).catch(() => { }); - }) - }, 5 * 1000); - if (data.type === "cancel") return tmp.add(data.action.channel.id); - }; -}; \ No newline at end of file diff --git a/index.js b/index.js index 03f171d..c2b85ac 100644 --- a/index.js +++ b/index.js @@ -1,12 +1,11 @@ - -const { Client, GatewayIntentBits, Partials, WebhookClient } = require("discord.js"); +const { Client, GatewayIntentBits, Partials } = require("discord.js"); const { EnkaClient } = require("enka-network-api"); const path = require("path"); const axios = require("axios"); const chalk = require("chalk"); const { - Logger, + GetLogger: logger, EventHandler, SlashCommandHandler } = require("./libs"); @@ -19,56 +18,10 @@ const client = new Client({ rest: 60000 }); -const errorWebhook = new WebhookClient({ url: process.env.errorwebhook }); -const logQueue = ["接続しました。"]; -setInterval(() => { - if (logQueue.length === 0) return; - let data = logQueue.shift(); - if (data.length > 2000) { - logQueue.unshift(data.slice(2000)); - data = data.slice(0, 2000); - } else { - for (let i = 0;logQueue.length > 0;i++) { - if (data.length + logQueue[0].length > 1999) break; - data += "\n" + logQueue.shift(); - } - } - errorWebhook.send(data).catch((error) => { console.error(error) }); -}, 1000); -const logger = new Logger({ - levels: ["info", "warn", "error", "debug"], - writeLog(data) { - let { lines, level: _level, time, location } = data; - const errors = lines.filter(line => line instanceof Error); - if (errors.length > 0) { - const lineStr = errors - .map(error => error.message + "\n" + error.stack) - .join("\n"); - lines = [ "\n" + lineStr ]; - } - let level = `[${_level}]`; - logQueue.push(`[${time}][${location.join("][")}] ${level} ${lines}`); - switch (_level) { - case "INFO": - break; - case "WARN": - level = chalk.magenta(level); - break; - case "ERROR": - level = chalk.red(level); - break; - case "DEBUG": - level = chalk.yellow(level); - break; - } - console.log(`[${time}][${location.join("][")}] ${level} ${lines}`); - } -}); const Log = logger.createChannel("main"); -client.logger = logger; EventHandler(client, path.resolve(__dirname, "./events")); -client.commands = SlashCommandHandler(client, path.resolve(__dirname, "./commands")); +client.commands = SlashCommandHandler(path.resolve(__dirname, "./commands")); globalThis.voice_channel = []; globalThis.ylivechat = {}; @@ -76,13 +29,14 @@ globalThis.tlivechat = {}; const enka = new EnkaClient({ showFetchCacheLog: true }); +//死活監視 setInterval(() => { axios.get(process.env.URL) .then(response => { - Log.info(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); + console.log(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); }) .catch(error => { - Log.warn(`[GETリクエスト] ${error.config.url} - ${error.message}`) + console.log(chalk.red(`[GETリクエスト] ${error.config.url} - ${error.message}`)) }); }, 10 * 1000); @@ -90,4 +44,4 @@ process.on("uncaughtException", (error) => { Log.error(error) }); -client.login(process.env.TOKEN); +client.login(process.env.TOKEN); \ No newline at end of file diff --git a/libs/EmbedUtil.js b/libs/EmbedUtil.js new file mode 100644 index 0000000..f3bea4c --- /dev/null +++ b/libs/EmbedUtil.js @@ -0,0 +1,64 @@ +const { Colors, EmbedBuilder } = require("discord.js"); + +const footerCR = "© 2023 KURONEKOSERVER"; + +class CustomEmbed extends EmbedBuilder { + constructor(name) { + super(); + this.setFooter({ + iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", + text: footerCR + (name ? ` | ${name}` : "") + }); + } + typeSuccess() { + this.setTitle("✅成功"); + this.setColor(Colors.Green); + return this; + } + typeError() { + this.setTitle("⚠エラー"); + this.setColor(Colors.Red); + return this; + } +} + +function getEmbedName(embed) { + const footer = embed.footer; + if (!footer) return null; + if (!footer.startWith(footerCR + " | ")) return null; + return footer.slice(footerCR.length + 3); +} + +const ColorsChoice = [ + { name: "赤色", value: "Red" }, + { name: "白色", value: "White" }, + { name: "水色", value: "Aqua" }, + { name: "緑色", value: "Green" }, + { name: "青色", value: "Blue" }, + { name: "黄色", value: "Yellow" }, + { name: "蛍光ピンク色", value: "LuminousVividPink" }, + { name: "紫色", value: "Purple" }, + { name: "赤紫色", value: "Fuchsia" }, + { name: "金色", value: "Gold" }, + { name: "オレンジ色", value: "Orange" }, + { name: "灰色", value: "Grey" }, + { name: "濃紺色", value: "Navy" }, + { name: "濃い水色", value: "DarkAqua" }, + { name: "濃い緑色", value: "DarkGreen" }, + { name: "濃い青色", value: "DarkBlue" }, + { name: "濃い紫色", value: "DarkPurple" }, + { name: "濃い蛍光ピンク色", value: "DarkVividPink" }, + { name: "濃い金色", value: "DarkGold" }, + { name: "濃いオレンジ色", value: "DarkOrange" }, + { name: "濃い赤色", value: "DarkRed" }, + { name: "濃い灰色", value: "DarkGrey" }, + { name: "明るい灰色", value: "LightGrey" }, + { name: "濃い紺色", value: "DarkNavy" }, + { name: "青紫色", value: "Blurple" } +]; + +module.exports = { + CustomEmbed, + getEmbedName, + ColorsChoice +}; \ No newline at end of file diff --git a/libs/EventHandler.js b/libs/EventHandler.js index c2a0f9e..3f186a6 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -1,8 +1,9 @@ const fs = require("fs"); const path = require("path"); +const logger = require("./GetLogger"); function EventHandler(client, eventsPath) { - const Log = client.logger.createChannel("event"); + const Log = logger.createChannel("event"); Log.debug("Loading..."); const events = []; fs.readdirSync(eventsPath).forEach((dir) => { diff --git a/libs/GetLogger.js b/libs/GetLogger.js new file mode 100644 index 0000000..d68dd1b --- /dev/null +++ b/libs/GetLogger.js @@ -0,0 +1,53 @@ +const { WebhookClient } = require("discord.js"); +const chalk = require("chalk"); +const Logger = require("./Logger"); +require("dotenv").config(); + +const errorWebhook = new WebhookClient({ url: process.env.errorwebhook }); +const logQueue = ["接続しました。"]; +setInterval(() => { + if (logQueue.length === 0) return; + let data = logQueue.shift(); + if (data.length > 2000) { + logQueue.unshift(data.slice(2000)); + data = data.slice(0, 2000); + } else { + for (let i = 0;logQueue.length > 0;i++) { + if (data.length + logQueue[0].length > 1999) break; + data += "\n" + logQueue.shift(); + } + } + errorWebhook.send(data).catch((error) => { console.error(error) }); +}, 1000); + +const logger = new Logger({ + levels: ["info", "warn", "error", "debug"], + writeLog(data) { + let { lines, level: _level, time, location } = data; + const errors = lines.filter(line => line instanceof Error); + if (errors.length > 0) { + const lineStr = errors + .map(error => error.message + "\n" + error.stack) + .join("\n"); + lines = [ "\n" + lineStr ]; + } + let level = `[${_level}]`; + logQueue.push(`[${time}][${location.join("][")}] ${level} ${lines}`); + switch (_level) { + case "INFO": + break; + case "WARN": + level = chalk.magenta(level); + break; + case "ERROR": + level = chalk.red(level); + break; + case "DEBUG": + level = chalk.yellow(level); + break; + } + console.log(`[${time}][${location.join("][")}] ${level} ${lines}`); + } +}); + +module.exports = logger; \ No newline at end of file diff --git a/libs/Permissions.js b/libs/Permissions.js new file mode 100644 index 0000000..331131a --- /dev/null +++ b/libs/Permissions.js @@ -0,0 +1,90 @@ +//MikanBot Discord Utilities +//Licenced to KuronekoServer under the MIT License +//© 2023 MikanDev All Rights Reserved + +module.exports = { + AddReactions: "Add Reactions", + Administrator: "Administrator", + AttachFiles: "Attach files", + BanMembers: "Ban members", + ChangeNickname: "Change nickname", + Connect: "Connect", + CreateInstantInvite: "Create instant invite", + CreatePrivateThreads: "Create private threads", + CreatePublicThreads: "Create public threads", + DeafenMembers: "Deafen members", + EmbedLinks: "Embed links", + KickMembers: "Kick members", + ManageChannels: "Manage channels", + ManageEmojisAndStickers: "Manage emojis and stickers", + ManageEvents: "Manage Events", + ManageGuild: "Manage server", + ManageMessages: "Manage messages", + ManageNicknames: "Manage nicknames", + ManageRoles: "Manage roles", + ManageThreads: "Manage Threads", + ManageWebhooks: "Manage webhooks", + MentionEveryone: "Mention everyone", + ModerateMembers: "Moderate Members", + MoveMembers: "Move members", + MuteMembers: "Mute members", + PrioritySpeaker: "Priority speaker", + ReadMessageHistory: "Read message history", + RequestToSpeak: "Request to Speak", + SendMessages: "Send messages", + SendMessagesInThreads: "Send Messages In Threads", + SendTTSMessages: "Send TTS messages", + Speak: "Speak", + Stream: "Video", + UseApplicationCommands: "Use Application Commands", + UseEmbeddedActivities: "Use Embedded Activities", + UseExternalEmojis: "Use External Emojis", + UseExternalStickers: "Use External Stickers", + UseVAD: "Use voice activity", + ViewAuditLog: "View audit log", + ViewChannel: "View channel", + ViewGuildInsights: "View server insights", + ja: { + AddReactions: "リアクションの追加", + Administrator: "管理者", + AttachFiles: "ファイルを添付", + BanMembers: "メンバーをBAN", + ChangeNickname: "ニックネームの変更", + Connect: "接続", + CreateInstantInvite: "招待を作成", + CreatePrivateThreads: "プライベートスレッドの作成", + CreatePublicThreads: "公開スレッドの作成", + DeafenMembers: "メンバーのスピーカーをミュート", + EmbedLinks: "埋め込みリンク", + KickMembers: "メンバーをキック", + ManageChannels: "チャンネルの管理", + ManageEmojisAndStickers: "絵文字・スタンプの管理", + ManageEvents: "イベントの管理", + ManageGuild: "サーバーの管理", + ManageMessages: "メッセージの管理", + ManageNicknames: "ニックネームの管理", + ManageRoles: "ロールの管理", + ManageThreads: "スレッドの管理", + ManageWebhooks: "ウェブフックの管理", + MentionEveryone: "@everyone、@here、すべてのロールにメンション", + ModerateMembers: "メンバーの管理", + MoveMembers: "メンバーを移動", + MuteMembers: "メンバーをミュート", + PrioritySpeaker: "優先スピーカー", + ReadMessageHistory: "メッセージ履歴を読む", + RequestToSpeak: "音声検出を使用", + SendMessages: "メッセージを送信", + SendMessagesInThreads: "スレッドでメッセージを送信", + SendTTSMessages: "Send TTS messages", + Speak: "発言", + Stream: "WEBカメラ", + UseApplicationCommands: "アプリコマンドを使う", + UseEmbeddedActivities: "Use Embedded Activities", + UseExternalEmojis: "外部絵文字を使用する", + UseExternalStickers: "外部スタンプを使用する", + UseVAD: "ユーザーアクティビティ", + ViewAuditLog: "監視ログを表示", + ViewChannel: "チャンネルを見る", + ViewGuildInsights: "View server insights", + } +}; \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index 3c205ba..43a2215 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -1,10 +1,11 @@ const { Collection, REST, Routes } = require("discord.js"); const fs = require("fs"); const path = require("path"); +const logger = require("./GetLogger"); const option = require("../helpers/optionslash.json"); -function SlashCommandHandler(client, commandsPath) { - const Log = client.logger.createChannel("command"); +function SlashCommandHandler(commandsPath) { + const Log = logger.createChannel("command"); Log.debug("Loading..."); const commands = new Collection(); fs.readdirSync(commandsPath).forEach((categoryDir) => { diff --git a/libs/Utils.js b/libs/Utils.js new file mode 100644 index 0000000..b40a64a --- /dev/null +++ b/libs/Utils.js @@ -0,0 +1,238 @@ +//MikanBot Discord Utilities +//Licenced to KuronekoServer under the MIT +//© 2023 MikanDev All Rights Reserved + +const { Colors, EmbedBuilder } = require("discord.js"); +const discordTranscripts = require("discord-html-transcripts"); +const fs = require("fs"); +const path = require("path"); +const ftpClient = require("ftp"); +const { escape } = require("mysql2"); +const mysql = require("mysql2/promise"); + +const { COLORS } = require("../data.json"); +const permissions = require("./Permissions"); + +const logger = require("./GetLogger"); +const Log = logger.createChannel("utils"); +const ftpLog = Log.createChild("ftp"); +const sqlLog = Log.createChild("sql"); + +const ftp = new ftpClient(); +const tmp = new Set(); +const ftp_option = { + host: process.env.core_host, + port: process.env.core_port, + user: process.env.core_account, + password: process.env.core_password +}; + +ftp.on("error", (error) => { + ftp.connect(ftp_option); + ftpLog.error("非常自動再接続しました。"); + ftpLog.error(error); +}); + +class Utils { + /** + * Checks if a string contains a URL + * @param {string} text + */ + static containsLink(text) { + return /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/.test( + text + ); + } + + /** + * Checks if a string is a valid discord invite + * @param {string} text + */ + static containsDiscordInvite(text) { + return /(https?:\/\/)?(www.)?(discord.(gg|io|me|li|link|plus)|discorda?p?p?.com\/invite|invite.gg|dsc.gg|urlcord.cf)\/[^\s/]+?(?=\b)/.test( + text + ); + } + + /** + * Returns a random number below a max + * @param {number} max + */ + static getRandomInt(max) { + return Math.floor(Math.random() * max); + } + + /** + * Checks if a string is a valid Hex color + * @param {string} text + */ + static isHex(text) { + return /^#[0-9A-F]{6}$/i.test(text); + } + + /** + * Checks if a string is a valid Hex color + * @param {string} text + */ + static isValidColor(text) { + if (COLORS.indexOf(text) > -1) { + return true; + } else return false; + } + + /** + * Returns hour difference between two dates + * @param {Date} dt2 + * @param {Date} dt1 + */ + static diffHours(dt2, dt1) { + let diff = (dt2.getTime() - dt1.getTime()) / 1000; + diff /= 60 * 60; + return Math.abs(Math.round(diff)); + } + + /** + * Returns remaining time in days, hours, minutes and seconds + * @param {number} timeInSeconds + */ + static timeformat(timeInSeconds) { + const days = Math.floor((timeInSeconds % 31536000) / 86400); + const hours = Math.floor((timeInSeconds % 86400) / 3600); + const minutes = Math.floor((timeInSeconds % 3600) / 60); + const seconds = Math.round(timeInSeconds % 60); + return ( + (days > 0 ? `${days} days, ` : "") + + (hours > 0 ? `${hours} hours, ` : "") + + (minutes > 0 ? `${minutes} minutes, ` : "") + + (seconds > 0 ? `${seconds} seconds` : "") + ); + } + + /** + * Converts duration to milliseconds + * @param {string} duration + */ + static durationToMillis(duration) { + return ( + duration + .split(":") + .map(Number) + .reduce((acc, curr) => curr + acc * 60) * 1000 + ); + } + + /** + * Returns time remaining until provided date + * @param {Date} timeUntil + */ + static getRemainingTime(timeUntil) { + const seconds = Math.abs((timeUntil - new Date()) / 1000); + const time = Utils.timeformat(seconds); + return time; + } + + /** + * @param {import("discord.js").PermissionResolvable[]} perms + */ + static parsePermissions(perms) { + const permissionWord = `permission${perms.length > 1 ? "s" : ""}`; + return "`" + perms.map((perm) => permissions[perm]).join(", ") + "` " + permissionWord; + } + + /** + * Recursively searches for a file in a directory + * @param {string} dir + * @param {string[]} allowedExtensions + */ + static recursiveReadDirSync(dir, allowedExtensions = [".js"]) { + const filePaths = []; + function readCommands(dir) { + const files = fs.readdirSync(path.join(process.cwd(), dir)); + files.forEach((file) => { + const stat = fs.lstatSync(path.join(process.cwd(), dir, file)); + if (stat.isDirectory()) { + readCommands(path.join(dir, file)); + } else { + const extension = path.extname(file); + if (!allowedExtensions.includes(extension)) return; + const filePath = path.join(process.cwd(), dir, file); + filePaths.push(filePath); + } + }); + } + readCommands(dir); + return filePaths; + } + + /** + * SQLコマンドを使用する + * @param {string} command - SQLコマンドの文字列 + * @example + * const command = "CREATE TABLE table_name (id int, name varchar(10), address varchar(10));" + * @returns {any} - 出力データ + */ + static async sql(command) { + try { + const connection = await mysql.createConnection({ + host: process.env.db_host, + user: process.env.db_user, + password: process.env.db_password, + database: process.env.db_name, + port: process.env.db_port, + }); + const result = await connection.query(command); + await connection.end(); + return result; + } catch (ex) { + sqlLog.error("SQLでエラーが発生しました。"); + sqlLog.error(ex); + } + } + + /** + * タイマーチケット + * @param {string} interactiondata.action - アクション + * @param {"delete"|"cancel"} interactiondata.type - タイプ + * @returns {undefined} + */ + static async ticket_timer(data) { + if (data.type === "delete") setTimeout(async () => { + if (tmp.has(data.action.channel.id)) return tmp.delete(data.action.channel.id); + const attachment = await discordTranscripts.createTranscript(data.action.channel, { + limit: -1, + returnType: "buffer", + saveImages: true, + footerText: "Exported {number} message{s}", + poweredBy: false + }); + const date = new Date(); + ftp.connect(ftp_option); + ftp.on("ready", async () => { + ftp.put(attachment, `./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`, (err) => { + if (err?.message?.includes("No such file or directory")) { + ftp.mkdir(`./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`, (err) => { }); + ftp.put(attachment, `./${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`, (err) => { }); + } + }); + const embed = new EmbedBuilder() + .setTitle("チケットが削除されました") + .setDescription(`チャンネル:${data.action.channel.name}\nユーザー:${data.action.user}\n日時:${new Date()}\n詳細:https://kuronekobot.kuroneko6423.com/${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}/${data.action.channel.id}.html`) + .setColor(Colors.Green); + await data.action.channel.delete().catch(() => { }); + const getdata = await sql(`select * from ticket_channel where guildid=${escape(data.action.guild.id)};`); + if (getdata[0][0]?.guildid) { + try { + const channel = await data.action.guild.channels.fetch(getdata[0][0].channelid) + await channel.send({ embeds: [embed] }); + } catch (error) { + await sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(data.action.guild.id)};`); + } + } + await data.action.user.send({ embeds: [embed] }).catch(() => { }); + }) + }, 5 * 1000); + if (data.type === "cancel") return tmp.add(data.action.channel.id); + }; +}; + +module.exports = Utils; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index fce9e7b..a80e884 100644 --- a/libs/index.js +++ b/libs/index.js @@ -1,5 +1,21 @@ +const Logger = require("./Logger"); +const GetLogger = require("./GetLogger"); +const EventHandler = require("./EventHandler"); +const SlashCommandHandler = require("./SlashCommandHandler"); +const Utils = require("./Utils"); +const Permissions = require("./Permissions"); +const EmbedUtil = require("./EmbedUtil"); +const { CustomEmbed, getEmbedName, ColorsChoice } = EmbedUtil; + module.exports = { - Logger: require("./Logger"), - EventHandler: require("./EventHandler"), - SlashCommandHandler: require("./SlashCommandHandler") + Logger, + GetLogger, + EventHandler, + SlashCommandHandler, + Utils, + Permissions, + EmbedUtil, + CustomEmbed, + getEmbedName, + ColorsChoice } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d03e41d..935cb7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "axios": "^1.3.4", "chalk": "^4.1.2", "discord-html-transcripts": "^3.1.3", - "discord.js": "^14.9.0", + "discord.js": "^14.11.0", "discord.js-pages": "^1.4.4", "dotenv": "^16.0.3", "edge": "^7.10.1", @@ -175,14 +175,14 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.1.tgz", - "integrity": "sha512-CCcLwn/8ANhlAbhlE18fcaN0hfXTen53/JiwZs1t9oE/Cqa9maA8ZRarkCIsXF4J7J/MYnd0J6IsxeKsq+f6mw==", - "dependencies": { - "@discordjs/formatters": "^0.3.0", - "@discordjs/util": "^0.2.0", - "@sapphire/shapeshift": "^3.8.1", - "discord-api-types": "^0.37.37", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", + "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "dependencies": { + "@discordjs/formatters": "^0.3.1", + "@discordjs/util": "^0.3.1", + "@sapphire/shapeshift": "^3.8.2", + "discord-api-types": "^0.37.41", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.3", "tslib": "^2.5.0" @@ -192,19 +192,19 @@ } }, "node_modules/@discordjs/collection": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.0.tgz", - "integrity": "sha512-suyVndkEAAWrGxyw/CPGdtXoRRU6AUNkibtnbJevQzpelkJh3Q1gQqWDpqf5i39CnAn5+LrN0YS+cULeEjq2Yw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", + "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", "engines": { "node": ">=16.9.0" } }, "node_modules/@discordjs/formatters": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.0.tgz", - "integrity": "sha512-Fc4MomalbP8HMKEMor3qUiboAKDtR7PSBoPjwm7WYghVRwgJlj5WYvUsriLsxeKk8+Qq2oy+HJlGTUkGvX0YnA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", + "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", "dependencies": { - "discord-api-types": "^0.37.37" + "discord-api-types": "^0.37.41" }, "engines": { "node": ">=16.9.0" @@ -243,27 +243,27 @@ } }, "node_modules/@discordjs/rest": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.0.tgz", - "integrity": "sha512-r2HzmznRIo8IDGYBWqQfkEaGN1LrFfWQd3dSyC4tOpMU8nuVvFUEw6V/lwnG44jyOq+vgyDny2fxeUDMt9I4aQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", + "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", "dependencies": { - "@discordjs/collection": "^1.5.0", - "@discordjs/util": "^0.2.0", + "@discordjs/collection": "^1.5.1", + "@discordjs/util": "^0.3.0", "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.0", - "discord-api-types": "^0.37.37", - "file-type": "^18.2.1", + "@sapphire/snowflake": "^3.4.2", + "discord-api-types": "^0.37.41", + "file-type": "^18.3.0", "tslib": "^2.5.0", - "undici": "^5.21.0" + "undici": "^5.22.0" }, "engines": { "node": ">=16.9.0" } }, "node_modules/@discordjs/util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz", - "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", + "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", "engines": { "node": ">=16.9.0" } @@ -283,6 +283,45 @@ "node": ">=16.9.0" } }, + "node_modules/@discordjs/ws": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "dependencies": { + "@discordjs/collection": "^1.5.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.4", + "@vladfrangu/async_event_emitter": "^2.2.1", + "discord-api-types": "^0.37.41", + "tslib": "^2.5.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/ws/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@sapphire/async-queue": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", @@ -293,9 +332,9 @@ } }, "node_modules/@sapphire/shapeshift": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz", - "integrity": "sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", + "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" @@ -306,9 +345,9 @@ } }, "node_modules/@sapphire/snowflake": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", - "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -398,6 +437,15 @@ "node-fetch": "^2.6.7" } }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -872,9 +920,9 @@ "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==" }, "node_modules/discord-api-types": { - "version": "0.37.37", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz", - "integrity": "sha512-LDMBKzl/zbvHO/yCzno5hevuA6lFIXJwdKSJZQrB+1ToDpFfN9thK+xxgZNR4aVkI7GHRDja0p4Sl2oYVPnHYg==" + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" }, "node_modules/discord-html-transcripts": { "version": "3.1.3", @@ -904,22 +952,23 @@ } }, "node_modules/discord.js": { - "version": "14.9.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.9.0.tgz", - "integrity": "sha512-ygGms5xP4hG+QrrY9k7d/OYCzMltSMtdl/2Snzq/nLCiZo+Sna91Ulv9l0+B5Jd/Czcq37B7wJAnmja7GOa+bg==", - "dependencies": { - "@discordjs/builders": "^1.6.0", - "@discordjs/collection": "^1.5.0", - "@discordjs/formatters": "^0.3.0", - "@discordjs/rest": "^1.7.0", - "@discordjs/util": "^0.2.0", - "@sapphire/snowflake": "^3.4.0", + "version": "14.11.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.0.tgz", + "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==", + "dependencies": { + "@discordjs/builders": "^1.6.3", + "@discordjs/collection": "^1.5.1", + "@discordjs/formatters": "^0.3.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@discordjs/ws": "^0.8.3", + "@sapphire/snowflake": "^3.4.2", "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.37", + "discord-api-types": "^0.37.41", "fast-deep-equal": "^3.1.3", "lodash.snakecase": "^4.1.1", "tslib": "^2.5.0", - "undici": "^5.21.0", + "undici": "^5.22.0", "ws": "^8.13.0" }, "engines": { @@ -1134,9 +1183,9 @@ } }, "node_modules/file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", + "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -2687,14 +2736,14 @@ } }, "node_modules/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", "dependencies": { "busboy": "^1.6.0" }, "engines": { - "node": ">=12.18" + "node": ">=14.0" } }, "node_modules/universalify": { @@ -2945,30 +2994,30 @@ } }, "@discordjs/builders": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.1.tgz", - "integrity": "sha512-CCcLwn/8ANhlAbhlE18fcaN0hfXTen53/JiwZs1t9oE/Cqa9maA8ZRarkCIsXF4J7J/MYnd0J6IsxeKsq+f6mw==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", + "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", "requires": { - "@discordjs/formatters": "^0.3.0", - "@discordjs/util": "^0.2.0", - "@sapphire/shapeshift": "^3.8.1", - "discord-api-types": "^0.37.37", + "@discordjs/formatters": "^0.3.1", + "@discordjs/util": "^0.3.1", + "@sapphire/shapeshift": "^3.8.2", + "discord-api-types": "^0.37.41", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.3", "tslib": "^2.5.0" } }, "@discordjs/collection": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.0.tgz", - "integrity": "sha512-suyVndkEAAWrGxyw/CPGdtXoRRU6AUNkibtnbJevQzpelkJh3Q1gQqWDpqf5i39CnAn5+LrN0YS+cULeEjq2Yw==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", + "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==" }, "@discordjs/formatters": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.0.tgz", - "integrity": "sha512-Fc4MomalbP8HMKEMor3qUiboAKDtR7PSBoPjwm7WYghVRwgJlj5WYvUsriLsxeKk8+Qq2oy+HJlGTUkGvX0YnA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", + "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", "requires": { - "discord-api-types": "^0.37.37" + "discord-api-types": "^0.37.41" } }, "@discordjs/node-pre-gyp": { @@ -2997,24 +3046,24 @@ } }, "@discordjs/rest": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.0.tgz", - "integrity": "sha512-r2HzmznRIo8IDGYBWqQfkEaGN1LrFfWQd3dSyC4tOpMU8nuVvFUEw6V/lwnG44jyOq+vgyDny2fxeUDMt9I4aQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", + "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", "requires": { - "@discordjs/collection": "^1.5.0", - "@discordjs/util": "^0.2.0", + "@discordjs/collection": "^1.5.1", + "@discordjs/util": "^0.3.0", "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.0", - "discord-api-types": "^0.37.37", - "file-type": "^18.2.1", + "@sapphire/snowflake": "^3.4.2", + "discord-api-types": "^0.37.41", + "file-type": "^18.3.0", "tslib": "^2.5.0", - "undici": "^5.21.0" + "undici": "^5.22.0" } }, "@discordjs/util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz", - "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", + "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==" }, "@discordjs/voice": { "version": "0.15.0", @@ -3028,24 +3077,48 @@ "ws": "^8.12.1" } }, + "@discordjs/ws": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "requires": { + "@discordjs/collection": "^1.5.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.4", + "@vladfrangu/async_event_emitter": "^2.2.1", + "discord-api-types": "^0.37.41", + "tslib": "^2.5.0", + "ws": "^8.13.0" + }, + "dependencies": { + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} + } + } + }, "@sapphire/async-queue": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" }, "@sapphire/shapeshift": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz", - "integrity": "sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", + "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", "requires": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "@sapphire/snowflake": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", - "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" }, "@sourcebin/linguist": { "version": "0.0.3", @@ -3124,6 +3197,11 @@ "node-fetch": "^2.6.7" } }, + "@vladfrangu/async_event_emitter": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3466,9 +3544,9 @@ "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==" }, "discord-api-types": { - "version": "0.37.37", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz", - "integrity": "sha512-LDMBKzl/zbvHO/yCzno5hevuA6lFIXJwdKSJZQrB+1ToDpFfN9thK+xxgZNR4aVkI7GHRDja0p4Sl2oYVPnHYg==" + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" }, "discord-html-transcripts": { "version": "3.1.3", @@ -3495,22 +3573,23 @@ } }, "discord.js": { - "version": "14.9.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.9.0.tgz", - "integrity": "sha512-ygGms5xP4hG+QrrY9k7d/OYCzMltSMtdl/2Snzq/nLCiZo+Sna91Ulv9l0+B5Jd/Czcq37B7wJAnmja7GOa+bg==", + "version": "14.11.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.0.tgz", + "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==", "requires": { - "@discordjs/builders": "^1.6.0", - "@discordjs/collection": "^1.5.0", - "@discordjs/formatters": "^0.3.0", - "@discordjs/rest": "^1.7.0", - "@discordjs/util": "^0.2.0", - "@sapphire/snowflake": "^3.4.0", + "@discordjs/builders": "^1.6.3", + "@discordjs/collection": "^1.5.1", + "@discordjs/formatters": "^0.3.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@discordjs/ws": "^0.8.3", + "@sapphire/snowflake": "^3.4.2", "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.37", + "discord-api-types": "^0.37.41", "fast-deep-equal": "^3.1.3", "lodash.snakecase": "^4.1.1", "tslib": "^2.5.0", - "undici": "^5.21.0", + "undici": "^5.22.0", "ws": "^8.13.0" }, "dependencies": { @@ -3670,9 +3749,9 @@ } }, "file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", + "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", "requires": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -4850,9 +4929,9 @@ } }, "undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", "requires": { "busboy": "^1.6.0" } diff --git a/package.json b/package.json index a71f21b..a183e1e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "axios": "^1.3.4", "chalk": "^4.1.2", "discord-html-transcripts": "^3.1.3", - "discord.js": "^14.9.0", + "discord.js": "^14.11.0", "discord.js-pages": "^1.4.4", "dotenv": "^16.0.3", "edge": "^7.10.1", From 5b1bf2a2b98d174f3fa39e6ad0e9401337313c97 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 08:02:59 +0900 Subject: [PATCH 06/90] update subcommand --- commands/misc/adminspeak.js | 61 +++++++++++++++++----------------- commands/misc/server-manage.js | 4 +-- commands/misc/ticket.js | 2 +- events/misc/slashcommand.js | 11 ++++-- libs/SlashCommandHandler.js | 49 ++++++++++++++++++++------- 5 files changed, 78 insertions(+), 49 deletions(-) diff --git a/commands/misc/adminspeak.js b/commands/misc/adminspeak.js index 858f6a2..6c65794 100644 --- a/commands/misc/adminspeak.js +++ b/commands/misc/adminspeak.js @@ -1,8 +1,9 @@ //voicevox:http://127.0.0.1:50021/docs#/ //COEIROINK:http://127.0.0.1:50031/docs#/ //SHAREVOX:http://127.0.0.1:50025/docs#/ -const { SlashCommandBuilder, ChannelType, PermissionFlagsBits } = require('discord.js'); -const fs = require("node:fs"); + +const { SlashCommandBuilder, ChannelType, PermissionFlagsBits } = require("discord.js"); +const fs = require("fs"); const server_auto_join = require("./speak/server_auto-join"); const server_auto_join_delete = require("./speak/server_auto-join-delete"); const server_force_guild = require("./speak/server_force-guild"); @@ -24,108 +25,108 @@ fs.readdirSync(`${process.env.exvoice}`).map(data => { }); module.exports = { data: new SlashCommandBuilder() - .setName('adminspeak') - .setDescription('読み上げ関係のコマンド') + .setName("adminspeak") + .setDescription("読み上げ関係のコマンド") .setDMPermission(false) .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .addSubcommand(subcommand => subcommand - .setName('server_read-user') + .setName("server_read-user") .setDescription("読み上げを行うユーザーの設定をします") .addUserOption(option => option.setName("user").setDescription("読み上げるユーザーの設定").setRequired(true)) .addStringOption(option => option.setName("toggle").setDescription("操作を選んでください").addChoices({ name: "読み上げる", value: "true" }, { name: "読み上げない", value: "false" }).setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_read-bot') + .setName("server_read-bot") .setDescription("BOTの読み上げを許可するか決めます") .addStringOption(option => option.setName("toggle").setDescription("BOTの読み上げを許可するか").addChoices({ name: "許可", value: "true" }, { name: "禁止", value: "false" }).setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_voice') + .setName("server_voice") .addStringOption(option => option.setName("voicevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/voicevoxlist.json"))) .addStringOption(option => option.setName("coeiroink話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/coeiroinklist.json"))) .addStringOption(option => option.setName("sharevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/sharevoxlist.json"))) - .setDescription('サーバー話者を変更します。') + .setDescription("サーバー話者を変更します。") ) .addSubcommand(subcommand => subcommand - .setName('server_voice-setting') - .setDescription('サーバー各種voice設定をします。') + .setName("server_voice-setting") + .setDescription("サーバー各種voice設定をします。") .addStringOption(option => option.setName("args").setDescription("変更する項目を選択してください。").addChoices({ name: "pitch", value: "pitch" }, { name: "intonation", value: "intonation" }, { name: "speed", value: "speed" }).setRequired(true)) .addNumberOption(option => option.setName("number").setDescription("数値を入力")) ) .addSubcommand(subcommand => subcommand - .setName('server_force-guild') - .setDescription('サーバー設定を強制するかどうか。') + .setName("server_force-guild") + .setDescription("サーバー設定を強制するかどうか。") .addStringOption(option => option.setName("choice").setDescription("どちらかを選択してください").addChoices({ name: "voice", value: "voice" }, { name: "その他の設定", value: "args" }).setRequired(true)) .addStringOption(option => option.setName("toggle").setDescription("選択してください").addChoices({ name: "強制する", value: "true" }, { name: "強制しない", value: "false" }).setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_read') - .setDescription('入退室時にユーザーを読み上げるか。') + .setName("server_read") + .setDescription("入退室時にユーザーを読み上げるか。") .addStringOption(option => option.setName("操作").setDescription("入退出時かメッセージユーザー名を読み上げるか").addChoices({ name: "メッセージユーザー名を読み上げる", value: "message" }, { name: "入退出時にユーザーを読み上げる", value: "join" }).setRequired(true)) .addStringOption(option => option.setName("toggle").setDescription("選択してください").addChoices({ name: "読み上げる", value: "true" }, { name: "読み上げない", value: "false" }).setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_auto-join') - .setDescription('自動で読み上げチャンネルに入室する。') + .setName("server_auto-join") + .setDescription("自動で読み上げチャンネルに入室する。") .addChannelOption(option => option.addChannelTypes(ChannelType.GuildText).setName("textchannel").setDescription("読み上げを行うチャンネル").setRequired(true)) .addChannelOption(option => option.addChannelTypes(ChannelType.GuildVoice).setName("voicechannel").setDescription("読み上げを行うチャンネル").setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_auto-join-delete') - .setDescription('自動で読み上げチャンネルに入室しない。') + .setName("server_auto-join-delete") + .setDescription("自動で読み上げチャンネルに入室しない。") ) .addSubcommand(subcommand => subcommand - .setName('server_exvoice') - .setDescription('exvoiceの操作。') + .setName("server_exvoice") + .setDescription("exvoiceの操作。") .addStringOption(option => option.setName("toggle").setDescription("選択してください").addChoices({ name: "読み上げる", value: "true" }, { name: "読み上げない", value: "false" }).setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_reset') - .setDescription('サーバー設定初期化') + .setName("server_reset") + .setDescription("サーバー設定初期化") ) .addSubcommand(subcommand => subcommand - .setName('server_exvoice-word') + .setName("server_exvoice-word") .addStringOption(option => option.setName("select").setDescription("単語の操作").addChoices({ name: "追加", value: "add" }, { name: "削除", value: "remove" }).setRequired(true)) .addStringOption(option => option.setName("話者").setDescription("話者の選択").setAutocomplete(true).setRequired(true)) - .setDescription('読み上げないexvoiceの追加。') + .setDescription("読み上げないexvoiceの追加。") ) .addSubcommand(subcommand => subcommand - .setName('server_vc-only-tts') + .setName("server_vc-only-tts") .addStringOption(option => option.setName("toggle").setDescription("選択してください").addChoices({ name: "ボイスチャンネル外のユーザーを読み上げない", value: "false" }, { name: "ボイスチャンネル外のユーザーを読み上げる", value: "true" }).setRequired(true)) - .setDescription('ボイスチャンネル外のユーザー設定。') + .setDescription("ボイスチャンネル外のユーザー設定。") ) .addSubcommand(subcommand => subcommand - .setName('dictionary_username') + .setName("dictionary_username") .addStringOption(option => option.setName("toggle").setDescription("選択してください").addChoices({ name: "ユーザー名に辞書を有効にする", value: "true" }, { name: "ユーザー名に辞書を無効にする", value: "false" }).setRequired(true)) - .setDescription('ユーザー名に辞書を適応するか。') + .setDescription("ユーザー名に辞書を適応するか。") ) .addSubcommand(subcommand => subcommand - .setName('read_through') + .setName("read_through") .addStringOption(option => option.setName("toggle").setDescription("読み上げるかどうか").addChoices({ name: "読み上げる", value: "false" }, { name: "読み上げない", value: "true" }).setRequired(true)) - .setDescription('Discordのメッセージを読み上げるかどうか。') + .setDescription("Discordのメッセージを読み上げるかどうか。") ), async autocomplete(interaction) { const focusedValue = interaction.options.getFocused(); diff --git a/commands/misc/server-manage.js b/commands/misc/server-manage.js index d0eca84..b592b1c 100644 --- a/commands/misc/server-manage.js +++ b/commands/misc/server-manage.js @@ -9,7 +9,5 @@ module.exports = { .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .setDMPermission(false) , - execute(...args) { - return args; - } + execute() { } }; \ No newline at end of file diff --git a/commands/misc/ticket.js b/commands/misc/ticket.js index ae6e0f5..9affc52 100644 --- a/commands/misc/ticket.js +++ b/commands/misc/ticket.js @@ -13,7 +13,7 @@ module.exports = { , async execute(interaction, ...args) { const data = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - return [interaction, data[0][0], ...args] + return [data[0][0]] } }; diff --git a/events/misc/slashcommand.js b/events/misc/slashcommand.js index de39036..ad28524 100644 --- a/events/misc/slashcommand.js +++ b/events/misc/slashcommand.js @@ -1,10 +1,10 @@ -const { Events, EmbedBuilder, Colors } = require("discord.js"); +const { Events, Colors } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); module.exports = { name: Events.InteractionCreate, async execute(interaction) { const { client } = interaction; - if (interaction.isAutocomplete()) { const command = client.commands.get(interaction.commandName); if (!command) return; @@ -17,7 +17,12 @@ module.exports = { const command = client.commands.get(interaction.commandName); if (!command) return; try { - await command.execute(interaction, command.logger); + const response = await command.execute(interaction, command.logger); + if (command.subcommands) { + const subcommand = command.subcommands.get(interaction.options.getSubcommand()); + const args = response ?? []; + subcommand.execute(interaction, ...args, command.logger); + } } catch (error) { command.logger.error(`${error.message}\n${error.stack}`); const embed = new EmbedBuilder() diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index 43a2215..34a29e8 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -1,4 +1,4 @@ -const { Collection, REST, Routes } = require("discord.js"); +const { Collection, REST, Routes, SlashCommandBuilder, SlashCommandSubcommandBuilder } = require("discord.js"); const fs = require("fs"); const path = require("path"); const logger = require("./GetLogger"); @@ -6,33 +6,58 @@ const option = require("../helpers/optionslash.json"); function SlashCommandHandler(commandsPath) { const Log = logger.createChannel("command"); - Log.debug("Loading..."); + Log.info("Loading..."); const commands = new Collection(); fs.readdirSync(commandsPath).forEach((categoryDir) => { + Log.debug(`Loading category ${categoryDir}...`); const categoryPath = path.resolve(commandsPath, categoryDir); const categoryLog = Log.createChild(categoryDir); const commandFiles = fs.readdirSync(categoryPath).filter(file => file.endsWith(".js")); for (const file of commandFiles) { + Log.debug(`Loading command ${categoryDir} ${file}...`); const commandPath = path.resolve(categoryPath, file); const command = require(commandPath); - if (!("data" in command) || !("execute" in command)) { - Log.warn(`${commandPath}はdataかexecuteプロパティが設定されていないため、ロードしていません。`); - return; - } - const name = command.data.name; + const commandBuilder = command.builder(new SlashCommandBuilder()); + const name = commandBuilder.name; command.logger = categoryLog.createChild(name); - commands.set(name, command); + if ("subcommands" in command) { + Log.debug(`Loading subcommands for ${categoryDir} ${file}...`); + const subcommands = []; + if (typeof command.subcommands === "string") { + const subcommandFiles = fs.readdirSync(path.resolve(categoryPath, command.subcommands)).filter(file => file.endsWith(".js")); + for (const subcommandFile of subcommandFiles) { + const subcommandPath = path.resolve(categoryPath, command.subcommands, subcommandFile); + subcommands.push(require(subcommandPath)); + } + } else { + command.subcommands.forEach(subcommand => subcommands.push(subcommand)); + } + command.subcommands = new Collection(); + subcommands.forEach(subcommand => { + const subcommandBuilder = subcommand.builder(new SlashCommandSubcommandBuilder()); + subcommand.logger = command.logger.createChild(subcommandBuilder.name); + subcommand.data = subcommandBuilder.toJSON(); + command.subcommands.set(subcommandBuilder.name, subcommand); + }); + Log.debug(`Loaded ${subcommands.size} subcommands for ${categoryDir} ${file}`); + } + command.data = commandBuilder.toJSON(); + commands.set(command.data.name, command); + Log.debug(`Loaded command ${categoryDir} ${file}`); } + Log.debug(`Loaded category ${categoryDir} ${commandFiles.length} commands`); }); - Log.debug(`Loaded ${commands.size} commands`); - Log.debug("Deploying..."); + Log.info(`Loaded ${commands.size} commands`); + Log.info("Deploying..."); const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); rest.put( Routes.applicationCommands(process.env.clientId), { body: [option, ...commands.map(command => command.data.toJSON())] }, ).then((data) => { - Log.debug(`Deployed ${data.length} commands`); - }).catch(Log.error); + Log.indo(`Deployed ${data.length} commands`); + }).catch((error) => { + Log.error(error) + }); return commands; } From 3c775290ce15ea0b5d5be040aa4429c9bf9a166d Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 12:23:20 +0900 Subject: [PATCH 07/90] update minecraft command --- commands/misc/minecraft.js | 154 ++++++++++++++++++++++++--------- commands/misc/sub/mcbedrock.js | 35 -------- commands/misc/sub/mcjava.js | 36 -------- commands/misc/sub/mcuser.js | 32 ------- 4 files changed, 111 insertions(+), 146 deletions(-) delete mode 100644 commands/misc/sub/mcbedrock.js delete mode 100644 commands/misc/sub/mcjava.js delete mode 100644 commands/misc/sub/mcuser.js diff --git a/commands/misc/minecraft.js b/commands/misc/minecraft.js index 1aded0d..09a0c9f 100644 --- a/commands/misc/minecraft.js +++ b/commands/misc/minecraft.js @@ -1,46 +1,114 @@ -const { SlashCommandBuilder } = require('discord.js'); -const mcjava = require("./sub/mcjava"); -const mcbedrock = require("./sub/mcbedrock"); -const mcuser = require("./sub/mcuser"); -let response; +const axios = require("axios"); +const { CustomEmbed } = require("../../libs"); + module.exports = { - data: new SlashCommandBuilder() - .setName('minecraft') - .setDescription('Minecraft関係コマンド') - .addSubcommand(subcommand => - subcommand - .setName('server-java') - .setDescription('Java版Minecraftサーバー情報') - .addStringOption(option => option.setName('address').setDescription('サーバーのアドレス').setRequired(true))) - .addSubcommand(subcommand => - subcommand - .setName('server-bedrock') - .setDescription('統合版Minecraftサーバー情報') - .addStringOption(option => option.setName('address').setDescription('サーバーのアドレス').setRequired(true))) - .addSubcommand(subcommand => - subcommand - .setName('user') - .setDescription('Minecraftユーザー情報') - .addStringOption(option => option.setName('username').setDescription('検索したいユーザーの名前').setRequired(true))), - async execute(interaction) { - const sub = interaction.options.getSubcommand(); + subcommands: [ServerInfo, UserInfo], + builder: (builder) => builder + .setName("minecraft") + .setDescription("Minecraft関係コマンド") + , + execute() { } +}; - // Javaサーバー - if (sub === "server-java") { - const query = interaction.options.getString("address"); - response = await mcjava(query); - }; - // BedRockサーバー - if (sub === "server-bedrock") { - const query = interaction.options.getString("address"); - response = await mcbedrock(query); - }; - //user - if (sub === "user") { - const query = interaction.options.getString("username"); - response = await mcuser(query); - }; - //user https://mojang-api-docs.gapple.pw/no-auth/uuid-to-profile - await interaction.reply(response); - }, +const ServerInfo = { + builder: (builder) => builder + .setName("serverinfojava") + .setDescription("Java版Minecraftサーバー情報") + .addStringOption((option) => option + .setName("type") + .setDescription("サーバーの種類") + .setChoices( + { name: "Java", value: "java" }, + { name: "Bedrock", value: "bedrock" } + ) + .setRequired(true) + ) + .addStringOption((option) => option + .setName("address") + .setDescription("サーバーのアドレス") + .setRequired(true) + ) + , + execute(interaction) { + const type = interaction.options.getString("type"); + const address = interaction.options.getString("address"); + const embed = new CustomEmbed("minecraft"); + axios.get(`https://api.mcstatus.io/v2/status/${type}/${address}`) + .then((response) => { + const json = response.data; + embed + .setTitle(`Minecraftサーバー (${type})`) + .addFields( + { + name: "ステータス", + value: json.online ? "オンライン" : "オフライン", + inline: true + }, + { + name: "アドレス", + value: json.host, + inline: true + }, + { + name: "ポート", + value: String(json.port), + inline: true + } + ) + .setThumbnail("https://cdn.mikn.dev/mclogo.png") + .setColor(json.online ? "GREEN" : "RED"); + interaction.reply({ embeds: [embed] }); + }) + .catch((error) => { + embed.typeError() + .setDescription("サーバーが見つかりませんでした。"); + interaction.reply({ embeds: [embed] }); + }); + } }; + +const UserInfo = { + builder: (builder) => builder + .setName("userinfo") + .setDescription("Minecraftユーザー情報") + .addStringOption((option) => option + .setName("username") + .setDescription("検索したいユーザーの名前") + .setRequired(true) + ) + , + async execute(interaction) { + const username = interaction.options.getString("username"); + const embed = new CustomEmbed("minecraft"); + function notFound() { + embed.typeError() + .setDescription("ユーザーが見つかりませんでした。"); + interaction.reply({ embeds: [embed] }); + } + // task: uuidからも検索できるようにする + + axios.get(`https://api.mojang.com/users/profiles/minecraft/${username}`) + .then((response) => { + const user = response.data; + axios.get(`https://sessionserver.mojang.com/session/minecraft/profile/${user.id}`) + .then((response) => { + embed + .setTitle("Minecraftユーザー") + .addFields( + { + name: "ユーザーID", + value: user.id + }, + { + name: "ユーザーネーム", + value: user.name + } + ) + .setImage(JSON.parse(Buffer.from(response.data.properties[0].value, "base64").toString()).textures.SKIN.url) + .setColor("GREEN"); + }) + .catch(notFound); + }) + .catch(notFound); + } +}; \ No newline at end of file diff --git a/commands/misc/sub/mcbedrock.js b/commands/misc/sub/mcbedrock.js deleted file mode 100644 index 64638a9..0000000 --- a/commands/misc/sub/mcbedrock.js +++ /dev/null @@ -1,35 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { getJson } = require("../../../helpers/HttpUtils"); -const error = new EmbedBuilder() - .setTitle(`⚠注意`) - .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Red); -module.exports = async (query) => { - const response = await getJson(`https://api.mcstatus.io/v2/status/bedrock/${query}`); - if (!response?.success) return ({ embeds: [error], ephemeral: true }); - const json = response.data; - const embed = new EmbedBuilder() - .setThumbnail(`https://cdn.mikn.dev/mclogo.png`) - .setAuthor({ - name: `✅Minecraftサーバー (BedRock)`, - }) - .addFields( - { - name: `ステータス`, - value: json.online ? "オンライン" : "オフライン" - }, - { - name: `アドレス`, - value: json.host - }, - { - name: `ポート`, - value: String(json.port) - }, - ) - .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Green); - return ({ embeds: [embed], ephemeral: true }); -}; \ No newline at end of file diff --git a/commands/misc/sub/mcjava.js b/commands/misc/sub/mcjava.js deleted file mode 100644 index ebbae1b..0000000 --- a/commands/misc/sub/mcjava.js +++ /dev/null @@ -1,36 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { getJson } = require("../../../helpers/HttpUtils"); -const error = new EmbedBuilder() - .setTitle(`⚠注意`) - .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Red); -module.exports = async (query) => { - const response = await getJson(`https://api.mcstatus.io/v2/status/java/${query}`); - if (!response?.success) return ({ embeds: [error], ephemeral: true }); - const json = response.data; - const embed = new EmbedBuilder() - .setThumbnail(`https://cdn.mikn.dev/mclogo.png`) - .setAuthor({ - name: `✅Minecraftサーバー (Java)`, - }) - .addFields( - { - name: `ステータス`, - value: json.online ? "オンライン" : "オフライン" - }, - { - name: `アドレス`, - value: json.host - }, - { - name: `ポート`, - value: String(json.port) - }, - ) - .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Green); - return ({ embeds: [embed], ephemeral: true }); - -}; \ No newline at end of file diff --git a/commands/misc/sub/mcuser.js b/commands/misc/sub/mcuser.js deleted file mode 100644 index 477dd3f..0000000 --- a/commands/misc/sub/mcuser.js +++ /dev/null @@ -1,32 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { getJson } = require("../../../helpers/HttpUtils"); -const error = new EmbedBuilder() - .setTitle(`⚠注意`) - .setDescription("ユーザーが見つかりませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Red); -module.exports = async (query) => { - const response = await getJson(`https://api.mojang.com/user/profile/agent/minecraft/name/${query}`); - if (!response?.success) return ({ embeds: [error], ephemeral: true }); - const response_uuid = await getJson(`https://sessionserver.mojang.com/session/minecraft/profile/${response.data?.id}`); - if (!response_uuid?.success) return ({ embeds: [error], ephemeral: true }); - const embed = new EmbedBuilder() - .setThumbnail(JSON.parse(atob(response_uuid.data?.properties[0]?.value)).textures.SKIN.url) - .setAuthor({ - name: `✅Minecraftユーザー`, - }) - .addFields( - { - name: `ユーザーID`, - value: response_uuid?.data?.id - }, - { - name: `ユーザーネーム`, - value: response_uuid?.data?.name - } - ) - .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | minecraft" }) - .setColor(Colors.Green); - return ({ embeds: [embed], ephemeral: true }); -}; From 16b0c203ef2ae02250928cb3d886667214b0aca9 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 17:22:53 +0900 Subject: [PATCH 08/90] =?UTF-8?q?oldCommand=E3=81=AB=E5=88=86=E3=81=91?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/{misc => game}/minecraft.js | 18 ++++----- commands/misc/poll.js | 29 +++++++------- .../server-manage.js => server/manage.js} | 4 +- .../server-manage => server/manage}/ban.js | 0 .../server-manage => server/manage}/clear.js | 0 .../server-manage => server/manage}/kick.js | 0 .../server-manage => server/manage}/mute.js | 0 .../server-manage => server/manage}/show.js | 0 .../server-manage => server/manage}/unban.js | 0 .../server-manage => server/manage}/unmute.js | 0 commands/{misc => server}/ticket.js | 39 +++++++++---------- libs/SlashCommandHandler.js | 4 +- .../misc/Miscellaneous.js | 0 {commands => oldCommands}/misc/adminspeak.js | 0 {commands => oldCommands}/misc/bot.js | 0 {commands => oldCommands}/misc/bot/report.js | 0 {commands => oldCommands}/misc/bot/status.js | 0 {commands => oldCommands}/misc/genshin.js | 0 {commands => oldCommands}/misc/help.js | 0 {commands => oldCommands}/misc/jobpanel.js | 0 .../misc/jobpanel/add.js | 0 .../misc/jobpanel/autoremove.js | 0 .../misc/jobpanel/copy.js | 0 .../misc/jobpanel/create.js | 0 .../misc/jobpanel/delete.js | 0 .../misc/jobpanel/edit.js | 0 .../misc/jobpanel/refresh.js | 0 .../misc/jobpanel/remove.js | 0 .../misc/jobpanel/selected.js | 0 {commands => oldCommands}/misc/log.js | 0 .../misc/miscellaneous/channel.js | 0 .../misc/miscellaneous/reserve.js | 0 .../misc/miscellaneous/role.js | 0 .../misc/miscellaneous/screenshot.js | 0 .../misc/miscellaneous/serverinfo.js | 0 .../misc/miscellaneous/translate.js | 0 .../misc/miscellaneous/userinfo.js | 0 .../misc/miscellaneous/wikipedia.js | 0 {commands => oldCommands}/misc/speak.js | 0 .../misc/speak/dictionary_add.js | 0 .../misc/speak/dictionary_export.js | 0 .../misc/speak/dictionary_import.js | 0 .../misc/speak/dictionary_remove.js | 0 .../misc/speak/dictionary_reset.js | 0 .../misc/speak/dictionary_username.js | 0 .../misc/speak/disconnect.js | 0 .../misc/speak/exvoice.js | 0 {commands => oldCommands}/misc/speak/join.js | 0 .../misc/speak/live_read.js | 0 .../misc/speak/live_read_stop.js | 0 .../misc/speak/read_through.js | 0 .../misc/speak/server_auto-join-delete.js | 0 .../misc/speak/server_auto-join.js | 0 .../misc/speak/server_exvoice-word.js | 0 .../misc/speak/server_exvoice.js | 0 .../misc/speak/server_force-guild.js | 0 .../misc/speak/server_read-bot.js | 0 .../misc/speak/server_read-user.js | 0 .../misc/speak/server_read.js | 0 .../misc/speak/server_reset.js | 0 .../misc/speak/server_user-dictionary-list.js | 0 .../misc/speak/server_vc-only-tts.js | 0 .../misc/speak/server_voice-setting.js | 0 .../misc/speak/server_voice.js | 0 .../misc/speak/setting-show.js | 0 .../misc/speak/setvoice.js | 0 {commands => oldCommands}/misc/speak/skip.js | 0 .../misc/speak/user_reset.js | 0 .../misc/speak/user_voice-setting.js | 0 69 files changed, 46 insertions(+), 48 deletions(-) rename commands/{misc => game}/minecraft.js (100%) rename commands/{misc/server-manage.js => server/manage.js} (77%) rename commands/{misc/server-manage => server/manage}/ban.js (100%) rename commands/{misc/server-manage => server/manage}/clear.js (100%) rename commands/{misc/server-manage => server/manage}/kick.js (100%) rename commands/{misc/server-manage => server/manage}/mute.js (100%) rename commands/{misc/server-manage => server/manage}/show.js (100%) rename commands/{misc/server-manage => server/manage}/unban.js (100%) rename commands/{misc/server-manage => server/manage}/unmute.js (100%) rename commands/{misc => server}/ticket.js (87%) rename {commands => oldCommands}/misc/Miscellaneous.js (100%) rename {commands => oldCommands}/misc/adminspeak.js (100%) rename {commands => oldCommands}/misc/bot.js (100%) rename {commands => oldCommands}/misc/bot/report.js (100%) rename {commands => oldCommands}/misc/bot/status.js (100%) rename {commands => oldCommands}/misc/genshin.js (100%) rename {commands => oldCommands}/misc/help.js (100%) rename {commands => oldCommands}/misc/jobpanel.js (100%) rename {commands => oldCommands}/misc/jobpanel/add.js (100%) rename {commands => oldCommands}/misc/jobpanel/autoremove.js (100%) rename {commands => oldCommands}/misc/jobpanel/copy.js (100%) rename {commands => oldCommands}/misc/jobpanel/create.js (100%) rename {commands => oldCommands}/misc/jobpanel/delete.js (100%) rename {commands => oldCommands}/misc/jobpanel/edit.js (100%) rename {commands => oldCommands}/misc/jobpanel/refresh.js (100%) rename {commands => oldCommands}/misc/jobpanel/remove.js (100%) rename {commands => oldCommands}/misc/jobpanel/selected.js (100%) rename {commands => oldCommands}/misc/log.js (100%) rename {commands => oldCommands}/misc/miscellaneous/channel.js (100%) rename {commands => oldCommands}/misc/miscellaneous/reserve.js (100%) rename {commands => oldCommands}/misc/miscellaneous/role.js (100%) rename {commands => oldCommands}/misc/miscellaneous/screenshot.js (100%) rename {commands => oldCommands}/misc/miscellaneous/serverinfo.js (100%) rename {commands => oldCommands}/misc/miscellaneous/translate.js (100%) rename {commands => oldCommands}/misc/miscellaneous/userinfo.js (100%) rename {commands => oldCommands}/misc/miscellaneous/wikipedia.js (100%) rename {commands => oldCommands}/misc/speak.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_add.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_export.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_import.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_remove.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_reset.js (100%) rename {commands => oldCommands}/misc/speak/dictionary_username.js (100%) rename {commands => oldCommands}/misc/speak/disconnect.js (100%) rename {commands => oldCommands}/misc/speak/exvoice.js (100%) rename {commands => oldCommands}/misc/speak/join.js (100%) rename {commands => oldCommands}/misc/speak/live_read.js (100%) rename {commands => oldCommands}/misc/speak/live_read_stop.js (100%) rename {commands => oldCommands}/misc/speak/read_through.js (100%) rename {commands => oldCommands}/misc/speak/server_auto-join-delete.js (100%) rename {commands => oldCommands}/misc/speak/server_auto-join.js (100%) rename {commands => oldCommands}/misc/speak/server_exvoice-word.js (100%) rename {commands => oldCommands}/misc/speak/server_exvoice.js (100%) rename {commands => oldCommands}/misc/speak/server_force-guild.js (100%) rename {commands => oldCommands}/misc/speak/server_read-bot.js (100%) rename {commands => oldCommands}/misc/speak/server_read-user.js (100%) rename {commands => oldCommands}/misc/speak/server_read.js (100%) rename {commands => oldCommands}/misc/speak/server_reset.js (100%) rename {commands => oldCommands}/misc/speak/server_user-dictionary-list.js (100%) rename {commands => oldCommands}/misc/speak/server_vc-only-tts.js (100%) rename {commands => oldCommands}/misc/speak/server_voice-setting.js (100%) rename {commands => oldCommands}/misc/speak/server_voice.js (100%) rename {commands => oldCommands}/misc/speak/setting-show.js (100%) rename {commands => oldCommands}/misc/speak/setvoice.js (100%) rename {commands => oldCommands}/misc/speak/skip.js (100%) rename {commands => oldCommands}/misc/speak/user_reset.js (100%) rename {commands => oldCommands}/misc/speak/user_voice-setting.js (100%) diff --git a/commands/misc/minecraft.js b/commands/game/minecraft.js similarity index 100% rename from commands/misc/minecraft.js rename to commands/game/minecraft.js index 09a0c9f..865928f 100644 --- a/commands/misc/minecraft.js +++ b/commands/game/minecraft.js @@ -1,15 +1,6 @@ const axios = require("axios"); const { CustomEmbed } = require("../../libs"); -module.exports = { - subcommands: [ServerInfo, UserInfo], - builder: (builder) => builder - .setName("minecraft") - .setDescription("Minecraft関係コマンド") - , - execute() { } -}; - const ServerInfo = { builder: (builder) => builder .setName("serverinfojava") @@ -111,4 +102,13 @@ const UserInfo = { }) .catch(notFound); } +}; + +module.exports = { + subcommands: [ServerInfo, UserInfo], + builder: (builder) => builder + .setName("minecraft") + .setDescription("Minecraft関係コマンド") + , + execute() { } }; \ No newline at end of file diff --git a/commands/misc/poll.js b/commands/misc/poll.js index 73f58d3..d30fe60 100644 --- a/commands/misc/poll.js +++ b/commands/misc/poll.js @@ -1,22 +1,9 @@ const { Colors } = require("discord.js"); -const { CustomEmbed, getEmbedName, ColorsChoice } = require("../../../libs"); -const poll = require("../../events/misc/poll"); - -module.exports = { - subcommands: [pollCreate, pollSum], - builder: (builder) => builder - .setName("poll") - .setDescription("アンケートを実施する。") - .setDMPermission(false) - , - execute(...args) { - return args; - } -}; +const { CustomEmbed, getEmbedName, ColorsChoice } = require("../../libs"); const maxChoice = 10; const ExampleEmojis = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"]; -const bar = "=========================>"; //4% = 1文字 +const bar = "=========================>"; const pollCreate = { builder: (builder) => { @@ -150,4 +137,16 @@ const pollSum = { .setColor(Colors.Green); interaction.reply({ embeds: [embed], ephemeral: true }); } +}; + +module.exports = { + subcommands: [pollCreate, pollSum], + builder: (builder) => builder + .setName("poll") + .setDescription("アンケートを実施する。") + .setDMPermission(false) + , + execute(...args) { + return args; + } }; \ No newline at end of file diff --git a/commands/misc/server-manage.js b/commands/server/manage.js similarity index 77% rename from commands/misc/server-manage.js rename to commands/server/manage.js index b592b1c..4801f28 100644 --- a/commands/misc/server-manage.js +++ b/commands/server/manage.js @@ -2,9 +2,9 @@ const { PermissionFlagsBits } = require("discord.js"); const path = require("path"); module.exports = { - subcommands: path.resolve(__dirname, "./server-manage"), + subcommands: path.resolve(__dirname, "./manage"), builder: (builder) => builder - .setName("server-manage") + .setName("manage") .setDescription("サーバーの管理用") .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .setDMPermission(false) diff --git a/commands/misc/server-manage/ban.js b/commands/server/manage/ban.js similarity index 100% rename from commands/misc/server-manage/ban.js rename to commands/server/manage/ban.js diff --git a/commands/misc/server-manage/clear.js b/commands/server/manage/clear.js similarity index 100% rename from commands/misc/server-manage/clear.js rename to commands/server/manage/clear.js diff --git a/commands/misc/server-manage/kick.js b/commands/server/manage/kick.js similarity index 100% rename from commands/misc/server-manage/kick.js rename to commands/server/manage/kick.js diff --git a/commands/misc/server-manage/mute.js b/commands/server/manage/mute.js similarity index 100% rename from commands/misc/server-manage/mute.js rename to commands/server/manage/mute.js diff --git a/commands/misc/server-manage/show.js b/commands/server/manage/show.js similarity index 100% rename from commands/misc/server-manage/show.js rename to commands/server/manage/show.js diff --git a/commands/misc/server-manage/unban.js b/commands/server/manage/unban.js similarity index 100% rename from commands/misc/server-manage/unban.js rename to commands/server/manage/unban.js diff --git a/commands/misc/server-manage/unmute.js b/commands/server/manage/unmute.js similarity index 100% rename from commands/misc/server-manage/unmute.js rename to commands/server/manage/unmute.js diff --git a/commands/misc/ticket.js b/commands/server/ticket.js similarity index 87% rename from commands/misc/ticket.js rename to commands/server/ticket.js index 9affc52..6728951 100644 --- a/commands/misc/ticket.js +++ b/commands/server/ticket.js @@ -1,21 +1,6 @@ const { ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionFlagsBits, Colors, ChannelType } = require("discord.js"); -const { CustomEmbed, ColorsChoice } = require("../../libs/CustomEmbed"); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - subcommands: [ticketCreate, ticketDelete], - builder: (builder) => builder - .setName("ticket") - .setDescription("チケットを作成します。") - .setDMPermission(false) - .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) - , - async execute(interaction, ...args) { - const data = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - return [data[0][0]] - } -}; +const { CustomEmbed, ColorsChoice, Utils } = require("../../libs"); +const { escape } = require("mysql2"); const ticketCreate = { builder: (builder) => builder @@ -63,9 +48,9 @@ const ticketCreate = { if (log) { let promise; if (data?.guildid) { - promise = sql(`update ticket_channel set channelid=${escape(log.id)} where guildid=${escape(guild.id)};`); + promise = Utils.sql(`update ticket_channel set channelid=${escape(log.id)} where guildid=${escape(guild.id)};`); } else { - promise = sql(`insert into ticket_channel values (${escape(guild.id)},${escape(log.id)});`); + promise = Utils.sql(`insert into ticket_channel values (${escape(guild.id)},${escape(log.id)});`); }; if (!await promise) { embed.typeError() @@ -106,7 +91,7 @@ const ticketDelete = { embed.typeError() .setDescription("データが見つかりませんでした。"); } else { - const sqlDelete = await sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(interaction.guild.id)};`); + const sqlDelete = await Utils.sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(interaction.guild.id)};`); if (!sqlDelete) { embed.typeError() .setDescription("データの削除に失敗しました。"); @@ -117,4 +102,18 @@ const ticketDelete = { } interaction.reply({ embeds: [embed], ephemeral: true }); } +}; + +module.exports = { + subcommands: [ticketCreate, ticketDelete], + builder: (builder) => builder + .setName("ticket") + .setDescription("チケットを作成します。") + .setDMPermission(false) + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) + , + async execute(interaction, ...args) { + const data = await Utils.sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); + return [data[0][0]] + } }; \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index 34a29e8..0922a8a 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -52,9 +52,9 @@ function SlashCommandHandler(commandsPath) { const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); rest.put( Routes.applicationCommands(process.env.clientId), - { body: [option, ...commands.map(command => command.data.toJSON())] }, + { body: [option, ...commands.map(command => command.data)] }, ).then((data) => { - Log.indo(`Deployed ${data.length} commands`); + Log.info(`Deployed ${data.length} commands`); }).catch((error) => { Log.error(error) }); diff --git a/commands/misc/Miscellaneous.js b/oldCommands/misc/Miscellaneous.js similarity index 100% rename from commands/misc/Miscellaneous.js rename to oldCommands/misc/Miscellaneous.js diff --git a/commands/misc/adminspeak.js b/oldCommands/misc/adminspeak.js similarity index 100% rename from commands/misc/adminspeak.js rename to oldCommands/misc/adminspeak.js diff --git a/commands/misc/bot.js b/oldCommands/misc/bot.js similarity index 100% rename from commands/misc/bot.js rename to oldCommands/misc/bot.js diff --git a/commands/misc/bot/report.js b/oldCommands/misc/bot/report.js similarity index 100% rename from commands/misc/bot/report.js rename to oldCommands/misc/bot/report.js diff --git a/commands/misc/bot/status.js b/oldCommands/misc/bot/status.js similarity index 100% rename from commands/misc/bot/status.js rename to oldCommands/misc/bot/status.js diff --git a/commands/misc/genshin.js b/oldCommands/misc/genshin.js similarity index 100% rename from commands/misc/genshin.js rename to oldCommands/misc/genshin.js diff --git a/commands/misc/help.js b/oldCommands/misc/help.js similarity index 100% rename from commands/misc/help.js rename to oldCommands/misc/help.js diff --git a/commands/misc/jobpanel.js b/oldCommands/misc/jobpanel.js similarity index 100% rename from commands/misc/jobpanel.js rename to oldCommands/misc/jobpanel.js diff --git a/commands/misc/jobpanel/add.js b/oldCommands/misc/jobpanel/add.js similarity index 100% rename from commands/misc/jobpanel/add.js rename to oldCommands/misc/jobpanel/add.js diff --git a/commands/misc/jobpanel/autoremove.js b/oldCommands/misc/jobpanel/autoremove.js similarity index 100% rename from commands/misc/jobpanel/autoremove.js rename to oldCommands/misc/jobpanel/autoremove.js diff --git a/commands/misc/jobpanel/copy.js b/oldCommands/misc/jobpanel/copy.js similarity index 100% rename from commands/misc/jobpanel/copy.js rename to oldCommands/misc/jobpanel/copy.js diff --git a/commands/misc/jobpanel/create.js b/oldCommands/misc/jobpanel/create.js similarity index 100% rename from commands/misc/jobpanel/create.js rename to oldCommands/misc/jobpanel/create.js diff --git a/commands/misc/jobpanel/delete.js b/oldCommands/misc/jobpanel/delete.js similarity index 100% rename from commands/misc/jobpanel/delete.js rename to oldCommands/misc/jobpanel/delete.js diff --git a/commands/misc/jobpanel/edit.js b/oldCommands/misc/jobpanel/edit.js similarity index 100% rename from commands/misc/jobpanel/edit.js rename to oldCommands/misc/jobpanel/edit.js diff --git a/commands/misc/jobpanel/refresh.js b/oldCommands/misc/jobpanel/refresh.js similarity index 100% rename from commands/misc/jobpanel/refresh.js rename to oldCommands/misc/jobpanel/refresh.js diff --git a/commands/misc/jobpanel/remove.js b/oldCommands/misc/jobpanel/remove.js similarity index 100% rename from commands/misc/jobpanel/remove.js rename to oldCommands/misc/jobpanel/remove.js diff --git a/commands/misc/jobpanel/selected.js b/oldCommands/misc/jobpanel/selected.js similarity index 100% rename from commands/misc/jobpanel/selected.js rename to oldCommands/misc/jobpanel/selected.js diff --git a/commands/misc/log.js b/oldCommands/misc/log.js similarity index 100% rename from commands/misc/log.js rename to oldCommands/misc/log.js diff --git a/commands/misc/miscellaneous/channel.js b/oldCommands/misc/miscellaneous/channel.js similarity index 100% rename from commands/misc/miscellaneous/channel.js rename to oldCommands/misc/miscellaneous/channel.js diff --git a/commands/misc/miscellaneous/reserve.js b/oldCommands/misc/miscellaneous/reserve.js similarity index 100% rename from commands/misc/miscellaneous/reserve.js rename to oldCommands/misc/miscellaneous/reserve.js diff --git a/commands/misc/miscellaneous/role.js b/oldCommands/misc/miscellaneous/role.js similarity index 100% rename from commands/misc/miscellaneous/role.js rename to oldCommands/misc/miscellaneous/role.js diff --git a/commands/misc/miscellaneous/screenshot.js b/oldCommands/misc/miscellaneous/screenshot.js similarity index 100% rename from commands/misc/miscellaneous/screenshot.js rename to oldCommands/misc/miscellaneous/screenshot.js diff --git a/commands/misc/miscellaneous/serverinfo.js b/oldCommands/misc/miscellaneous/serverinfo.js similarity index 100% rename from commands/misc/miscellaneous/serverinfo.js rename to oldCommands/misc/miscellaneous/serverinfo.js diff --git a/commands/misc/miscellaneous/translate.js b/oldCommands/misc/miscellaneous/translate.js similarity index 100% rename from commands/misc/miscellaneous/translate.js rename to oldCommands/misc/miscellaneous/translate.js diff --git a/commands/misc/miscellaneous/userinfo.js b/oldCommands/misc/miscellaneous/userinfo.js similarity index 100% rename from commands/misc/miscellaneous/userinfo.js rename to oldCommands/misc/miscellaneous/userinfo.js diff --git a/commands/misc/miscellaneous/wikipedia.js b/oldCommands/misc/miscellaneous/wikipedia.js similarity index 100% rename from commands/misc/miscellaneous/wikipedia.js rename to oldCommands/misc/miscellaneous/wikipedia.js diff --git a/commands/misc/speak.js b/oldCommands/misc/speak.js similarity index 100% rename from commands/misc/speak.js rename to oldCommands/misc/speak.js diff --git a/commands/misc/speak/dictionary_add.js b/oldCommands/misc/speak/dictionary_add.js similarity index 100% rename from commands/misc/speak/dictionary_add.js rename to oldCommands/misc/speak/dictionary_add.js diff --git a/commands/misc/speak/dictionary_export.js b/oldCommands/misc/speak/dictionary_export.js similarity index 100% rename from commands/misc/speak/dictionary_export.js rename to oldCommands/misc/speak/dictionary_export.js diff --git a/commands/misc/speak/dictionary_import.js b/oldCommands/misc/speak/dictionary_import.js similarity index 100% rename from commands/misc/speak/dictionary_import.js rename to oldCommands/misc/speak/dictionary_import.js diff --git a/commands/misc/speak/dictionary_remove.js b/oldCommands/misc/speak/dictionary_remove.js similarity index 100% rename from commands/misc/speak/dictionary_remove.js rename to oldCommands/misc/speak/dictionary_remove.js diff --git a/commands/misc/speak/dictionary_reset.js b/oldCommands/misc/speak/dictionary_reset.js similarity index 100% rename from commands/misc/speak/dictionary_reset.js rename to oldCommands/misc/speak/dictionary_reset.js diff --git a/commands/misc/speak/dictionary_username.js b/oldCommands/misc/speak/dictionary_username.js similarity index 100% rename from commands/misc/speak/dictionary_username.js rename to oldCommands/misc/speak/dictionary_username.js diff --git a/commands/misc/speak/disconnect.js b/oldCommands/misc/speak/disconnect.js similarity index 100% rename from commands/misc/speak/disconnect.js rename to oldCommands/misc/speak/disconnect.js diff --git a/commands/misc/speak/exvoice.js b/oldCommands/misc/speak/exvoice.js similarity index 100% rename from commands/misc/speak/exvoice.js rename to oldCommands/misc/speak/exvoice.js diff --git a/commands/misc/speak/join.js b/oldCommands/misc/speak/join.js similarity index 100% rename from commands/misc/speak/join.js rename to oldCommands/misc/speak/join.js diff --git a/commands/misc/speak/live_read.js b/oldCommands/misc/speak/live_read.js similarity index 100% rename from commands/misc/speak/live_read.js rename to oldCommands/misc/speak/live_read.js diff --git a/commands/misc/speak/live_read_stop.js b/oldCommands/misc/speak/live_read_stop.js similarity index 100% rename from commands/misc/speak/live_read_stop.js rename to oldCommands/misc/speak/live_read_stop.js diff --git a/commands/misc/speak/read_through.js b/oldCommands/misc/speak/read_through.js similarity index 100% rename from commands/misc/speak/read_through.js rename to oldCommands/misc/speak/read_through.js diff --git a/commands/misc/speak/server_auto-join-delete.js b/oldCommands/misc/speak/server_auto-join-delete.js similarity index 100% rename from commands/misc/speak/server_auto-join-delete.js rename to oldCommands/misc/speak/server_auto-join-delete.js diff --git a/commands/misc/speak/server_auto-join.js b/oldCommands/misc/speak/server_auto-join.js similarity index 100% rename from commands/misc/speak/server_auto-join.js rename to oldCommands/misc/speak/server_auto-join.js diff --git a/commands/misc/speak/server_exvoice-word.js b/oldCommands/misc/speak/server_exvoice-word.js similarity index 100% rename from commands/misc/speak/server_exvoice-word.js rename to oldCommands/misc/speak/server_exvoice-word.js diff --git a/commands/misc/speak/server_exvoice.js b/oldCommands/misc/speak/server_exvoice.js similarity index 100% rename from commands/misc/speak/server_exvoice.js rename to oldCommands/misc/speak/server_exvoice.js diff --git a/commands/misc/speak/server_force-guild.js b/oldCommands/misc/speak/server_force-guild.js similarity index 100% rename from commands/misc/speak/server_force-guild.js rename to oldCommands/misc/speak/server_force-guild.js diff --git a/commands/misc/speak/server_read-bot.js b/oldCommands/misc/speak/server_read-bot.js similarity index 100% rename from commands/misc/speak/server_read-bot.js rename to oldCommands/misc/speak/server_read-bot.js diff --git a/commands/misc/speak/server_read-user.js b/oldCommands/misc/speak/server_read-user.js similarity index 100% rename from commands/misc/speak/server_read-user.js rename to oldCommands/misc/speak/server_read-user.js diff --git a/commands/misc/speak/server_read.js b/oldCommands/misc/speak/server_read.js similarity index 100% rename from commands/misc/speak/server_read.js rename to oldCommands/misc/speak/server_read.js diff --git a/commands/misc/speak/server_reset.js b/oldCommands/misc/speak/server_reset.js similarity index 100% rename from commands/misc/speak/server_reset.js rename to oldCommands/misc/speak/server_reset.js diff --git a/commands/misc/speak/server_user-dictionary-list.js b/oldCommands/misc/speak/server_user-dictionary-list.js similarity index 100% rename from commands/misc/speak/server_user-dictionary-list.js rename to oldCommands/misc/speak/server_user-dictionary-list.js diff --git a/commands/misc/speak/server_vc-only-tts.js b/oldCommands/misc/speak/server_vc-only-tts.js similarity index 100% rename from commands/misc/speak/server_vc-only-tts.js rename to oldCommands/misc/speak/server_vc-only-tts.js diff --git a/commands/misc/speak/server_voice-setting.js b/oldCommands/misc/speak/server_voice-setting.js similarity index 100% rename from commands/misc/speak/server_voice-setting.js rename to oldCommands/misc/speak/server_voice-setting.js diff --git a/commands/misc/speak/server_voice.js b/oldCommands/misc/speak/server_voice.js similarity index 100% rename from commands/misc/speak/server_voice.js rename to oldCommands/misc/speak/server_voice.js diff --git a/commands/misc/speak/setting-show.js b/oldCommands/misc/speak/setting-show.js similarity index 100% rename from commands/misc/speak/setting-show.js rename to oldCommands/misc/speak/setting-show.js diff --git a/commands/misc/speak/setvoice.js b/oldCommands/misc/speak/setvoice.js similarity index 100% rename from commands/misc/speak/setvoice.js rename to oldCommands/misc/speak/setvoice.js diff --git a/commands/misc/speak/skip.js b/oldCommands/misc/speak/skip.js similarity index 100% rename from commands/misc/speak/skip.js rename to oldCommands/misc/speak/skip.js diff --git a/commands/misc/speak/user_reset.js b/oldCommands/misc/speak/user_reset.js similarity index 100% rename from commands/misc/speak/user_reset.js rename to oldCommands/misc/speak/user_reset.js diff --git a/commands/misc/speak/user_voice-setting.js b/oldCommands/misc/speak/user_voice-setting.js similarity index 100% rename from commands/misc/speak/user_voice-setting.js rename to oldCommands/misc/speak/user_voice-setting.js From 1d75d0a1f6d319f172df613c96b1be1257de6984 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 17:33:33 +0900 Subject: [PATCH 09/90] update event loading logger --- libs/EventHandler.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/EventHandler.js b/libs/EventHandler.js index 3f186a6..b1840c0 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -4,19 +4,23 @@ const logger = require("./GetLogger"); function EventHandler(client, eventsPath) { const Log = logger.createChannel("event"); - Log.debug("Loading..."); + Log.info("Loading..."); const events = []; fs.readdirSync(eventsPath).forEach((dir) => { + Log.debug(`Loading ${dir}...`); const eventPath = path.resolve(eventsPath, dir); const eventFiles = fs.readdirSync(eventPath).filter(file => file.endsWith(".js")); for (const file of eventFiles) { + Log.debug(`Loading ${dir} ${file}...`); const event = require(path.resolve(eventPath, file)); event.logger = Log.createChild(event.name); client.on(event.name, (...args) => event.execute(...args, event.logger)); events.push(event); + Log.debug(`Loaded ${dir} ${event.name} (${file})`); } + Log.debug(`Loaded ${eventFiles.length} events for ${dir}`); }); - Log.debug(`Loaded ${events.length} events`); + Log.info(`Loaded ${events.length} events`); return events; } From a01fdb90fd1710b27d1c3e2463f611bbcc4b0e0e Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 17:55:23 +0900 Subject: [PATCH 10/90] =?UTF-8?q?slashcommand=E3=81=AE=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit エラーの表示 エラーのロガー AutoCompleteが機能していなかった --- events/misc/slashcommand.js | 44 ++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/events/misc/slashcommand.js b/events/misc/slashcommand.js index ad28524..748860c 100644 --- a/events/misc/slashcommand.js +++ b/events/misc/slashcommand.js @@ -5,38 +5,32 @@ module.exports = { name: Events.InteractionCreate, async execute(interaction) { const { client } = interaction; + const command = client.commands.get(interaction.commandName); + if (!command) return; if (interaction.isAutocomplete()) { - const command = client.commands.get(interaction.commandName); if (!command) return; try { await command.autocomplete(interaction, command.logger); } catch (error) { - command.logger.error(`${error.message}\n${error.stack}`); + command.logger.error(error); } - } else { - const command = client.commands.get(interaction.commandName); - if (!command) return; - try { - const response = await command.execute(interaction, command.logger); - if (command.subcommands) { - const subcommand = command.subcommands.get(interaction.options.getSubcommand()); - const args = response ?? []; - subcommand.execute(interaction, ...args, command.logger); - } - } catch (error) { - command.logger.error(`${error.message}\n${error.stack}`); - const embed = new EmbedBuilder() - .setTitle("⚠エラー") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | SlashCommand" }) - .setColor(Colors.Red); - if (error.message === "Missing Permissions") { - embed.setDescription("権限が足りません。\nBOTに権限を与えてください") - interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); - } else { - embed.setDescription(`不明なエラーが発生しました。\n詳細:${error.message}\n運営に問い合わせていただけると幸いです。`) - interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); - } + } + try { + const response = await command.execute(interaction, command.logger); + if (command.subcommands) { + const subcommand = command.subcommands.get(interaction.options.getSubcommand()); + const args = response ?? []; + subcommand.execute(interaction, ...args, command.logger); + } + } catch (error) { + command.logger.error(error); + const embed = new CustomEmbed("error").typeError(); + if (error.message === "Missing Permissions") { + embed.setDescription("権限が足りません。\nBOTに権限を与えてください") + } else { + embed.setDescription(`不明なエラーが発生しました。\n詳細:${error.message}\n運営に問い合わせていただけると幸いです。`) } + interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); } } }; \ No newline at end of file From 2c6f971416dfb8b9ec1cf51be20b13b54a54ed56 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 23:06:18 +0900 Subject: [PATCH 11/90] =?UTF-8?q?=E3=81=84=E3=82=8D=E3=81=84=E3=82=8D?= =?UTF-8?q?=EF=BC=88=E4=B8=BB=E3=81=ABspeak=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/game/minecraft.js | 16 ++-- commands/misc/poll.js | 52 ++++++------ commands/server/ticket.js | 11 ++- commands/speak/admin/setvoice.js | 82 ++++++++++++++++++ .../misc => commands/speak}/adminspeak.js | 32 ++++--- commands/speak/general/disconnect.js | 36 ++++++++ commands/speak/general/join.js | 29 +++++++ commands/speak/general/setvoice.js | 82 ++++++++++++++++++ commands/speak/general/skip.js | 24 ++++++ {oldCommands/misc => commands/speak}/speak.js | 83 +++++++++---------- .../speak/subcommands}/dictionary_add.js | 0 .../speak/subcommands}/dictionary_export.js | 0 .../speak/subcommands}/dictionary_import.js | 0 .../speak/subcommands}/dictionary_remove.js | 0 .../speak/subcommands}/dictionary_reset.js | 0 .../speak/subcommands}/dictionary_username.js | 0 .../speak/subcommands}/exvoice.js | 0 .../speak/subcommands}/live_read.js | 0 .../speak/subcommands}/live_read_stop.js | 0 .../speak/subcommands}/read_through.js | 0 .../subcommands}/server_auto-join-delete.js | 0 .../speak/subcommands}/server_auto-join.js | 0 .../speak/subcommands}/server_exvoice-word.js | 0 .../speak/subcommands}/server_exvoice.js | 0 .../speak/subcommands}/server_force-guild.js | 0 .../speak/subcommands}/server_read-bot.js | 0 .../speak/subcommands}/server_read-user.js | 0 .../speak/subcommands}/server_read.js | 0 .../speak/subcommands}/server_reset.js | 0 .../server_user-dictionary-list.js | 0 .../speak/subcommands}/server_vc-only-tts.js | 0 .../subcommands}/server_voice-setting.js | 0 .../speak/subcommands}/server_voice.js | 0 .../speak/subcommands}/setting-show.js | 0 .../speak/subcommands}/user_reset.js | 0 .../speak/subcommands}/user_voice-setting.js | 0 helpers/optionslash.json | 4 - libs/EmbedUtil.js | 4 +- libs/SlashCommandHandler.js | 4 +- oldCommands/misc/speak/disconnect.js | 34 -------- oldCommands/misc/speak/join.js | 28 ------- oldCommands/misc/speak/setvoice.js | 68 --------------- oldCommands/misc/speak/skip.js | 29 ------- 43 files changed, 358 insertions(+), 260 deletions(-) create mode 100644 commands/speak/admin/setvoice.js rename {oldCommands/misc => commands/speak}/adminspeak.js (92%) create mode 100644 commands/speak/general/disconnect.js create mode 100644 commands/speak/general/join.js create mode 100644 commands/speak/general/setvoice.js create mode 100644 commands/speak/general/skip.js rename {oldCommands/misc => commands/speak}/speak.js (78%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_add.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_export.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_import.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_remove.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_reset.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/dictionary_username.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/exvoice.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/live_read.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/live_read_stop.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/read_through.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_auto-join-delete.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_auto-join.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_exvoice-word.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_exvoice.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_force-guild.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_read-bot.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_read-user.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_read.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_reset.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_user-dictionary-list.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_vc-only-tts.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_voice-setting.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/server_voice.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/setting-show.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/user_reset.js (100%) rename {oldCommands/misc/speak => commands/speak/subcommands}/user_voice-setting.js (100%) delete mode 100644 helpers/optionslash.json delete mode 100644 oldCommands/misc/speak/disconnect.js delete mode 100644 oldCommands/misc/speak/join.js delete mode 100644 oldCommands/misc/speak/setvoice.js delete mode 100644 oldCommands/misc/speak/skip.js diff --git a/commands/game/minecraft.js b/commands/game/minecraft.js index 865928f..99c4f9e 100644 --- a/commands/game/minecraft.js +++ b/commands/game/minecraft.js @@ -1,10 +1,11 @@ const axios = require("axios"); +const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../libs"); const ServerInfo = { builder: (builder) => builder - .setName("serverinfojava") - .setDescription("Java版Minecraftサーバー情報") + .setName("serverinfo") + .setDescription("Minecraftサーバー情報") .addStringOption((option) => option .setName("type") .setDescription("サーバーの種類") @@ -47,7 +48,7 @@ const ServerInfo = { } ) .setThumbnail("https://cdn.mikn.dev/mclogo.png") - .setColor(json.online ? "GREEN" : "RED"); + .setColor(json.online ? Colors.Green : Colors.Red); interaction.reply({ embeds: [embed] }); }) .catch((error) => { @@ -68,7 +69,7 @@ const UserInfo = { .setRequired(true) ) , - async execute(interaction) { + async execute(interaction, logger) { const username = interaction.options.getString("username"); const embed = new CustomEmbed("minecraft"); function notFound() { @@ -96,9 +97,12 @@ const UserInfo = { } ) .setImage(JSON.parse(Buffer.from(response.data.properties[0].value, "base64").toString()).textures.SKIN.url) - .setColor("GREEN"); + .setColor(Colors.Green); + interaction.reply({ embeds: [embed] }); }) - .catch(notFound); + .catch((error) => { + logger.error(error); + }); }) .catch(notFound); } diff --git a/commands/misc/poll.js b/commands/misc/poll.js index d30fe60..8e3e05d 100644 --- a/commands/misc/poll.js +++ b/commands/misc/poll.js @@ -1,9 +1,8 @@ const { Colors } = require("discord.js"); const { CustomEmbed, getEmbedName, ColorsChoice } = require("../../libs"); -const maxChoice = 10; +const defaultMaxChoice = 10; const ExampleEmojis = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"]; -const bar = "=========================>"; const pollCreate = { builder: (builder) => { @@ -15,6 +14,19 @@ const pollCreate = { .setDescription("アンケート画面のタイトル") .setRequired(true) ) + for (let i = 1; i <= defaultMaxChoice; i++) { + builder + .addStringOption(option => option + .setName(`choice${i}`) + .setDescription(`アンケートの${i}番目の選択肢`) + .setRequired(i === 1) + ) + .addStringOption(option => option + .setName(`emoji${i}`) + .setDescription(`アンケートの${i}番目の絵文字`) + ); + } + builder .addAttachmentOption(option => option .setName("image") .setDescription("アンケート画面の画像") @@ -27,21 +39,9 @@ const pollCreate = { .addIntegerOption(option => option .setName("maxchoice") .setDescription("アンケートの選択肢の最大数") - .setMaxValue(maxChoice) + .setMaxValue(defaultMaxChoice) .setMinValue(1) - .setRequired(true) ); - for (let i = 1; i <= maxChoice; i++) { - builder - .addStringOption(option => option - .setName(`choice${i}`) - .setDescription(`アンケートの${i}番目の選択肢`) - ) - .addStringOption(option => option - .setName(`emoji${i}`) - .setDescription(`アンケートの${i}番目の絵文字`) - ); - } return builder; }, async execute(interaction) { @@ -49,7 +49,7 @@ const pollCreate = { const title = options.getString("title"); const color = options.getString("color") ?? "Blue"; const image = options.getAttachment("image"); - const maxChoice = options.getInteger("maxchoice"); + const maxChoice = options.getInteger("maxchoice") || defaultMaxChoice; const choices = []; const emojis = []; const nonSelectEmoji = Array.from(ExampleEmojis); @@ -65,7 +65,7 @@ const pollCreate = { const loadEmbed = new CustomEmbed("poll") .setTitle("処理中..."); - const message = await interaction.channel.send({ embeds: [loadEmbed] }); + const message = await interaction.reply({ embeds: [loadEmbed] , fetchReply: true }); for (const emoji of emojis) { const check = await message.react(emoji).catch((error) => { }); if (!check) { @@ -82,7 +82,7 @@ const pollCreate = { .setDescription(description) .setColor(Colors[color]) if (image) pollEmbed.setImage(image.attachment); - message.edit({ embeds: [pollEmbed] }) + interaction.editReply({ embeds: [pollEmbed] }) } }; @@ -104,17 +104,17 @@ const pollSum = { const { options, guild } = interaction; const messageId = options.getString("messageid"); const channelId = options.getString("channelid"); - let message, channel; + let message, channel, pollEmbed; try { channel = channelId ? await guild.channels.fetch(channelId) : interaction.channel; message = await channel.messages.fetch(messageId); - if (!message.embeds[0] || getEmbedName(message.embeds[0]).startsWith("poll")) throw new Error(); + pollEmbed = message.embeds[0]?.data; + if (!pollEmbed || !getEmbedName(pollEmbed).startsWith("poll")) throw new Error(); } catch (error) { const embed = new CustomEmbed("poll").typeError() .setDescription("pollメッセージが取得できませんでした。") return interaction.reply({ embeds: [embed], ephemeral: true }); } - const pollEmbed = message.embeds[0]; const reactions = message.reactions.cache; const contents = pollEmbed.description.split("\n").slice(0, -2); let allCount = 0; @@ -122,20 +122,22 @@ const pollSum = { .map((content) => { const [emoji, ...textArr] = content.split(" "); const text = textArr.join(" "); - const count = reactions.get(emoji)?.count ?? 0; + const count = (reactions.get(emoji)?.count ?? 1) - 1; allCount += count; return { emoji, text, count }; }) .map((data) => { data.percent = ((data.count / allCount) * 100).toFixed(1); - data.bar = bar.slice(0, (bar.length - 1 - Math.floor(data.count / (allCount / (bar.length - 1))))) + //ゼロ幅スペースと全角スペースを使ってます。 + data.bar = "​ " + "▀".repeat(Math.round(data.percent / 14)); + return data; }); const text = data.map(d => `${d.emoji} ${d.text} **${d.percent}% (${d.count}票)**\n${d.bar}`).join("\n"); const embed = new CustomEmbed("sumpoll") .setTitle(pollEmbed.title) - .setDescription(`${text}\n\n[元のアンケート](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.id})`) + .setDescription(`${text}\n[元のアンケート](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.id})`) .setColor(Colors.Green); - interaction.reply({ embeds: [embed], ephemeral: true }); + interaction.reply({ embeds: [embed] }); } }; diff --git a/commands/server/ticket.js b/commands/server/ticket.js index 6728951..253286a 100644 --- a/commands/server/ticket.js +++ b/commands/server/ticket.js @@ -75,23 +75,22 @@ const ticketCreate = { embed.typeSuccess() .setDescription("チケット作成画面を作成しました。"); - interaction.reply({ embeds: [success_embed], ephemeral: true }); + interaction.reply({ embeds: [embed], ephemeral: true }); } }; const ticketDelete = { builder: (builder) => builder - .setName("delete") - .setDescription("チケット作成画面を削除します。") + .setName("logdelete") + .setDescription("チケットのログチャンネルを削除します(チャンネルそのものを削除するわけではありません)。") , async execute(interaction, data) { const embed = new CustomEmbed("ticket"); - - if (!data?.guildid) { + if (!(data?.guildid)) { embed.typeError() .setDescription("データが見つかりませんでした。"); } else { - const sqlDelete = await Utils.sql(`DELETE FROM ticket_channel WHERE guildid = ${escape(interaction.guild.id)};`); + const sqlDelete = await Utils.sql(`DELETE FROM ticket_channel WHERE guildid=${escape(interaction.guild.id)};`); if (!sqlDelete) { embed.typeError() .setDescription("データの削除に失敗しました。"); diff --git a/commands/speak/admin/setvoice.js b/commands/speak/admin/setvoice.js new file mode 100644 index 0000000..c08ccc7 --- /dev/null +++ b/commands/speak/admin/setvoice.js @@ -0,0 +1,82 @@ +const { Colors, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js"); +const { CustomEmbed, Utils } = require("../../../libs"); +const { escape } = require("mysql2"); + +const voicevoxList = require("../../../helpers/voicelist/voicevoxlist.json"); +const coeiroinkList = require("../../../helpers/voicelist/coeiroinklist.json"); +const sharevoxList = require("../../../helpers/voicelist/sharevoxlist.json"); + +const allList = { + voicevox: require("../../../helpers/voicelist/allvoicevoxlist.json"), + coeiroink: require("../../../helpers/voicelist/allcoeiroinklist.json"), + sharevox: require("../../../helpers/voicelist/allsharevoxlist.json") +}; + +module.exports = { + builder: (builder) => builder + .setName("setvoice") + .setDescription("サーバーの話者を変更します。") + .addStringOption(option => option + .setName("voicevox") + .setDescription("voicevoxの話者") + .addChoices(...voicevoxList) + ) + .addStringOption(option => option + .setName("coeiroink") + .setDescription("coeiroinkの話者") + .addChoices(...coeiroinkList) + ) + .addStringOption(option => option + .setName("sharevox") + .setDescription("sharevoxの話者") + .addChoices(...sharevoxList) + ) + , + execute: async (interaction) => { + const voicevox = interaction.options.getString("voicevox"); + const coeiroink = interaction.options.getString("coeiroink"); + const sharevox = interaction.options.getString("sharevox"); + + const embed = new CustomEmbed("speak"); + if (!voicevox && !coeiroink && !sharevox) { + embed.typeError().setDescription("話者が選択されていません。"); + } else if (voicevox && coeiroink && sharevox) { + embed.typeError().setDescription("話者は一つしか選択できません。"); + } + if (embed.title) return interaction.reply({ embeds: [embed], ephemeral: true }); + + const serviceName = voicevox ? "voicevox" : coeiroink ? "COEIROINK" : "SHAREVOX"; + const speakname = voicevox || coeiroink || sharevox; + embed.typeSuccess().setDescription(`話者を変更しました。\n${speakname}のスタイルを選択してください。\n※3分後に自動キャンセルされます。`); + const component = new ActionRowBuilder() + .addComponents( + new StringSelectMenuBuilder() + .setCustomId("setvoice") + .setPlaceholder("選択されていません") + .addOptions(...allList[serviceName.toLowerCase()] + .filter(name => name.name === speakname)[0] + .styles.map(option => ({ + label: option.name, + value: `${option.id}` + })) + ) + ); + interaction.reply({ embeds: [embed], components: [component], ephemeral: true }) + .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) + .then(async (i) => { + const speakid = i.values[0]; + const speakhost = process.env[serviceName]; + const getdata = await Utils.sql(`select * from server_speak where guildid="${interaction.guild.id}";`); + let sqlStatus; + if (getdata[0][0].guildid) { + sqlStatus = Utils.sql(`update server_speak set speakid=${escape(speakid)},speakhost=${escape(speakhost)},speakname=${speakname} where guildid="${interaction.guild.id}";`); + } else { + sqlStatus = Utils.sql(`INSERT INTO server_speak(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(speakid)},${escape(speakhost)},${escape(speakname)});`) + } + const embed = new CustomEmbed("speak"); + if (!sqlStatus) embed.typeError().setDescription("データの更新でエラーが発生しました。"); + else embed.typeSuccess().setDescription("ボイスがセットされました。"); + interaction.editReply({ embeds: [embed], components: [] }); + }); + } +}; \ No newline at end of file diff --git a/oldCommands/misc/adminspeak.js b/commands/speak/adminspeak.js similarity index 92% rename from oldCommands/misc/adminspeak.js rename to commands/speak/adminspeak.js index 6c65794..d9f96f0 100644 --- a/oldCommands/misc/adminspeak.js +++ b/commands/speak/adminspeak.js @@ -1,9 +1,26 @@ +const { SlashCommandBuilder, ChannelType, PermissionFlagsBits } = require("discord.js"); +const fs = require("fs"); + //voicevox:http://127.0.0.1:50021/docs#/ //COEIROINK:http://127.0.0.1:50031/docs#/ //SHAREVOX:http://127.0.0.1:50025/docs#/ -const { SlashCommandBuilder, ChannelType, PermissionFlagsBits } = require("discord.js"); -const fs = require("fs"); +module.exports = { + subcommands: "./admin", + builder: (builder) => builder + .setName("adminspeak") + .setDescription("読み上げ関係のコマンド") + .setDMPermission(false) + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) + , + async autocomplete(interaction) { + const focusedValue = interaction.options.getFocused(); + await interaction.respond(all_voice_list.filter(data => data.name.startsWith(focusedValue))).catch(() => { }); + }, + async execute() { } +}; + +/* const server_auto_join = require("./speak/server_auto-join"); const server_auto_join_delete = require("./speak/server_auto-join-delete"); const server_force_guild = require("./speak/server_force-guild"); @@ -11,7 +28,6 @@ const server_read_bot = require("./speak/server_read-bot"); const server_read = require("./speak/server_read"); const server_reset = require("./speak/server_reset"); const server_voice_setting = require("./speak/server_voice-setting"); -const server_voice = require("./speak/server_voice"); const server_exvoice = require("./speak/server_exvoice"); const server_exvoice_word = require("./speak/server_exvoice-word"); const server_vc_only_tts = require("./speak/server_vc-only-tts"); @@ -42,15 +58,6 @@ module.exports = { .setDescription("BOTの読み上げを許可するか決めます") .addStringOption(option => option.setName("toggle").setDescription("BOTの読み上げを許可するか").addChoices({ name: "許可", value: "true" }, { name: "禁止", value: "false" }).setRequired(true)) - ) - .addSubcommand(subcommand => - subcommand - .setName("server_voice") - .addStringOption(option => option.setName("voicevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/voicevoxlist.json"))) - .addStringOption(option => option.setName("coeiroink話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/coeiroinklist.json"))) - .addStringOption(option => option.setName("sharevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/sharevoxlist.json"))) - .setDescription("サーバー話者を変更します。") - ) .addSubcommand(subcommand => subcommand @@ -197,3 +204,4 @@ module.exports = { await interaction.deleteReply(); }, }; +*/ \ No newline at end of file diff --git a/commands/speak/general/disconnect.js b/commands/speak/general/disconnect.js new file mode 100644 index 0000000..78a85f0 --- /dev/null +++ b/commands/speak/general/disconnect.js @@ -0,0 +1,36 @@ +const { CustomEmbed } = require("../../../libs"); +const { getVoiceConnection } = require("@discordjs/voice"); + +module.exports = { + builder: (builder) => builder + .setName("disconnect") + .setDescription("ボイスチャンネルから退出します。") + , + execute: async (interaction) => { + const { guild } = interaction; + const vcChannel = getVoiceConnection(guild.id); + const embed = new CustomEmbed("speak"); + if (!vcChannel) { + embed.typeError().setDescription("botがボイスチャンネルに参加していません。"); + } else { + vcChannel.destroy(); + delete globalThis.voice_channel[guild.id]; + if (globalThis.ylivechat[guild.id]) { + try { + await globalThis.ylivechat[guild.id]?.stop(); + } catch (error) { } finally { + delete globalThis.ylivechat[guild.id]; + }; + }; + if (globalThis.tlivechat[guild.id]) { + try { + await globalThis.tlivechat[guild.id]?.disconnect(); + } catch (error) { } finally { + delete globalThis.tlivechat[guild.id]; + }; + }; + embed.typeSuccess().setDescription("ボイスチャンネルから退出しました。"); + } + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/commands/speak/general/join.js b/commands/speak/general/join.js new file mode 100644 index 0000000..6bda848 --- /dev/null +++ b/commands/speak/general/join.js @@ -0,0 +1,29 @@ +const { joinVoiceChannel } = require("@discordjs/voice"); +const { CustomEmbed } = require("../../../libs"); + +module.exports = { + builder: (builder) => builder + .setName("join") + .setDescription("ボイスチャンネルに参加します。") + , + execute(interaction) { + const { guild } = interaction; + const vcChannel = interaction.member.voice.channel; + const embed = new CustomEmbed("speak") + if (!vcChannel) { + embed.typeError().setDescription("ボットを使用するにはボイスチャンネルに参加してください。"); + } else { + joinVoiceChannel({ + channelId: vcChannel.id, + guildId: guild.id, + adapterCreator: guild.voiceAdapterCreator, + selfMute:true, + selfDeaf:true, + }); + if (!globalThis.voice_channel[guild.id]) delete globalThis.voice_channel[guild.id]; + globalThis.voice_channel[guild.id] = interaction.channel.id; + embed.typeSuccess().setDescription("ボイスチャンネルに参加しました。"); + } + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/commands/speak/general/setvoice.js b/commands/speak/general/setvoice.js new file mode 100644 index 0000000..69699a7 --- /dev/null +++ b/commands/speak/general/setvoice.js @@ -0,0 +1,82 @@ +const { ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js"); +const { CustomEmbed, Utils } = require("../../../libs"); +const { escape } = require("mysql2"); + +const voicevoxList = require("../../../helpers/voicelist/voicevoxlist.json"); +const coeiroinkList = require("../../../helpers/voicelist/coeiroinklist.json"); +const sharevoxList = require("../../../helpers/voicelist/sharevoxlist.json"); + +const allList = { + voicevox: require("../../../helpers/voicelist/allvoicevoxlist.json"), + coeiroink: require("../../../helpers/voicelist/allcoeiroinklist.json"), + sharevox: require("../../../helpers/voicelist/allsharevoxlist.json") +}; + +module.exports = { + builder: (builder) => builder + .setName("setvoice") + .setDescription("話者を変更します。") + .addStringOption(option => option + .setName("voicevox") + .setDescription("voicevoxの話者") + .addChoices(...voicevoxList) + ) + .addStringOption(option => option + .setName("coeiroink") + .setDescription("coeiroinkの話者") + .addChoices(...coeiroinkList) + ) + .addStringOption(option => option + .setName("sharevox") + .setDescription("sharevoxの話者") + .addChoices(...sharevoxList) + ) + , + execute: async (interaction) => { + const voicevox = interaction.options.getString("voicevox"); + const coeiroink = interaction.options.getString("coeiroink"); + const sharevox = interaction.options.getString("sharevox"); + + const embed = new CustomEmbed("speak"); + if (!voicevox && !coeiroink && !sharevox) { + embed.typeError().setDescription("話者が選択されていません。"); + } else if (voicevox && coeiroink && sharevox) { + embed.typeError().setDescription("話者は一つしか選択できません。"); + } + if (embed.title) return interaction.reply({ embeds: [embed], ephemeral: true }); + + const serviceName = voicevox ? "voicevox" : coeiroink ? "COEIROINK" : "SHAREVOX"; + const speakname = voicevox || coeiroink || sharevox; + embed.typeSuccess().setDescription(`話者を変更しました。\n${speakname}のスタイルを選択してください。\n※3分後に自動キャンセルされます。`); + const component = new ActionRowBuilder() + .addComponents( + new StringSelectMenuBuilder() + .setCustomId("setvoice") + .setPlaceholder("選択されていません") + .addOptions(...allList[serviceName.toLowerCase()] + .filter(name => name.name === speakname)[0] + .styles.map(option => ({ + label: option.name, + value: `${option.id}` + })) + ) + ); + interaction.reply({ embeds: [embed], components: [component], ephemeral: true }) + .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) + .then(async (i) => { + const speakid = i.values[0]; + const speakhost = process.env[serviceName]; + const getdata = await Utils.sql(`select * from "user_speak" where userid="${interaction.user.id}";`); + let sqlStatus; + if (getdata[0][0].userid) { + sqlStatus = Utils.sql(`update "user_speak" set speakid=${escape(speakid)},speakhost=${escape(speakhost)},speakname=${speakname} where userid="${interaction.user.id}";`); + } else { + sqlStatus = Utils.sql(`INSERT INTO "user_speak"(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(speakid)},${escape(speakhost)},${escape(speakname)});`) + } + const embed = new CustomEmbed("speak"); + if (!sqlStatus) embed.typeError().setDescription("データの更新でエラーが発生しました。"); + else embed.typeSuccess().setDescription("ボイスがセットされました。"); + interaction.editReply({ embeds: [embed], components: [] }); + }); + } +}; \ No newline at end of file diff --git a/commands/speak/general/skip.js b/commands/speak/general/skip.js new file mode 100644 index 0000000..30d52ad --- /dev/null +++ b/commands/speak/general/skip.js @@ -0,0 +1,24 @@ +const { CustomEmbed } = require("../../../libs"); +const { read } = require("../../../helpers/read"); + +module.exports = { + builder: (builder) => builder + .setName("skip") + .setDescription("読み上げをスキップします。") + , + execute: async (interaction) => { + const { guild } = interaction; + const vcChannel = interaction.member.voice.channel; + const embed = new CustomEmbed("speak"); + if (!vcChannel) { + embed.typeError().setDescription("botがボイスチャンネルに参加していません。"); + } else if (!globalThis.voice_channel[guild.id]) { + embed.typeError().setDescription("ボイスチャンネルのデータが取得できません。"); + } else if (globalThis.voice_channel[guild.id] !== interaction.member.voice.channel.id) { + embed.typeError().setDescription("あなたと参加しているボイスチャンネルが違います。"); + } else { + await read(interaction, "システム", "スキップしました", true); + } + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/oldCommands/misc/speak.js b/commands/speak/speak.js similarity index 78% rename from oldCommands/misc/speak.js rename to commands/speak/speak.js index f1d41db..2347e14 100644 --- a/oldCommands/misc/speak.js +++ b/commands/speak/speak.js @@ -1,6 +1,18 @@ -const { SlashCommandBuilder } = require('discord.js'); -const join = require("./speak/join"); -const disconnect = require("./speak/disconnect"); +module.exports = { + subcommands: "./general", + builder: (builder) => builder + .setName("speak") + .setDescription("読み上げ関係のコマンド") + .setDMPermission(false) + , + async autocomplete(interaction) { + const focusedValue = interaction.options.getFocused(); + await interaction.respond(all_voice_list.filter(data => data.name.startsWith(focusedValue))).catch(() => { }); + }, + async execute() { } +}; + +/* const dictionary_add = require("./speak/dictionary_add"); const dictionary_export = require("./speak/dictionary_export"); const dictionary_import = require("./speak/dictionary_import"); @@ -18,100 +30,82 @@ const all_voice_list = require("../../helpers/voicelist/allvoicelist.json"); let response; module.exports = { data: new SlashCommandBuilder() - .setName('speak') - .setDescription('読み上げ関係のコマンド') - .setDMPermission(false) - .addSubcommand(subcommand => - subcommand - .setName('join') - .setDescription('ボイスチャンネルに参加します。') - ) - .addSubcommand(subcommand => - subcommand - .setName('skip') - .setDescription('読み上げをスキップします。') - ) - .addSubcommand(subcommand => - subcommand - .setName('disconnect') - .setDescription('ボイスチャンネルから退出します。') - ) .addSubcommand(subcommand => subcommand - .setName('user_voice') + .setName("user_voice") .addStringOption(option => option.setName("voicevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/voicevoxlist.json"))) .addStringOption(option => option.setName("coeiroink話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/coeiroinklist.json"))) .addStringOption(option => option.setName("sharevox話者名").setDescription("話者を選択してください").addChoices(...require("../../helpers/voicelist/sharevoxlist.json"))) - .setDescription('話者を変更します。') + .setDescription("話者を変更します。") ) .addSubcommand(subcommand => subcommand - .setName('user_voice-setting') - .setDescription('ユーザーの各種voice設定をします。') + .setName("user_voice-setting") + .setDescription("ユーザーの各種voice設定をします。") .addStringOption(option => option.setName("args").setDescription("設定する項目を選択").addChoices({ name: "pitch", value: "pitch" }, { name: "speed", value: "speed" }, { name: "intonation", value: "intonation" }).setRequired(true)) .addNumberOption(option => option.setName("number").setDescription("数値を入力")) ) .addSubcommand(subcommand => subcommand - .setName('dictionary_add') - .setDescription('辞書を設定します。') + .setName("dictionary_add") + .setDescription("辞書を設定します。") .addStringOption(option => option.setName("before").setDescription("変換前").setRequired(true)) .addStringOption(option => option.setName("after").setDescription("変換後").setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('dictionary_remove') - .setDescription('辞書を削除します。') + .setName("dictionary_remove") + .setDescription("辞書を削除します。") .addStringOption(option => option.setName("delete").setDescription("言葉").setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('dictionary_export') - .setDescription('辞書の内容をエクスポートします。') + .setName("dictionary_export") + .setDescription("辞書の内容をエクスポートします。") .addStringOption(option => option.setName("format").setDescription("形式を選択").addChoices({ name: "JSON", value: "json" }, { name: "colon", value: "colon" }, { name: "csv", value: "csv" })) ) .addSubcommand(subcommand => subcommand - .setName('dictionary_import') - .setDescription('辞書をインポートします。') + .setName("dictionary_import") + .setDescription("辞書をインポートします。") .addAttachmentOption(option => option.setName("file").setDescription("json形式にしてください").setRequired(true)) ) .addSubcommand(subcommand => subcommand - .setName('server_user-dictionary-list') + .setName("server_user-dictionary-list") .addStringOption(option => option.setName("select").setDescription("選択してください").addChoices({ name: "user-read", value: "user" }, { name: "dictionary", value: "dictionary" }).setRequired(true)) .setDescription("辞書の一覧又は読み上げないユーザーを表示します。") ) .addSubcommand(subcommand => subcommand - .setName('user_reset') - .setDescription('ユーザー設定初期化') + .setName("user_reset") + .setDescription("ユーザー設定初期化") ) .addSubcommand(subcommand => subcommand - .setName('setting_show') + .setName("setting_show") .addStringOption(option => option.setName("select").setDescription("対象の選択").addChoices({ name: "server", value: "server" }, { name: "user", value: "user" }).setRequired(true)) - .setDescription('読み上げ関連設定の表示') + .setDescription("読み上げ関連設定の表示") ) .addSubcommand(subcommand => subcommand - .setName('live_read') + .setName("live_read") .addStringOption(option => option.setName("select").setDescription("選択してください").addChoices({ name: "youtube", value: "youtube" }, { name: "twitch", value: "twitch" }).setRequired(true)) .addStringOption(option => option.setName("url").setDescription("LIVEのURLを入力").setRequired(true)) - .setDescription('ライブの読み上げ。') + .setDescription("ライブの読み上げ。") ) .addSubcommand(subcommand => subcommand - .setName('live_read-stop') + .setName("live_read-stop") .addStringOption(option => option.setName("select").setDescription("選択してください").addChoices({ name: "youtube", value: "youtube" }, { name: "twitch", value: "twitch" }).setRequired(true)) - .setDescription('ライブの読み上げを停止します。') + .setDescription("ライブの読み上げを停止します。") ) .addSubcommand(subcommand => subcommand - .setName('exvoice-word') + .setName("exvoice-word") .addStringOption(option => option.setName("select").setDescription("単語の操作").addChoices({ name: "除外リスト", value: "removelist" }, { name: "一覧", value: "list" }).setRequired(true)) .addStringOption(option => option.setName("話者").setDescription("話者の選択").setAutocomplete(true).setRequired(true)) - .setDescription('読み上げないexvoiceの追加。') + .setDescription("読み上げないexvoiceの追加。") ), async autocomplete(interaction) { const focusedValue = interaction.options.getFocused(); @@ -186,3 +180,4 @@ module.exports = { await interaction.deleteReply(); }, }; +*/ \ No newline at end of file diff --git a/oldCommands/misc/speak/dictionary_add.js b/commands/speak/subcommands/dictionary_add.js similarity index 100% rename from oldCommands/misc/speak/dictionary_add.js rename to commands/speak/subcommands/dictionary_add.js diff --git a/oldCommands/misc/speak/dictionary_export.js b/commands/speak/subcommands/dictionary_export.js similarity index 100% rename from oldCommands/misc/speak/dictionary_export.js rename to commands/speak/subcommands/dictionary_export.js diff --git a/oldCommands/misc/speak/dictionary_import.js b/commands/speak/subcommands/dictionary_import.js similarity index 100% rename from oldCommands/misc/speak/dictionary_import.js rename to commands/speak/subcommands/dictionary_import.js diff --git a/oldCommands/misc/speak/dictionary_remove.js b/commands/speak/subcommands/dictionary_remove.js similarity index 100% rename from oldCommands/misc/speak/dictionary_remove.js rename to commands/speak/subcommands/dictionary_remove.js diff --git a/oldCommands/misc/speak/dictionary_reset.js b/commands/speak/subcommands/dictionary_reset.js similarity index 100% rename from oldCommands/misc/speak/dictionary_reset.js rename to commands/speak/subcommands/dictionary_reset.js diff --git a/oldCommands/misc/speak/dictionary_username.js b/commands/speak/subcommands/dictionary_username.js similarity index 100% rename from oldCommands/misc/speak/dictionary_username.js rename to commands/speak/subcommands/dictionary_username.js diff --git a/oldCommands/misc/speak/exvoice.js b/commands/speak/subcommands/exvoice.js similarity index 100% rename from oldCommands/misc/speak/exvoice.js rename to commands/speak/subcommands/exvoice.js diff --git a/oldCommands/misc/speak/live_read.js b/commands/speak/subcommands/live_read.js similarity index 100% rename from oldCommands/misc/speak/live_read.js rename to commands/speak/subcommands/live_read.js diff --git a/oldCommands/misc/speak/live_read_stop.js b/commands/speak/subcommands/live_read_stop.js similarity index 100% rename from oldCommands/misc/speak/live_read_stop.js rename to commands/speak/subcommands/live_read_stop.js diff --git a/oldCommands/misc/speak/read_through.js b/commands/speak/subcommands/read_through.js similarity index 100% rename from oldCommands/misc/speak/read_through.js rename to commands/speak/subcommands/read_through.js diff --git a/oldCommands/misc/speak/server_auto-join-delete.js b/commands/speak/subcommands/server_auto-join-delete.js similarity index 100% rename from oldCommands/misc/speak/server_auto-join-delete.js rename to commands/speak/subcommands/server_auto-join-delete.js diff --git a/oldCommands/misc/speak/server_auto-join.js b/commands/speak/subcommands/server_auto-join.js similarity index 100% rename from oldCommands/misc/speak/server_auto-join.js rename to commands/speak/subcommands/server_auto-join.js diff --git a/oldCommands/misc/speak/server_exvoice-word.js b/commands/speak/subcommands/server_exvoice-word.js similarity index 100% rename from oldCommands/misc/speak/server_exvoice-word.js rename to commands/speak/subcommands/server_exvoice-word.js diff --git a/oldCommands/misc/speak/server_exvoice.js b/commands/speak/subcommands/server_exvoice.js similarity index 100% rename from oldCommands/misc/speak/server_exvoice.js rename to commands/speak/subcommands/server_exvoice.js diff --git a/oldCommands/misc/speak/server_force-guild.js b/commands/speak/subcommands/server_force-guild.js similarity index 100% rename from oldCommands/misc/speak/server_force-guild.js rename to commands/speak/subcommands/server_force-guild.js diff --git a/oldCommands/misc/speak/server_read-bot.js b/commands/speak/subcommands/server_read-bot.js similarity index 100% rename from oldCommands/misc/speak/server_read-bot.js rename to commands/speak/subcommands/server_read-bot.js diff --git a/oldCommands/misc/speak/server_read-user.js b/commands/speak/subcommands/server_read-user.js similarity index 100% rename from oldCommands/misc/speak/server_read-user.js rename to commands/speak/subcommands/server_read-user.js diff --git a/oldCommands/misc/speak/server_read.js b/commands/speak/subcommands/server_read.js similarity index 100% rename from oldCommands/misc/speak/server_read.js rename to commands/speak/subcommands/server_read.js diff --git a/oldCommands/misc/speak/server_reset.js b/commands/speak/subcommands/server_reset.js similarity index 100% rename from oldCommands/misc/speak/server_reset.js rename to commands/speak/subcommands/server_reset.js diff --git a/oldCommands/misc/speak/server_user-dictionary-list.js b/commands/speak/subcommands/server_user-dictionary-list.js similarity index 100% rename from oldCommands/misc/speak/server_user-dictionary-list.js rename to commands/speak/subcommands/server_user-dictionary-list.js diff --git a/oldCommands/misc/speak/server_vc-only-tts.js b/commands/speak/subcommands/server_vc-only-tts.js similarity index 100% rename from oldCommands/misc/speak/server_vc-only-tts.js rename to commands/speak/subcommands/server_vc-only-tts.js diff --git a/oldCommands/misc/speak/server_voice-setting.js b/commands/speak/subcommands/server_voice-setting.js similarity index 100% rename from oldCommands/misc/speak/server_voice-setting.js rename to commands/speak/subcommands/server_voice-setting.js diff --git a/oldCommands/misc/speak/server_voice.js b/commands/speak/subcommands/server_voice.js similarity index 100% rename from oldCommands/misc/speak/server_voice.js rename to commands/speak/subcommands/server_voice.js diff --git a/oldCommands/misc/speak/setting-show.js b/commands/speak/subcommands/setting-show.js similarity index 100% rename from oldCommands/misc/speak/setting-show.js rename to commands/speak/subcommands/setting-show.js diff --git a/oldCommands/misc/speak/user_reset.js b/commands/speak/subcommands/user_reset.js similarity index 100% rename from oldCommands/misc/speak/user_reset.js rename to commands/speak/subcommands/user_reset.js diff --git a/oldCommands/misc/speak/user_voice-setting.js b/commands/speak/subcommands/user_voice-setting.js similarity index 100% rename from oldCommands/misc/speak/user_voice-setting.js rename to commands/speak/subcommands/user_voice-setting.js diff --git a/helpers/optionslash.json b/helpers/optionslash.json deleted file mode 100644 index 55da8bd..0000000 --- a/helpers/optionslash.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "パネルを選択", - "type": 3 -} \ No newline at end of file diff --git a/libs/EmbedUtil.js b/libs/EmbedUtil.js index f3bea4c..675f5c6 100644 --- a/libs/EmbedUtil.js +++ b/libs/EmbedUtil.js @@ -23,9 +23,9 @@ class CustomEmbed extends EmbedBuilder { } function getEmbedName(embed) { - const footer = embed.footer; + const footer = embed.footer.text; if (!footer) return null; - if (!footer.startWith(footerCR + " | ")) return null; + if (!footer.startsWith(footerCR + " | ")) return null; return footer.slice(footerCR.length + 3); } diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index 0922a8a..4fff918 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -2,7 +2,6 @@ const { Collection, REST, Routes, SlashCommandBuilder, SlashCommandSubcommandBui const fs = require("fs"); const path = require("path"); const logger = require("./GetLogger"); -const option = require("../helpers/optionslash.json"); function SlashCommandHandler(commandsPath) { const Log = logger.createChannel("command"); @@ -35,6 +34,7 @@ function SlashCommandHandler(commandsPath) { command.subcommands = new Collection(); subcommands.forEach(subcommand => { const subcommandBuilder = subcommand.builder(new SlashCommandSubcommandBuilder()); + commandBuilder.addSubcommand(subcommandBuilder); subcommand.logger = command.logger.createChild(subcommandBuilder.name); subcommand.data = subcommandBuilder.toJSON(); command.subcommands.set(subcommandBuilder.name, subcommand); @@ -52,7 +52,7 @@ function SlashCommandHandler(commandsPath) { const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); rest.put( Routes.applicationCommands(process.env.clientId), - { body: [option, ...commands.map(command => command.data)] }, + { body: commands.map(command => command.data) }, ).then((data) => { Log.info(`Deployed ${data.length} commands`); }).catch((error) => { diff --git a/oldCommands/misc/speak/disconnect.js b/oldCommands/misc/speak/disconnect.js deleted file mode 100644 index 98d7e08..0000000 --- a/oldCommands/misc/speak/disconnect.js +++ /dev/null @@ -1,34 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { getVoiceConnection } = require('@discordjs/voice'); -const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription("ボイスチャンネルにから退出しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) - .setColor(Colors.Green); -const undefined_channel = new EmbedBuilder() - .setTitle(`⚠エラー`) - .setDescription("ボイスチャンネルに参加していません。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) - .setColor(Colors.Red); - -module.exports = async (interaction) => { - const voiceChannel = getVoiceConnection(interaction.guildId); - if (!voiceChannel) return ({ embeds: [undefined_channel] }); - voiceChannel.destroy(); - delete globalThis.voice_channel[interaction.guild.id]; - if (globalThis.ylivechat[interaction.guild.id]) { - try { - await globalThis.ylivechat[interaction.guild.id]?.stop(); - } catch (ex) { } finally { - delete globalThis.ylivechat[interaction.guild.id]; - }; - }; - if (globalThis.tlivechat[interaction.guild.id]) { - try { - await globalThis.tlivechat[interaction.guild.id]?.disconnect(); - } catch (ex) { } finally { - delete globalThis.tlivechat[interaction.guild.id]; - }; - }; - return ({ embeds: [success] }); -}; diff --git a/oldCommands/misc/speak/join.js b/oldCommands/misc/speak/join.js deleted file mode 100644 index 7e00732..0000000 --- a/oldCommands/misc/speak/join.js +++ /dev/null @@ -1,28 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { joinVoiceChannel } = require('@discordjs/voice'); - -const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription("ボイスチャンネルに参加しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) - .setColor(Colors.Green); -const undefined_channel = new EmbedBuilder() - .setTitle(`⚠エラー`) - .setDescription("貴方が参加しているボイスチャンネルを見つけることができませんでした。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | jobpanel" }) - .setColor(Colors.Red); - -module.exports = async (interaction) => { - const voiceChannel = interaction.member.voice.channel; - if (!voiceChannel) return ({ embeds: [undefined_channel] }); - joinVoiceChannel({ - channelId: voiceChannel.id, - guildId: voiceChannel.guild.id, - adapterCreator: voiceChannel.guild.voiceAdapterCreator, - selfMute:true, - selfDeaf:true, - }); - if (!globalThis.voice_channel[interaction.guild.id]) delete globalThis.voice_channel[interaction.guild.id]; - globalThis.voice_channel[interaction.guild.id] = interaction.channel.id; - return ({ embeds: [success] }); -}; \ No newline at end of file diff --git a/oldCommands/misc/speak/setvoice.js b/oldCommands/misc/speak/setvoice.js deleted file mode 100644 index c9a0c34..0000000 --- a/oldCommands/misc/speak/setvoice.js +++ /dev/null @@ -1,68 +0,0 @@ -const { EmbedBuilder, Colors, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js"); -const undefined_choice = new EmbedBuilder() - .setTitle(`⚠エラー`) - .setDescription("何も選択されていません。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Red); -const voicevox_array = require("../../../helpers/voicelist/allvoicevoxlist.json"); -const coeiroink_array = require("../../../helpers/voicelist/allcoeiroinklist.json"); -const sharevox_array = require("../../../helpers/voicelist/allsharevoxlist.json"); -module.exports = async (interaction) => { - if (interaction.options.getString("voicevox話者名")) { - const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`${interaction.options.getString("voicevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Green); - const select = new ActionRowBuilder() - .addComponents( - new StringSelectMenuBuilder() - .setCustomId('voicevox') - .setPlaceholder('選択されていません') - .addOptions(...voicevox_array - .filter(name => name.name === interaction.options.getString("voicevox話者名"))[0] - .styles - .map(option => ({ label: option.name, description: `${option.name}を選択します`, value: `${process.env.voicevox},${option.id},${interaction.options.getString("voicevox話者名")}` })) - ), - ); - return ({ embeds: [success], components: [select], ephemeral: true }); - } else if (interaction.options.getString("coeiroink話者名")) { - const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`${interaction.options.getString("coeiroink話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Green); - const select = new ActionRowBuilder() - .addComponents( - new StringSelectMenuBuilder() - .setCustomId('coeiroink') - .setPlaceholder('選択されていません') - .addOptions(...coeiroink_array - .filter(name => name.name === interaction.options.getString("coeiroink話者名"))[0] - .styles - .map(option => ({ label: option.name, description: `${option.name}を選択します`, value: `${process.env.COEIROINK},${option.id},${interaction.options.getString("coeiroink話者名")}` })) - ), - ); - return ({ embeds: [success], components: [select], ephemeral: true }); - } else if (interaction.options.getString("sharevox話者名")) { - const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`${interaction.options.getString("sharevox話者名")}のスタイルを選択してください!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Green); - const select = new ActionRowBuilder() - .addComponents( - new StringSelectMenuBuilder() - .setCustomId('sharevox') - .setPlaceholder('選択されていません') - .addOptions(...sharevox_array - .filter(name => name.name === interaction.options.getString("sharevox話者名"))[0] - .styles - .map(option => ({ label: option.name, description: `${option.name}を選択します`, value: `${process.env.SHAREVOX},${option.id},${interaction.options.getString("sharevox話者名")}` })) - ), - ); - return ({ embeds: [success], components: [select], ephemeral: true }); - } else { - return ({ embeds: [undefined_choice] }); - }; -}; \ No newline at end of file diff --git a/oldCommands/misc/speak/skip.js b/oldCommands/misc/speak/skip.js deleted file mode 100644 index 0acc385..0000000 --- a/oldCommands/misc/speak/skip.js +++ /dev/null @@ -1,29 +0,0 @@ -const { EmbedBuilder, Colors } = require("discord.js"); -const { read } = require("../../../helpers/read"); -const nojoin_error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("BOTがボイスチャンネルに参加していません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); -const undefined_error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("ボイスチャンネルのデータが取得できません。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); -const error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("貴方と参加しているボイスチャンネルが違います。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); -const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription(`スキップしました!`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Green); -module.exports = async (interaction) => { - if (!interaction?.guild?.members?.me?.voice?.channel?.id) return ({ embeds: [nojoin_error] }); - if (!globalThis.voice_channel[interaction.guild.id]) return ({ embeds: [undefined_error] }); - if (interaction.member?.voice?.channel?.id !== interaction?.guild?.members?.me?.voice?.channel?.id) return ({ embeds: [error] }); - await read(interaction, "システム", "スキップしました", true); - return ({embeds: [success]}); -}; \ No newline at end of file From 1c150f71acaea0dbfe3f7e7e666dd3b61f9cdfbd Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 17 May 2023 23:29:41 +0900 Subject: [PATCH 12/90] =?UTF-8?q?setvoice=E3=81=AE=E3=83=90=E3=82=B0?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/speak/admin/setvoice.js | 19 +++++------ commands/speak/general/setvoice.js | 25 ++++++-------- events/misc/setvoice.js | 54 ------------------------------ 3 files changed, 19 insertions(+), 79 deletions(-) delete mode 100644 events/misc/setvoice.js diff --git a/commands/speak/admin/setvoice.js b/commands/speak/admin/setvoice.js index c08ccc7..b56002e 100644 --- a/commands/speak/admin/setvoice.js +++ b/commands/speak/admin/setvoice.js @@ -32,18 +32,15 @@ module.exports = { .addChoices(...sharevoxList) ) , - execute: async (interaction) => { + async execute(interaction) { const voicevox = interaction.options.getString("voicevox"); const coeiroink = interaction.options.getString("coeiroink"); const sharevox = interaction.options.getString("sharevox"); - const embed = new CustomEmbed("speak"); - if (!voicevox && !coeiroink && !sharevox) { - embed.typeError().setDescription("話者が選択されていません。"); - } else if (voicevox && coeiroink && sharevox) { - embed.typeError().setDescription("話者は一つしか選択できません。"); - } - if (embed.title) return interaction.reply({ embeds: [embed], ephemeral: true }); + const selectedCount = [voicevox, coeiroink, sharevox].filter(Boolean).length; + if (selectedCount === 0) embed.typeError().setDescription("話者が選択されていません。"); + if (selectedCount > 1) embed.typeError().setDescription("話者は一つしか選択できません。"); + if (embed.data.title) return interaction.reply({ embeds: [embed], ephemeral: true }); const serviceName = voicevox ? "voicevox" : coeiroink ? "COEIROINK" : "SHAREVOX"; const speakname = voicevox || coeiroink || sharevox; @@ -61,14 +58,14 @@ module.exports = { })) ) ); - interaction.reply({ embeds: [embed], components: [component], ephemeral: true }) - .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) + const message = await interaction.reply({ embeds: [embed], components: [component], ephemeral: true, fetchReply: true }) + message.awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) .then(async (i) => { const speakid = i.values[0]; const speakhost = process.env[serviceName]; const getdata = await Utils.sql(`select * from server_speak where guildid="${interaction.guild.id}";`); let sqlStatus; - if (getdata[0][0].guildid) { + if (getdata[0][0]?.guildid) { sqlStatus = Utils.sql(`update server_speak set speakid=${escape(speakid)},speakhost=${escape(speakhost)},speakname=${speakname} where guildid="${interaction.guild.id}";`); } else { sqlStatus = Utils.sql(`INSERT INTO server_speak(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(speakid)},${escape(speakhost)},${escape(speakname)});`) diff --git a/commands/speak/general/setvoice.js b/commands/speak/general/setvoice.js index 69699a7..4e853d9 100644 --- a/commands/speak/general/setvoice.js +++ b/commands/speak/general/setvoice.js @@ -32,18 +32,15 @@ module.exports = { .addChoices(...sharevoxList) ) , - execute: async (interaction) => { + async execute(interaction) { const voicevox = interaction.options.getString("voicevox"); const coeiroink = interaction.options.getString("coeiroink"); const sharevox = interaction.options.getString("sharevox"); - const embed = new CustomEmbed("speak"); - if (!voicevox && !coeiroink && !sharevox) { - embed.typeError().setDescription("話者が選択されていません。"); - } else if (voicevox && coeiroink && sharevox) { - embed.typeError().setDescription("話者は一つしか選択できません。"); - } - if (embed.title) return interaction.reply({ embeds: [embed], ephemeral: true }); + const selectedCount = [voicevox, coeiroink, sharevox].filter(Boolean).length; + if (selectedCount === 0) embed.typeError().setDescription("話者が選択されていません。"); + if (selectedCount > 1) embed.typeError().setDescription("話者は一つしか選択できません。"); + if (embed.data.title) return interaction.reply({ embeds: [embed], ephemeral: true }); const serviceName = voicevox ? "voicevox" : coeiroink ? "COEIROINK" : "SHAREVOX"; const speakname = voicevox || coeiroink || sharevox; @@ -61,17 +58,17 @@ module.exports = { })) ) ); - interaction.reply({ embeds: [embed], components: [component], ephemeral: true }) - .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) + const message = await interaction.reply({ embeds: [embed], components: [component], ephemeral: true, fetchReply: true }) + message.awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) .then(async (i) => { const speakid = i.values[0]; const speakhost = process.env[serviceName]; - const getdata = await Utils.sql(`select * from "user_speak" where userid="${interaction.user.id}";`); + const getdata = await Utils.sql(`select * from user_speak where userid="${interaction.user.id}";`); let sqlStatus; - if (getdata[0][0].userid) { - sqlStatus = Utils.sql(`update "user_speak" set speakid=${escape(speakid)},speakhost=${escape(speakhost)},speakname=${speakname} where userid="${interaction.user.id}";`); + if (getdata[0][0]?.userid) { + sqlStatus = Utils.sql(`update user_speak set speakid=${escape(speakid)},speakhost=${escape(speakhost)},speakname=${speakname} where userid="${interaction.user.id}";`); } else { - sqlStatus = Utils.sql(`INSERT INTO "user_speak"(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(speakid)},${escape(speakhost)},${escape(speakname)});`) + sqlStatus = Utils.sql(`INSERT INTO user_speak(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(speakid)},${escape(speakhost)},${escape(speakname)});`) } const embed = new CustomEmbed("speak"); if (!sqlStatus) embed.typeError().setDescription("データの更新でエラーが発生しました。"); diff --git a/events/misc/setvoice.js b/events/misc/setvoice.js deleted file mode 100644 index 936263c..0000000 --- a/events/misc/setvoice.js +++ /dev/null @@ -1,54 +0,0 @@ -const { Events, Colors, EmbedBuilder } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -const success = new EmbedBuilder() - .setTitle(`✅完了`) - .setDescription("ボイスがセットされました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }) - .setColor(Colors.Green); -const db_error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("データ更新に失敗しました。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | speak" }); -const db_set = async (data, interaction) => { - //サーバー設定か(配列の3番目に値がある場合はサーバー設定[IDが格納]) - if (data[3]) { - const getdata = await sql(`select * from server_speak where guildid="${interaction?.guild?.id}";`); - if (getdata[0][0]?.guildid) { - const set = await sql(`update server_speak set speakid=${escape(data[1])},speakhost=${escape(data[0])},speakname=${escape(data[2])} where guildid=${escape(interaction.guild.id)};`); - if (!set) return interaction.reply({ embeds: [db_error], ephemeral: true }); - } else { - const set = await sql(`INSERT INTO server_speak(guildid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(data[1])},${escape(data[0])},${escape(data[2])});`); - if (!set) return await interaction.reply({ embeds: [db_error], ephemeral: true }); - }; - } else { - const getdata = await sql(`select * from user_speak where userid=${escape(interaction.user.id)};`); - if (getdata[0][0]?.userid) { - const set = await sql(`update user_speak set speakid=${escape(data[1])},speakhost=${escape(data[0])},speakname=${escape(data[2])} where userid=${escape(interaction.user.id)};`); - if (!set) return interaction.reply({ embeds: [db_error], ephemeral: true }); - } else { - const set = await sql(`INSERT INTO user_speak(userid,speakid,speakhost,speakname) VALUES (${escape(interaction.user.id)},${escape(data[1])},${escape(data[0])},${escape(data[2])});`); - if (!set) return await interaction.reply({ embeds: [db_error], ephemeral: true }); - }; - }; - await interaction.reply({ embeds: [success], ephemeral: true }); -} -module.exports = { - name: Events.InteractionCreate, - async execute(interaction) { - if (interaction.customId === "voicevox") { - const data = interaction.values[0].split(","); - return db_set(data, interaction); - }; - if (interaction.customId === "coeiroink") { - const data = interaction.values[0].split(","); - return db_set(data, interaction); - }; - if (interaction.customId === "sharevox") { - const data = interaction.values[0].split(","); - return db_set(data, interaction); - }; - } -}; \ No newline at end of file From 88bf4158e42bc6c4f52990d5009f7b5eff562a6a Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 00:54:01 +0900 Subject: [PATCH 13/90] =?UTF-8?q?=E3=82=A4=E3=83=99=E3=83=B3=E3=83=88?= =?UTF-8?q?=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/server/manage/clear.js | 9 +- events/{misc => bot}/ready.js | 2 + events/{misc => bot}/slashcommand.js | 5 +- events/{misc => commands}/poll.js | 11 +- events/commands/ticket.js | 131 ++++++++++++++++++ events/misc/msgURL.js | 8 +- events/misc/ticket.js | 120 ---------------- libs/EventHandler.js | 20 ++- {events => oldEvents}/misc/admincommand.js | 0 {events => oldEvents}/misc/genshin_modal.js | 0 {events => oldEvents}/misc/genshin_select.js | 0 {events => oldEvents}/misc/genshindelete.js | 0 {events => oldEvents}/misc/guildbanadd.js | 0 {events => oldEvents}/misc/guildbanremove.js | 0 {events => oldEvents}/misc/guilddelete.js | 0 .../misc/job_reaction_add.js | 0 .../misc/job_reaction_remove.js | 0 {events => oldEvents}/misc/messageDelete.js | 0 {events => oldEvents}/misc/messageUpdate.js | 0 {events => oldEvents}/misc/report.js | 0 {events => oldEvents}/misc/select_job.js | 0 {events => oldEvents}/misc/speakmessage.js | 0 {events => oldEvents}/misc/voiceautojoin.js | 0 {events => oldEvents}/misc/voiceautoremove.js | 0 {events => oldEvents}/misc/voicemember.js | 0 25 files changed, 168 insertions(+), 138 deletions(-) rename events/{misc => bot}/ready.js (89%) rename events/{misc => bot}/slashcommand.js (91%) rename events/{misc => commands}/poll.js (83%) create mode 100644 events/commands/ticket.js delete mode 100644 events/misc/ticket.js rename {events => oldEvents}/misc/admincommand.js (100%) rename {events => oldEvents}/misc/genshin_modal.js (100%) rename {events => oldEvents}/misc/genshin_select.js (100%) rename {events => oldEvents}/misc/genshindelete.js (100%) rename {events => oldEvents}/misc/guildbanadd.js (100%) rename {events => oldEvents}/misc/guildbanremove.js (100%) rename {events => oldEvents}/misc/guilddelete.js (100%) rename {events => oldEvents}/misc/job_reaction_add.js (100%) rename {events => oldEvents}/misc/job_reaction_remove.js (100%) rename {events => oldEvents}/misc/messageDelete.js (100%) rename {events => oldEvents}/misc/messageUpdate.js (100%) rename {events => oldEvents}/misc/report.js (100%) rename {events => oldEvents}/misc/select_job.js (100%) rename {events => oldEvents}/misc/speakmessage.js (100%) rename {events => oldEvents}/misc/voiceautojoin.js (100%) rename {events => oldEvents}/misc/voiceautoremove.js (100%) rename {events => oldEvents}/misc/voicemember.js (100%) diff --git a/commands/server/manage/clear.js b/commands/server/manage/clear.js index 50563bc..c248c7e 100644 --- a/commands/server/manage/clear.js +++ b/commands/server/manage/clear.js @@ -12,7 +12,7 @@ module.exports = { .setMinValue(0) ) , - execute(interaction) { + async execute(interaction) { const deleteCount = interaction.options.getInteger("count"); const component = new ActionRowBuilder() .addComponents( @@ -31,8 +31,8 @@ module.exports = { .setTitle("⚠確認 (30秒後に自動キャンセルされます)") .setDescription(`${(deleteCount === 0) ? "すべてのメッセージ" : `${deleteCount}件のメッセージ`}を削除しますか?`) .setColor(Colors.Red); - interaction.reply({ embeds: [embed], components: [component] }) - .awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 30 * 1000}) + const message = await interaction.reply({ embeds: [embed], components: [component] }) + message.awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 30 * 1000}) .then(async (i) => { const embed = new CustomEmbed("clear").typeSuccess(); let message; @@ -50,8 +50,7 @@ module.exports = { message = interaction.channel.send({ embeds: [embed] }) } } else { - embed.setDescription("キャンセルしました。"); - message = interaction.update({ embeds: [embed], components: [] }); + interaction.delete(); } await message; setTimeout(message.delete, 3 * 1000); diff --git a/events/misc/ready.js b/events/bot/ready.js similarity index 89% rename from events/misc/ready.js rename to events/bot/ready.js index c282ed6..2d352e2 100644 --- a/events/misc/ready.js +++ b/events/bot/ready.js @@ -2,6 +2,8 @@ const { Events, ActivityType } = require("discord.js"); module.exports = { name: Events.ClientReady, + once: true, + filter: () => true, async execute(client, Log) { setInterval(() => { client.user.setPresence({ activities: [{ name: `/help`, type: ActivityType.Streaming }] }); diff --git a/events/misc/slashcommand.js b/events/bot/slashcommand.js similarity index 91% rename from events/misc/slashcommand.js rename to events/bot/slashcommand.js index 748860c..8be43c2 100644 --- a/events/misc/slashcommand.js +++ b/events/bot/slashcommand.js @@ -1,14 +1,13 @@ -const { Events, Colors } = require("discord.js"); +const { Events } = require("discord.js"); const { CustomEmbed } = require("../../libs"); module.exports = { name: Events.InteractionCreate, + filter: (interaction) => interaction.isCommand() || interaction.isAutocomplete(), async execute(interaction) { const { client } = interaction; const command = client.commands.get(interaction.commandName); - if (!command) return; if (interaction.isAutocomplete()) { - if (!command) return; try { await command.autocomplete(interaction, command.logger); } catch (error) { diff --git a/events/misc/poll.js b/events/commands/poll.js similarity index 83% rename from events/misc/poll.js rename to events/commands/poll.js index af73ee5..9f23cb2 100644 --- a/events/misc/poll.js +++ b/events/commands/poll.js @@ -3,13 +3,16 @@ const { getEmbedName } = require("../../libs"); module.exports = { name: Events.MessageReactionAdd, - async execute(react, user, Log) { - const { client, message, emoji, users } = react; - if ( + filter(react, user) { + const { client, message } = react; + return ( message.author.id !== client.user.id || user.id === client.user.id || !message.embeds?.length - ) return; + ); + }, + async execute(react, user, Log) { + const { message, emoji, users } = react; const name = getEmbedName(message.embeds[0]) ?? ""; if (!name.startsWith("poll")) return; const reactions = message.reactions.cache; diff --git a/events/commands/ticket.js b/events/commands/ticket.js new file mode 100644 index 0000000..c9ce521 --- /dev/null +++ b/events/commands/ticket.js @@ -0,0 +1,131 @@ +const { Events, Colors, PermissionsBitField, ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); +const { Utils, CustomEmbed } = require("../../libs"); +const { sql } = Utils; +const { escape } = require("mysql2"); + +module.exports = { + name: Events.InteractionCreate, + filter: (interaction) => interaction.isButton() && interaction.customId.startsWith("ticket_"), + async execute(interaction) { + const embed = new CustomEmbed("ticket"); + try { + if (interaction.customId === "ticket_button") { + const ticketChannel = await interaction.guild.channels.create({ + name: `¦🎫-${interaction.user.username}¦`, + permissionOverwrites:[ + { + id: interaction.guild.roles.everyone, + deny: [PermissionsBitField.Flags.ViewChannel] + }, + { + id: process.env.clientId, + allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] + }, + { + id: interaction.user.id, + allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] + } + ] + }); + const ticketEmbed = new CustomEmbed("ticket") + .setTitle("お問い合わせ") + .setDescription("スタッフが来るまでお待ちください。") + .setColor(Colors.Green); + const ticketComponent = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("ticket_close") + .setLabel("🔒チケットを閉じる") + .setStyle(ButtonStyle.Danger) + ); + await ticketChannel.send({ content: `${interaction.member}`, embeds: [ticketEmbed], components: [ticketComponent] }); + embed + .setTitle("Ticket") + .setDescription(`チケットを作成しました。\nチャンネルを開いて質問などをご記入ください。\n${ticketChannel}`) + .setColor(Colors.Green); + interaction.reply({ embeds: [success_embed], ephemeral: true }); + const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); + if (getdata[0][0]?.guildid) { + const logEmbed = new CustomEmbed("ticket") + .setTitle("チケットが作成されました。") + .addFields( + { + name: "チャンネル", + value: `${ticketChannel} (${ticketChannel.name})`, + inline: true + }, + { + name: "ユーザー", + value: `${interaction.user}`, + inline: true + }, + { + name: "日時", + value: `${new Date()}`, + inline: true + } + ) + .setColor(Colors.Green); + const logChannel = await interaction.guild.channels.cache.get(getdata[0][0].channelid); + await logChannel.send({ embeds: [logEmbed] }); + } + } + if (interaction.customId === "ticket_close") { + embed + .setTitle("⚠確認 (30秒後に自動キャンセルされます)") + .setDescription("チケットを閉じますか?\n閉じると元に戻せません。") + .setColor(Colors.Red); + const component = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("ticketcloseclose") + .setLabel("閉じる") + .setStyle(ButtonStyle.Danger), + new ButtonBuilder() + .setCustomId("ticketclosecancel") + .setLabel("キャンセル") + .setStyle(ButtonStyle.Secondary) + ); + const message = await interaction.reply({ embeds: [embed], components: [component], ephemeral: true }); + message.awaitMessageComponent({ time: 30 * 1000 }) + .then(async (i) => { + if (i.customId === "ticketcloseclose") { + const logEmbed = new CustomEmbed("ticket") + .setTitle("チケットが閉じられました。") + .addFields( + { + name: "チャンネル", + value: interaction.channel.name, + inline: true + }, + { + name: "ユーザー", + value: interaction.user, + inline: true + }, + { + name: "日時", + value: new Date(), + inline: true + } + ) + .setColor(Colors.Red); + await interaction.channel.delete(); + const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); + if (getdata[0][0]?.guildid) { + const logChannel = await interaction.guild.channels.cache.get(getdata[0][0].channelid); + await logChannel.send({ embeds: [logEmbed] }); + } + } else { + message.delete(); + } + }); + } + } catch (error) { + embed.typeError(); + if (error.message === "Missing Permissions") embed.setDescription("botの権限が不足しています。") + else embed.setDescription(`不明なエラーが発生しました。\n${error.message}`); + interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); + }; + } +}; \ No newline at end of file diff --git a/events/misc/msgURL.js b/events/misc/msgURL.js index f8e04f2..93e3c54 100644 --- a/events/misc/msgURL.js +++ b/events/misc/msgURL.js @@ -1,13 +1,11 @@ const { EmbedBuilder, Events, ChannelType } = require('discord.js'); +const regex = /https:\/\/(ptb.)?discord\.com\/channels\/(\d{16,19})\/(\d{16,19})\/(\d{16,19})/; + module.exports = { name: Events.MessageCreate, + filter: (message) => message.channel.type !== ChannelType.DM && message.content.match(regex), async execute(message) { - if (message.channel.type === ChannelType.DM) return; - const re = /https:\/\/(ptb.)?discord\.com\/channels\/(\d{16,19})\/(\d{16,19})\/(\d{16,19})/ - const results = message.content.match(re) - if (!results) return; - let channel_id; let message_id; if (results[2] = "ptb.") { diff --git a/events/misc/ticket.js b/events/misc/ticket.js deleted file mode 100644 index 248a02d..0000000 --- a/events/misc/ticket.js +++ /dev/null @@ -1,120 +0,0 @@ -const { Events, Colors, PermissionsBitField, ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); -const { ticket_timer, sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -/* - embed -*/ -const wait_embed = new EmbedBuilder() - .setTitle("お問い合わせ") - .setDescription("スタッフが来るまでお待ちください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); -const cancel_embed = new EmbedBuilder() - .setTitle("Ticket") - .setDescription("チケットの削除がキャンセルされました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); -const confirmation_embed = new EmbedBuilder() - .setTitle("Ticket") - .setDescription("5秒後にチケットが削除されます。\nキャンセルするには下記のキャンセルボタンを押してください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Red); -const permissions_embed = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("権限が足りません。\nBOTに権限を与えてください。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Red); -const sql_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("データベースからTicket情報を削除しました。") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); -/* -button -*/ -const close_button = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('ticket_close') - .setLabel('🔒チケットを閉じる') - .setStyle(ButtonStyle.Danger) - ); -const close_button1 = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('ticket_close') - .setLabel('🔒チケットを閉じる') - .setStyle(ButtonStyle.Danger) - .setDisabled(true)//ボタンを押せるように - ); -const cancel_button = new ActionRowBuilder() - .addComponents(new ButtonBuilder() - .setCustomId('ticket_cancel') - .setLabel('✖キャンセル') - .setStyle(ButtonStyle.Danger) - ); - -module.exports = { - name: Events.InteractionCreate, - async execute(interaction) { - if (interaction.isButton()) { - try { - if (interaction.customId === "ticket_button") { - const new_channel = await interaction.guild.channels.create({ - name: `¦🎫-${interaction.user.username}¦`, - permissionOverwrites: - [{ - id: interaction.guild.roles.everyone, deny: [PermissionsBitField.Flags.ViewChannel] - }, - { - id: process.env.clientId, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] - }, - { id: interaction.user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] } - ] - }); - const success_embed = new EmbedBuilder() - .setTitle("Ticket") - .setDescription(`チケットを作成しました。\nチャンネルを開いて質問などをご記入ください。\n${new_channel}`) - .setColor(Colors.Green); - await new_channel.send({ embeds: [wait_embed], components: [close_button] }); - await new_channel.send({ content: `${interaction.member}` }); - await interaction.reply({ embeds: [success_embed], ephemeral: true }); - const create_embed = new EmbedBuilder() - .setTitle("チケットが作成されました") - .setDescription(`チャンネル:${new_channel.name}\nユーザー:${interaction.user}\n日時:${new Date()}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Green); - const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - if (getdata[0][0]?.guildid) await (await interaction.guild.channels.fetch(getdata[0][0].channelid)).send({ embeds: [create_embed] }); - }; - if (interaction.customId === "ticket_close") { - const channel = await interaction.channel.messages.fetch({ after: '0', limit: 1 }); - const message = await interaction.channel.messages.fetch(channel.map(x => x.id)[0]); - await message.edit({ embeds: [wait_embed], components: [close_button1] }); - await interaction.reply({ embeds: [confirmation_embed], components: [cancel_button], ephemeral: true }); - ticket_timer({ action: interaction, type: "delete" }); - }; - if (interaction.customId === "ticket_cancel") { - ticket_timer({ action: interaction, type: "cancel" }); - const channel = await interaction.channel.messages.fetch({ after: '0', limit: 1 }); - const message = await interaction.channel.messages.fetch(channel.map(x => x.id)[0]); - await message.edit({ embeds: [wait_embed], components: [close_button] }); - await interaction.reply({ embeds: [cancel_embed], ephemeral: true }); - }; - if (interaction.customId === "ticket_log") { - await sql(`DELETE FROM ticket_channel where guildid=${escape(interaction.guild.id)};`); - await interaction.reply({ embeds: [sql_embed], ephemeral: true }); - }; - } catch (error) { - const other_error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription(`不明なエラー:${error}`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | ticket" }) - .setColor(Colors.Red); - if (error.message === "Missing Permissions") return await interaction.reply({ embeds: [permissions_embed], ephemeral: true }).catch(() => { }); - await interaction.reply({ embeds: [other_error], ephemeral: true }).catch(() => { }); - }; - }; - } -}; \ No newline at end of file diff --git a/libs/EventHandler.js b/libs/EventHandler.js index b1840c0..289fed4 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -6,6 +6,7 @@ function EventHandler(client, eventsPath) { const Log = logger.createChannel("event"); Log.info("Loading..."); const events = []; + const eventsMap = new Map(); fs.readdirSync(eventsPath).forEach((dir) => { Log.debug(`Loading ${dir}...`); const eventPath = path.resolve(eventsPath, dir); @@ -14,12 +15,29 @@ function EventHandler(client, eventsPath) { Log.debug(`Loading ${dir} ${file}...`); const event = require(path.resolve(eventPath, file)); event.logger = Log.createChild(event.name); - client.on(event.name, (...args) => event.execute(...args, event.logger)); events.push(event); + if (eventsMap.has(event.name)) { + eventsMap.get(event.name).push(event); + } else { + eventsMap.set(event.name, [event]); + } Log.debug(`Loaded ${dir} ${event.name} (${file})`); } Log.debug(`Loaded ${eventFiles.length} events for ${dir}`); }); + eventsMap.forEach((events, eventName) => { + client.on(eventName ,(...args) => { + events + .filter(event => event.fillter(...args)) + .forEach((event) => { + try { + event.execute(...args); + } catch (error) { + event.logger.error(error); + } + }); + }); + }); Log.info(`Loaded ${events.length} events`); return events; } diff --git a/events/misc/admincommand.js b/oldEvents/misc/admincommand.js similarity index 100% rename from events/misc/admincommand.js rename to oldEvents/misc/admincommand.js diff --git a/events/misc/genshin_modal.js b/oldEvents/misc/genshin_modal.js similarity index 100% rename from events/misc/genshin_modal.js rename to oldEvents/misc/genshin_modal.js diff --git a/events/misc/genshin_select.js b/oldEvents/misc/genshin_select.js similarity index 100% rename from events/misc/genshin_select.js rename to oldEvents/misc/genshin_select.js diff --git a/events/misc/genshindelete.js b/oldEvents/misc/genshindelete.js similarity index 100% rename from events/misc/genshindelete.js rename to oldEvents/misc/genshindelete.js diff --git a/events/misc/guildbanadd.js b/oldEvents/misc/guildbanadd.js similarity index 100% rename from events/misc/guildbanadd.js rename to oldEvents/misc/guildbanadd.js diff --git a/events/misc/guildbanremove.js b/oldEvents/misc/guildbanremove.js similarity index 100% rename from events/misc/guildbanremove.js rename to oldEvents/misc/guildbanremove.js diff --git a/events/misc/guilddelete.js b/oldEvents/misc/guilddelete.js similarity index 100% rename from events/misc/guilddelete.js rename to oldEvents/misc/guilddelete.js diff --git a/events/misc/job_reaction_add.js b/oldEvents/misc/job_reaction_add.js similarity index 100% rename from events/misc/job_reaction_add.js rename to oldEvents/misc/job_reaction_add.js diff --git a/events/misc/job_reaction_remove.js b/oldEvents/misc/job_reaction_remove.js similarity index 100% rename from events/misc/job_reaction_remove.js rename to oldEvents/misc/job_reaction_remove.js diff --git a/events/misc/messageDelete.js b/oldEvents/misc/messageDelete.js similarity index 100% rename from events/misc/messageDelete.js rename to oldEvents/misc/messageDelete.js diff --git a/events/misc/messageUpdate.js b/oldEvents/misc/messageUpdate.js similarity index 100% rename from events/misc/messageUpdate.js rename to oldEvents/misc/messageUpdate.js diff --git a/events/misc/report.js b/oldEvents/misc/report.js similarity index 100% rename from events/misc/report.js rename to oldEvents/misc/report.js diff --git a/events/misc/select_job.js b/oldEvents/misc/select_job.js similarity index 100% rename from events/misc/select_job.js rename to oldEvents/misc/select_job.js diff --git a/events/misc/speakmessage.js b/oldEvents/misc/speakmessage.js similarity index 100% rename from events/misc/speakmessage.js rename to oldEvents/misc/speakmessage.js diff --git a/events/misc/voiceautojoin.js b/oldEvents/misc/voiceautojoin.js similarity index 100% rename from events/misc/voiceautojoin.js rename to oldEvents/misc/voiceautojoin.js diff --git a/events/misc/voiceautoremove.js b/oldEvents/misc/voiceautoremove.js similarity index 100% rename from events/misc/voiceautoremove.js rename to oldEvents/misc/voiceautoremove.js diff --git a/events/misc/voicemember.js b/oldEvents/misc/voicemember.js similarity index 100% rename from events/misc/voicemember.js rename to oldEvents/misc/voicemember.js From 49a3a055bf00588df86dd66b4922451c97f50220 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 07:43:07 +0900 Subject: [PATCH 14/90] =?UTF-8?q?=E3=83=81=E3=82=B1=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=81=AE=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/commands/ticket.js | 8 +++++--- libs/EventHandler.js | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/events/commands/ticket.js b/events/commands/ticket.js index c9ce521..b58f8a8 100644 --- a/events/commands/ticket.js +++ b/events/commands/ticket.js @@ -43,7 +43,7 @@ module.exports = { .setTitle("Ticket") .setDescription(`チケットを作成しました。\nチャンネルを開いて質問などをご記入ください。\n${ticketChannel}`) .setColor(Colors.Green); - interaction.reply({ embeds: [success_embed], ephemeral: true }); + interaction.reply({ embeds: [embed], ephemeral: true }); const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); if (getdata[0][0]?.guildid) { const logEmbed = new CustomEmbed("ticket") @@ -90,6 +90,8 @@ module.exports = { message.awaitMessageComponent({ time: 30 * 1000 }) .then(async (i) => { if (i.customId === "ticketcloseclose") { + console.log(interaction.channel.name) + console.log(interaction.user.toString()) const logEmbed = new CustomEmbed("ticket") .setTitle("チケットが閉じられました。") .addFields( @@ -100,12 +102,12 @@ module.exports = { }, { name: "ユーザー", - value: interaction.user, + value: `${interaction.user}`, inline: true }, { name: "日時", - value: new Date(), + value: `${new Date()}`, inline: true } ) diff --git a/libs/EventHandler.js b/libs/EventHandler.js index 289fed4..a71c2fa 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -28,10 +28,10 @@ function EventHandler(client, eventsPath) { eventsMap.forEach((events, eventName) => { client.on(eventName ,(...args) => { events - .filter(event => event.fillter(...args)) + .filter(event => event.filter(...args)) .forEach((event) => { try { - event.execute(...args); + event.execute(...args, event.logger); } catch (error) { event.logger.error(error); } From 3640aa78cf05183a021a9ce04128865c48d1f87c Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 07:45:07 +0900 Subject: [PATCH 15/90] =?UTF-8?q?debug=E6=B6=88=E3=81=99=E3=81=AE=E5=BF=98?= =?UTF-8?q?=E3=82=8C=E3=81=A6=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/commands/ticket.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/events/commands/ticket.js b/events/commands/ticket.js index b58f8a8..7a67f5b 100644 --- a/events/commands/ticket.js +++ b/events/commands/ticket.js @@ -90,8 +90,6 @@ module.exports = { message.awaitMessageComponent({ time: 30 * 1000 }) .then(async (i) => { if (i.customId === "ticketcloseclose") { - console.log(interaction.channel.name) - console.log(interaction.user.toString()) const logEmbed = new CustomEmbed("ticket") .setTitle("チケットが閉じられました。") .addFields( From de25798733719b1e6932950e253a46a5b9ecdb54 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 08:12:47 +0900 Subject: [PATCH 16/90] =?UTF-8?q?log=E6=A9=9F=E8=83=BD=E3=82=92=E4=B8=80?= =?UTF-8?q?=E9=83=A8=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/bot/ready.js | 2 -- events/log/guildbanadd.js | 16 ++++++++++++++++ events/log/messageDelete.js | 16 ++++++++++++++++ helpers/sendLog.js | 17 +++++++++++++++++ libs/EventHandler.js | 14 ++++++++------ oldEvents/misc/guildbanadd.js | 22 ---------------------- oldEvents/misc/messageDelete.js | 23 ----------------------- 7 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 events/log/guildbanadd.js create mode 100644 events/log/messageDelete.js create mode 100644 helpers/sendLog.js delete mode 100644 oldEvents/misc/guildbanadd.js delete mode 100644 oldEvents/misc/messageDelete.js diff --git a/events/bot/ready.js b/events/bot/ready.js index 2d352e2..c282ed6 100644 --- a/events/bot/ready.js +++ b/events/bot/ready.js @@ -2,8 +2,6 @@ const { Events, ActivityType } = require("discord.js"); module.exports = { name: Events.ClientReady, - once: true, - filter: () => true, async execute(client, Log) { setInterval(() => { client.user.setPresence({ activities: [{ name: `/help`, type: ActivityType.Streaming }] }); diff --git a/events/log/guildbanadd.js b/events/log/guildbanadd.js new file mode 100644 index 0000000..a321d4a --- /dev/null +++ b/events/log/guildbanadd.js @@ -0,0 +1,16 @@ +const { Events, Colors } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); +const sendLog = require("../../helpers/sendLog"); + + +module.exports = { + name: Events.GuildBanAdd, + async execute(member) { + sendLog(member.guild, () => ( + new CustomEmbed("BANadd") + .setTitle("✅BAN") + .setDescription(`${member.user} (${member.user.id})がBANされました`) + .setColor(Colors.Red) + )); + } +} \ No newline at end of file diff --git a/events/log/messageDelete.js b/events/log/messageDelete.js new file mode 100644 index 0000000..b734792 --- /dev/null +++ b/events/log/messageDelete.js @@ -0,0 +1,16 @@ +const { Events, Colors, ChannelType } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); +const sendLog = require("../../helpers/sendLog"); + +module.exports = { + name: Events.MessageDelete, + async execute(message) { + if (message.channel.type === ChannelType.DM) return; + sendLog(message.guild, () => ( + new CustomEmbed("messagedelete") + .setTitle("✅メッセージの削除") + .setDescription(`メッセージユーザー:${message.author || message.author.tag}\n**対象チャンネル**${message.channel}**\n削除したメッセージ**\n${message.content}`) + .setColor(Colors.Red) + )); + } +} \ No newline at end of file diff --git a/helpers/sendLog.js b/helpers/sendLog.js new file mode 100644 index 0000000..8f61b1f --- /dev/null +++ b/helpers/sendLog.js @@ -0,0 +1,17 @@ +const { Utils } = require("../libs"); +const { escape } = require("mysql2"); + +async function sendLog(guild, callback) { + const getdata = await Utils.sql(`select * from log_channel where guildid=${escape(guild.id)};`); + if (!getdata[0][0]?.guildid) return; + try { + const channel = await member.guild.channels.fetch(getdata[0][0].channelid); + if (!channel) return; + const embed = callback(); + await channel.send({ embeds: [embed] }); + } catch (error) { + Utils.sql(`DELETE FROM log_channel WHERE guildid=${escape(guild.id)};`); + } +} + +module.exports = sendLog; \ No newline at end of file diff --git a/libs/EventHandler.js b/libs/EventHandler.js index a71c2fa..96f4621 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -28,13 +28,15 @@ function EventHandler(client, eventsPath) { eventsMap.forEach((events, eventName) => { client.on(eventName ,(...args) => { events - .filter(event => event.filter(...args)) + .filter(event => event.filter ? event.filter(...args) : true) .forEach((event) => { - try { - event.execute(...args, event.logger); - } catch (error) { - event.logger.error(error); - } + new Promise(async (resolve) => { + try { + event.execute(...args, event.logger).then(resolve) + } catch (error) { + event.logger.error(error); + } + }); }); }); }); diff --git a/oldEvents/misc/guildbanadd.js b/oldEvents/misc/guildbanadd.js deleted file mode 100644 index 028ca90..0000000 --- a/oldEvents/misc/guildbanadd.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.GuildBanAdd, - async execute(member) { - const getdata = await sql(`select * from log_channel where guildid=${escape(member.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await member.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅BAN") - .setDescription(`${member.user || member.user?.tag}がBANされました`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | BANadd" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(member.guild.id)};`); - }; - } -} \ No newline at end of file diff --git a/oldEvents/misc/messageDelete.js b/oldEvents/misc/messageDelete.js deleted file mode 100644 index edc2802..0000000 --- a/oldEvents/misc/messageDelete.js +++ /dev/null @@ -1,23 +0,0 @@ -const { Events, EmbedBuilder, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.MessageDelete, - async execute(message) { - if (message.channel.type === ChannelType.DM) return; - const getdata = await sql(`select * from log_channel where guildid=${escape(message.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await message.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅メッセージの削除") - .setDescription(`メッセージユーザー:${message.author || message.author.tag}\n**対象チャンネル**${message.channel}**\n削除したメッセージ**\n${message.content}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | messagedelete" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(message.guild.id)};`); - }; - } -} \ No newline at end of file From a07f6c32e9818ee9bb470d65c14406c9dc04361e Mon Sep 17 00:00:00 2001 From: Puton1221 Date: Thu, 18 May 2023 10:44:55 +0900 Subject: [PATCH 17/90] =?UTF-8?q?=E3=80=8C=E3=82=B5=E3=83=BC=E3=83=90?= =?UTF-8?q?=E3=83=BC=E6=83=85=E5=A0=B1=E3=80=8D=E3=81=8C=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=87=E3=83=BC=E3=83=88=E3=81=95=E3=82=8C=E3=81=9F?= =?UTF-8?q?=E3=81=9E!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 8 +- commands/server/serverinfo.js | 100 +++++++++++++++++++ oldCommands/misc/miscellaneous/serverinfo.js | 85 ---------------- 3 files changed, 104 insertions(+), 89 deletions(-) create mode 100644 commands/server/serverinfo.js delete mode 100644 oldCommands/misc/miscellaneous/serverinfo.js diff --git a/.env b/.env index 1262d6f..fa7f681 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN=token -clientId=clientid +TOKEN="MTA3NjA2MTU4MDgzMzMyOTE5Mg.GHSFSu.96YULq1Q7BrklqLuJk7OFqVJ4E9biwvpm-gW54" +clientId="1076061580833329192" URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" +errorwebhook="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds" version="1.0.3"#上がるタイミング分からんけど書いとく Proxy="プロキシ" \ No newline at end of file diff --git a/commands/server/serverinfo.js b/commands/server/serverinfo.js new file mode 100644 index 0000000..c0f73ac --- /dev/null +++ b/commands/server/serverinfo.js @@ -0,0 +1,100 @@ +const { EmbedBuilder, codeBlock, ChannelType, Colors } = require('discord.js'); +const moment = require('moment'); +moment.locale('ja'); + +const filterLevel = { + 0: 'Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)', + 1: 'Medium - ロールのないメンバーのメディアコンテンツをスキャンします。(ロールを持つメンバーを信頼する)', + 2: 'High - すべてのメンバーのメディアコンテンツをスキャンします。(クリーンなサーバーに推奨)' +}; + +const verificationLevel = { + 0: '設定しない - 無制限', + 1: '低 - メール認証がされてるアカウントのみ', + 2: '中 - Discordに登録してから5分以上経過したアカウントのみ', + 3: '高 - このサーバーにメンバーとなってから10分以上経過したアカウントのみ', + 4: '最高 - 電話認証がされているアカウントのみ' +}; + +const verified = { + true: '認証されています', + false: '認証されていません' +}; + +const partnered = { + true: 'パートナープログラムに登録されています', + false: 'パートナープログラムに登録されていません' +}; + +const membersRole = (members, role) => { + return members.filter((m) => m.roles.cache.has(role.id)).size; +}; + +module.exports = { + builder: (builder) => builder + .setName('server-info') + .setDescription('サーバー情報を表示します。') + .addBooleanOption((option) => option + .setName('ephemeral') + .setDescription('あなただけが見れるようにするか') + ), + async execute(interaction) { + const members = interaction.guild.members.cache; + const roles = interaction.guild.roles.cache; + const channels = interaction.guild.channels.cache; + const emojis = interaction.guild.emojis.cache; + const stickers = interaction.guild.stickers.cache; + const owner = await interaction.guild.fetchOwner(); + + const fields = [ + { name: '基本情報', value: '\u200b' }, + { name: 'サーバー名・ID', value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, + { name: 'オーナー名・ID', value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, + { name: '言語', value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, + { name: 'ブーストレベル', value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, + { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, + { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, + { name: 'その他のチャンネル', value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, + { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes('everyone')).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(','))}` }, + { name: '\u200b', value: '\u200b' }, + { name: '高度な情報', value: '\u200b' }, + { name: 'メディアコンテンツフィルター', value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, + { name: '認証レベル', value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, + { name: '認証サーバー', value: `${codeBlock(verified[interaction.guild.verified])} ` }, + { name: 'パートナープログラム', value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, + { name: '\u200b', value: '\u200b' }, + { name: 'メンバーと絵文字(ステッカー)', value: '\u200b' }, + { name: `メンバー[${interaction.guild.memberCount}]`, value: `${codeBlock(`ユーザー:${members.filter(member => !member.user.bot).size}\nボット:${members.filter(member => member.user.bot).size}`)}`, inline: true }, + { name: `絵文字[${emojis.size}]`, value: `${codeBlock(`通常:${emojis.filter(emoji => !emoji.animated).size}\nアニメーション:${emojis.filter(emoji => emoji.animated).size}\nステッカー:${stickers.size}`)}`, inline: true } + ]; + + function limitString(str, maxLength) { + if (str.length >= maxLength) { + return str.substring(0, maxLength - 3) + "..."; + } else { + return str; + } + }; + + const editedFields = fields.map((field) => { + return { name: field.name, value: limitString(field.value, 1024) }; + }); + + const embed = new EmbedBuilder() + .setTitle('✅サーバー情報') + .setColor(Colors.Green) + .setThumbnail(interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })) + .addFields(editedFields) + .setTimestamp(new Date()) + .setFooter({ + text: `${interaction.guild.name}`, + iconURL: `${interaction.guild.icon === null ? "https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6a49cf127bf92de1e2_icon_clyde_blurple_RGB.png" : interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })}` + }); + + if (interaction.options.getBoolean('ephemeral')) { + return interaction.reply({ embeds: [embed], ephemeral: true }); + } else { + return interaction.reply({ embeds: [embed] }); + }; + } +} \ No newline at end of file diff --git a/oldCommands/misc/miscellaneous/serverinfo.js b/oldCommands/misc/miscellaneous/serverinfo.js deleted file mode 100644 index a15d939..0000000 --- a/oldCommands/misc/miscellaneous/serverinfo.js +++ /dev/null @@ -1,85 +0,0 @@ -const { EmbedBuilder, codeBlock, ChannelType, Colors } = require('discord.js'); -const moment = require('moment'); -moment.locale('ja'); - -const filterLevel = { - 0: 'Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)', - 1: 'Medium - ロールのないメンバーのメディアコンテンツをスキャンします。(ロールを持つメンバーを信頼する)', - 2: 'High - すべてのメンバーのメディアコンテンツをスキャンします。(クリーンなサーバーに推奨)' -}; - -const verificationLevel = { - 0: '設定しない - 無制限', - 1: '低 - メール認証がされてるアカウントのみ', - 2: '中 - Discordに登録してから5分以上経過したアカウントのみ', - 3: '高 - このサーバーにメンバーとなってから10分以上経過したアカウントのみ', - 4: '最高 - 電話認証がされているアカウントのみ' -}; - -const verified = { - true: '認証されています', - false: '認証されていません' -}; - -const partnered = { - true: 'パートナープログラムに登録されています', - false: 'パートナープログラムに登録されていません' -}; - -const membersRole = (members, role) => { - return members.filter((m) => m.roles.cache.has(role.id)).size; -}; - -module.exports = async (interaction) => { - const members = interaction.guild.members.cache; - const roles = interaction.guild.roles.cache; - const channels = interaction.guild.channels.cache; - const emojis = interaction.guild.emojis.cache; - const stickers = interaction.guild.stickers.cache; - const owner = await interaction.guild.fetchOwner(); - - const fields = [ - { name: '基本情報', value: '\u200b' }, - { name: 'サーバー名・ID', value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, - { name: 'オーナー名・ID', value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, - { name: '言語', value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, - { name: 'ブーストレベル', value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, - { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, - { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, - { name: 'その他のチャンネル', value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, - { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes('everyone')).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(','))}` }, - { name: '\u200b', value: '\u200b' }, - { name: '高度な情報', value: '\u200b' }, - { name: 'メディアコンテンツフィルター', value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, - { name: '認証レベル', value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, - { name: '認証サーバー', value: `${codeBlock(verified[interaction.guild.verified])} ` }, - { name: 'パートナープログラム', value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, - { name: '\u200b', value: '\u200b' }, - { name: 'メンバーと絵文字(ステッカー)', value: '\u200b' }, - { name: `メンバー[${interaction.guild.memberCount}]`, value: `${codeBlock(`ユーザー:${members.filter(member => !member.user.bot).size}\nボット:${members.filter(member => member.user.bot).size}`)}`, inline: true }, - { name: `絵文字[${emojis.size}]`, value: `${codeBlock(`通常:${emojis.filter(emoji => !emoji.animated).size}\nアニメーション:${emojis.filter(emoji => emoji.animated).size}\nステッカー:${stickers.size}`)}`, inline: true } - ]; - - function limitString(str, maxLength) { - if (str.length >= maxLength) { - return str; - } else { - return str.substring(0, maxLength - 3) + "..."; - } - } - const editedFields = fields.map((field) => { - return { name: field.name, value: limitString(field.value, 1024) }; - }); - - const embed = new EmbedBuilder() - .setTitle('✅サーバー情報') - .setColor(Colors.Green) - .setThumbnail(interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })) - .addFields(editedFields) - .setTimestamp(new Date()) - .setFooter({ - text: `${interaction.guild.name}`, - iconURL: `${interaction.guild.icon === null ? "https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6a49cf127bf92de1e2_icon_clyde_blurple_RGB.png" : interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })}` - }); - await interaction.reply({ embeds: [embed], ephemeral: true }); -} \ No newline at end of file From 3968ab445e6e1613d5ded40a0d70394e75b0d74b Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 12:08:09 +0900 Subject: [PATCH 18/90] =?UTF-8?q?log=20=E3=81=A8=20env=20=E3=82=92=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 8 ++++---- events/log/guildbanadd.js | 1 - events/log/guildbanremove.js | 16 ++++++++++++++++ events/log/messageDelete.js | 2 +- events/log/messageUpdate.js | 16 ++++++++++++++++ oldEvents/misc/guildbanremove.js | 22 ---------------------- oldEvents/misc/messageUpdate.js | 23 ----------------------- 7 files changed, 37 insertions(+), 51 deletions(-) create mode 100644 events/log/guildbanremove.js create mode 100644 events/log/messageUpdate.js delete mode 100644 oldEvents/misc/guildbanremove.js delete mode 100644 oldEvents/misc/messageUpdate.js diff --git a/.env b/.env index fa7f681..1262d6f 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN="MTA3NjA2MTU4MDgzMzMyOTE5Mg.GHSFSu.96YULq1Q7BrklqLuJk7OFqVJ4E9biwvpm-gW54" -clientId="1076061580833329192" +TOKEN=token +clientId=clientid URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds" +errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" version="1.0.3"#上がるタイミング分からんけど書いとく Proxy="プロキシ" \ No newline at end of file diff --git a/events/log/guildbanadd.js b/events/log/guildbanadd.js index a321d4a..3d96bcf 100644 --- a/events/log/guildbanadd.js +++ b/events/log/guildbanadd.js @@ -2,7 +2,6 @@ const { Events, Colors } = require("discord.js"); const { CustomEmbed } = require("../../libs"); const sendLog = require("../../helpers/sendLog"); - module.exports = { name: Events.GuildBanAdd, async execute(member) { diff --git a/events/log/guildbanremove.js b/events/log/guildbanremove.js new file mode 100644 index 0000000..0497426 --- /dev/null +++ b/events/log/guildbanremove.js @@ -0,0 +1,16 @@ +const { Events, Colors } = require("discord.js"); +const { CustomEmbed } = require("../../libs/EmbedBuilder"); +const sendLog = require("../../helpers/sendLog"); +const { CustomEmbed } = require("../../libs"); + +module.exports = { + name: Events.GuildBanRemove, + async execute(member) { + sendLog(member.guild, () => ( + new CustomEmbed("BANremove") + .setTitle("✅BAN解除") + .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) + .setColor(Colors.Red) + )); + } +} \ No newline at end of file diff --git a/events/log/messageDelete.js b/events/log/messageDelete.js index b734792..a32b6d7 100644 --- a/events/log/messageDelete.js +++ b/events/log/messageDelete.js @@ -4,8 +4,8 @@ const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageDelete, + filter: (message) => message.channel.type !== ChannelType.DM, async execute(message) { - if (message.channel.type === ChannelType.DM) return; sendLog(message.guild, () => ( new CustomEmbed("messagedelete") .setTitle("✅メッセージの削除") diff --git a/events/log/messageUpdate.js b/events/log/messageUpdate.js new file mode 100644 index 0000000..a40b6c9 --- /dev/null +++ b/events/log/messageUpdate.js @@ -0,0 +1,16 @@ +const { Events, Colors, ChannelType } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); +const sendLog = require("../../helpers/sendLog"); + +module.exports = { + name: Events.MessageUpdate, + filter: (oldMessage) => oldMessage.channel.type !== ChannelType.DM, + async execute(oldMessage, newMessage) { + sendLog(oldMessage.guild, () => ( + new CustomEmbed("messageUpdate") + .setTitle("✅メッセージの編集") + .setDescription(`メッセージユーザー:${oldMessage.author || oldMessage.author.tag}\n**対象チャンネル**:${newMessage.channel}\n**編集前のメッセージ**\n${oldMessage.content}\n**編集後のメッセージ**\n${newMessage.content}`) + .setColor(Colors.Blue) + )); + } +} \ No newline at end of file diff --git a/oldEvents/misc/guildbanremove.js b/oldEvents/misc/guildbanremove.js deleted file mode 100644 index 3607896..0000000 --- a/oldEvents/misc/guildbanremove.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.GuildBanRemove, - async execute(member) { - const getdata = await sql(`select * from log_channel where guildid=${escape(member.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await member.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅BAN解除") - .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | BANremove" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(member.guild.id)};`); - }; - } -} \ No newline at end of file diff --git a/oldEvents/misc/messageUpdate.js b/oldEvents/misc/messageUpdate.js deleted file mode 100644 index 26a9394..0000000 --- a/oldEvents/misc/messageUpdate.js +++ /dev/null @@ -1,23 +0,0 @@ -const { Events, EmbedBuilder, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.MessageUpdate, - async execute(oldMessage, newMessage) { - if (oldMessage.channel.type === ChannelType.DM) return; - const getdata = await sql(`select * from log_channel where guildid=${escape(oldMessage.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await oldMessage.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅メッセージの編集") - .setDescription(`メッセージユーザー:${oldMessage.author || oldMessage.author.tag}\n**対象チャンネル**:${newMessage.channel}\n**編集前のメッセージ**\n${oldMessage.content}\n**編集後のメッセージ**\n${newMessage.content}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | messageUpdate" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(oldMessage.guild.id)};`); - }; - } -} \ No newline at end of file From ecf2f41e8651c4d5fff736be5a4953f82f0671e1 Mon Sep 17 00:00:00 2001 From: Puton1221 Date: Thu, 18 May 2023 12:15:19 +0900 Subject: [PATCH 19/90] =?UTF-8?q?userinfo=E8=BF=BD=E5=8A=A0=20and=20misc?= =?UTF-8?q?=E3=81=B8=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- commands/{server => misc}/serverinfo.js | 0 commands/misc/userinfo.js | 54 ++++++++++++++++++++++ libs/Permissions.js | 6 ++- oldCommands/misc/miscellaneous/userinfo.js | 35 -------------- 5 files changed, 61 insertions(+), 38 deletions(-) rename commands/{server => misc}/serverinfo.js (100%) create mode 100644 commands/misc/userinfo.js delete mode 100644 oldCommands/misc/miscellaneous/userinfo.js diff --git a/.env b/.env index fa7f681..b86b196 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN="MTA3NjA2MTU4MDgzMzMyOTE5Mg.GHSFSu.96YULq1Q7BrklqLuJk7OFqVJ4E9biwvpm-gW54" -clientId="1076061580833329192" +TOKEN="your-token" +clientId="client-id" URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text diff --git a/commands/server/serverinfo.js b/commands/misc/serverinfo.js similarity index 100% rename from commands/server/serverinfo.js rename to commands/misc/serverinfo.js diff --git a/commands/misc/userinfo.js b/commands/misc/userinfo.js new file mode 100644 index 0000000..afe62cb --- /dev/null +++ b/commands/misc/userinfo.js @@ -0,0 +1,54 @@ +const { EmbedBuilder, Colors } = require('discord.js'); +const { ja } = require('../../libs/Permissions'); +const status = { + key: { + desktop: "デスクトップ", + web: "Web", + mobile: "スマホ" + }, + value: { + online: "オンライン", + idle: "退席中", + dnd: "取り込み中" + } +} +module.exports = { + builder: (builder) => builder + .setName('user-info') + .setDescription('ユーザー情報を取得します。') + .addUserOption((option) => option + .setName('user') + .setDescription('対象のユーザー') + ) + .addBooleanOption((option) => option + .setName('ephemeral') + .setDescription('自分だけが見れるようにするか') + ), + async execute(interaction) { + const member = interaction.guild.members.cache.get(interaction.options.getUser("user")?.id) || interaction.member; + const embed = new EmbedBuilder() + .setTitle(`✅${member.user.username}の情報`) + .setThumbnail((member.user.avatar) ? `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp` : "https://discord.com/assets/7c8f476123d28d103efe381543274c25.png") + .setColor(Colors.Green) + .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | userinfo" }) + .addFields( + { name: '名前(ID)', value: `${member.user.tag}(${member.user.id})` }, + { name: 'サーバー参加日', value: `()` }, + { name: 'Discord参加日', value: `()` }, + { name: `役職(${member.roles.cache.filter(role => role.name !== "@everyone").size})`, value: `${member.roles.cache.filter(role => role.name !== "@everyone").map(role => role).join(",")}` }, + { name: 'BOTか否か', value: `${member.user.bot ? "はい" : "いいえ"}` }, + { name: 'ステータス', value: `${status.value[Object.values(member.presence?.clientStatus || {})[0]] ? `${status.key[Object.keys(member.presence.clientStatus)[0]]}でログイン中\n状態:${status.value[Object.values(member.presence.clientStatus)[0]]}` : "オフライン"}` }, + { name: 'ニックネーム', value: `${member.nickname || "なし"}` }, + { name: '権限一覧', value: `${member.permissions.toArray().map(permission => `\`${ja[permission] || permission}\``).join(",")}` } + ); + + if (interaction.options.getBoolean('ephemeral')) { + return interaction.reply({ embeds: [embed], ephemeral: true }); + } else { + return interaction.reply({ embeds: [embed] }) + } + await interaction.reply({ + embeds: [embed] + }); + } +} \ No newline at end of file diff --git a/libs/Permissions.js b/libs/Permissions.js index 331131a..9fccff6 100644 --- a/libs/Permissions.js +++ b/libs/Permissions.js @@ -44,6 +44,8 @@ module.exports = { ViewAuditLog: "View audit log", ViewChannel: "View channel", ViewGuildInsights: "View server insights", + UseSoundboard: "Use Soundboard", + SendVoiceMessages: "Send Voice Messages", ja: { AddReactions: "リアクションの追加", Administrator: "管理者", @@ -85,6 +87,8 @@ module.exports = { UseVAD: "ユーザーアクティビティ", ViewAuditLog: "監視ログを表示", ViewChannel: "チャンネルを見る", - ViewGuildInsights: "View server insights", + ViewGuildInsights: "サーバーインサイトを見る", + UseSoundboard: "サウンドボードを使用する", + SendVoiceMessages: "ボイスメッセージを送信する" } }; \ No newline at end of file diff --git a/oldCommands/misc/miscellaneous/userinfo.js b/oldCommands/misc/miscellaneous/userinfo.js deleted file mode 100644 index 13447f6..0000000 --- a/oldCommands/misc/miscellaneous/userinfo.js +++ /dev/null @@ -1,35 +0,0 @@ -const { SlashCommandBuilder, EmbedBuilder, Colors } = require('discord.js'); -const { ja } = require('../../../libs/Permissions'); -const status = { - key: { - desktop: "デスクトップ", - web: "Web", - mobile: "スマホ" - }, - value: { - online: "オンライン", - idle: "退席中", - dnd: "取り込み中" - } -} -module.exports = async (interaction) => { - const member = interaction.guild.members.cache.get(interaction.options.getUser("user")?.id) || interaction.member; - const embed = new EmbedBuilder() - .setTitle(`✅${member.user.username}の情報`) - .setThumbnail((member.user.avatar) ? `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp` : "https://discord.com/assets/7c8f476123d28d103efe381543274c25.png") - .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | userinfo" }) - .addFields( - { name: '名前(ID)', value: `${member.user.tag}(${member.user.id})` }, - { name: 'サーバー参加日', value: `()` }, - { name: 'Discord参加日', value: `()` }, - { name: `役職(${member.roles.cache.filter(role => role.name !== "@everyone").size})`, value: `${member.roles.cache.filter(role => role.name !== "@everyone").map(role => role).join(",")}` }, - { name: 'BOTか否か', value: `${member.user.bot ? "はい" : "いいえ"}` }, - { name: 'ステータス', value: `${status.value[Object.values(member.presence?.clientStatus || {})[0]] ? `${status.key[Object.keys(member.presence.clientStatus)[0]]}でログイン中\n状態:${status.value[Object.values(member.presence.clientStatus)[0]]}` : "オフライン"}` }, - { name: 'ニックネーム', value: `${member.nickname || "なし"}` }, - { name: '権限一覧', value: `${member.permissions.toArray().map(permission => `\`${ja[permission] || permission}\``).join(",")}` } - ); - await interaction.reply({ - embeds: [embed] - }); -}; \ No newline at end of file From 577c909bfe7a2ff7625bf56441cca748e1ee8648 Mon Sep 17 00:00:00 2001 From: Puton1221 Date: Thu, 18 May 2023 12:18:03 +0900 Subject: [PATCH 20/90] =?UTF-8?q?userinfo=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 8 ++++---- events/log/guildbanadd.js | 1 - events/log/guildbanremove.js | 16 ++++++++++++++++ events/log/messageDelete.js | 2 +- events/log/messageUpdate.js | 16 ++++++++++++++++ oldEvents/misc/guildbanremove.js | 22 ---------------------- oldEvents/misc/messageUpdate.js | 23 ----------------------- 7 files changed, 37 insertions(+), 51 deletions(-) create mode 100644 events/log/guildbanremove.js create mode 100644 events/log/messageUpdate.js delete mode 100644 oldEvents/misc/guildbanremove.js delete mode 100644 oldEvents/misc/messageUpdate.js diff --git a/.env b/.env index b86b196..1262d6f 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN="your-token" -clientId="client-id" +TOKEN=token +clientId=clientid URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://ptb.discord.com/api/webhooks/1108322785094270997/OZZWU9P1uwweQjAM7ffvt_OYkrviieRTJivSB6vxQLi_SOT9LfoP4LXDekvxyIZGSYds" +errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" version="1.0.3"#上がるタイミング分からんけど書いとく Proxy="プロキシ" \ No newline at end of file diff --git a/events/log/guildbanadd.js b/events/log/guildbanadd.js index a321d4a..3d96bcf 100644 --- a/events/log/guildbanadd.js +++ b/events/log/guildbanadd.js @@ -2,7 +2,6 @@ const { Events, Colors } = require("discord.js"); const { CustomEmbed } = require("../../libs"); const sendLog = require("../../helpers/sendLog"); - module.exports = { name: Events.GuildBanAdd, async execute(member) { diff --git a/events/log/guildbanremove.js b/events/log/guildbanremove.js new file mode 100644 index 0000000..0497426 --- /dev/null +++ b/events/log/guildbanremove.js @@ -0,0 +1,16 @@ +const { Events, Colors } = require("discord.js"); +const { CustomEmbed } = require("../../libs/EmbedBuilder"); +const sendLog = require("../../helpers/sendLog"); +const { CustomEmbed } = require("../../libs"); + +module.exports = { + name: Events.GuildBanRemove, + async execute(member) { + sendLog(member.guild, () => ( + new CustomEmbed("BANremove") + .setTitle("✅BAN解除") + .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) + .setColor(Colors.Red) + )); + } +} \ No newline at end of file diff --git a/events/log/messageDelete.js b/events/log/messageDelete.js index b734792..a32b6d7 100644 --- a/events/log/messageDelete.js +++ b/events/log/messageDelete.js @@ -4,8 +4,8 @@ const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageDelete, + filter: (message) => message.channel.type !== ChannelType.DM, async execute(message) { - if (message.channel.type === ChannelType.DM) return; sendLog(message.guild, () => ( new CustomEmbed("messagedelete") .setTitle("✅メッセージの削除") diff --git a/events/log/messageUpdate.js b/events/log/messageUpdate.js new file mode 100644 index 0000000..a40b6c9 --- /dev/null +++ b/events/log/messageUpdate.js @@ -0,0 +1,16 @@ +const { Events, Colors, ChannelType } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); +const sendLog = require("../../helpers/sendLog"); + +module.exports = { + name: Events.MessageUpdate, + filter: (oldMessage) => oldMessage.channel.type !== ChannelType.DM, + async execute(oldMessage, newMessage) { + sendLog(oldMessage.guild, () => ( + new CustomEmbed("messageUpdate") + .setTitle("✅メッセージの編集") + .setDescription(`メッセージユーザー:${oldMessage.author || oldMessage.author.tag}\n**対象チャンネル**:${newMessage.channel}\n**編集前のメッセージ**\n${oldMessage.content}\n**編集後のメッセージ**\n${newMessage.content}`) + .setColor(Colors.Blue) + )); + } +} \ No newline at end of file diff --git a/oldEvents/misc/guildbanremove.js b/oldEvents/misc/guildbanremove.js deleted file mode 100644 index 3607896..0000000 --- a/oldEvents/misc/guildbanremove.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Events, EmbedBuilder, Colors } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.GuildBanRemove, - async execute(member) { - const getdata = await sql(`select * from log_channel where guildid=${escape(member.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await member.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅BAN解除") - .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | BANremove" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(member.guild.id)};`); - }; - } -} \ No newline at end of file diff --git a/oldEvents/misc/messageUpdate.js b/oldEvents/misc/messageUpdate.js deleted file mode 100644 index 26a9394..0000000 --- a/oldEvents/misc/messageUpdate.js +++ /dev/null @@ -1,23 +0,0 @@ -const { Events, EmbedBuilder, Colors, ChannelType } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -module.exports = { - name: Events.MessageUpdate, - async execute(oldMessage, newMessage) { - if (oldMessage.channel.type === ChannelType.DM) return; - const getdata = await sql(`select * from log_channel where guildid=${escape(oldMessage.guild.id)};`); - if (!getdata[0][0]?.guildid) return;//もっときれいな書き方あったら書き直しといて(これだとレスポンス悪そう) - try { - const channel = await oldMessage.guild.channels.fetch(getdata[0][0]?.channelid); - const Embed = new EmbedBuilder() - .setTitle("✅メッセージの編集") - .setDescription(`メッセージユーザー:${oldMessage.author || oldMessage.author.tag}\n**対象チャンネル**:${newMessage.channel}\n**編集前のメッセージ**\n${oldMessage.content}\n**編集後のメッセージ**\n${newMessage.content}`) - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | messageUpdate" }); - await channel.send({ embeds: [Embed] }); - } catch (error) { - await sql(`DELETE FROM log_channel WHERE guildid = ${escape(oldMessage.guild.id)};`); - }; - } -} \ No newline at end of file From 5483c1950a7a3072049ae0a463e0661b011f5ed6 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 15:31:23 +0900 Subject: [PATCH 21/90] =?UTF-8?q?log=20=E3=81=AE=E3=83=81=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=83=8D=E3=83=AB=E3=81=AE=E8=A8=AD=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/server/log.js | 62 ++++++++++++++++++++++++++++++++ events/log/guildbanremove.js | 1 - helpers/sendLog.js | 8 +++-- oldCommands/misc/log.js | 68 ------------------------------------ 4 files changed, 68 insertions(+), 71 deletions(-) create mode 100644 commands/server/log.js delete mode 100644 oldCommands/misc/log.js diff --git a/commands/server/log.js b/commands/server/log.js new file mode 100644 index 0000000..0e40334 --- /dev/null +++ b/commands/server/log.js @@ -0,0 +1,62 @@ +const { ChannelType, Colors, PermissionFlagsBits } = require("discord.js"); +const { CustomEmbed, Utils } = require("../../libs"); +const { escape } = require("mysql2"); + +const logCreate = { + builder: (builder) => builder + .setName("create") + .setDescription("logチャンネルを指定します") + .addChannelOption(option => option + .setName("channel") + .setDescription("logを残したいチャンネルを選択") + .setRequired(true) + .addChannelTypes(ChannelType.GuildText) + ) + , + async execute(interaction, getdata, Log) { + const channel = interaction.options.getChannel("channel"); + let sqlStatus; + if (getdata?.guildid) { + sqlStatus = Utils.sql(`update log_channel set channelid=${escape(channel.id)} where guildid=${escape(interaction.guild.id)};`); + } else { + sqlStatus = Utils.sql(`insert into log_channel values (${escape(interaction.guild.id)}, ${escape(interaction.options.getChannel("channel").id)});`); + }; + await sqlStatus; + const embed = new CustomEmbed("log"); + if (!sqlStatus) embed.typeError().setDescription("データの保存に失敗しました。"); + else embed.typeSuccess().setDescription(`logチャンネルを${channel}に設定しました。`); + interaction.reply({ embeds: [embed], ephemeral: true }); + } +}; + +const logDelete = { + builder: (builder) => builder + .setName("delete") + .setDescription("logチャンネルを削除します") + , + async execute(interaction, getdata, Log) { + const embed = new CustomEmbed("log"); + if (!getdata?.guildid) embed.typeError().setDescription("データが見つかりませんでした。"); + else { + const sqlStatus = await Utils.sql(`DELETE FROM log_channel WHERE guildid = ${escape(interaction.guild.id)};`); + if (!sqlStatus) embed.typeError().setDescription("データの削除に失敗しました。"); + else embed.typeSuccess().setDescription("データの削除に成功しました!"); + }; + interaction.reply({ embeds: [embed], ephemeral: true }); + } + +}; + +module.exports = { + subcommands: [logCreate, logDelete], + builder: (builder) => builder + .setName("log") + .setDescription("logチャンネルの設定") + .setDMPermission(false) + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) + , + async execute(interaction) { + const getdata = await Utils.sql(`select * from log_channel where guildid=${escape(interaction.guild.id)};`); + return [getdata[0][0]]; + } +}; \ No newline at end of file diff --git a/events/log/guildbanremove.js b/events/log/guildbanremove.js index 0497426..4bb5ac7 100644 --- a/events/log/guildbanremove.js +++ b/events/log/guildbanremove.js @@ -1,5 +1,4 @@ const { Events, Colors } = require("discord.js"); -const { CustomEmbed } = require("../../libs/EmbedBuilder"); const sendLog = require("../../helpers/sendLog"); const { CustomEmbed } = require("../../libs"); diff --git a/helpers/sendLog.js b/helpers/sendLog.js index 8f61b1f..215d7f3 100644 --- a/helpers/sendLog.js +++ b/helpers/sendLog.js @@ -1,15 +1,19 @@ const { Utils } = require("../libs"); const { escape } = require("mysql2"); +const { GetLogger: logger } = require("../libs"); +const Log = logger.createChannel("sendLog"); async function sendLog(guild, callback) { const getdata = await Utils.sql(`select * from log_channel where guildid=${escape(guild.id)};`); - if (!getdata[0][0]?.guildid) return; + const data = getdata[0][0]; + if (!data) return; try { - const channel = await member.guild.channels.fetch(getdata[0][0].channelid); + const channel = await guild.channels.fetch(data.channelid); if (!channel) return; const embed = callback(); await channel.send({ embeds: [embed] }); } catch (error) { + Log.error(error); Utils.sql(`DELETE FROM log_channel WHERE guildid=${escape(guild.id)};`); } } diff --git a/oldCommands/misc/log.js b/oldCommands/misc/log.js deleted file mode 100644 index e01106c..0000000 --- a/oldCommands/misc/log.js +++ /dev/null @@ -1,68 +0,0 @@ -const { SlashCommandBuilder, ChannelType, EmbedBuilder, Colors, PermissionFlagsBits } = require('discord.js'); -const { sql } = require("../../libs/Utils"); -const { escape } = require("mysql2") - -const ERROREmbed = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("データの保存に失敗しました。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); -const delete_embed = new EmbedBuilder() - .setTitle("✅成功") - .setDescription("データの削除に成功しました!") - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) - .setColor(Colors.Green); -const undefined_embed = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("データが見つかりませんでした。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); -const delete_error = new EmbedBuilder() - .setTitle("⚠エラー") - .setDescription("データの削除に失敗しました。") - .setColor(Colors.Red) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }); -module.exports = { - data: new SlashCommandBuilder() - .setName('log') - .addSubcommand(subcommand => - subcommand.setName("create").setDescription("logチャンネルを指定します").addChannelOption(option => option.addChannelTypes(ChannelType.GuildText).setName("channel").setDescription("logを残したいチャンネルを選択").setRequired(true)) - ) - .addSubcommand(subcommand => - subcommand.setName("delete").setDescription("logチャンネルを削除します") - ) - .setDMPermission(false) - .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) - .setDescription('logを残します'), - async execute(interaction) { - const getdata = await sql(`select * from log_channel where guildid=${escape(interaction.guild.id)};`); - const sub = interaction.options.getSubcommand(); - if (sub === "create") { - if (getdata[0][0]?.guildid) { - const update = await sql(`update log_channel set channelid=${escape(interaction.options.getChannel("channel").id)} where guildid=${escape(interaction.guild.id)};`); - const update_embed = new EmbedBuilder() - .setTitle(`✅logチャンネル`) - .setDescription(`logチャンネルを${interaction.options.getChannel("channel")}に変更しました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) - .setColor(Colors.Green); - if (!update) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) - await interaction.reply({ embeds: [update_embed], ephemeral: true }); - } else { - const add = await sql(`insert into log_channel values (${escape(interaction.guild.id)}, ${escape(interaction.options.getChannel("channel").id)});`); - const add_embed = new EmbedBuilder() - .setTitle(`✅logチャンネル`) - .setDescription(`logチャンネルを${interaction.options.getChannel("channel")}に設定しました。`) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | log" }) - .setColor(Colors.Green); - if (!add) return await interaction.reply({ embeds: [ERROREmbed], ephemeral: true }) - await interaction.reply({ embeds: [add_embed], ephemeral: true }); - }; - }; - if (sub === "delete") { - if (!getdata[0][0]?.guildid) return await interaction.reply({ embeds: [undefined_embed], ephemeral: true }); - const sql_delete = await sql(`DELETE FROM log_channel WHERE guildid = ${escape(interaction.guild.id)};`); - if (!sql_delete) return await interaction.reply({ embeds: [delete_error], ephemeral: true }); - await interaction.reply({ embeds: [delete_embed], ephemeral: true }); - }; - } -}; \ No newline at end of file From 8c6a3b747a0ed7ffd4d318e018473600cb23bf3d Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 16:05:20 +0900 Subject: [PATCH 22/90] =?UTF-8?q?CustomEmbed=E3=81=A7timestamp=E3=81=8C?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=A0=B4=E5=90=88=E3=80=81=E8=87=AA=E5=8B=95=E3=81=A7?= =?UTF-8?q?=E9=80=81=E4=BF=A1=E6=99=82=E3=81=ABtimestamp=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/EmbedUtil.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/EmbedUtil.js b/libs/EmbedUtil.js index 675f5c6..957a877 100644 --- a/libs/EmbedUtil.js +++ b/libs/EmbedUtil.js @@ -20,6 +20,10 @@ class CustomEmbed extends EmbedBuilder { this.setColor(Colors.Red); return this; } + toJSON() { + if (!this.data.timestamp) this.setTimestamp(); + return super.toJSON(); + } } function getEmbedName(embed) { From ce685dd5e9ee7deff72e9d60ae0be8795d651461 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 16:06:47 +0900 Subject: [PATCH 23/90] =?UTF-8?q?=E3=82=AE=E3=83=AB=E3=83=89=E3=81=8C?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=95=E3=82=8C=E3=81=9F=E9=9A=9B=E3=81=AB?= =?UTF-8?q?bot=E3=81=AE=E3=83=9C=E3=82=A4=E3=82=B9=E3=83=81=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=83=8D=E3=83=AB=E3=81=AE=E6=8E=A5=E7=B6=9A=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/speak/guilddelete.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 events/speak/guilddelete.js diff --git a/events/speak/guilddelete.js b/events/speak/guilddelete.js new file mode 100644 index 0000000..79a4bff --- /dev/null +++ b/events/speak/guilddelete.js @@ -0,0 +1,10 @@ +const { Events } = require("discord.js"); +const { getVoiceConnection } = require("@discordjs/voice"); +module.exports = { + name: Events.GuildDelete, + async execute(guild) { + const connection = getVoiceConnection(guild.id); + if (globalThis.voice_channel[guild.id]) delete globalThis.voice_channel[guild.id]; + if (connection?.state?.status) connection.destroy(); + } +} \ No newline at end of file From 0cf32b981d40c667ea84ab4c6d466656aa523f2f Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 16:12:21 +0900 Subject: [PATCH 24/90] =?UTF-8?q?guilddelete=E3=81=AEold=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oldEvents/misc/guilddelete.js | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 oldEvents/misc/guilddelete.js diff --git a/oldEvents/misc/guilddelete.js b/oldEvents/misc/guilddelete.js deleted file mode 100644 index 7298ab1..0000000 --- a/oldEvents/misc/guilddelete.js +++ /dev/null @@ -1,10 +0,0 @@ -const { Events } = require('discord.js'); -const { getVoiceConnection } = require('@discordjs/voice'); -module.exports = { - name: Events.GuildDelete, - async execute(guild) { - const connection = getVoiceConnection(guild.id); - if (globalThis.voice_channel[guild.id]) delete globalThis.voice_channel[guild.id]; - if (connection?.state?.status) connection.destroy(); - } -} \ No newline at end of file From e986d9afc26d6be912a4daa8f9ea17d67445809f Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 16:12:30 +0900 Subject: [PATCH 25/90] =?UTF-8?q?report=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/bot/report.js | 22 ++++++++++++++++++++++ helpers/reportwebhook.js | 9 --------- oldEvents/misc/report.js | 19 ------------------- 3 files changed, 22 insertions(+), 28 deletions(-) create mode 100644 events/bot/report.js delete mode 100644 helpers/reportwebhook.js delete mode 100644 oldEvents/misc/report.js diff --git a/events/bot/report.js b/events/bot/report.js new file mode 100644 index 0000000..75b4141 --- /dev/null +++ b/events/bot/report.js @@ -0,0 +1,22 @@ +const { WebhookClient, Colors, Events } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); + +const reportWebhook = new WebhookClient({ url: process.env.errorwebhook }); + +module.exports = { + name: Events.InteractionCreate, + filter: (interaction) => interaction.isModalSubmit() && interaction.customId === "report", + async execute(interaction) { + const title = interaction.fields.getTextInputValue("title"); + const description = interaction.fields.getTextInputValue("description"); + + const reportEmbed = new CustomEmbed("report") + .setTitle(title) + .setDescription(description) + .setColor(Colors.Orange); + reportWebhook.send({ embeds: [reportEmbed] }); + + const embed = new CustomEmbed("report").typeSuccess().setDescription("レポートが送信されました。"); + interaction.reply({ embeds: [embed], ephemeral: true }); + } +}; \ No newline at end of file diff --git a/helpers/reportwebhook.js b/helpers/reportwebhook.js deleted file mode 100644 index 8c156ce..0000000 --- a/helpers/reportwebhook.js +++ /dev/null @@ -1,9 +0,0 @@ -const { WebhookClient } = require('discord.js'); -const webhookClient = new WebhookClient({ url: process.env.errorwebhook }); - - -module.exports = { - async send(data) { - await webhookClient.send({ embeds: [{ title: data.title, description: data.description }] }); - } -} \ No newline at end of file diff --git a/oldEvents/misc/report.js b/oldEvents/misc/report.js deleted file mode 100644 index 6a1da73..0000000 --- a/oldEvents/misc/report.js +++ /dev/null @@ -1,19 +0,0 @@ -const { EmbedBuilder, Colors, Events } = require('discord.js'); -const { send } = require("../../helpers/reportwebhook"); -const embed = new EmbedBuilder() - .setTitle('✅完了') - .setDescription("レポートが送信されました") - .setColor(Colors.Green) - .setTimestamp(new Date()) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | status" }); -module.exports = { - name: Events.InteractionCreate, - async execute(interaction) { - if (!interaction.isModalSubmit()) return; - if (interaction.customId !== "report") return; - const title = interaction.fields.getTextInputValue('title'); - const description = interaction.fields.getTextInputValue('description'); - send({ title: title, description: description }); - await interaction.reply({ embeds: [embed], ephemeral: true }); - } -} \ No newline at end of file From 37f8362b093342f3a09a2df96e8ffd53bc2f2673 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 20:33:03 +0900 Subject: [PATCH 26/90] =?UTF-8?q?userinfo=E3=81=AE=E8=AA=BF=E6=95=B4,=20se?= =?UTF-8?q?rverinfo=E3=82=92dm=E3=81=A7=E4=BD=BF=E3=81=88=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/misc/serverinfo.js | 80 ++++++++++++------------ commands/misc/userinfo.js | 117 +++++++++++++++++++++++++++--------- 2 files changed, 128 insertions(+), 69 deletions(-) diff --git a/commands/misc/serverinfo.js b/commands/misc/serverinfo.js index c0f73ac..aefc6f6 100644 --- a/commands/misc/serverinfo.js +++ b/commands/misc/serverinfo.js @@ -1,29 +1,29 @@ -const { EmbedBuilder, codeBlock, ChannelType, Colors } = require('discord.js'); -const moment = require('moment'); -moment.locale('ja'); +const { EmbedBuilder, codeBlock, ChannelType, Colors } = require("discord.js"); +const moment = require("moment"); +moment.locale("ja"); const filterLevel = { - 0: 'Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)', - 1: 'Medium - ロールのないメンバーのメディアコンテンツをスキャンします。(ロールを持つメンバーを信頼する)', - 2: 'High - すべてのメンバーのメディアコンテンツをスキャンします。(クリーンなサーバーに推奨)' + 0: "Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)", + 1: "Medium - ロールのないメンバーのメディアコンテンツをスキャンします。(ロールを持つメンバーを信頼する)", + 2: "High - すべてのメンバーのメディアコンテンツをスキャンします。(クリーンなサーバーに推奨)" }; const verificationLevel = { - 0: '設定しない - 無制限', - 1: '低 - メール認証がされてるアカウントのみ', - 2: '中 - Discordに登録してから5分以上経過したアカウントのみ', - 3: '高 - このサーバーにメンバーとなってから10分以上経過したアカウントのみ', - 4: '最高 - 電話認証がされているアカウントのみ' + 0: "設定しない - 無制限", + 1: "低 - メール認証がされてるアカウントのみ", + 2: "中 - Discordに登録してから5分以上経過したアカウントのみ", + 3: "高 - このサーバーにメンバーとなってから10分以上経過したアカウントのみ", + 4: "最高 - 電話認証がされているアカウントのみ" }; const verified = { - true: '認証されています', - false: '認証されていません' + true: "認証されています", + false: "認証されていません" }; const partnered = { - true: 'パートナープログラムに登録されています', - false: 'パートナープログラムに登録されていません' + true: "パートナープログラムに登録されています", + false: "パートナープログラムに登録されていません" }; const membersRole = (members, role) => { @@ -32,12 +32,14 @@ const membersRole = (members, role) => { module.exports = { builder: (builder) => builder - .setName('server-info') - .setDescription('サーバー情報を表示します。') + .setName("serverinfo") + .setDescription("サーバー情報を表示します。") .addBooleanOption((option) => option - .setName('ephemeral') - .setDescription('あなただけが見れるようにするか') - ), + .setName("ephemeral") + .setDescription("あなただけが見れるようにするか") + ) + .setDMPermission(false) + , async execute(interaction) { const members = interaction.guild.members.cache; const roles = interaction.guild.roles.cache; @@ -47,23 +49,23 @@ module.exports = { const owner = await interaction.guild.fetchOwner(); const fields = [ - { name: '基本情報', value: '\u200b' }, - { name: 'サーバー名・ID', value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, - { name: 'オーナー名・ID', value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, - { name: '言語', value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, - { name: 'ブーストレベル', value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, + { name: "基本情報", value: "\u200b" }, + { name: "サーバー名・ID", value: `${codeBlock(`${interaction.guild.name} - ${interaction.guild.id}`)}` }, + { name: "オーナー名・ID", value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, + { name: "言語", value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, + { name: "ブーストレベル", value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, - { name: 'その他のチャンネル', value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, - { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes('everyone')).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(','))}` }, - { name: '\u200b', value: '\u200b' }, - { name: '高度な情報', value: '\u200b' }, - { name: 'メディアコンテンツフィルター', value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, - { name: '認証レベル', value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, - { name: '認証サーバー', value: `${codeBlock(verified[interaction.guild.verified])} ` }, - { name: 'パートナープログラム', value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, - { name: '\u200b', value: '\u200b' }, - { name: 'メンバーと絵文字(ステッカー)', value: '\u200b' }, + { name: "その他のチャンネル", value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, + { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes("everyone")).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(","))}` }, + { name: "\u200b", value: "\u200b" }, + { name: "高度な情報", value: "\u200b" }, + { name: "メディアコンテンツフィルター", value: `${codeBlock(filterLevel[interaction.guild.explicitContentFilter])}` }, + { name: "認証レベル", value: `${codeBlock(verificationLevel[interaction.guild.verificationLevel])} ` }, + { name: "認証サーバー", value: `${codeBlock(verified[interaction.guild.verified])} ` }, + { name: "パートナープログラム", value: `${codeBlock(partnered[interaction.guild.partnered])} ` }, + { name: "\u200b", value: "\u200b" }, + { name: "メンバーと絵文字(ステッカー)", value: "\u200b" }, { name: `メンバー[${interaction.guild.memberCount}]`, value: `${codeBlock(`ユーザー:${members.filter(member => !member.user.bot).size}\nボット:${members.filter(member => member.user.bot).size}`)}`, inline: true }, { name: `絵文字[${emojis.size}]`, value: `${codeBlock(`通常:${emojis.filter(emoji => !emoji.animated).size}\nアニメーション:${emojis.filter(emoji => emoji.animated).size}\nステッカー:${stickers.size}`)}`, inline: true } ]; @@ -81,17 +83,17 @@ module.exports = { }); const embed = new EmbedBuilder() - .setTitle('✅サーバー情報') + .setTitle("✅サーバー情報") .setColor(Colors.Green) - .setThumbnail(interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })) + .setThumbnail(interaction.guild.iconURL({ dynamic: true, format: "png", size: 4096 })) .addFields(editedFields) .setTimestamp(new Date()) .setFooter({ text: `${interaction.guild.name}`, - iconURL: `${interaction.guild.icon === null ? "https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6a49cf127bf92de1e2_icon_clyde_blurple_RGB.png" : interaction.guild.iconURL({ dynamic: true, format: 'png', size: 4096 })}` + iconURL: `${interaction.guild.icon === null ? "https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6a49cf127bf92de1e2_icon_clyde_blurple_RGB.png" : interaction.guild.iconURL({ dynamic: true, format: "png", size: 4096 })}` }); - if (interaction.options.getBoolean('ephemeral')) { + if (interaction.options.getBoolean("ephemeral")) { return interaction.reply({ embeds: [embed], ephemeral: true }); } else { return interaction.reply({ embeds: [embed] }); diff --git a/commands/misc/userinfo.js b/commands/misc/userinfo.js index afe62cb..9cfbbc4 100644 --- a/commands/misc/userinfo.js +++ b/commands/misc/userinfo.js @@ -1,5 +1,6 @@ -const { EmbedBuilder, Colors } = require('discord.js'); -const { ja } = require('../../libs/Permissions'); +const { Colors, time, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageComponentInteraction } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); +const { ja } = require("../../libs/Permissions"); const status = { key: { desktop: "デスクトップ", @@ -14,41 +15,97 @@ const status = { } module.exports = { builder: (builder) => builder - .setName('user-info') - .setDescription('ユーザー情報を取得します。') + .setName("userinfo") + .setDescription("ユーザー情報を取得します。") .addUserOption((option) => option - .setName('user') - .setDescription('対象のユーザー') + .setName("user") + .setDescription("対象のユーザー") ) .addBooleanOption((option) => option - .setName('ephemeral') - .setDescription('自分だけが見れるようにするか') + .setName("ephemeral") + .setDescription("自分だけが見れるようにするか") ), async execute(interaction) { - const member = interaction.guild.members.cache.get(interaction.options.getUser("user")?.id) || interaction.member; - const embed = new EmbedBuilder() - .setTitle(`✅${member.user.username}の情報`) - .setThumbnail((member.user.avatar) ? `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp` : "https://discord.com/assets/7c8f476123d28d103efe381543274c25.png") - .setColor(Colors.Green) - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | userinfo" }) - .addFields( - { name: '名前(ID)', value: `${member.user.tag}(${member.user.id})` }, - { name: 'サーバー参加日', value: `()` }, - { name: 'Discord参加日', value: `()` }, - { name: `役職(${member.roles.cache.filter(role => role.name !== "@everyone").size})`, value: `${member.roles.cache.filter(role => role.name !== "@everyone").map(role => role).join(",")}` }, - { name: 'BOTか否か', value: `${member.user.bot ? "はい" : "いいえ"}` }, - { name: 'ステータス', value: `${status.value[Object.values(member.presence?.clientStatus || {})[0]] ? `${status.key[Object.keys(member.presence.clientStatus)[0]]}でログイン中\n状態:${status.value[Object.values(member.presence.clientStatus)[0]]}` : "オフライン"}` }, - { name: 'ニックネーム', value: `${member.nickname || "なし"}` }, - { name: '権限一覧', value: `${member.permissions.toArray().map(permission => `\`${ja[permission] || permission}\``).join(",")}` } - ); + const { client, channel, options } = interaction; + const user = options.getUser("user") || interaction.user; + const ephemeral = interaction.options.getBoolean("ephemeral") || false; - if (interaction.options.getBoolean('ephemeral')) { - return interaction.reply({ embeds: [embed], ephemeral: true }); + const mutualGuilds = client.guilds.cache.filter(guild => guild.members.cache.has(user.id)); + + const embed = new CustomEmbed("userinfo") + .setTitle(`${user.username} の情報`) + .setThumbnail((user.avatar) ? `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.webp` : "https://discord.com/assets/7c8f476123d28d103efe381543274c25.png") + .setColor(Colors.Green); + + let member; + if (channel.isDMBased || !options.getUser("user")) { + if (mutualGuilds.size) { + if (mutualGuilds.has(channel.guild?.id)) { + member = channel.guild.members.cache.get(user.id); + } else { + member = mutualGuilds.first().members.cache.get(user.id); + } + } else { + member = null; + } + } else { + member = interaction.member; + } + + const inThisGuild = channel.guild && member?.guild?.id === channel.guild.id; + + embed.addFields({ name: "ユーザー (id)", value: `${user} (${user.id})`, inline: !inThisGuild }); + if (inThisGuild) embed.addFields({ name: "ニックネーム", value: `${member.nickname || user.username}`, inline: true }); + embed.addFields({ name: "Botかどうか", value: `${user.bot ? "はい" : "いいえ"}`, inline: true }); + let presenceText; + if (member) { + if (Object.keys(member.presence?.clientStatus || {}).length) { + presenceText = + `${status.key[Object.keys(member.presence.clientStatus)[0]]}でログイン中\n` + + `状態:${status.value[Object.values(member.presence.clientStatus)[0]]}`; + } else { + presenceText = "オフライン" + } } else { - return interaction.reply({ embeds: [embed] }) + presenceText = "取得できませんでした" + } + embed.addFields( + { name: "ステータス", value: presenceText }, + { name: "Discordアカウント作成日時", value: `${ts2time(user.createdTimestamp)} (${ts2time(user.createdTimestamp, "R")})` } + ); + if (inThisGuild) embed.addFields({ name: "サーバー参加日時", value: `${ts2time(member.joinedTimestamp)} (${ts2time(member.joinedTimestamp, "R")})` }); + if (inThisGuild) { + const roles = member.roles.cache + .filter(role => role.name !== "@everyone") + .map(role => role); + embed.addFields({ name: `役職 (${roles.length})`, value: `${roles.join(", ")}`}) + } + + if (inThisGuild) { + const component = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("userinfo_permissions") + .setLabel("権限一覧を表示する") + .setStyle(ButtonStyle.Primary) + ); + const message = await interaction.reply({ embeds: [embed], components: [component], ephemeral, fetchReply: true }); + message.awaitMessageComponent({ filter: (i) => i.customId === "userinfo_permissions", time: 3 * 60 * 1000 }) + .then(() => { + const permissions = member.permissions; + embed.addFields({ name: "権限一覧", value: `${permissions.toArray().map(permission => `\`${ja[permission] || permission}\``).join(", ")}` }); + }) + .catch(() => { }) + .then(() => { + interaction.editReply({ embeds: [embed], components: [] }); + }) + } else { + interaction.reply({ embeds: [embed], ephemeral }) } - await interaction.reply({ - embeds: [embed] - }); } +} + +//timeをdiscordのメッセージタイムスタンプに変換 +function ts2time(timestamp, format) { + return time(Math.floor(timestamp / 1000), format); } \ No newline at end of file From a26f935972e9f6807993c1d9ccdd4c0cadae18d0 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Thu, 18 May 2023 22:21:34 +0900 Subject: [PATCH 27/90] add ts2time --- commands/misc/serverinfo.js | 5 ++--- commands/misc/userinfo.js | 7 +------ libs/index.js | 4 +++- libs/ts2time.js | 7 +++++++ package-lock.json | 1 - package.json | 1 - 6 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 libs/ts2time.js diff --git a/commands/misc/serverinfo.js b/commands/misc/serverinfo.js index aefc6f6..f4e1b6c 100644 --- a/commands/misc/serverinfo.js +++ b/commands/misc/serverinfo.js @@ -1,6 +1,5 @@ const { EmbedBuilder, codeBlock, ChannelType, Colors } = require("discord.js"); -const moment = require("moment"); -moment.locale("ja"); +const { CustomEmbed, ts2time } = require("../../libs"); const filterLevel = { 0: "Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)", @@ -54,7 +53,7 @@ module.exports = { { name: "オーナー名・ID", value: `${codeBlock(`${owner.user.tag} - ${interaction.guild.ownerId}`)}` }, { name: "言語", value: `${codeBlock(interaction.guild.preferredLocale)}`, inline: true }, { name: "ブーストレベル", value: `${codeBlock(`レベル-${interaction.guild.premiumTier}`)}`, inline: true }, - { name: `サーバー作成日[${moment(interaction.guild.createdAt).fromNow()}]`, value: `${codeBlock(moment(interaction.guild.createdAt).format("YYYY年MMMMDodddd"))}` }, + { name: `サーバー作成日`, value: `${ts2time(interaction.guild.createdAt)} (${ts2time(interaction.guild.createdAt, "R")})` }, { name: `カテゴリーとチャンネル`, value: `${codeBlock(`カテゴリー:${channels.filter(channel => channel.type === ChannelType.GuildCategory).size}|テキスト:${channels.filter(channel => channel.type === ChannelType.GuildText).size}|ボイス:${channels.filter(channel => channel.type === ChannelType.GuildVoice).size}`)}` }, { name: "その他のチャンネル", value: `${codeBlock(`アナウンス:${channels.filter(channel => channel.type === ChannelType.GuildAnnouncement).size}|フォーラム:${channels.filter(channel => channel.type === ChannelType.GuildForum).size}|スレッド:${channels.filter(channel => channel.type === ChannelType.PublicThread).size}|ステージ:${channels.filter(channel => channel.type === ChannelType.GuildStageVoice).size}`)}` }, { name: `ロール[${roles.size}]`, value: `${codeBlock(roles.filter(r => !r.name.includes("everyone")).sort((a, b) => b.position - a.position).map(r => `${r.name}[${membersRole(members, r)}]`).join(","))}` }, diff --git a/commands/misc/userinfo.js b/commands/misc/userinfo.js index 9cfbbc4..ad1ad88 100644 --- a/commands/misc/userinfo.js +++ b/commands/misc/userinfo.js @@ -1,5 +1,5 @@ const { Colors, time, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageComponentInteraction } = require("discord.js"); -const { CustomEmbed } = require("../../libs"); +const { CustomEmbed, ts2time } = require("../../libs"); const { ja } = require("../../libs/Permissions"); const status = { key: { @@ -103,9 +103,4 @@ module.exports = { interaction.reply({ embeds: [embed], ephemeral }) } } -} - -//timeをdiscordのメッセージタイムスタンプに変換 -function ts2time(timestamp, format) { - return time(Math.floor(timestamp / 1000), format); } \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index a80e884..e712ac3 100644 --- a/libs/index.js +++ b/libs/index.js @@ -6,6 +6,7 @@ const Utils = require("./Utils"); const Permissions = require("./Permissions"); const EmbedUtil = require("./EmbedUtil"); const { CustomEmbed, getEmbedName, ColorsChoice } = EmbedUtil; +const ts2time = require("./ts2time"); module.exports = { Logger, @@ -17,5 +18,6 @@ module.exports = { EmbedUtil, CustomEmbed, getEmbedName, - ColorsChoice + ColorsChoice, + ts2time } \ No newline at end of file diff --git a/libs/ts2time.js b/libs/ts2time.js new file mode 100644 index 0000000..be5fd20 --- /dev/null +++ b/libs/ts2time.js @@ -0,0 +1,7 @@ +const { time } = require("discord.js"); + +function ts2time(timestamp, format) { + return time(Math.floor(timestamp / 1000), format); +} + +module.exports = ts2time; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 935cb7e..74818e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,6 @@ "libsodium-wrappers": "^0.7.11", "mariadb": "^3.0.2", "module-alias": "^2.2.2", - "moment": "^2.29.4", "mysql": "^2.18.1", "mysql2": "^3.2.0", "node-fetch": "^2.6.9", diff --git a/package.json b/package.json index a183e1e..8f2180c 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "libsodium-wrappers": "^0.7.11", "mariadb": "^3.0.2", "module-alias": "^2.2.2", - "moment": "^2.29.4", "mysql": "^2.18.1", "mysql2": "^3.2.0", "node-fetch": "^2.6.9", From b159c4e897343c7133071fce65d29f795f4eb91f Mon Sep 17 00:00:00 2001 From: maamokun Date: Thu, 18 May 2023 22:37:22 +0900 Subject: [PATCH 28/90] New URLs --- commands/misc/serverinfo.js | 2 +- events/misc/msgURL.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/misc/serverinfo.js b/commands/misc/serverinfo.js index f4e1b6c..975e123 100644 --- a/commands/misc/serverinfo.js +++ b/commands/misc/serverinfo.js @@ -89,7 +89,7 @@ module.exports = { .setTimestamp(new Date()) .setFooter({ text: `${interaction.guild.name}`, - iconURL: `${interaction.guild.icon === null ? "https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6a49cf127bf92de1e2_icon_clyde_blurple_RGB.png" : interaction.guild.iconURL({ dynamic: true, format: "png", size: 4096 })}` + iconURL: `${interaction.guild.icon === null ? "https://cdn.mikandev.tech/public-assets/clyde-blue.png" : interaction.guild.iconURL({ dynamic: true, format: "png", size: 4096 })}` }); if (interaction.options.getBoolean("ephemeral")) { diff --git a/events/misc/msgURL.js b/events/misc/msgURL.js index 93e3c54..e3592d2 100644 --- a/events/misc/msgURL.js +++ b/events/misc/msgURL.js @@ -29,7 +29,7 @@ module.exports = { .setTimestamp(msg.createdAt) .setFooter({ text: `${msg.channel.name}`, - iconURL: `${msg.guild.iconURL() == null ? "https://www.freepnglogos.com/uploads/discord-logo-png/discord-logo-logodownload-download-logotipos-1.png" : msg.guild.iconURL()}` + iconURL: `${msg.guild.iconURL() == null ? "https://cdn.mikandev.tech/public-assets/discord-logo.png" : msg.guild.iconURL()}` }) if (msg.content.length > 0) { From 9c352e679c815b576d29862cb882e12d6d85f3d1 Mon Sep 17 00:00:00 2001 From: maamokun Date: Thu, 18 May 2023 23:02:37 +0900 Subject: [PATCH 29/90] artifacter cards CDN --- oldCommands/misc/genshin.js | 2 +- oldEvents/misc/genshin_modal.js | 2 +- oldEvents/misc/genshin_select.js | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/oldCommands/misc/genshin.js b/oldCommands/misc/genshin.js index fc66eaa..39d3f8b 100644 --- a/oldCommands/misc/genshin.js +++ b/oldCommands/misc/genshin.js @@ -68,7 +68,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`${user.nickname} - レベル${user.level}`) .setDescription(`${user.enkaProfile?.bio || "自己紹介なし"}\n**螺旋**\n${user.abyssFloor || "取得失敗"}層 ${user.abyssChamber || "取得失敗"}間\n**アチーブメント数**\n${user.achievements || "取得失敗"}`) - .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) + .setThumbnail(`https://mikandev-assets.b-cdn.net/public-assets/genshin-cards/UI_AvatarIcon_Albedo_Card.png`) .setImage(`https://enka.network/ui/${user.profileCard.pictures[1].name}.png`) .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); diff --git a/oldEvents/misc/genshin_modal.js b/oldEvents/misc/genshin_modal.js index 7e6da57..5daaf22 100644 --- a/oldEvents/misc/genshin_modal.js +++ b/oldEvents/misc/genshin_modal.js @@ -57,7 +57,7 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`✅成功`) .setDescription(`${user.enkaProfile?.bio || "自己紹介なし"}\n**螺旋**\n${user?.abyssFloor || "取得失敗"}層 ${user?.abyssChamber || "取得失敗"}間\n**アチーブメント数**\n${user.achievements || "取得失敗"}`) - .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) + .setThumbnail(`https://cdn.mikandev.tech/public-assets/genshin-cards/${user.profilePictureCharacter.cardIcon.name}.png`) .setImage(`https://enka.network/ui/${user.profileCard.pictures[1].name}.png`) .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | genshin" }) .setColor(Colors.Green); diff --git a/oldEvents/misc/genshin_select.js b/oldEvents/misc/genshin_select.js index b4fab04..8051e57 100644 --- a/oldEvents/misc/genshin_select.js +++ b/oldEvents/misc/genshin_select.js @@ -56,10 +56,10 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`${name} - レベル${user.characters.filter(r => name === r.characterData.name.get('jp'))[0].level}`) .setDescription(`時点\n**スコア計算式**\n\`${math[types[type]]}\``) - .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) + .setThumbnail(`https://cdn.mikandev.tech/public-assets/genshin-cards/${user.profilePictureCharacter.cardIcon.name}.png`) .setImage("attachment://genshin.png") .setFooter({ - iconURL: `https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`, + iconURL: `https://cdn.mikandev.tech/public-assets/genshin-cards/${user.profilePictureCharacter.cardIcon.name}.png`, text: `${user.nickname} - レベル${user.level}` }) .setColor(Colors.Green); @@ -102,10 +102,10 @@ module.exports = { const success = new EmbedBuilder() .setTitle(`${name} - レベル${user.characters.filter(r => name === r.characterData.name.get('jp'))[0].level}`) .setDescription(`時点\n**スコア計算式**\n\`${math[types[type]]}\``) - .setThumbnail(`https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`) + .setThumbnail(`https://cdn.mikandev.tech/public-assets/genshin-cards/${user.profilePictureCharacter.cardIcon.name}.png`) .setImage("attachment://genshin.png") .setFooter({ - iconURL: `https://artifacter.krnk-infra.com/avatar/${user.profilePictureCharacter.cardIcon.name}/image.png`, + iconURL: `https://cdn.mikandev.tech/public-assets/genshin-cards/${user.profilePictureCharacter.cardIcon.name}.png`, text: `${user.nickname} - レベル${user.level}` }) .setColor(Colors.Green); From 53f3a2f58dbcbce868b9da1d818050c3bf098d0e Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 00:30:07 +0900 Subject: [PATCH 30/90] =?UTF-8?q?manage=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/server/manage/ban.js | 1 - commands/server/manage/kick.js | 1 - commands/server/manage/mute.js | 1 - commands/server/manage/show.js | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/commands/server/manage/ban.js b/commands/server/manage/ban.js index cf7b69e..d9a057f 100644 --- a/commands/server/manage/ban.js +++ b/commands/server/manage/ban.js @@ -1,4 +1,3 @@ -const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../../libs"); module.exports = { diff --git a/commands/server/manage/kick.js b/commands/server/manage/kick.js index 9b261cb..6323602 100644 --- a/commands/server/manage/kick.js +++ b/commands/server/manage/kick.js @@ -1,4 +1,3 @@ -const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../../libs"); module.exports = { diff --git a/commands/server/manage/mute.js b/commands/server/manage/mute.js index 4176368..b256ea9 100644 --- a/commands/server/manage/mute.js +++ b/commands/server/manage/mute.js @@ -1,4 +1,3 @@ -const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../../libs"); module.exports = { diff --git a/commands/server/manage/show.js b/commands/server/manage/show.js index 00eef9a..c73f0fe 100644 --- a/commands/server/manage/show.js +++ b/commands/server/manage/show.js @@ -50,7 +50,7 @@ module.exports = { speakFieldData.forEach((data) => fieldData.push({ name: data[0], value: data[1], inline: true })); const embed = new CustomEmbed("show") - .setTitle("✅サーバーの情報") + .setTitle("サーバーの情報") .setDescription(`[サポートサーバー]https://discord.gg/Y6w5Jv3EAR`) .addFields(fieldData) .setColor(Colors.Green); From 3956239dc326d0e0e00a8856749891ed9978ec16 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 00:30:55 +0900 Subject: [PATCH 31/90] =?UTF-8?q?class=20Database=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/Database.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ libs/index.js | 4 ++- 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 libs/Database.js diff --git a/libs/Database.js b/libs/Database.js new file mode 100644 index 0000000..60d73f7 --- /dev/null +++ b/libs/Database.js @@ -0,0 +1,80 @@ +const mysql = require("mysql2/promise"); +const { escape } = require("mysql2"); + +const logger = require("./GetLogger"); +const Log = logger.createChannel("db"); + +const connectionLog = Log.createChild("connection"); +const runCmdLog = Log.createChild("runCmd"); + + +class Database { + constructor() { + this.connectionOption = { + host: process.env.db_host, + port: process.env.db_port, + user: process.env.db_user, + password: process.env.db_password, + database: process.env.db_name, + }; + } + + select(table, whereObject, columns = "*") { + const where = this.whereParser(whereObject); + return this.sql(`SELECT ${columns} FROM ${table} WHERE ${where}`); + } + + insert(table, data) { + let keys, values; + if (Array.isArray(data)) { + values = data.map((value) => escape(value)); + } else { + keys = Object.keys(data); + values = Object.values(data).map((value) => escape(value)); + } + return this.sql(`INSERT INTO ${table} ${keys ? `(${keys.join(",")})` : ""} VALUES (${values.join(",")})`); + } + + update(table, data, whereObject) { + const where = this.whereParser(whereObject); + const set = Object.entries(data).map(([key, value]) => `${key}=${escape(value)}`).join(","); + return this.sql(`UPDATE ${table} SET ${set} WHERE ${where}`); + } + + delete(table, whereObject) { + const where = this.whereParser(whereObject); + return this.sql(`DELETE FROM ${table} WHERE ${where}`); + } + + whereParser(where) { + const whereArray = Object.entries(where).map(([key, value]) => `${key}=${escape(value)}`) + return whereArray.join(" AND "); + } + + sql(command) { + return new Promise((resolve) => { + mysql.createConnection(this.connectionOption) + .then((connection) => { + connection.query(command) + .then((result) => { + resolve(result); + }) + .catch((error) => { + Log.error(error); + resolve(); + }) + .then(() => { + connection.end(); + }); + }) + .catch((error) => { + connectionLog.error(error); + resolve(); + }); + }); + } +} + +// thisを使いたいのでnewしてます。 +const database = new Database(); +module.exports = database; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index e712ac3..fe39cc8 100644 --- a/libs/index.js +++ b/libs/index.js @@ -7,6 +7,7 @@ const Permissions = require("./Permissions"); const EmbedUtil = require("./EmbedUtil"); const { CustomEmbed, getEmbedName, ColorsChoice } = EmbedUtil; const ts2time = require("./ts2time"); +const Database = require("./Database"); module.exports = { Logger, @@ -19,5 +20,6 @@ module.exports = { CustomEmbed, getEmbedName, ColorsChoice, - ts2time + ts2time, + Database } \ No newline at end of file From 4702397aeb0a9822ebcf8de75e73a5274c9bce9d Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 08:39:01 +0900 Subject: [PATCH 32/90] =?UTF-8?q?=E3=81=84=E3=82=8D=E3=81=84=E3=82=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/misc/serverinfo.js | 2 +- commands/misc/userinfo.js | 3 ++- commands/server/log.js | 26 +++++++++++++------------- commands/server/manage/show.js | 14 ++++++++------ commands/server/manage/unban.js | 1 - commands/server/manage/unmute.js | 1 - libs/{Database.js => SQL.js} | 32 +++++++++++++++++++++++--------- libs/index.js | 4 ++-- 8 files changed, 49 insertions(+), 34 deletions(-) rename libs/{Database.js => SQL.js} (70%) diff --git a/commands/misc/serverinfo.js b/commands/misc/serverinfo.js index 975e123..bb33dd1 100644 --- a/commands/misc/serverinfo.js +++ b/commands/misc/serverinfo.js @@ -1,5 +1,5 @@ const { EmbedBuilder, codeBlock, ChannelType, Colors } = require("discord.js"); -const { CustomEmbed, ts2time } = require("../../libs"); +const { ts2time } = require("../../libs"); const filterLevel = { 0: "Disabled - いかなるメディアコンテンツをスキャンしないでください。(全員を信頼する)", diff --git a/commands/misc/userinfo.js b/commands/misc/userinfo.js index ad1ad88..c5e4338 100644 --- a/commands/misc/userinfo.js +++ b/commands/misc/userinfo.js @@ -1,6 +1,7 @@ -const { Colors, time, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageComponentInteraction } = require("discord.js"); +const { Colors, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); const { CustomEmbed, ts2time } = require("../../libs"); const { ja } = require("../../libs/Permissions"); + const status = { key: { desktop: "デスクトップ", diff --git a/commands/server/log.js b/commands/server/log.js index 0e40334..429f138 100644 --- a/commands/server/log.js +++ b/commands/server/log.js @@ -1,6 +1,5 @@ -const { ChannelType, Colors, PermissionFlagsBits } = require("discord.js"); -const { CustomEmbed, Utils } = require("../../libs"); -const { escape } = require("mysql2"); +const { ChannelType, PermissionFlagsBits } = require("discord.js"); +const { CustomEmbed, SQL } = require("../../libs"); const logCreate = { builder: (builder) => builder @@ -13,15 +12,15 @@ const logCreate = { .addChannelTypes(ChannelType.GuildText) ) , - async execute(interaction, getdata, Log) { + async execute(interaction, data, Log) { const channel = interaction.options.getChannel("channel"); let sqlStatus; - if (getdata?.guildid) { - sqlStatus = Utils.sql(`update log_channel set channelid=${escape(channel.id)} where guildid=${escape(interaction.guild.id)};`); + if (!data) { + sqlStatus = await SQL.insert("log_channel", [ interaction.guild.id, channel.id ]); } else { - sqlStatus = Utils.sql(`insert into log_channel values (${escape(interaction.guild.id)}, ${escape(interaction.options.getChannel("channel").id)});`); + sqlStatus = await SQL.update("log_channel", { channelid: channel.id }, { guildid: interaction.guild.id }); }; - await sqlStatus; + console.log(sqlStatus) const embed = new CustomEmbed("log"); if (!sqlStatus) embed.typeError().setDescription("データの保存に失敗しました。"); else embed.typeSuccess().setDescription(`logチャンネルを${channel}に設定しました。`); @@ -34,11 +33,11 @@ const logDelete = { .setName("delete") .setDescription("logチャンネルを削除します") , - async execute(interaction, getdata, Log) { + async execute(interaction, data, Log) { const embed = new CustomEmbed("log"); - if (!getdata?.guildid) embed.typeError().setDescription("データが見つかりませんでした。"); + if (!data) embed.typeError().setDescription("データが見つかりませんでした。"); else { - const sqlStatus = await Utils.sql(`DELETE FROM log_channel WHERE guildid = ${escape(interaction.guild.id)};`); + const sqlStatus = await SQL.delete("log_channel", { guildid: interaction.guild.id }); if (!sqlStatus) embed.typeError().setDescription("データの削除に失敗しました。"); else embed.typeSuccess().setDescription("データの削除に成功しました!"); }; @@ -56,7 +55,8 @@ module.exports = { .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) , async execute(interaction) { - const getdata = await Utils.sql(`select * from log_channel where guildid=${escape(interaction.guild.id)};`); - return [getdata[0][0]]; + const data = await SQL.select("log_channel", { guildid: interaction.guild.id }); + return [data]; + } }; \ No newline at end of file diff --git a/commands/server/manage/show.js b/commands/server/manage/show.js index c73f0fe..30a50cc 100644 --- a/commands/server/manage/show.js +++ b/commands/server/manage/show.js @@ -1,6 +1,5 @@ const { Colors } = require("discord.js"); -const { CustomEmbed, Utils } = require("../../../libs"); -const { escape } = require("mysql2"); +const { CustomEmbed, SQL } = require("../../../libs"); module.exports = { builder: (builder) => builder @@ -11,8 +10,11 @@ module.exports = { const dataNames = ["ticket_channel", "log_channel", "job_message", "dictionary", "server_speak", "read_user", "exvoiceword"]; const data = {}; const promises = dataNames.map((name) => { - return Utils.sql(`select * from ${name} where guildid=${escape(interaction.guild.id)};`) - .then((res) => data[name] = res[0][0]); + return SQL.select(name, { guildid: interaction.guild.id }) + .then((res) => { + if (!res) data[name] = {}; + else data[name] = res[0] + }); }); await Promise.all(promises); @@ -50,8 +52,8 @@ module.exports = { speakFieldData.forEach((data) => fieldData.push({ name: data[0], value: data[1], inline: true })); const embed = new CustomEmbed("show") - .setTitle("サーバーの情報") - .setDescription(`[サポートサーバー]https://discord.gg/Y6w5Jv3EAR`) + .setTitle("サーバーの設定") + .setDescription(`[サポートサーバー](https://discord.gg/Y6w5Jv3EAR)`) .addFields(fieldData) .setColor(Colors.Green); interaction.reply({ embeds: [embed], ephemeral: true }); diff --git a/commands/server/manage/unban.js b/commands/server/manage/unban.js index d7e0421..b23e528 100644 --- a/commands/server/manage/unban.js +++ b/commands/server/manage/unban.js @@ -1,4 +1,3 @@ -const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../../libs"); module.exports = { diff --git a/commands/server/manage/unmute.js b/commands/server/manage/unmute.js index a10bb4c..5a564be 100644 --- a/commands/server/manage/unmute.js +++ b/commands/server/manage/unmute.js @@ -1,4 +1,3 @@ -const { Colors } = require("discord.js"); const { CustomEmbed } = require("../../../libs"); module.exports = { diff --git a/libs/Database.js b/libs/SQL.js similarity index 70% rename from libs/Database.js rename to libs/SQL.js index 60d73f7..873a9b4 100644 --- a/libs/Database.js +++ b/libs/SQL.js @@ -8,7 +8,7 @@ const connectionLog = Log.createChild("connection"); const runCmdLog = Log.createChild("runCmd"); -class Database { +class SQL { constructor() { this.connectionOption = { host: process.env.db_host, @@ -32,35 +32,49 @@ class Database { keys = Object.keys(data); values = Object.values(data).map((value) => escape(value)); } - return this.sql(`INSERT INTO ${table} ${keys ? `(${keys.join(",")})` : ""} VALUES (${values.join(",")})`); + const sql = this.sql(`INSERT INTO ${table} ${keys ? `(${keys.join(",")})` : ""} VALUES (${values.join(",")})`, true); + return sql.then((result) => { + return Boolean(result); + }); } update(table, data, whereObject) { const where = this.whereParser(whereObject); const set = Object.entries(data).map(([key, value]) => `${key}=${escape(value)}`).join(","); - return this.sql(`UPDATE ${table} SET ${set} WHERE ${where}`); + const sql = this.sql(`UPDATE ${table} SET ${set} WHERE ${where}`, true); + return sql.then((result) => { + return Boolean(result); + }); } delete(table, whereObject) { const where = this.whereParser(whereObject); return this.sql(`DELETE FROM ${table} WHERE ${where}`); } - whereParser(where) { const whereArray = Object.entries(where).map(([key, value]) => `${key}=${escape(value)}`) return whereArray.join(" AND "); } - sql(command) { + sql(command, option) { + console.log(command); return new Promise((resolve) => { mysql.createConnection(this.connectionOption) .then((connection) => { connection.query(command) .then((result) => { - resolve(result); + if (option) { + resolve(result); + } else { + if (result[0] && result[0].length > 0) { + resolve(result[0]); + } else { + resolve(); + } + } }) .catch((error) => { - Log.error(error); + runCmdLog.error(error); resolve(); }) .then(() => { @@ -76,5 +90,5 @@ class Database { } // thisを使いたいのでnewしてます。 -const database = new Database(); -module.exports = database; \ No newline at end of file +const sql = new SQL(); +module.exports = sql; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index fe39cc8..f8af4d5 100644 --- a/libs/index.js +++ b/libs/index.js @@ -7,7 +7,7 @@ const Permissions = require("./Permissions"); const EmbedUtil = require("./EmbedUtil"); const { CustomEmbed, getEmbedName, ColorsChoice } = EmbedUtil; const ts2time = require("./ts2time"); -const Database = require("./Database"); +const SQL = require("./SQL"); module.exports = { Logger, @@ -21,5 +21,5 @@ module.exports = { getEmbedName, ColorsChoice, ts2time, - Database + SQL } \ No newline at end of file From 6d0aa9835d811d37bb04decfb3907234cea1156e Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:38:00 +0900 Subject: [PATCH 33/90] =?UTF-8?q?ping=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/bot/ping.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 commands/bot/ping.js diff --git a/commands/bot/ping.js b/commands/bot/ping.js new file mode 100644 index 0000000..499dbec --- /dev/null +++ b/commands/bot/ping.js @@ -0,0 +1,15 @@ +module.exports = { + builder: (builder) => builder + .setName("ping") + .setDescription("ボットの応答速度を測定します。") + , + async execute(interaction) { + const base = ":ping_pong:Pong!\n"; + const message = await interaction.reply({ content: base + "取得中...", fetchReply: true }); + interaction.editReply( + base + + `Websocket: ${interaction.client.ws.ping}ms\n` + + `API Endpoint: ${Date.now() - message.createdTimestamp}ms` + ); + } +}; \ No newline at end of file From a1eb2cd757c138e81ff3d7cd563f3ca643e153c5 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:38:45 +0900 Subject: [PATCH 34/90] =?UTF-8?q?poll=E3=81=AE=E3=83=AA=E3=82=A2=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=81=8C=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=A6=E3=81=AA?= =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/commands/poll.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/events/commands/poll.js b/events/commands/poll.js index 9f23cb2..407595e 100644 --- a/events/commands/poll.js +++ b/events/commands/poll.js @@ -6,9 +6,9 @@ module.exports = { filter(react, user) { const { client, message } = react; return ( - message.author.id !== client.user.id || - user.id === client.user.id || - !message.embeds?.length + message.author.id === client.user.id && + user.id !== client.user.id && + message.embeds?.length ); }, async execute(react, user, Log) { From 202fbd83fa0d519f3bd74683e3877c75e093a91b Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:39:25 +0900 Subject: [PATCH 35/90] =?UTF-8?q?guildban=E3=81=AE=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E4=BF=AE=E6=AD=A3&=E3=83=87=E3=82=B6?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/log/guildbanadd.js | 17 +++++++++++++---- events/log/guildbanremove.js | 21 +++++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/events/log/guildbanadd.js b/events/log/guildbanadd.js index 3d96bcf..705e1c1 100644 --- a/events/log/guildbanadd.js +++ b/events/log/guildbanadd.js @@ -4,11 +4,20 @@ const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.GuildBanAdd, - async execute(member) { - sendLog(member.guild, () => ( + async execute(guildBan) { + sendLog(guildBan.guild, () => ( new CustomEmbed("BANadd") - .setTitle("✅BAN") - .setDescription(`${member.user} (${member.user.id})がBANされました`) + .setTitle("ユーザーがBANされました。") + .addFields( + { + name: "ユーザー (id)", + value: `${guildBan.user} (${guildBan.user.id})`, + }, + { + name: "理由", + value: `${guildBan.reason || "なし"}`, + } + ) .setColor(Colors.Red) )); } diff --git a/events/log/guildbanremove.js b/events/log/guildbanremove.js index 4bb5ac7..13c74ac 100644 --- a/events/log/guildbanremove.js +++ b/events/log/guildbanremove.js @@ -1,15 +1,24 @@ const { Events, Colors } = require("discord.js"); -const sendLog = require("../../helpers/sendLog"); const { CustomEmbed } = require("../../libs"); +const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.GuildBanRemove, - async execute(member) { - sendLog(member.guild, () => ( + async execute(guildBan) { + sendLog(guildBan.guild, () => ( new CustomEmbed("BANremove") - .setTitle("✅BAN解除") - .setDescription(`${member.user || member.user?.tag}がBAN解除されました`) - .setColor(Colors.Red) + .setTitle("ユーザーのBANが解除されました。") + .addFields( + { + name: "ユーザー (id)", + value: `${guildBan.user} (${guildBan.user.id})`, + }, + { + name: "理由", + value: `${guildBan.reason || "なし"}`, + } + ) + .setColor(Colors.Orange) )); } } \ No newline at end of file From 69f90fd74c5df080f61730dfd503b0c2c069a02b Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:39:41 +0900 Subject: [PATCH 36/90] =?UTF-8?q?msgURL=E3=81=8C=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E4=B8=80=E3=81=8B=E3=82=89=E6=9B=B8=E3=81=8D=E7=9B=B4?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/misc/msgURL.js | 83 ++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 49 deletions(-) diff --git a/events/misc/msgURL.js b/events/misc/msgURL.js index e3592d2..255e15d 100644 --- a/events/misc/msgURL.js +++ b/events/misc/msgURL.js @@ -1,55 +1,40 @@ -const { EmbedBuilder, Events, ChannelType } = require('discord.js'); +const { Events, Colors, hyperlink } = require("discord.js"); +const { CustomEmbed } = require("../../libs"); -const regex = /https:\/\/(ptb.)?discord\.com\/channels\/(\d{16,19})\/(\d{16,19})\/(\d{16,19})/; +const regex = /(https?:\/\/)?((ptb|canary)\.)?discord\.com\/channels(\/\d{17,19}){3}/; module.exports = { name: Events.MessageCreate, - filter: (message) => message.channel.type !== ChannelType.DM && message.content.match(regex), async execute(message) { - let channel_id; - let message_id; - if (results[2] = "ptb.") { - channel_id = results[3] - message_id = results[4] - } else { - channel_id = results[2] - message_id = results[3] - }; - - const channelch = message.client.channels.cache.get(channel_id); - if (!channelch) return; - - channelch.messages.fetch(message_id) - .then(msg => { - const embed = new EmbedBuilder() - .setAuthor({ - name: `${msg.author.username}`, - iconURL: msg.author.avatarURL({ format: 'png', size: 4096, dynamic: true }) - }) - .setTimestamp(msg.createdAt) - .setFooter({ - text: `${msg.channel.name}`, - iconURL: `${msg.guild.iconURL() == null ? "https://cdn.mikandev.tech/public-assets/discord-logo.png" : msg.guild.iconURL()}` - }) - - if (msg.content.length > 0) { - embed.setDescription(`${msg.content}`); - }; - - if (msg.attachments?.size > 0) { - embed.setImage(`${msg.attachments.map(attachment => attachment.url)}`); - } else if (msg.stickers?.size > 0) { - embed.setImage(`https://media.discordapp.net/stickers/${msg.stickers.first().id}.png`); - }; - - message.reply({ - embeds: [embed] - }); - - if (msg.embeds[0]) { - message.channel.send({ embeds: [msg.embeds[0]] }); - }; - }) - .catch(console.error); + const { client, content } = message; + const urls = content.match(regex); + if (!urls) return; + urls.forEach(async (url) => { + const [guildId, channelId, messageId] = new URL(url).pathname.split("/").slice(2); + const guild = client.guilds.cache.get(guildId); + if (!guild) return; + const channel = await guild.channels.fetch(channelId); + if (!channel) return; + const msg = await channel.messages.fetch(messageId); + if (!msg) return; + const embedText = msg.embeds.length ? `\n${msg.embeds.length}個の埋め込みメッセージがあります。` : ""; + const attachmentText = msg.attachments.size ? `\n${msg.attachments.size}個の添付ファイルがあります。` : ""; + const embed = new CustomEmbed("fetchMessage") + .setAuthor({ name: msg.author.tag, icon_url: msg.author.displayAvatarURL({ dynamic: true }) }) + .setDescription(`${hyperlink("メッセージにジャンプ", msg.url)}${embedText}${attachmentText}`) + .setTimestamp(msg.createdAt) + .setColor(Colors.Aqua); + if (msg.content) embed.addFields({ name: "\u200b", value: msg.content || "\u200b" }); + if (msg.embeds.length) + }); + } -}; \ No newline at end of file +}; + +function fetchMessageData(url, client) { + const [guildId, channelId, messageId] = + const guild = client.guilds.cache.get(guildId); + const channel = guild.channels.cache.get(channelId); + const msg = channel.messages.fetch(messageId); + return msg; +} \ No newline at end of file From edb950486d73c9d1f9ee9cd6b5c91634611746ce Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:39:55 +0900 Subject: [PATCH 37/90] =?UTF-8?q?=E7=B4=B0=E3=81=8B=E3=81=AA=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/bot/report.js | 6 +++--- events/bot/slashcommand.js | 2 +- events/log/messageDelete.js | 4 ++-- events/log/messageUpdate.js | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/events/bot/report.js b/events/bot/report.js index 75b4141..c3399bc 100644 --- a/events/bot/report.js +++ b/events/bot/report.js @@ -1,11 +1,11 @@ const { WebhookClient, Colors, Events } = require("discord.js"); const { CustomEmbed } = require("../../libs"); -const reportWebhook = new WebhookClient({ url: process.env.errorwebhook }); +const webhook = new WebhookClient({ url: process.env.reportwebhookurl }); module.exports = { name: Events.InteractionCreate, - filter: (interaction) => interaction.isModalSubmit() && interaction.customId === "report", + filter: (i) => i.isModalSubmit() && i.customId === "report", async execute(interaction) { const title = interaction.fields.getTextInputValue("title"); const description = interaction.fields.getTextInputValue("description"); @@ -14,7 +14,7 @@ module.exports = { .setTitle(title) .setDescription(description) .setColor(Colors.Orange); - reportWebhook.send({ embeds: [reportEmbed] }); + webhook.send({ embeds: [reportEmbed] }); const embed = new CustomEmbed("report").typeSuccess().setDescription("レポートが送信されました。"); interaction.reply({ embeds: [embed], ephemeral: true }); diff --git a/events/bot/slashcommand.js b/events/bot/slashcommand.js index 8be43c2..191202b 100644 --- a/events/bot/slashcommand.js +++ b/events/bot/slashcommand.js @@ -3,7 +3,7 @@ const { CustomEmbed } = require("../../libs"); module.exports = { name: Events.InteractionCreate, - filter: (interaction) => interaction.isCommand() || interaction.isAutocomplete(), + filter: (i) => i.isCommand() || i.isAutocomplete(), async execute(interaction) { const { client } = interaction; const command = client.commands.get(interaction.commandName); diff --git a/events/log/messageDelete.js b/events/log/messageDelete.js index a32b6d7..85b450d 100644 --- a/events/log/messageDelete.js +++ b/events/log/messageDelete.js @@ -1,10 +1,10 @@ -const { Events, Colors, ChannelType } = require("discord.js"); +const { Events, Colors } = require("discord.js"); const { CustomEmbed } = require("../../libs"); const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageDelete, - filter: (message) => message.channel.type !== ChannelType.DM, + filter: (message) => !message.channel.isDMBased() && message.author.id !== message.client.user.id, async execute(message) { sendLog(message.guild, () => ( new CustomEmbed("messagedelete") diff --git a/events/log/messageUpdate.js b/events/log/messageUpdate.js index a40b6c9..c8786cf 100644 --- a/events/log/messageUpdate.js +++ b/events/log/messageUpdate.js @@ -1,10 +1,10 @@ -const { Events, Colors, ChannelType } = require("discord.js"); +const { Events, Colors } = require("discord.js"); const { CustomEmbed } = require("../../libs"); const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageUpdate, - filter: (oldMessage) => oldMessage.channel.type !== ChannelType.DM, + filter: (oldMessage) => !oldMessage.channel.isDMBased() && oldMessage.author.id !== oldMessage.client.user.id, async execute(oldMessage, newMessage) { sendLog(oldMessage.guild, () => ( new CustomEmbed("messageUpdate") From cf4625e3736e6e517c016feb6c27a8ec631f1ebf Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Fri, 19 May 2023 18:40:16 +0900 Subject: [PATCH 38/90] =?UTF-8?q?ticket=E3=81=AESQL=E3=82=92=E6=96=B0?= =?UTF-8?q?=E3=81=97=E3=81=84=E3=82=82=E3=81=AE=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/commands/ticket.js | 73 ++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/events/commands/ticket.js b/events/commands/ticket.js index 7a67f5b..ce56d3e 100644 --- a/events/commands/ticket.js +++ b/events/commands/ticket.js @@ -1,11 +1,9 @@ -const { Events, Colors, PermissionsBitField, ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); -const { Utils, CustomEmbed } = require("../../libs"); -const { sql } = Utils; -const { escape } = require("mysql2"); +const { Events, Colors, PermissionsBitField, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const { CustomEmbed, SQL } = require("../../libs"); module.exports = { name: Events.InteractionCreate, - filter: (interaction) => interaction.isButton() && interaction.customId.startsWith("ticket_"), + filter: (i) => i.isButton() && i.customId.startsWith("ticket_"), async execute(interaction) { const embed = new CustomEmbed("ticket"); try { @@ -41,11 +39,11 @@ module.exports = { await ticketChannel.send({ content: `${interaction.member}`, embeds: [ticketEmbed], components: [ticketComponent] }); embed .setTitle("Ticket") - .setDescription(`チケットを作成しました。\nチャンネルを開いて質問などをご記入ください。\n${ticketChannel}`) + .setDescription(`チケットを作成しました。\n${ticketChannel}`) .setColor(Colors.Green); interaction.reply({ embeds: [embed], ephemeral: true }); - const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - if (getdata[0][0]?.guildid) { + const data = await SQL.select("ticket_channel", { guildid: interaction.guild.id }); + if (data) { const logEmbed = new CustomEmbed("ticket") .setTitle("チケットが作成されました。") .addFields( @@ -66,7 +64,7 @@ module.exports = { } ) .setColor(Colors.Green); - const logChannel = await interaction.guild.channels.cache.get(getdata[0][0].channelid); + const logChannel = await interaction.guild.channels.cache.get(data[0].channelid); await logChannel.send({ embeds: [logEmbed] }); } } @@ -78,7 +76,7 @@ module.exports = { const component = new ActionRowBuilder() .addComponents( new ButtonBuilder() - .setCustomId("ticketcloseclose") + .setCustomId("ticketcloseaccept") .setLabel("閉じる") .setStyle(ButtonStyle.Danger), new ButtonBuilder() @@ -89,36 +87,39 @@ module.exports = { const message = await interaction.reply({ embeds: [embed], components: [component], ephemeral: true }); message.awaitMessageComponent({ time: 30 * 1000 }) .then(async (i) => { - if (i.customId === "ticketcloseclose") { - const logEmbed = new CustomEmbed("ticket") - .setTitle("チケットが閉じられました。") - .addFields( - { - name: "チャンネル", - value: interaction.channel.name, - inline: true - }, - { - name: "ユーザー", - value: `${interaction.user}`, - inline: true - }, - { - name: "日時", - value: `${new Date()}`, - inline: true - } - ) - .setColor(Colors.Red); - await interaction.channel.delete(); - const getdata = await sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); - if (getdata[0][0]?.guildid) { - const logChannel = await interaction.guild.channels.cache.get(getdata[0][0].channelid); - await logChannel.send({ embeds: [logEmbed] }); + if (i.customId === "ticketcloseaccept") { + const data = await SQL.select("ticket_channel", { guildid: interaction.guild.id }); + if (data) { + const logEmbed = new CustomEmbed("ticket") + .setTitle("チケットが閉じられました。") + .addFields( + { + name: "チャンネル", + value: interaction.channel.name, + inline: true + }, + { + name: "ユーザー", + value: `${interaction.user}`, + inline: true + }, + { + name: "日時", + value: `${new Date()}`, + inline: true + } + ) + .setColor(Colors.Red); + await interaction.channel.delete(); + const logChannel = await interaction.guild.channels.cache.get(data[0].channelid); + logChannel.send({ embeds: [logEmbed] }); } } else { message.delete(); } + }) + .catch(() => { + message.delete(); }); } } catch (error) { From d00d1244ecacf490674543959dd058704406d215 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sat, 20 May 2023 00:14:39 +0900 Subject: [PATCH 39/90] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E3=83=A1=E3=83=B3=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E3=81=A7?= =?UTF-8?q?false=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index c2b85ac..b98899b 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,7 @@ require("dotenv").config(); const client = new Client({ intents: Object.values(GatewayIntentBits), partials: [Partials.Message, Partials.Channel, Partials.Reaction], + allowedMentions: { repliedUser: false }, rest: 60000 }); From 6e5bbc3d334b7894b50c03b8a68e8ab7434703d4 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sat, 20 May 2023 01:52:35 +0900 Subject: [PATCH 40/90] =?UTF-8?q?msgURL=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/misc/msgURL.js | 55 +++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/events/misc/msgURL.js b/events/misc/msgURL.js index 255e15d..50cbe14 100644 --- a/events/misc/msgURL.js +++ b/events/misc/msgURL.js @@ -1,7 +1,7 @@ const { Events, Colors, hyperlink } = require("discord.js"); -const { CustomEmbed } = require("../../libs"); +const { CustomEmbed, getEmbedName } = require("../../libs"); -const regex = /(https?:\/\/)?((ptb|canary)\.)?discord\.com\/channels(\/\d{17,19}){3}/; +const regex = /(https?:\/\/)?((ptb|canary)\.)?discord\.com\/channels(\/\d{17,19}){3}/g; module.exports = { name: Events.MessageCreate, @@ -9,32 +9,41 @@ module.exports = { const { client, content } = message; const urls = content.match(regex); if (!urls) return; - urls.forEach(async (url) => { - const [guildId, channelId, messageId] = new URL(url).pathname.split("/").slice(2); - const guild = client.guilds.cache.get(guildId); + const ids = urls + .map((url) => { + const paths = url.split("/"); + const index = paths.indexOf("channels"); + const [guild, channel, message] = paths.slice(index + 1); + return { guild, channel, message }; + }) + .filter((id, index, ids) => ids.findIndex((i) => i.guild === id.guild && i.channel === id.channel && i.message === id.message) === index); + + for (const id of ids) { + const guild = client.guilds.cache.get(id.guild); if (!guild) return; - const channel = await guild.channels.fetch(channelId); + const channel = guild.channels.cache.get(id.channel); if (!channel) return; - const msg = await channel.messages.fetch(messageId); + const msg = await channel.messages.fetch(id.message); if (!msg) return; - const embedText = msg.embeds.length ? `\n${msg.embeds.length}個の埋め込みメッセージがあります。` : ""; - const attachmentText = msg.attachments.size ? `\n${msg.attachments.size}個の添付ファイルがあります。` : ""; + const embeds = msg.embeds.filter((embed) => getEmbedName(embed) !== "fetchMessage"); + const attachments = msg.attachments.map((attachment) => attachment); + let description = hyperlink("メッセージにジャンプ", msg.url); + if (embeds.length) description += `\n${embeds.length}個の埋め込みメッセージがあります。`; + if (attachments.length) description += `\n${attachments.length}個の添付ファイルがあります。`; const embed = new CustomEmbed("fetchMessage") - .setAuthor({ name: msg.author.tag, icon_url: msg.author.displayAvatarURL({ dynamic: true }) }) - .setDescription(`${hyperlink("メッセージにジャンプ", msg.url)}${embedText}${attachmentText}`) + .setAuthor({ name: msg.author.tag, iconURL: msg.author.displayAvatarURL() }) + .setDescription(description) .setTimestamp(msg.createdAt) .setColor(Colors.Aqua); if (msg.content) embed.addFields({ name: "\u200b", value: msg.content || "\u200b" }); - if (msg.embeds.length) - }); - + message.reply({ embeds: [embed] }); + if (embeds.length) { + embeds.forEach((embed, index) => { + message.channel.send({ embeds: [embed], files: (embeds.length - 1 === index ? attachments : null) }); + }); + } else if (attachments.length) { + message.channel.send({ files: attachments }) + } + } } -}; - -function fetchMessageData(url, client) { - const [guildId, channelId, messageId] = - const guild = client.guilds.cache.get(guildId); - const channel = guild.channels.cache.get(channelId); - const msg = channel.messages.fetch(messageId); - return msg; -} \ No newline at end of file +}; \ No newline at end of file From 66359cd8fb05b3cdeb343e72d87fb1e0e0914423 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sat, 20 May 2023 01:54:40 +0900 Subject: [PATCH 41/90] =?UTF-8?q?manage=20show=E3=82=92settings=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/{server/manage/show.js => bot/settings.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename commands/{server/manage/show.js => bot/settings.js} (98%) diff --git a/commands/server/manage/show.js b/commands/bot/settings.js similarity index 98% rename from commands/server/manage/show.js rename to commands/bot/settings.js index 30a50cc..278bc87 100644 --- a/commands/server/manage/show.js +++ b/commands/bot/settings.js @@ -1,9 +1,9 @@ const { Colors } = require("discord.js"); -const { CustomEmbed, SQL } = require("../../../libs"); +const { CustomEmbed, SQL } = require("../../libs"); module.exports = { builder: (builder) => builder - .setName("show") + .setName("settings") .setDescription("サーバーの設定を表示します。") , async execute(interaction) { From a914cf100f1b25472057e420d10cdb356ebb4917 Mon Sep 17 00:00:00 2001 From: TanakaTakeshikun <85824872+TanakaTakeshikun@users.noreply.github.com> Date: Sat, 20 May 2023 10:47:06 +0900 Subject: [PATCH 42/90] =?UTF-8?q?fix:=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 正規表現の修正(.があるとリンク省略になっていたので修正) 平仮名に変換した後に固定辞書置き換えに変更 --- .env | 4 ++-- events/log/messageUpdate.js | 2 +- helpers/read.js | 9 ++++----- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.env b/.env index 1262d6f..3ffa27a 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN=token -clientId=clientid +TOKEN=MTA4MzcxMjQ2NDk4MzY4NzIyOQ.GkXkyo.M8Hu3Vz3462uav9wPSTfpUREp7k-s3v6BmCgt8 +clientId=1083712464983687229 URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text diff --git a/events/log/messageUpdate.js b/events/log/messageUpdate.js index c8786cf..47534ed 100644 --- a/events/log/messageUpdate.js +++ b/events/log/messageUpdate.js @@ -4,7 +4,7 @@ const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageUpdate, - filter: (oldMessage) => !oldMessage.channel.isDMBased() && oldMessage.author.id !== oldMessage.client.user.id, + filter: (oldMessage) => !oldMessage.channel.isDMBased() && oldMessage.author?.id !== oldMessage.client.user.id, async execute(oldMessage, newMessage) { sendLog(oldMessage.guild, () => ( new CustomEmbed("messageUpdate") diff --git a/helpers/read.js b/helpers/read.js index f5664b2..6be131e 100644 --- a/helpers/read.js +++ b/helpers/read.js @@ -25,14 +25,13 @@ module.exports = { const not_exvoice = (await sql(`select * from exvoiceword where guildid=${escape(message.guild.id)} and speakname=${escape(name)};`))[0].map(data => data.word); const exvoice = (exvoice_list[name]) ? exvoice_list[name].filter(item => !not_exvoice.includes(item)) : null const before_msg = (get_server_data[0][0]?.read_username && !get_server_data[0][0]?.dictionary_username) ? `${user}さんのメッセージ ${live_content}` : live_content; - const romajimsg = before_msg.replace(/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi, 'リンク省略'); + const romajimsg = before_msg.replace(/(https?|ftp):\/\/[\w\/:%#\$\&\?\(\)~\.=\+\-]+/gi, 'リンク省略'); const code = romajimsg.replace(/```[\s\S]*?```/gi, "コード省略"); - const wara = code.replace(/w|w|W|W/g, "わら"); - const tmpfile = tmp ? "添付ファイル" + wara : wara; - const format_msg = await axios.get(`https://eng-jpn-api.kuroneko6423.com/query?text=${tmpfile}`, { + const format_msg = await axios.get(`https://eng-jpn-api.kuroneko6423.com/query?text=${code}`, { httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), }).catch((ex) => { }); - const msg = (format_msg.data) ? format_msg.data : romajimsg; + const wara = format_msg.data ? format_msg.data : code.replace(/w|w|W|W/g, "わら"); + const msg = tmp ? `添付ファイル ${wara}`: wara; const check = exvoice?.find(str => msg.includes(str)); if (exvoice && check && !get_server_data[0][0]?.exvoice) { const matchStr = exvoice?.find(str => msg.includes(str)); // 配列内に一致する要素を検索する From 648b1a5c49be3bf834a6682f5fd4d3e078673cb3 Mon Sep 17 00:00:00 2001 From: TanakaTakeshikun <85824872+TanakaTakeshikun@users.noreply.github.com> Date: Sat, 20 May 2023 10:48:18 +0900 Subject: [PATCH 43/90] =?UTF-8?q?=E3=83=9F=E3=82=B9=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 3ffa27a..1262d6f 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -TOKEN=MTA4MzcxMjQ2NDk4MzY4NzIyOQ.GkXkyo.M8Hu3Vz3462uav9wPSTfpUREp7k-s3v6BmCgt8 -clientId=1083712464983687229 +TOKEN=token +clientId=clientid URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text From 4e0a318388244dc7bc33995875869fa1b2f2f67b Mon Sep 17 00:00:00 2001 From: TanakaTakeshikun <85824872+TanakaTakeshikun@users.noreply.github.com> Date: Sun, 21 May 2023 00:16:34 +0900 Subject: [PATCH 44/90] =?UTF-8?q?feat:=E3=83=80=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=83=9C=E3=83=BC=E3=83=89=E3=81=AE=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/.eslintrc.json | 3 + dashboard/.gitattributes | 2 + dashboard/.gitignore | 35 + dashboard/README.md | 14 + dashboard/jsconfig.json | 7 + dashboard/next.config.js | 3 + dashboard/package-lock.json | 3590 +++++++++++++++++ dashboard/package.json | 18 + dashboard/src/app/components/test.jsx | 9 + dashboard/src/app/favicon.ico | Bin 0 -> 67646 bytes dashboard/src/app/layout.js | 17 + dashboard/src/app/page.js | 12 + dashboard/src/app/page.module.css | 229 ++ dashboard/src/app/pages/next/page.jsx | 13 + dashboard/src/app/pages/next/page.module.css | 229 ++ .../src/app/pages/next/pagecomponent.jsx | 9 + dashboard/src/app/style/globals.css | 107 + 17 files changed, 4297 insertions(+) create mode 100644 dashboard/.eslintrc.json create mode 100644 dashboard/.gitattributes create mode 100644 dashboard/.gitignore create mode 100644 dashboard/README.md create mode 100644 dashboard/jsconfig.json create mode 100644 dashboard/next.config.js create mode 100644 dashboard/package-lock.json create mode 100644 dashboard/package.json create mode 100644 dashboard/src/app/components/test.jsx create mode 100644 dashboard/src/app/favicon.ico create mode 100644 dashboard/src/app/layout.js create mode 100644 dashboard/src/app/page.js create mode 100644 dashboard/src/app/page.module.css create mode 100644 dashboard/src/app/pages/next/page.jsx create mode 100644 dashboard/src/app/pages/next/page.module.css create mode 100644 dashboard/src/app/pages/next/pagecomponent.jsx create mode 100644 dashboard/src/app/style/globals.css diff --git a/dashboard/.eslintrc.json b/dashboard/.eslintrc.json new file mode 100644 index 0000000..4e921c1 --- /dev/null +++ b/dashboard/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next", "next/core-web-vitals", "prettier", "next/babel"] +} \ No newline at end of file diff --git a/dashboard/.gitattributes b/dashboard/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/dashboard/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/dashboard/.gitignore b/dashboard/.gitignore new file mode 100644 index 0000000..8f322f0 --- /dev/null +++ b/dashboard/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 0000000..f2ca235 --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,14 @@ +http://localhost:3000 + +http://localhost:3000/pages/next + +のみ作成済みです(testなので後から変えます) + + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` diff --git a/dashboard/jsconfig.json b/dashboard/jsconfig.json new file mode 100644 index 0000000..b8d6842 --- /dev/null +++ b/dashboard/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/dashboard/next.config.js b/dashboard/next.config.js new file mode 100644 index 0000000..4a8844b --- /dev/null +++ b/dashboard/next.config.js @@ -0,0 +1,3 @@ +/** @type {import('next').NextConfig} */ +module.exports = { +} \ No newline at end of file diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json new file mode 100644 index 0000000..ddcc284 --- /dev/null +++ b/dashboard/package-lock.json @@ -0,0 +1,3590 @@ +{ + "name": "dashboard", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dashboard", + "version": "0.1.0", + "dependencies": { + "eslint": "8.41.0", + "eslint-config-next": "13.4.3", + "next": "13.4.3", + "react": "18.2.0", + "react-dom": "18.2.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@next/env": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.3.tgz", + "integrity": "sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.3.tgz", + "integrity": "sha512-5B0uOnh7wyUY9vNNdIA6NUvWozhrZaTMZOzdirYAefqD0ZBK5C/h3+KMYdCKrR7JrXGvVpWnHtv54b3dCzwICA==", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.3.tgz", + "integrity": "sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.3.tgz", + "integrity": "sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.3.tgz", + "integrity": "sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.3.tgz", + "integrity": "sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.3.tgz", + "integrity": "sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.3.tgz", + "integrity": "sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.3.tgz", + "integrity": "sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.3.tgz", + "integrity": "sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.3.tgz", + "integrity": "sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz", + "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.3.tgz", + "integrity": "sha512-1lXwdFi29fKxzeugof/TUE7lpHyJQt5+U4LaUHyvQfHjvsWO77vFNicJv5sX6k0VDVSbnfz0lw+avxI+CinbMg==", + "dependencies": { + "@next/eslint-plugin-next": "13.4.3", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.3.tgz", + "integrity": "sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==", + "dependencies": { + "@next/env": "13.4.3", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.3", + "@next/swc-darwin-x64": "13.4.3", + "@next/swc-linux-arm64-gnu": "13.4.3", + "@next/swc-linux-arm64-musl": "13.4.3", + "@next/swc-linux-x64-gnu": "13.4.3", + "@next/swc-linux-x64-musl": "13.4.3", + "@next/swc-win32-arm64-msvc": "13.4.3", + "@next/swc-win32-ia32-msvc": "13.4.3", + "@next/swc-win32-x64-msvc": "13.4.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/dashboard/package.json b/dashboard/package.json new file mode 100644 index 0000000..537abc4 --- /dev/null +++ b/dashboard/package.json @@ -0,0 +1,18 @@ +{ + "name": "dashboard", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "eslint": "8.41.0", + "eslint-config-next": "13.4.3", + "next": "13.4.3", + "react": "18.2.0", + "react-dom": "18.2.0" + } +} diff --git a/dashboard/src/app/components/test.jsx b/dashboard/src/app/components/test.jsx new file mode 100644 index 0000000..4807076 --- /dev/null +++ b/dashboard/src/app/components/test.jsx @@ -0,0 +1,9 @@ +const Test = () => { + return ( +
+

Hello Global Kuroneko

+
+ ); +}; + +export default Test; diff --git a/dashboard/src/app/favicon.ico b/dashboard/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2f4d66f282cdcf8422c2f428c2f36d155993235e GIT binary patch literal 67646 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%0A_eYPDK6iZlG^fY)oMeLD6UJM79vor(!+3|U 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 m5 zGJL!x^TjtO*;DCxj>oK-b+_7+MYwA%-wy|WQJ84pYIMjR)H6gQkWs&Q;T7z^t?vG1 z1IU(HI&Z(ts$l;GT2rd^f$G&X6CcV{quX;Lsk+Y2(-*qk1K|lV)pa zAg2xuD4w!}UXHK+{%@wWxKg_=)&uYRSf5|J<0k&!^30(5~M>LGEM z^(f1hY_*MRj$6xOd;@y6)z4~oc?@p@2C>(92lkq0MtJ^(k>qT}q$a0xg>_o0Fz)oZ zyPn@V{`xMDyFZ4%|7O_hwcEu%BZ(dcIpj?9>sdq7WK)WkTjTtlwx;Ev?b!A-GS!7w zu(HUzUj5=a8gP^SgZWSUPDb{i7XFuUQ}^#VjqQ5K^%GaUNJAa_n&R8$szytABiG#s z@;x|sJ`3`W&OMJt?4<^W``yGpjCc6DC;a{E;rsU2LEd-rVSJU9OkkY?b$pYtA#1DG z*=qLJRqsWuyA)?B=k^sF^XQ+CyLrz0!9eeBB!a(e0sqii(oJnoQY*5beL@dn%hF2* ze^5F=G;kgM0qixGe%}01`c(Wc-KqF;S6=T<2HYP1hw% zJJ+v@#IV*ZJ7f*D?7KlcAbl+I((8Y0uq=k-d(i;%q7k0I#IdX+LSJSxUt0UrGyYv^ zB8=w^ue`)%T%oLE7f2(~ryGB-Qxewb!dEZ(7jtV03zf%YBCqJ-9fd8X+CK^_o8Rd%q@~4lf z8{UN+*kudpSD8bcCMSyht>Eu$rYJU|gS(EqrHXm!BnP7QfNu7mfB%@A%SL*LY_+CETP+{^ zCo>UWIi6fO^&T0-Q#6N~E6tsJq>SXLZUpC2=VANcx@(W;4URX%D*RnNUJLuMAHzLH z-p6m^JdM6$>El>Wno>nvc)qP}*=}1l@1fT&F;ww9uzUYrh-kD^d85be{q>DL zx+)pgYOBPXD3su5*RoAZhe=> z-N!Y8M_wz)B;QokWDWDz+mS=h+cjKe@xAypA|hF{8Tj{O!oMSD;ix_OA3yxAi_j_y9wJr|WT$_44ZWxGh$>srVBthwx^vC(!v@wEN(!e=g*@Ag@M z{#^=>X^;#M`kgkOo(T`0x`jvhUHn`Ksv)_^UJt+e#h>YGx7QlkZ*uOmO;(ga zPf6AjI{kVJINyjyzBl}JPtd7qnsVrqrI>Ezh($ literal 0 HcmV?d00001 diff --git a/dashboard/src/app/layout.js b/dashboard/src/app/layout.js new file mode 100644 index 0000000..4e83c30 --- /dev/null +++ b/dashboard/src/app/layout.js @@ -0,0 +1,17 @@ +import './style/globals.css' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ["greek"] }) + +export const metadata = { + title: 'Kuroneko', + description: 'Hi' +} + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} diff --git a/dashboard/src/app/page.js b/dashboard/src/app/page.js new file mode 100644 index 0000000..cd0a61a --- /dev/null +++ b/dashboard/src/app/page.js @@ -0,0 +1,12 @@ +import Header from './components/test'; + +export default function FirstPost() { + return ( + <> +

Hello Home

+

+
+

+ + ) +} \ No newline at end of file diff --git a/dashboard/src/app/page.module.css b/dashboard/src/app/page.module.css new file mode 100644 index 0000000..9411a5e --- /dev/null +++ b/dashboard/src/app/page.module.css @@ -0,0 +1,229 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + width: var(--max-width); + max-width: 100%; +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ''; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/dashboard/src/app/pages/next/page.jsx b/dashboard/src/app/pages/next/page.jsx new file mode 100644 index 0000000..5bae99b --- /dev/null +++ b/dashboard/src/app/pages/next/page.jsx @@ -0,0 +1,13 @@ +import Header from './pagecomponent'; + +const Next = () => { + return ( + <> +

Hi Next

+

+
+

+ + ) +} +export default Next; \ No newline at end of file diff --git a/dashboard/src/app/pages/next/page.module.css b/dashboard/src/app/pages/next/page.module.css new file mode 100644 index 0000000..9411a5e --- /dev/null +++ b/dashboard/src/app/pages/next/page.module.css @@ -0,0 +1,229 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + width: var(--max-width); + max-width: 100%; +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ''; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/dashboard/src/app/pages/next/pagecomponent.jsx b/dashboard/src/app/pages/next/pagecomponent.jsx new file mode 100644 index 0000000..01542e3 --- /dev/null +++ b/dashboard/src/app/pages/next/pagecomponent.jsx @@ -0,0 +1,9 @@ +const Pagecom = () => { + return ( +
+

Hello Local Kuroneko

+
+ ); +}; + +export default Pagecom; diff --git a/dashboard/src/app/style/globals.css b/dashboard/src/app/style/globals.css new file mode 100644 index 0000000..d4f491e --- /dev/null +++ b/dashboard/src/app/style/globals.css @@ -0,0 +1,107 @@ +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} From 907c6a13490bf3b2b0234ee106d7e563d5228625 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sun, 21 May 2023 17:31:26 +0900 Subject: [PATCH 45/90] =?UTF-8?q?=E3=81=84=E3=82=89=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=82=E3=81=AE=E3=81=AA=E3=81=8F=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/server/ticket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/server/ticket.js b/commands/server/ticket.js index 253286a..c3211cf 100644 --- a/commands/server/ticket.js +++ b/commands/server/ticket.js @@ -111,7 +111,7 @@ module.exports = { .setDMPermission(false) .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) , - async execute(interaction, ...args) { + async execute(interaction) { const data = await Utils.sql(`select * from ticket_channel where guildid=${escape(interaction.guild.id)};`); return [data[0][0]] } From 146a5120a2da65b99bb1f5e440d33c7588e7f2d9 Mon Sep 17 00:00:00 2001 From: maamokun Date: Mon, 22 May 2023 15:32:15 +0900 Subject: [PATCH 46/90] Delete favicon.ico --- dashboard/src/app/favicon.ico | Bin 67646 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dashboard/src/app/favicon.ico diff --git a/dashboard/src/app/favicon.ico b/dashboard/src/app/favicon.ico deleted file mode 100644 index 2f4d66f282cdcf8422c2f428c2f36d155993235e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 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%0A_eYPDK6iZlG^fY)oMeLD6UJM79vor(!+3|U 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 m5 zGJL!x^TjtO*;DCxj>oK-b+_7+MYwA%-wy|WQJ84pYIMjR)H6gQkWs&Q;T7z^t?vG1 z1IU(HI&Z(ts$l;GT2rd^f$G&X6CcV{quX;Lsk+Y2(-*qk1K|lV)pa zAg2xuD4w!}UXHK+{%@wWxKg_=)&uYRSf5|J<0k&!^30(5~M>LGEM z^(f1hY_*MRj$6xOd;@y6)z4~oc?@p@2C>(92lkq0MtJ^(k>qT}q$a0xg>_o0Fz)oZ zyPn@V{`xMDyFZ4%|7O_hwcEu%BZ(dcIpj?9>sdq7WK)WkTjTtlwx;Ev?b!A-GS!7w zu(HUzUj5=a8gP^SgZWSUPDb{i7XFuUQ}^#VjqQ5K^%GaUNJAa_n&R8$szytABiG#s z@;x|sJ`3`W&OMJt?4<^W``yGpjCc6DC;a{E;rsU2LEd-rVSJU9OkkY?b$pYtA#1DG z*=qLJRqsWuyA)?B=k^sF^XQ+CyLrz0!9eeBB!a(e0sqii(oJnoQY*5beL@dn%hF2* ze^5F=G;kgM0qixGe%}01`c(Wc-KqF;S6=T<2HYP1hw% zJJ+v@#IV*ZJ7f*D?7KlcAbl+I((8Y0uq=k-d(i;%q7k0I#IdX+LSJSxUt0UrGyYv^ zB8=w^ue`)%T%oLE7f2(~ryGB-Qxewb!dEZ(7jtV03zf%YBCqJ-9fd8X+CK^_o8Rd%q@~4lf z8{UN+*kudpSD8bcCMSyht>Eu$rYJU|gS(EqrHXm!BnP7QfNu7mfB%@A%SL*LY_+CETP+{^ zCo>UWIi6fO^&T0-Q#6N~E6tsJq>SXLZUpC2=VANcx@(W;4URX%D*RnNUJLuMAHzLH z-p6m^JdM6$>El>Wno>nvc)qP}*=}1l@1fT&F;ww9uzUYrh-kD^d85be{q>DL zx+)pgYOBPXD3su5*RoAZhe=> z-N!Y8M_wz)B;QokWDWDz+mS=h+cjKe@xAypA|hF{8Tj{O!oMSD;ix_OA3yxAi_j_y9wJr|WT$_44ZWxGh$>srVBthwx^vC(!v@wEN(!e=g*@Ag@M z{#^=>X^;#M`kgkOo(T`0x`jvhUHn`Ksv)_^UJt+e#h>YGx7QlkZ*uOmO;(ga zPf6AjI{kVJINyjyzBl}JPtd7qnsVrqrI>Ezh($ From 3b09b109631f62b7df3c62426106a2d213caa33a Mon Sep 17 00:00:00 2001 From: maamokun Date: Mon, 22 May 2023 15:32:55 +0900 Subject: [PATCH 47/90] improved favicon --- dashboard/src/app/favicon.ico | Bin 0 -> 67646 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dashboard/src/app/favicon.ico diff --git a/dashboard/src/app/favicon.ico b/dashboard/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2bcc77e9db0075b5c70c0600fa189389f02f706 GIT binary patch literal 67646 zcmdqK2Vk3Lb|vcUCj0V|&2F-p%uXho>9J=rlbP|@9$S?Xdv72Bk^l)1APBJcBC(52 zERslds`uV|wJIf1#p<0BC97Gzi=-&&ymLPiG9|Zh-W1PLzW#rJMElRJ=icwb8*lst z|CN-y!T)A&4+HjdEn&DfCH!Rr|&xO zsDAc>^k>}XFuLD~Sb)vZi$f=!m%|9mbq-$j8&VYFT zMP9Z6^+5?i=|Of)KuBW9oBvl|v_I1iw_wHo?`__3Ct~aF+YQ_I-fdd9{nFz#TU)Vm z%PB0`cp9s>T*a1M53%#3r`Ud=9lH-dS0dQ&plm(-47*MO+mCl*{^m0Xup}eEW<*F* z2m+IQ5#$I!up<;9@fwlGnuM?>N`odr7oknje(%rpvi(`V?GU@!TVuD@hgcGi*G}Aw z4SODAV{;qU?s`C*eunLbp5Vj%53y^S%gI}g3U-V;F6;ZH^I-+t@`noa}T zjy=VmmUavtJ{kI?c!Z_s5tty@2lvDu#9m2Qq81|BB;9dslD=M>p!NQVtZ9CX4g1=$f%l1Q zK0tdvL|y11+l~CK z^!tWi&OeK{7Z|U7OPdr?rA;v2(8NbU6CVv-q7}LX8zl~*acMB+G-BDFCs?%oAy)0} zB<{~&k#)S?C7nEWV#`PL_4EPTjuLksHy>pTI4*wRId-0C$DY#~GMU)Yvp$!FJ733bct4&?Xp&!{_0j z0)6UmETP|Dyz>E8Hb2G6J)Ky&`}s>*v*!g~m(2&M1B?q>DT2S)|F)ygu;X|;b{@Tl zd%*LgO?L z?7tF!J9D+zA}rl~3(NNqx7`o1Vpkib11p+383&$WRnv2<-UY1M($DK-295bV-(%F(8cidmFQ` zvgs<;@4bUHyKiG{(;ckcc^7MU+{fDO53qjcW2|p#!@AuaSi8Fui?=)`?roT{<_;R> zoWSbUoK!woF@uocB47b4i20*%8=9}xc1=Xc>uyps%{73zULS=%Mz z1NgWgO9V`)!`a1FGfX7mc|_~-^U>}bW{lF86TW+OzC zf{@TOBqi0MbjTb`o4pS!HebVvEq5_*<6X?&_z?59c3}2a<_?S(i|8ZdeAebin7-jI z8dqJ0CV3b_>xk zu2Z5rPlnl6jA=7BAtEvzK0eX#bk)M!RRbS) zE&N<{2=ItPfNvc9{1cItKNB@$wqfd$3z)s`rt$-`H$KMf&25;z@d+lZeuznHo?!gy z$4IZ&nj)f6<3{-siAF>tKu!vC~gb7Zm;}K`-&wCq&SXgrZ>NV3bc7 zf=g(1{440x(kgx*e6)nKzIVZ4s+Y`)Qbr&<& zKE|}QPcd=zGt|$&0N|LPX^2%;e|ck@7vJt*Y9D# zJMY8o{a$eE(+|D+_Ceo)12E9j4eq{P@Cym-l2Ctj42=wjKFS1xnL1#y!78}3?vF4e zA}lNpo}Q6#=@*I*-tmEtn-1OsgAm{vgkZNIgt`YH(no_R-!K^c!(s3@LhnbP9bkjT z-wuDTSa`Wvl`dFq!!dl!4$Nn6ICJGaOjvpk(^lVr#*z7Q9E@w2G{2>ruonZXyF;+4*$>~ zgoNlC{s>U~QD4H~9r~WpGx&hfD+qd5UuXw-Bc!i8eEJSR-(G$3LGQlkMP2CAuOIpk z81Pd1xwxQTe^>PFOX=f|KD|89>wOROdEXm-e(Qr?@A{(e`~DcvI{@x|1L5Nmh#>b6 zXgmUG_kqw-!n~;mK0(m{}}jFC&CN`$S9hP zv9k_i;f6~nt(yaH4ei_#i^wGEKmubCMPk3?B9fQrd4FtHK6G)(2((fklERrgXc3aY zyoPm*#5M6B#uNwUuib=!At8uJHZuR1$r$Geb7mN{mO!}ry1+lkA6kv}fZ1$*?~e-7 zALzxRyaH{}p22X6(Jc@W)B#<8F9h{-hX=78(03qQ`t(P?-u>vqUAu&Opw9cd!L^?U zT>E-byy4c@4}IVDK;L(~;MSYhtk(v`z5v!j02IxJyLk6 zZv2CZe?*#t*r%Xm#02=8j7lf8sSyZCq|Q0QluwX+L2tJse`o`u64O*&uwdIP8~ho^{Y?n)G$7c=1idB+ zo?dpm^(!9)8SIEkNJ6B8IXtmf_$Njqn6-(9IjOJShK9+DY2&E~j3sZF%-2ZKke}+x z7sG636-O+|`7p+(shl9QIu$e5O+jd^H=@&m5N`K@d*BC%VeX^Vgu@zTN1`LO?vDc2 z@9{+j3>fg225-NG#2*TO(E&=7PavXci*k(c@Pp377a{x`r33v2V891`;YsX!iu_KA zt2c9bZ}>8Hc=e<7^?`4H<_InU@E=IOPwYe7{1Ha%1^-CCp2UDK;w_jf+`XBT@mx#n zMRbC{e+0t)y6_hr2yqWXWPk}#!B)l%)*hNv1Ozw`7#f2Z=AFhk#sTWUr}l4vuh|H1 ztqny(ry*%jHT;>cNL&yfV9bnSo@az6)`UQV1-T`oP&Q&B@s4Hg7mB6ZmSAvg7Q$>^ zFeLj@2fUz(@o}|0`l7{s!VN z_=rUKQWtuNUmsV9`1W;!Uw?N5yZR^zq`wde80bxrW0wRD^oJ5xKLk=F=Ia>qMZ$eU zpz{^X$s^O}>-{K<|2m(pqnw9R2O_BhA_n?_=#Xec2b*CEi9r;_5FCpLN|c6mh?YLV z!2FN4EF46j)GKL82(~!jp|K-5XBZ`4K1fpNGF-|3xCY5k_1!wDI5pUI^^(iBRG%;?#o>H~Neo5=5Kt zDSH1<)_IKio&n4SeY-Fh+$rJyjQ7gs#qPT#lK$T*hQNp}{HX(`P}8TPiH23f+uA7T zB3R>_EC`E>V_bKz=1)REbUgec(qKy(iL$b_NJ^cI0P+%{u~tN;Tc8nM$Yw!&b_s^o z&4*ub0w&E{1V>J)s(WXzn2XwRH3&3%z?9}kZo>-cMkYflMbuHRF{ z2LwwF$hfcUy&L<;03C4_>B3vE7IEHo9+mw&@h9%4FavRqfK?X>lg`LkKs_=iz!1;c zjs3?EYdnI@iHNip!C>k+|7X+CDxE|M2oMcA9rHk)Bc^l-FXc2rqAdW!Q3fw zpN4wWW%FY9T@n>+U~D(Q7{u#Kd0h_#f3f`-jTtdvJZg=I(T5{8JQC(`a#9f%cm({aG%8cYD44{qDT1#>Yo=|-d@5RN7xvxwTXa#d=nbFZ zud~3z%YdY;F-XWBhwQQ`n7jHA&ffs$vWGM{cN20lHX<)~Ju-9V;pq9NxbYY$uUi0n z!bp@9EXA17ThKg$N$Zf8y@|QN77VFgj@wUw?7W%C%AA9uK`Su4b|dZ){KqeV`?TxTn|C8MtqMCh zh}OpY+K74wrIRA||M*EeZr`~_xE1bB{3Raj;9Y;RxcLmyPhT(o z-f8#Fqu_1|(kYR1W$VQL>)!H)3gne6N6w&Ch>V(m(u$3kv*2UcV&)+wVI?xtRwFrS0q)pQJiGQq~Sa-((C;pNHSVH3{>^sm02>zxB_8}sZpw|sTdBs{} zXRTu2aS~F}7a=cyHNry2B06Fwa{P81$m2c{$t|L zSpLbK=ZLoCU>M`WzI|7_@TU(D{6%)}+mDtD7Zv_(-ErU*{HYJT`;W>IMfv#KqP_hg zV)6-iMTFn!DJDPGuawvQ{_F9+C-&-`d0-4h@K-vZp&n48=o2C(2k*`U#IL`K`KS54 z*t!$zo=0c=cOC_A!QWwsL%h*WUmpuI?=um9a~SghZ7eL|%n>5Zu$vu7G-r@Qh(}TO zR17Iujns_A&_|9ze&GgWX0C?oz@bQREJsSxY9!g0qpWBz0=-5dh3AR(1*k0BfDxlt zTa>(v_%F}86s?mm31{D9d1Q|d-f>3Gikkn;2y z{wQ3r**oC9*D>#TyC?Q?{=4FDp`G>=!T$5`H}QU_4oFP+Jp8-r_*ZScC;mOpMF#|b z!Cdf9WGyc`V5ObM=(@1ChT9NljD;=A#u~taw76X62kA(*3`KU%EF`4PKt$9S)^*d6 zk+~8k(@fS0GZ151fTTF){qY<4m<@>5&1P<}95vP3sV^lse}(hNyDzKxg|e#2_^{~+ z?zXq#30^3BpFDLj<}F-~2Tyn(0sb=ll@0)Z@SYK|KF|~I*U!zwT*RpdpTYkN;=Lt^ zcCMsL555S0@c}(`;C1|aV(-lHd*c22xzk4o{&5jDq_Vf1WJ**z5El{0yx#%4Apvnw z35ca6#%3UiGY9#Z^=LfRb zAFKxIgMATdt9Qc9BaPS|#G)mK5FJy3imF*yzGg4(x4*!h$4_zd)(cpzIoQ5)A0Bsf zDt(X~pr`H2xzql;j|YBl0seEI$mHwa@H*bF-~L15A44w2DWB?qlh^4w_RQ~k;_r;< z&ZAQgUdKN@HdX0>@&ktWF6@noutg^$HaZpYv4fc74aSDG$8qf%aQP}{$+^BLuXr(j z^L`?<;SESgny>soRMb?&M9+lXx(Mm<>rjxj6&B+x`u}azkKu@o8-dA_cfn{ZLwV%_ zELgmURUhz#iQls2dy$q>g`+20@u>YNJwkW>$D`zhBAs}S+Xx+8F z6Jt3_JntzI??r6%?IPmiW5wQiUru}$@)C29U`#+lbPD1O$w-XJMS`sWmZ-rP*{}pB z&$i=4ODB$<1I|$o4$~Km7~6#2E}1Y{C&Fx<1}wKb8X?=#jVg8MsO}| z3haq9Rc;ufsV8qRA6Cj(|b z#h~0qT))}Qc<=-a3rd_Z!0Gn|bI}Fo{h}Y8oi9%F@OzslOwk*vZNcPdiM!zMl&;&N z6Q7EOwl3nddkcA85of;t8N2Vc_t+3}Y$D9}MXVabtI}=nPP=y=Ejs3J6shgHgq&@6 zZRhm$a_ot{oICLsyYDH=7mx!iN-IK+BO95vY#s|~|3xS(n2M7pp5oMbt`j)jhP@{r zqxn=j_ER4=Hr>MRgB>`_x~^czO2o!bMx<#BbAwq(Nm~L<$Y{ob*+_9LMP|xM7#@dh{pMYfcKOGuvw+;ls5)iELcH$n(ddw*n z`g$wtdXbo*FeP0%K6AamNIsT6Jcu|`VuPc)q+17mSNvnO|2h0E%;PP3;dNfcUwFTS z2s?7(vQV5>g1nRxq$LbNZe|0H9%;k*3-tA;U*K>HaHN%MM-Dy4uA|h2V_a{t;WG9d ze1TOPZgPfWg2G>K7=?`NrEu8iB0@Kj`NMpa|Ck`R6I`~0@Q`tWr6G==xQexFo3UWQW~^A*ghL-) z#68l5k00az_iQ=ZJC+^W-HgWCVaVi+V_{M%3fS|kNY6qN`B1TK!PiEKX6j%1*JeuWsi3<{;((lyLF|)=21?67v=QVG*!t zBfG`OBl%b2-BSerS0s$JJjH4I&X_M)_Y}cBriWPdtotcRjQJ_d_X}9#m1R{SoxE&z zVI$X&U&E0zz#+=MV=vVH0kVgH>?NRtzQ37kOV@pPmpuL*q-M`Uh^`Ki(c=(q7>k^| zwVdf13v=`|#Kq1*TIy0n8>u7uF-kN6b*Lg=Y-Jsp5vogtH?fF?!^>WnbIidprQop7}p- z=NpjZv*S4)UcZfPtJYz3MGdm!5-`}2iaZr~#GkfoBj&Mw;mix!Z=sk1 z_3WvzucM_uU?0^^PQ~oQd2Tmi;76ejyn;V<;17*|46zn5vE~y!coqLdg@0+*P{gNH zW9N|v%E#|N^&I=j@$Wf8{E4-QVE$6Lu5i=#$5^%gE=G<2NO1zf3utr=iX+Y>R~Qyb zp1{JnzwFhp#m?l+;V_t^CL$_)EV5FUFvpkxKldTzo5rCqZ$9pjBf9gXL;3r=4}rV) zfcf)wAwoMCo&%DUpD>4yL~<4J%^79lpd-yCCOrD1o?79CHKufnerme4Lf}yolJk*nXVO&@E9sM!~Kl2iHSvJbzVUc>B|So-^+E zw0${O*oVK0zvw^$=gLL$;s&8Gs|E{}?^7}Uz?tVbNT1()oH-wDU9fNZi022W3r^Y3 zb)~yIv4d+)$4)pxUUveb%o7k{9LKrdI#m-I4HKE~Pe4lYV)h3XAt<1hJ)?0jMK&VV zG#Ob*3(@;G=?edX+_|`UhxH(ReH*WNOG_KF)5mglJ)g61Im}5WAdP%OQT7T9tNain zYqu$BsM~>|rJGSxww2uDhMhf3`gcBMC86nj(TOLFG0*4%ZnMTYvi~wRuRVyh%bT%w z>29oFwhtd|KZjKdwxe;_Oq6CBr(6QpJ?WY2fDss)2XM{vzTqv{ughBPQ0kQkuXj#56r zpc}1ppnm9XxcAG4A*7zYg1NZE{7-(ak!L8#oys})Wca%dMsD(K)RwNtnA#l}UAG0( zC+))So!4=W@o9MVO7wd_0lotZ$X8Fn#F2-?erMpj|FEsSbH`ok-qIyUQJBAwF{u$Y zQ#}m2DivQeegz2f9)zf{GS1cJAjw*biDTAa{i;KlJ8L6~@@o-GzmRCpWZgRm>5hCP znDXc!a!|l^bv60)dHxCPt+BQ?q#-_%=b_}>Ihzqf`*(z!XoqGvBBJ>iBkXz}MS9r2 zoWE-Oa{Ke`-$X7~B$ji$N+RPCONroIXOxb7e|S87ZxZW!t`TGIpOspIkt65g*!eab zILrNkPIh3=@u#f!DBbqIWly`Zcd>b=j2w4B`Tkwa!1~RPmFLNUU`licftP9a^{O=^rOR&8aox^ z>b7Ha?FKaP{sVij;?X09X!;0_2jC8ITd{N>*GZW0?k{4wE~041*TKKD9bTQZ`>_qH zn6Hds4zvuKpn7OSM{;IWEEy{osB7^0Orsf;+(1Q7oY10k3$^!7dvNck_=WPNAYNkQF;&` zVTOo9AEU&n2VVz&iSriWcti)f@sE)sF^`MMAWxTt#Kb)M=0ftgIoQI5;YYqE{+qV7 zamH^uX3lBFmhGL$FIuncU+~wE2ME`XBd@a=A;I+u|IGBID*w}kja2yOFb5C`_O60G zb}T;J-in>gmtl-7gHcxtn_&z_5B(71Mr^{^kt=ZXrquh45A@N3{bLq}q6czcW%*?E z{UDZe)fw!WjQXATA9!#ROV=$tjr7>b>M}6odXuPLz zW_luLbIE1&FGufpQsM13h@USX)iq0Tw&fYj#!~X;W1tVH!le3x$Yo7L{!8ih^TO@L39n1+?QuCsPA#I(9*hOcwlUYgjYGtLA9=prwEtb7WB*&Z-$YN@ zwU>KJY;R}YH5XH6oWYc-r{Eu0iSY1Iyk?_d2p`Wmfayq2Spt37Xmx#UmKo3l52x>$ zh(zlQR1|GSIDJB5+(gukSjIV`F|_?5^i@NV%KIjb-io@RGw{hLPw<$vz=Ma+@R+$F z=Rvw=1d06<4wqcJ_84LMboB3UXHJo@^mp+AJ3l=CR#GhaD(0irh1=kWoehVB`6T0* z%{C2|*hz@7OoWB}rsS~+X3jqZu-5UM#C4aW;Okn$H8$16zZ}6KMey;TW%A zo5iRq+yP_A80H9*kPtHt`6=UI3(I9rn2and`zq9f;)FpcOUc8Ks6o7l>RK6@2DI&lT(t~|l%D{c6wRq$v0C(rW|f7W~w1GemG!`9}GS7grt)(4cD z5lzrWjKGlc4KOoL3)2lpKwve*&Leg70fRR}rx^voJ|$s+$^oL82U-~i1pj!;baDlg z5F9iZuC83`$hs~fq#9#~?Lbk^H0<5ef`^aD2ayOM?081ZAKWJ~z@HBKf)3s<#~E{0 z6T2F?_vYFKZP{1OjRyIbRC%}*qptD*lH(Rq-)3_Dy&R*|s2qo3TJ`6EUBsV)a zg}0+JkRHiAL&qA9J%kj-4QHN^Oy8bi&BmZ4ayT}wkB(hI%f}CK>H1T&UTatQAG`1n2QPHI#J}kn_m7kKFZg%sz_xvD*s${+wlqJ+ zfs?=i?kRIn_7>Xt5SF;{@C__R?|x~V87xL%P>ss>BeaaEw12C48f*5^NT7`+*=IxB z?E{h>bCH{|3{eqdSlicdooX@HDORxmJO(qy9YKh9E-svZibu44;ew<)B)uS!XS^-) zf^%asCwS)c$5^#|57$X?MtwkP)mQldf6vMrfxe^3Mee08&V;W^Hfjpz;dyuMC-Fvd z4RT93bLJT$^i}X2Sje?mLsW0WpymE)8tQ<;znbe8s^G>vbTH?nD$BRBcQzT(kz=6? z9Zvr-gWSjz`jmM{;O9@Yj7Ms84IIHa$YP#Y;V45|L=Fla6(~-rKw(BDGLniBYtCl< zn@W2~L5h)agWRn6je=z6>1HRc+(e*L>{lrBWx?Oqe+c}1%9Wims(%o9=QR<1=0h^w5W*l zpPC>bCw%M1eYBjo&UGw#@aPqL6Fa_I@qP!6BFi?i3B zD!IyQctv#J)^la^V*5_}KYOVICt6weo}*2(1~@>@f8VJmiud1p;t6BG6YSW_ykH+W z0M`CHnz@hE&NejjeAnJ*n9p8NNNBn8fiAQoO-LQrp4O7H8OGYF7U>C#5oex`@X%4p z{>APEf2jjRAA}Ej9skC{5#{I$%T#r_AU zEr2UydDFI5t_k^a`xpGB5hUE*#+8RKpqCDNb{?7fMLr-SW$Hb_U*=a$M&@+X(^-?7 z&`G=JGj+`y@Cju$ndZ-)6Lo_6wP?|P_AZtnlC`Oke72w0PVf-=L z`c%%tj8u9dKES}w8AU!Mnt5PU)Kr*QUq~E?;_Q^cG#kJ9Z2^)}7IMzw0$P}R9XWgl zr+Az?b2rz|&E)*t9!#5Y3fs3m;_sg0IP>!pXXv+?uPHhA6vv6#iBDeO82$Xo8_!?L z>Fc!ho6pfo`IvV9g~A!#k3Rt}P%hr$IqUG_7avjgKEdE2)49%X5aLqnk)A&Z1r>8p z-?)Ku0G&8^ssnqEK4L%k5oZAAASk2^p&>)r@2^w%Gsbd#@i3(W#e+65#y2S6FMeNQ zfJlOECi$looEMpdQ0CLxz#7<1jVR7q%C*Y{m_1|b?}k5dx_`R^=T6*W4q?Idt9R~x z9{w|DZt>2^ng#LyX5(x%yXNOxgW1!Y@r+utyLd=}0z z_TFL6Aspl_@(JU|?ZEK*ttjB^bzZ>|uBF+IoqO)1mHe1+b*Db29&rCQ!TxA#2afYG zM~VIMZu|xNvlPMpBJcY`>_snbG9MuBm+AkmK6rr}ybc`4;A3R1#}OPq1J(CGa;`)9 zhqc?!BX`IY>^gE={oMuX&#ZYzSua=8{!3LXl-j5#{&wa-G7~JhpX7kz2c!;+rw`-A(W3xrVkbTZP6o;ol(!a|EvAK;4eQN%-3g3oy#+^ z;wSa5`+zG~a4aL8`&W1mLH|A_jL%D$x0g{TN8tgl>r)zfPy9Q09YhE2GL9Z%?KF4J zKIXG?7`vya+%7P%jx%nJ7+%-RS?F1e?W~3P+<^g=h~SJ|1m~p{{-#N=Sf(kCL1Ki1 zeQ&;1+GU+_lt!FL%5qmMLv*s>2hh=LoGWO2EeZI%L zj7K*Z7X?Gf@dS4#_UDMd*!(4m6MrY}>d40k=9lk1Q}%v~aql6YQ+n>wgMY%$e1myH zl&KV>NAJbD4djLob6$rvz|j`g#MH^*jXRK4GM8&PYq5FHZQSI0si;|jUcK$)Mh7F9 zpI`d@;s*qOn`s(nf>tTKCErhppQp}+2ar5a>|b($K(8{`VZjv)PyE~3@Vy7rkIBF6dKjxd0HC5N!pW+h1J9mq-TEzXl*dj%2 z@-xDG@B*>Fc()TDKj^^KC!D|K^U%Cl^YBDID6to5qK^*@WUV=58+(JDm^JGOrcU90 zQIoEb_dNo8@*)iIDZyKBv(M!iiJR1+c<9#u& zmDst&06V!K(FL)8xm{VhMd2UKKJQSj9WawuvYAKV6V8uIe^B09JKv;C2|rc;rv~sn z3nwH$?VJ(2d;cLmxp9ks;apXSmwVTDu#A^EgOg|PVsP;^a=jxMt4Aq6WYm{p`qWhl z|296U;+Exl@JBf33l|^aI`gApwX5Ju9~aL)wD3Qkp5@%Lpb2S=|6=Q6_d!9GN(aRL zB^Q>SMVl3nYqQPVtos??Y@nl@wx^0*C9BNJ@KM_$S>K0 z;+kD3tlNpQ(Z`Tlv<5MWBh}stVyh2ntJj~l;nJgaoaf?OC-$FrywHvPg*zR%c)txF zGuT|~Xva-nCz?dpj|4rr!RMYfVZGut!^vZ$4{AbY#y)66mLfTMCsI?16Y~}q*6aWB z<0$<2KO)e4;wHa~;0VHvC3yGUSp4!AR=o4;c=Uch4gGs(anGAsRBXuo0qMoy=^VoZui92`6H}M*r zK6wiZ=WJ!~VIdlZbDyj+i!g2KCh}PmnA?(Tq3#9|E3xb9p}SzBf0sNUz`ufaQ=#%; zZP+kX3&+y$3oq{DTZZ@EO~x;N9;&^hHrHbBfkzmWKMNo9O2mMEh465#=5sV6 zD0CwFdsT2B7S^1J^Wdc?PvM`AJ_Ge?KIT3Zx~Kh%-*;l)%2@VN=v$P2-0i>x29Aro z0GA$j;eX@#Qx)^?-G7Xy;#9ka4jfm-&BCIa1>%!F?e6mF5z(oPVUaKtianf9V5= zGvB%513ScaDVlJ!zwhT;s(3-E zg@gl;ywKIP5WoIS0)F$Gc=YX)rFg(WdCL*!7{#?QH=)xNVnSmRzVqz>{OT78e62!! z|Hl^muYcCyCvQ9OOZLKl-Y*6J_`QJ&f3byIkLbf6k<)uX+oydyv6tgZ>_ra*|2tfV z-;Mu;d&HkHL;QyLfpZKf(`GF}^X{X#f9oNxv|dMfX#C8Dh5Ijm8BHDF zo~Go-1aGnN>@@ZQ$&EYl7cM|}pd{u`gEAMxYhXTS2Uk!J3VFZy*+TUBAPVkoCahZ3 zta!Pn1iXs}lxRTd)&bE2i4!mF|HX?Yr~SX^c=lM7g#Rf$y2Uu!IBqRtObzRfQZ&|c zzF_=TM2F|X&)dZHD^svy$u2bSI>&j{t2ja(;RQCQaXt-OX1~UN#Ls{DB9) z_pjdg>%aW~Z~Wyuc;m0$#vA{=H~!+EJSi^t_Kyaj*8mO9U%E%G?;cKkd`HD}g}vDS z>ms_)ZU1L)cHqp7cF6I_#rrtidLQ%G?M2zJX=oU;5L2hEz|q64*uUo(Ipoo}#T>AO z^=4nsMEt*hI}rcnFI@09f8&9F`ByFe?tgmXAHL;{fBI)XeD{0a&_)%Yh`DM10S>(T zo&~>ooBsbDE8ctG0vGnhg6J0|#-}9AK~3d$H47{;RCw}O_C_S168tlhIX}voz$EsB z4B8r`(f=3Z%)r=D>ljx;=pQ2#*Qq#K+OlBX$%r5`JfDNT=)q&bAMNdLs-XU&gOA|@ z`6GRWHu{0_qgNxrGMw`;!!anek^AT+V(VtEQDe^0!QWpZ*K+yNQ{H!$T*Va5tqn$4 zP%XUN%Q-u75HT@Rdf-14UOt?4r#^`e{Px{ceDGc-{h+#y#&^Hl7k~E;@8Yli=GXYIe@pp?5Aa|A*$w~C|8d1Xe7`q* zxM$ay^SANwwMRI0>7nBHz6^h-Klqqih z@dEbjILfu#!*Pjx;(g`>!a0af|GWR*AK&^%4}9l4-b%jvfBf*h9|q%x{}zOAeWy3R z{}T`V;70)vn}6?JJ8@58UzB?nvq$dFTv7bLU_6xlkwD)H+CTYk>(rO{%k7M$IWR|Z zhCGs7Q8;}@%xF}VF2RvQ_prD53irLWa(~P))DN4X`hIO4oZTWwV(+30q60l_U!C)= zH;I1$p7O)IV1b}2dmi{B_1<0j$QhG2Qs;*9HSnbXE%j|Dus5#Rs5H@;0D^lv{2Qa{w)}9 z{wxGPe#;j>c`E?l`@TQ=^iEPX5Wsm|T?Bi2x?*^H<||tlyempJDa@r;n#g)c>|gwV z)g-mREcUA>sUEP6{g#;UIyL7d>%>^8Qi-uPw|$e#hcZGT|sjCG!zuCM1H|)>5gCgbO7FZt1o`U z0mSqbAHW+_jdVQitXF|w{nm+m7sk>*zIFWt`w$bzy|G_jG6Bn0e#rcSx#+ejh@K%%0NvT_I=KNhKs+@!*?(3!J41tHA6$4yN@bHXdO_+ix z_Mr<)r=Wh^O3Yc>j6ElxVDrfrn7!>T#w<9^eV>^F1xjC}f*i>Z_JT{*`macGBgqLf z)f~j|q1(yzRVrH-zQ;z+zo$fVjwFHW3$?5Pit^`TNZBN=4QK7f+U#TUoxUCp@(L;3 zhlso#b%Jyad$zKdOjik`bb$YpT#scTv462h6^Wlhug)Z9Fm&J%eQ0?R=fG^0xJ$oz zk_IDO*nK*fraeb-p8bwt<;$5HR>FsI-OsHMBkT4k{gqyyKjWEjKfZol`1^8pS$d+e zTkmM_%U)W%)`GZ%lbW!`v&e+sh!|2 zGa{k`FYzb1%m)@R2<%jS!Y{!87VW2@dM;uN1(298Jkg_0?ng)b_v|}?=BBHtEnCJJ zp<=lAN#!hXDdS`_|DLg*{jLD-a#iDa`xcN_%;hXx5x<9_2=TNx;Q)<>(VP{lQruA4 zkoCOg+&hsxVF>Gmx)D3n+Uk?70EHg>#Mly-(Pq=XJkG9Hqx1J)h>o*Rg)v zX)IoS0LwQV}6zd{|@$|<-XJm=H?CS*?Yc3&ha|-pS_7w%mFV_*RC;lxJdk4TB#eHlQ=@mr5|vZ zeB|Eqz?=_npkmT~yvx}4?tn~q`InFnq5b#3UuNZEiK*-lR9>`B<#}TJvFv|4ad#f$ zxuzg4n!OWE4Kh+DqoRBU=S+_&`xkzG)$)VfFPq;(5R%3BUx~|?@2UJx_7J%9;L)c! zpo$95c0Pap{N$J6fA!)M46B&M8QCJ-;q?=~S=Jhgf7pNU3^uGeftu1~++#Ig&828L z>)6=9+>bge^@`-P;@_P1?-x*@a-fuCnFS#S$QeMH6%uZsvT`$VAopqFd?|C>((*Of zzUP6$_#$mtFuXv%xs{C=$=k%Q3-*W4KER3dPjLP!dpCTKB4;m?|6?ylI9D&dr zkJdZF7t^osby_Yz<)Pqq|w_<VLR$B$pf zKKL5dixKYT6zin{eWF>XCsLn^v1G|6HMb#lFF&dVP}q0UA9S1~{@1DZV${{p8akLPt) ze2s86-Mo(2zlale=TZ7Rt@P6^*VzwdEqIEv90$)lW`5YHa*(&l9mO!Oj%SZ0k=V-| zzVxc)D6=P`6C#om6qc;w{tk1M|5yAG--mDqB2qg@o_UtoA2`*4#KBXEKWBm1o0zrg z5^~B{qPIs5-gimE+wVJ69u!Q!FW8F@P}jvXPpt(PACQ?co3#}EX&7SwebjfGJ{>!e8Q>ukT=mzv#fgf$0i=S^xYx{*lxl=@W=g$jF+5)f=vC?|2bax)HgX90Mt+A-ZYeK+DbjL@E4hK!@xRRLE&V0ZP8c<9JHOv+B@T0DX#L(7n7ptRfx2q) zk{Ren`R)7h{O%d9n+X`A@YgYh`!g@{BL30F2CkQ3o}Vy-`Su$2gE{X(U+=_Tj-Q8r z?J({y#l3@MZKzrw%v!)4MPJ;H{in!cwTH+}+JUlL+OE_BWP$~I$|KeQUylD1e!k(A zvpI)Sh>w~teTqNVr0)OdEc^S5iT6ANlG~B`FDG?2xypG6<-Dp1udwIewh)7} zoDUeunVjP-&(S!e2?5%C^mXC7sDQy-i&aA&pFAV;&scJ7(tnisG|>aWUqtYiy}iN7a{+cZzY727e4ONe zai$^IMlOb_ANvTbH%SBt{*`6i(=L0K!e8vaD0eZkQ)Vgq7au10>!{04`}gq3#DD>5 zuloNU_#2}d6hGw0m}s#zvM#@+)?ADID*TD}OZ4@NjSrQZD#5NWLCTprisMRG=gF;-^KWj;mb6eJdi4k!^FNLz@6^f}z; za|Bj>*rMjZ6#k+Elv7tYTSk4Gy!apjqAJz*3@+Q!jtL8|V4z<)-hV#{uDmY&iM_~Y z@y}l%9t}Coba7!wv}k4fXTY z+Alv(?ok|5s@4i{3lWw7e=Yl`zR2w8sA|Eq0ps{RdrTuCvmX!II~D%9S>w2$;T+bS z`EcP}a#iUXuBjN$UKVEn2jr>zMSPhb>waJF9Q4Fr>H~@W5)Z>dtJI!2TJnUxK84Eu zgE=?3h`s%tw5N;gNk~m~L24}GE^}OJj!$$z)p(tX?^Qm(m7EW4-<~iI^B0~~{cMf4 zyqkMqZb96|{~L{?6#kM2s5sE=1H=!AIO3W2QsUEQ!^-EHzHlFoa2Db$bIEhun@{FM zj|_Z)fLzsHw3<>vjg{gro-U9bipklPZ@+igHP`t?av;^oB}h}SA8sF-zt_<$h_ zf1_cT!e3&*u-dKk-Q;8I2pcE^$1{I2$1Sf64#ub5ZiP z9Y%zqq^PD*VNlIq`RMr!OS`E%~4L1&M_{@z;fsBVkSK z>sv&dEyI!zA7ITs&hat7l55>6c>sMt3o(~`P<*iXVwvAK$C_N~?~9bi$-6mEIG*zY z%M{-roQw1wWIc+W+^OUlQfCMc<+Oi^0pbIkBI})ExGzg=;&jBsk43|zEvz5eA7re* z%weOJPadiGBXd4}5#-2|XENqrWA9)mxxV52-l{Z}-%GyJw^xFaFT&qIowQm;D;=n+ z*r4jcXzHgEd*{(C^?!F>DENymj2!kMCQaCgN3_+a#J{m|DO~#U`>D8xP-f}~?Az1Y zHMgPg@0t}N(@Xrh)9_cs{|@p>YnB{9dBF_EqjEKKBtGB)hoQD`uAzweZch3Pu2IQT z`CnbdM&=6CT|>R<2TT3Z6Mt8?w3qlxUZC)2EDR$)8R;`QBgyq7jEC+NSFe23Pd|>v zB`sLH=Nh&hxUAOWN*#Cl2L0}J+9BtA6u(34B@aJC+uzlESNZrD`cugzq~7xIU~h{4 zMDj}MFNp0&(Y_S^th?=T%mc|u2=+3ACjLO?Qe;0jJwH#lX*lvY3o&oSVScadNo;63 zie>BfW5$9#oB?j+_mGw%I&lVS#~(&s*(Ufiw-c^g_V*I}d-qOIBEDW?VL(8>nj_I@ zO5x$2#hIuY&Ri02^JtX^C2<{u*#GMi!`e^cfarkeg5-#GRqHUMXeu7kM?Rsw%1lPD zUIxzGWFSAM5r;pzLYh}>U$A$I%!zPfPtK0M$?wls2L(TT?XecA9l^1^7(e| zK8=#%IWO_|;peEY*{o_n8?U_^d2@NM5({41|G-rC@RODO3;tsJk_+|3-@`qJylN); zl20Bz`xF*zxr64@9oTvJ6G$(8<(3mzwD}_}*tiet_7IC*r};gMOi$4(#TJRU!HyAjB$Qtu?{Dqgal8YCgV4+^fT1Qjt1p0tR?)SU^ zI}hB$$&VTP8HYsQwl&}4_X3TBpS}(SHCr)d;bnvpH(&NSh3gWmKZ8H#0D9stIdNn} z^-KKo$Tw%E&HD`Yq6<#HpBOh;#R55&kXy{l8m;D}A5aGx>gVFU_w?#}4Tls?!|_8m zSobk*)7Hgzcj`7G^Uc-^zi4P@`FZM*KkkZR1&vc_G+N?o;C$-B^J2^VMOx#)?>GFI*J znUXn;>-_GJM`9de%sF=91s1P72d$wF{#@%ctda4M9F}V!=UlbY<0?zK~wM(q=h~+&l+UwdkPS$Y9zxI>QzKs9nV`O&h z4(B4OxqiqTQHJ9DiE6G;?NPb1iS@@UH7n%dMsAb1m2ocLZX2U;bsr$JZIjuPD4-7H z^80w1`}a>$aWI>oPyB-5FW3hM6mczdBYkrvXM!?RPSnqxd#_b)Q1*Y|yu|m<;(z?= z6P&!p8BfU%825+PZeZRv5%0X~Ktu%hC!p<%-3$My*9~Pqx@&E+aIT^U5?7tMmgs;} zALM?~2f@HhpDeYaJ*g2Jci!P#Idf6Ip6vTo$=3_yx@{AEwT7~fMQ z{}&N1D2mt%{x-`?SB#dfBl!? zFMMGKxkZ@+sVJI5j1zF6`4crOx_a$CR1TTXxwUD^z9k1NDO{}d(U<4m?%WTGwV)U0 zLcAEyJsA7@_I9AxZ{wJk&f+W~b2IXWg1tX|qQlN>Z>&LI*689VUAezZVDxBySMn|F z;99#Dr~Om^S{Q%Nkl(*df7im>N6&Izsd1m;&|O{fR6Q-eL~_X>=3!#{!m|bX7AoE~ ziv0z-)_TrTNlb9!FSv_OmFp_!a_wVSXA3rls9{*V_6qwyTzhbub>6D0{NCchs#g_5 z%m$LPaO1vxdU6Yvc=~CxtowNte>c~Zm-x$?hL`w9R5Au}PhiH*__#(C4q8HdxjzSWD-y>#QGTy(M^-DG8%Hn01M*RB1EZ*C{GI|sAu6~YiBzqc?No99W&BrlU_J3q z|1$h({*an-^ZKJ)hr58^pPh>-tTi|$i>9WNTpzTA`x?(y^}ley`CJ2%o-|q2gK|5S zF;d;p#EAC>|t~MO& zt^uXq7hfQ_pI|>w?EmN)aQ=FhS~J@31MVlp=koW-BF|c=_RUfHNdM%|d`!c-Qm?60 zBDODaAd1)2MqQP25zz_xoykcs&k~Pp;esiBTF|8E3xJ@k`FE z_y-kmKmUCP(X2NU;>Zth?!siKqW#Yx4?7htT$|qSw-KDpb+C@9 z#ON`z@sPvebm6r5E)Gb}Md-rQ8UF*m41byTddxYX)^qpO{Fg1dk~L=)$Hr&_ds|+? zUpOGC1!b=&iT44t-z3gb3GR~ndAX%iHzog1V1JGKKQaFiPDuQpH-8^%ss9ZA{kV=` z(!!gVx8WWR(Z{z)4CsNs~7r!7P9Jbh4ba*Xi7fVn-<0v*9X6)MnSU4x3d=&HI zx8E^xzJ=cvuPoAUYvE z2|eosBWt@zEwSY1s~FRaWlfy5T6_!cp~K+r$G(sD z^g)7of7*Ya_pP+cRQk$X&hVC!Ct=Jd{(-*i|InVruI0Aav~a2>`t{f4b^NX5v}1^W zMl$1pu7th#`EdEIe1~xgxw+9?L$y}*>*)es$DYvRO_>2E{zUiHAIbYfB=$ez8b~?H zzHVhj(`nm@oDW}#meY?>U(4@19K2A?iARKRpWF=Yc}<_+)BXj25y9V`^1A(t?K|y1 zD!Nw1fARk^FX-W0j%?0hE#B6FO@|os1%LW|CB$Fq@NIi@MSebtP(_Ovyb2|ChEe_*0}8qYWun@m=C>taXfv1yUahHzhsV2<8s5_nPFA`87K* zcT+n?Oh1obabDHKmpVEy0q^&UL2zik!d~!?wGQLjm!a(Ke?9y~4@3tBWzSMN@m2T> z_99942Kw6!&W>d%{DZvH7!w+~R$+_s`!cg3KRxVU&3|{}PmO-{$BBO%*S^YLQu1)w zS9o~M0`_%TulXmdbs?3d3swIwlCe?8{k)RNg$N%YK0lbYAu}q1y*uq*@b@79D>+~? z`4sVQ-d>!EV0`rP&gA~M#q5Lsf9;)Vbd}Y)$LX+EKi-e+r+U}wy0^F2rPcwN1;RWf zf#hVKLr4N)NFaoSApsIe2xJ0603o8H%%g}^sCd=(+Sc3USkbDiR_ZJc#Q~`M{{H)% zee#~yOoV9ZYO~hP`|fkjJN}<}Kl|Brr6$&3(W4)ExNLXXbfq z0QrF$-+z@j;46#^-A9eWd}Lp8qGAqn8S`MCEwQS?ytU*)5|f#~ zmB%?~xjE}C{|oAa)mU*1X zy<~uXs~W#Lmz5)_)n?f3S?1^eHG}$*`IZhU$~Kvoag2qf@b~He@ca*Kz~)HwgS@Zf zG%x4^b*8lc5qd!L&daDlI&@$Xx_=*Iy?5gm93UTQ74-#FJEDymrR~h&U2NZ(_C*WA zUix47D+VB6Px4;+al-gwO9!eMC;a6v$zGaBzUbKT%gjV_MDITFsoDMbXXgK~0h9}( zdD~~nO?&BeYMX5Qr72#t)7Hw;`%Xzx4TF{B9Wf3*e3l1)>e77;e_})N)Gk8j>V7Q# z*!dcliG?;S{@69bUvZ?|`A5v=-RDg{c{(=?CzgY~cPsgczhr>qhGf8w zyH1$8)qAL6G8;QHi(IAkHvcD;oaPv8crX7;uazyNP6nS#|4R-SFb4ZS4!T-X4;EhRU3^Xr0yeGn?A3@O;nsFY6Y6>3hk2$$#y8vDbcg z_z$@)gZi84*7h$hY9u%BL2L7?K7jbw+l0Avzx$*AqL&7~!0`ii%k!Tpag0CZeaP=` zT({elmu$88PeP_|Zhp+f6xbCW#d0lcaVQGzQjI9ey-wI z)n*zxKsK`GvnEp`HYsT(V`aH!^q3+uYTR5iB&ygHE`HFoA9~lEdX_w3ra&MPVd!d=SD8IIt3q4^e{6lkqUvRj)?fLWPo6em($9!_; zJ2Ux9^M>?yfk5wHnNJ&%8P*OscJyiHq2F!g|G1HJ%%+A@W)ATd;h&FO*WBU2bZo>B z|7$;)@ephOgYg9Hy%ge}vR{P1{9%W`{O1&E-3}j~XYK0I6Xu%X{9ZQTw%va*zj&IO zD{tTjk_Vvmmv(IZ75S#*OLG1x*uOa$HLR_%o^hlyi+|Lpe2f3&$-;lJ#a;R)2Fwx@ zH1>qN0C&YL%$Ic7OP#AK|R$)rEAQa@0^d| zdEx)L=K2xNceuOlrAwD43is!qf8IR$=%eQBpZ;X$4k_P5d7#Q2V`JxH8fyax`!Udrbl%*;O<%)5E)M>{Zyq(W zz>F9H?@pRe9suu<`QjVfU$gljPavsYK?eMmJpQ_xBW7JSHF9LvMJwL0o-rNP)gu3S z#PDq54b)v3kIunIS1i`c`-;8B&A?U+;V&8x=4p(@Do!X`aI$}D%tB&&rRHb<9k4k} zn$H`Tu*{xUaeVQ;@b_Xb8lOBtF|PuAo^0YCaXhyz=TB*8fxffaVNo{-1Kp4j%Xwaljfg=$16oSa-ryE_uMNOCanE zX0}+}C7mz)MGMkh@&hIjCml7SkQnSza;>*~4gc8Ka^?iAwKZ>t4WoAXWPHYnrDou8 z*2pCe^uY0t%p1Y$oS z{Jp%NjO+=Je<8gu?A0_5Bm8Ca$sdruklculF16bmZ%8)(`5&?N{zR*yr>sokvBdK2 z7W+(mFYFcL9Y1zX7=P&^KmNkrkN=!J;)lp~$$2mK+V|sc#x6uA4n|lQ|hbGUVixl z>OMA`QNwe|4cv|lK4@(~#jq5AQQXhk|BLRn??ZB4n2Y~MG8QHqKy@Qi(f0wpM{IY= zZ}E#hiz8oi*x+pY?lc}adxq{lDf>V8**^Ylc(8cYF8b$Hbgw}m%==1 zPR5s;!GlvQ|4*KXT`Bybqlv_4)dJ{T*%`uLyz83ff9wFoC1n#zE(m+caM>uL-Rplg zgZZjS_C94pNQcOF&@m~=L0et)E`22Yb?q@xv#k7|G6_9KOw#ec!(Ot$HOYY4GpP-a zUzLoEOiNf5(cEW>AL@6qyCpkh<0{sX7_$_gyp8(%=NRX+P*VE^9{~P+?Tx>fyY9NL z%leP}dWwq$>rl-h|AdJJ8=4u9EMI3HefSxh|0Vpj9R23j1IYLVmR9Slj|J%!KF`gh zP62X2GI{Yr=JNAQ4u8Ev*?^*h(qh&~Q=AqoWS==ZEdyUh_>UMm6Tbl)o7llHatWp- zY&2VTy>IrP{K}kuR(Y0Zsn@^FtXj6$Vxt=QxtYuzn9h8QLCNG?=h_??O9K}F`Bn#5 z?1ewgVXv)t*u~m~e-3;tn$o>F*>%$m@#gk{DV8RtPb;^W>lk6*8UB|4L-ag}-X9%_I(*f=ufz{$tUXcMQoj0q$v8*g)%C3=*rekE^sCDpukpHFoqekah{jW70b$_;n z+ZCW4@#akW}fPJ{PERys7^Bh~K)zrxIau;hy!fkL%?$LDu$K*3M9qL~#xIhvfz%}Xg}>`hVGJXRxcUTQ!Q&Xa zzy2210H}PL@!(75fm4^v#`|6|^XBigzETu6#lm^yofG$;HhI3qf9x3ajIj6M?{K&4 zX&^5|e`*>-Q< zFFKU%7tg)*gun1CAt(6_u(xx@HdPH)qL32y5HQj`5-y|%h9`cn{}%Xu=Yc#Xe1+H0L1~Ql z&So5H9&zW{_M9p3vaX?~>v>xSYcPA8`z|}3I51-gdbg8^MGU$%30q~3wc|t^R+n?$ zbk3<3#y7<0nuj-vIK+5pQSoU1_p%4Q@<1^GjpaDm-x>ajAxdB9x#dSn_m9WNOe6L+ zx1gS}`Y%mW(=OstQ>ZnOYBp@%#{A$fvEk13xc);(2OJ7xAB+N7IUpMN;GK)6zGl1G zKny68{Gym~5Q+Y#!`o47I{nXk($F_JR=$qp9_ESThZ+12>gY; z!#^&DapN&L;Fn9CodPq6F{F_(HD<$}x6HPOi2K(6j=5RnB{I&ZI+c?Df$7RSBL8V< zCN@T)#b5Lw+1ok(qJ=7SKl$69rq9$gj-dOPIuYG8p~%ve_Jw7Je#1Lg(_A|>`5xY; zdl3HPM$ZaXA)2G z;4j^)CO>^Fx=OTAQryP49Xb)-5k7I?C;S!1*E^mN!hbY+bQtmWn}#hg<>cA59sbA^ zRGctn<>V2QePz;9Va1+jI!qng7Pe_&s_mRXD zB$sq=!rhCt_Vu~9MIrko17wrf-*$q(Xu!n+{QNID;BC_N;(v#~;)k;RqIqYk2|MtX zSnShi#!wSYeqlNFu>NG;eEV%`He8w@YT>JNS;7xp2R!SiYBWokce8H#3X1>A+t;={V>`bRhf{bCrzf z3;v=H;VJnoyFyq>ALuhb_MPD`-q$e+apWXQK6HhDhz7#=BP*rjz1VBtkH6%d#yE8T zvXV{I7L7)SrsLNvG<)|w%3P>-u+_h~qV?ZIBcL50fxkM?fMP%wE?hPrynn%L*|ZzI zf6NpRGYc?Q->~wqsUjCWC5CmqSo^7vxQh5vv@JRn4&p!QP1$ME%O&&3y$2ih#izp0 zHuztBH)R4iM&(!^dI<5Lp`#a=L8BL$)_Y$uY2<5ERxyu^WAm~#ZbFT9-h<}8jmGzr z>~*~8u=2}m$Nyb@uHz*SB)_Hibx!Gnj`NBRI$BC%1vK8##$vl@95Ok9cr(xAj&obB z;~H)n8$c%I=d88wDjuK6$pyDfp27GgEuY$qnvW5SUppT9QchmNj1n{C*6Cbh0c#0w zqjvuL!TLX!FUR$k@4deR@h2_QTN@xq4Z{BtlSw|O5Xj3f{@KnAT?OXxW$cO@S>(D|| z$($$6$y&LRoK)dYuC?%&?=Rgiyu`2WJzov}q7CVOoliO-%*$5ScVI6%@M5q12>cn7 zaQEZ3VeCV6Al}dzhTe~O+v*0%hEVh4KWR)MwHM}-|J8(jI*S?{spMd;H;dz&AB zKi>Yn{TRpcQ|3r8udMfb()(Te~WyDBwD3KdC+!$}}z_-@?6EFV4NIF+Gn#BjK zgqOqDZ5_U@@3!u9x7FtkBhi!SK%ZSH{(25Icdo9s1*{w3=LL&9@5gR^_)Go^`v810 zAu7+5&TlX$AAZh!NM0l%oU2;@J%s_yoeFE|Xz2mz1BYu@+jL}hcP$MW-d*$azcAKk+Qvqc>pCohds$@r zjt0D2jn#HE<*ed=B;l*@92#Ghj`y}q#Ta;Zxy&t?PE2C@lwxYWHJDLDGZ}ZOrheSL z)Z`Se%1*m@vsa(@b)Qq!*%R_FCeaVA)%$0FE!H>P`PnuX1%IBDA<$%L~MFsP;iP0$6QyA;_veP1U zbfi!2rG@UW*LU4vukU)oKWbDCV@Zq?K@V=*HU6xF8p1ynTJ8-0j6`xpXrhC7^rwC! z+bIO58h7Dk`?*xC*fb2i#yE(l5Tg_#c3{Wi9%m2$Ow%c5vIzpLfh`*FwhrD8$^k$AN!S2h{!a@mrxqXaW@JEs ze5AZgI!OnQFX@}>sgnrejoXOhwZw7 ziUBH5P`*k6+s^o3dO&htet`A=I+6dPg@E`P8Q}2O*uLa{#S+%Z$k&`G;yLh+^uP3l zlLZcUw{^I?ZBO|2^nFkGPn$fKF-7EGKjAOj^RW>VW0$ZVi1KZzV@SQX)hoB#IuDws za~Z6z2J5bl1^;G0|9_64ak)VU51eAn57wrqPSB=?hs>&_yU+uhs0YIs8Sx*{f|r)H zFM8IqERYUhU-C>%@>|Wx0pYJExi12q&O4lKrQ3AG4YK=J_I_qCMiX9$TZd-B^SMx`qB9K@VSd$I2uS#lxK#Y|qD-Il#X|iv%pOH*V5E(2vD?7F){1ppu_>aTi73NE@ zduQg5%Y~lxO!lDeCBwYXl%@xZ=L*gHCK zYfNaq@c*2A!L(olZmfIQG_5{iTJ9uPs~8=%2s6^ku+g!Jl7qT82Ky*5y_lGA1wH^d z7wJ`&1`_a@B@3Otb+}2#PZ*bP`CoJ}byAUOTz|;w0R6^~cShO@`HK(N^s)z1d46rXIyU@y0`GyA8dq**el|HL)l2U+ z4K=&%_}iupI|akKE5WY6e#>?D`SDl1C>fxt8QD^M+-zO{xY=BP(&i-Q&(u6S{Fb;P z@@AHq%oODVF=vbSpnCOL)R^rJ{<5jX`@&!PU|rpQ@{Gut${?rO=aWl6I9pIO&>8;1 zUUcSgorg`8%elOtx$nNV?FIIt0f&DI&lwvt-}XfdVVpZVkFZaKM%ZSeC+DF6{rKxE6%n%h!@PpNBq?SFRkYRx;Rn>RMh#=cT0d!h?H=kHY_YY<^e*+@wRP`P*b0C3yTf0Y#K*AK5crQK z&%c@)SM{~j%)<`!tZr-seu9{NEq;CzgFZ7x@1K z{9g@L7-6m`lLVD3`1+X-nH#*5JfWRtEp?(dH$G@Kt~+YV7cfVJ+DMXVS;V@NiDM*D zS1eIuDmExVMFr%W%MQT)k?s@r(uKlbK7_83&$#xTtUa(1U#g|{nC1PJ`aQ31Y1#dgzT)*w z9LGo_d81!i8u)^B=kP@>4Lo%8DR}=r>ko={+ZujhYL?v(4Y0;p4r`hdx6er-&kk(W z9PVx_yZ6qjUF5ow-{Fak2cQ*=eT*2I&Yat7Y9{ZqG~jFi$$#N5-k1DWzbE`f2f|x< zG@=97_tJpF-EIB&Yn=q)uenjeP?%d=2YW~Rbz)$c3pSyVZ^I$vx8qioo^SYh3cG$-HAP*J2;YzfZ-1eZt=6 z3teWu)?>fH{@Y<1m^UmNK(3wPZ zqiUJf$|a9bpM~P@&gY8UMvlKZe(P-OWU;Q{n*VpQ^-=;0yKJfWZu&lnCO=MFZ_{Vq zrZtumr?WmrNfToy4W_Y%G4;y5`>LuQ`@7oteW5cffOTJ>3-qTN5{H?OvUbf5vvuQf z(|9Mo0X5sI%G&KXhO+^^*lRzGz1}m;|Ne!M%;_M+~IRa?)M&lUCZI_ zw*KpPhrPbLQv8$Ss9})Km}zzub7<<#+?nhCF0q}y;N96V7tO^yr5cNSf8y`Q+u!dAfA_ur zzFptT`&K^8C^oaQn5RG<-|W0Qztxy-XZZEUXVAbvL;w|287p8e>9)2*NDxNM7$u23#5c`|G1AupZ&#|BHK zS-uwy@LtsX?=N;5^N7%wY3NPOed-ziNSg5D*=4_zYwKRzef4$g$3J0u@i#ht-&?G{ zsozmgFdB7m=Ji+JGwav16VHSW>W`R`f(A1ym6-b#;vXM7k311|4dS#v>TF-({Vex<9}1iP^M%zuD68plPVyYvyEAiv#@C z#QVMB|HSwba)j{NoE;tVpCYjHW7(H}2>-tFc~{5DK1@wmSXWh5)vx(_eZ}V6JnrHJ zbMvb&et5XK?tbLJ{bn`wD$|M6q=&HY4gS_<3SlEU=y%*5t@IUtj`!=Z4q7NVoD{dD zUvjj+P2BqXT5rGk;nb%3txvYp?=bb%J4|*mK0qwKax`P*t>)4^R0nUIdHZ}AuQf%*S9_{*mi9n4t#1T-9fExhY%`5u~TcT8wmyX(-RIqOU| zbH&ohb=CM_()1AD3;Tq*wxtA+4VI^R$)8?%%)Vb9^u+&Z@#Ly_TDRBk;QvD@ab;ID z|NdIW=i9os)~3BbEiPzSGb?5FyNU}W!~|u&<^5|O|3&Yn#+9x~3oO1S$LhW<4EyUk zg}F6TG831y!*3rY#m$Fr=P^cyZGbJ%Ef4k}8+ye$tm$A z&8dNfPhneMxDuMULi{hl|4*gH7dNLREJ#id%!{a@{%t+;zpm5$8%Rtn`A^~k(^3)^ z7K=Ai0*m&`=VJd4(8ya}`tafZ7WUsCQUay?R>yEG=g_%y&hD@JkNK^}WXRhYFyK17 z6Z)rT@$~sR;s>YI|6ce9U#UA_K&AV@{@ioGS^M>XAGq(Ug8lD=`k}+aCkP!LK0&x% z@xKKR2%T<#J7MT_0|tan7(BcF+uw&zAG$#J^q~ucPd{LQy};RyGJfB_@@eb3v~nXmKrBOZqb?5Te?^8S9%Q~z}2@4wemzbf+g-?`d;+d&kwfOjtKOK34J<`kB$lw24-FaExt-~4?)zxw-re*ap(%KLzw$dA+B z?~ylWy?x|S!~-Ev{r!jsLf%C@0P-;6hAY3`kGNsOUscBqSb2Q9qi^N)*^a)I=bjs~ z^4@bp*Xewo8>m#@b3xnfxS+k9=MC7?d!9I?ufi9&E_i(S0+qqOJ7MT_;S+{V7giCW f!^3yz4iD)7`>???+AD^C&S!cB!LPzU2z~wk Date: Tue, 23 May 2023 23:08:44 +0900 Subject: [PATCH 48/90] =?UTF-8?q?=E6=AD=BB=E6=B4=BB=E7=AE=A1=E7=90=86url?= =?UTF-8?q?=E3=81=8C=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=82=89=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index b98899b..53626c7 100644 --- a/index.js +++ b/index.js @@ -31,15 +31,18 @@ globalThis.tlivechat = {}; const enka = new EnkaClient({ showFetchCacheLog: true }); //死活監視 -setInterval(() => { - axios.get(process.env.URL) - .then(response => { - console.log(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); - }) - .catch(error => { - console.log(chalk.red(`[GETリクエスト] ${error.config.url} - ${error.message}`)) - }); -}, 10 * 1000); +if (process.env.URL) { + Log.info("死活監視を開始します。"); + setInterval(() => { + axios.get(process.env.URL) + .then(response => { + console.log(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); + }) + .catch(error => { + console.log(chalk.red(`[GETリクエスト] ${error.config.url} - ${error.message}`)) + }); + }, 10 * 1000); +} process.on("uncaughtException", (error) => { Log.error(error) From 559e7feef9790a876f13bf948ee99c5cfd8a48c2 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Tue, 23 May 2023 23:08:55 +0900 Subject: [PATCH 49/90] =?UTF-8?q?README=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 91df85e..99eebad 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # 次世代型黒猫ちゃんBOT -# Why? Update? +## Why? Update? 最近DiscordのBOT界隈が賑やかになり、色々なBOTが世の中に出続けている。 これを機に黒猫ちゃんBOTも進化せず何をするというのか。(迫真) @@ -8,8 +8,6 @@ BOTはあらゆる点に置いて大変な作業が多いのである!(ha 今こそ新たな黒猫ちゃんBOTを作ってKuronekoServerの代表BOTを作ろうでは無いか!! - - 起動法 1.mariadbを構築 @@ -28,29 +26,32 @@ BOTはあらゆる点に置いて大変な作業が多いのである!(ha `sudo apt install libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgbm1 libasound2 libpangocairo-1.0-0 libxss1 libgtk-3-0` おしまい<=足りないところあったら付け足しといて(複雑になってきた) -補足 - -npm run speechlistで音声の最新情報を保存する - - -.... - - - - -............. +## コマンドを追加するときの注意点 +コマンド名が"none"だとhelpコマンドに表示されません。 +できるだけほかのコマンドと同じ書き方にしてください。 +・CustomEmbedを用いてください。 (CustomEmbed.typeError や .typeSuccessなどを活用してください) +・むやみにeventにコマンド専用のコードを追加する +> ボタン押下時などはawaitMessageComponentなどを活用してください。 +など +、以上 +## 補足 +npm run speechlistで音声の最新情報を保存する -...................... +## あとがき +..... +.......... +............... +.................... って言うのは前置きで黒猫ちゃんの > 新しいのはDBがあってその関係で動かせないからDBを使わないbotを作った方がいい気がした() > あと黒猫ちゃんbotをやめて沢城さんみたいな個性のあるbotを作りたいと思っている -っという発言である!(殴 +という発言である!(殴 \ No newline at end of file From 3e6c741a535150e0bfa76d05fecb11d52c63c168 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Tue, 23 May 2023 23:09:35 +0900 Subject: [PATCH 50/90] =?UTF-8?q?EmbedPages=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/EmbedUtil.js | 95 ++++++++++++++++++++++++++++++++++++++++++++++- libs/index.js | 3 +- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/libs/EmbedUtil.js b/libs/EmbedUtil.js index 957a877..5aaf721 100644 --- a/libs/EmbedUtil.js +++ b/libs/EmbedUtil.js @@ -1,4 +1,4 @@ -const { Colors, EmbedBuilder } = require("discord.js"); +const { Colors, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); const footerCR = "© 2023 KURONEKOSERVER"; @@ -61,8 +61,99 @@ const ColorsChoice = [ { name: "青紫色", value: "Blurple" } ]; +const nextButton = new ButtonBuilder() + .setCustomId("page_next") + .setLabel("次のページ") + .setStyle(ButtonStyle.Primary); + +const backButton = new ButtonBuilder() + .setCustomId("page_back") + .setLabel("前のページ") + .setStyle(ButtonStyle.Primary); + +const firstComponent = new ActionRowBuilder() + .addComponents(nextButton); + +const middleComponent = new ActionRowBuilder() + .addComponents(backButton, nextButton); + +const lastComponent = new ActionRowBuilder() + .addComponents(backButton); + +class EmbedPages { + constructor(name) { + this.name = name; + this.date = new Date(); + this.pages = []; + } + + setTimestamp(timestamp = Date.now()) { + this.date = timestamp; + return this; + } + + setColor(color) { + this.color = color; + return this; + } + + addPage(callback) { + const embed = new CustomEmbed(this.name) + .setTimestamp(this.date); + callback(embed); + this.pages.push(embed); + return this; + } + + run(interaction) { + const pages = this.pages; + pages.forEach((embed, i) => { + embed + .setAuthor({ name: `${i + 1}ページ / ${pages.length}ページ` }) + .setColor(this.color) + .setTimestamp(this.date); + }); + let page = 0; + const maxPage = pages.length - 1; + interaction.reply({ embeds: [pages[page]], components: [firstComponent], fetchReply: true }) + .then(async function collecter(message) { + message.awaitMessageComponent({ time: 3 * 60 * 1000 }) + .then(async (i) => { + switch (i.customId) { + case "page_next": + page++; + break; + case "page_back": + page--; + break; + } + const embed = pages[page]; + let component; + switch (page) { + case 0: + component = firstComponent; + break; + case maxPage: + component = lastComponent; + break; + default: + component = middleComponent; + break; + } + i.update({ embeds: [embed], components: [component], fetchReply: true }).then(collecter); + }) + .catch((error) => { + console.error(error) + message.edit({ components: [] }); + }) + }); + return this; + } +} + module.exports = { CustomEmbed, getEmbedName, - ColorsChoice + ColorsChoice, + EmbedPages }; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index f8af4d5..e9d797c 100644 --- a/libs/index.js +++ b/libs/index.js @@ -5,7 +5,7 @@ const SlashCommandHandler = require("./SlashCommandHandler"); const Utils = require("./Utils"); const Permissions = require("./Permissions"); const EmbedUtil = require("./EmbedUtil"); -const { CustomEmbed, getEmbedName, ColorsChoice } = EmbedUtil; +const { CustomEmbed, getEmbedName, ColorsChoice, EmbedPages } = EmbedUtil; const ts2time = require("./ts2time"); const SQL = require("./SQL"); @@ -20,6 +20,7 @@ module.exports = { CustomEmbed, getEmbedName, ColorsChoice, + EmbedPages, ts2time, SQL } \ No newline at end of file From cc70efe45c8258757f4d89e5a250e952b0b1fab3 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Tue, 23 May 2023 23:10:14 +0900 Subject: [PATCH 51/90] =?UTF-8?q?Help=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=81=A7=E3=83=93=E3=83=AB=E3=83=89=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/bot/help.js | 87 ++++++++++++++++++++++++++++++ libs/SlashCommandHandler.js | 13 +++++ oldCommands/misc/help.js | 104 ------------------------------------ 3 files changed, 100 insertions(+), 104 deletions(-) create mode 100644 commands/bot/help.js delete mode 100644 oldCommands/misc/help.js diff --git a/commands/bot/help.js b/commands/bot/help.js new file mode 100644 index 0000000..89cf2b5 --- /dev/null +++ b/commands/bot/help.js @@ -0,0 +1,87 @@ +const { Colors } = require("discord.js"); +const { EmbedPages } = require("../../libs"); + +const pagePerCommand = 10; + +module.exports = { + builder: (builder) => builder + .setName("help") + .setDescription("ヘルプの表示") + .addStringOption(option => option + .setName("commandname") + .setDescription("指定されたコマンドの詳細を表示します。") + /* SlashCommandHandlerに実装している + .setChoices(...{ name: command.data.name, value: `/${command.data.name}`}) + */ + ) + , + async autocomplete(interaction) { + const focusedValue = interaction.options.getFocused(); + await interaction.respond(all_voice_list.filter(data => data.name.startsWith(focusedValue))).catch(() => { }); + }, + execute(interaction) { + const { commands } = interaction.client; + const commandName = interaction.options.getString("commandname"); + if (!commandName) { + const categoryCommands = {}; + commands.forEach((command) => { + if (!categoryCommands[command.category]) { + categoryCommands[command.category] = []; + } + const commandList = [`\`/${command.data.name}\` - ${command.data.description}`]; + if ("subcommands" in command) { + command.subcommands.forEach((subcommand) => { + commandList.push(`> \`/${command.data.name} ${subcommand.data.name}\` - ${subcommand.data.description}`); + }); + } + categoryCommands[command.category].push(commandList); + }); + const pagesField = []; + let currentPage = { fields: [], length: 0 }; + Object.entries(categoryCommands).forEach(([category, categoryCommands]) => { + let leftItemCount = pagePerCommand - currentPage.length; + let categoryValue = []; + + function nextPage() { + currentPage.fields.push({ name: category, values: categoryValue }); + pagesField.push(currentPage.fields); + currentPage = { fields: [], length: 0 }; + leftItemCount = pagePerCommand; + categoryValue = []; + } + + categoryCommands.forEach((commands) => { + if (commands.length <= leftItemCount) { + categoryValue.push(...commands); + currentPage.length += commands.length; + leftItemCount -= commands.length; + if (leftItemCount === 0) nextPage(); + } else { + if (leftItemCount === 1) nextPage(); + for (let i = 0; i < commands.length; i++) { + categoryValue.push(commands[i]); + currentPage.length++; + leftItemCount--; + if (leftItemCount === 0) { + categoryValue.push("> ... (次のページへ)"); + nextPage(); + } + } + } + }); + + currentPage.fields.push({ name: category, values: categoryValue }); + }); + if (currentPage.length !== 0) pagesField.push(currentPage.fields); + const embedPages = new EmbedPages("help").setColor(Colors.Gold); + pagesField.forEach((page) => { + embedPages.addPage((embed) => { + embed.addFields(page.map((field) => ({ name: field.name, value: field.values.join("\n") }))); + }); + }); + embedPages.run(interaction); + } else { + + } + } +} \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index 4fff918..cf8198b 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -18,6 +18,7 @@ function SlashCommandHandler(commandsPath) { const command = require(commandPath); const commandBuilder = command.builder(new SlashCommandBuilder()); const name = commandBuilder.name; + command.category = categoryDir; command.logger = categoryLog.createChild(name); if ("subcommands" in command) { Log.debug(`Loading subcommands for ${categoryDir} ${file}...`); @@ -47,6 +48,18 @@ function SlashCommandHandler(commandsPath) { } Log.debug(`Loaded category ${categoryDir} ${commandFiles.length} commands`); }); + + // helpコマンドの選択肢を指定 + const helpCommand = commands.get("help"); + helpCommand.logger.debug(`Loading Choices...`); + helpCommand.data.options[0].choices = commands.map((command) => { + return { + name: command.data.name, + value: `/${command.data.name}` + } + }); + helpCommand.logger.debug(`Loaded Choices`); + Log.info(`Loaded ${commands.size} commands`); Log.info("Deploying..."); const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); diff --git a/oldCommands/misc/help.js b/oldCommands/misc/help.js deleted file mode 100644 index 24659b8..0000000 --- a/oldCommands/misc/help.js +++ /dev/null @@ -1,104 +0,0 @@ -const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); -const { PagesManager } = require('discord.js-pages'); -const pagesManager = new PagesManager(); -module.exports = { - data: new SlashCommandBuilder() - .setName("help") - .setDMPermission(false) - .setDescription("ヘルプの表示"), - async execute(interaction) { - pagesManager.middleware(interaction); - await interaction.pagesBuilder() - .setPages([ - new EmbedBuilder() - .setTitle("読み上げ(全員)") - .addFields( - { name:'\`speak join\`', value: `ボイスチャンネルに参加します。`, inline: true }, - { name:'\`speak skip\`', value: `読み上げをスキップします。(読み上げてる最中の物のみになります)`, inline: true }, - { name:'\`speak disconnect\`', value: `ボイスチャンネルから退出します。`, inline: true }, - { name:'\`speak user_voice\`', value: `話者を変更します。`, inline: true }, - { name:'\`speak user_voice-setting\`', value: `ユーザーの各種voice設定をします。`, inline: true }, - { name:'\`speak dictionary_add\`', value: `辞書を追加します。`, inline: true }, - { name:'\`speak dictionary_remove\`', value: `辞書を削除します。`, inline: true }, - { name:'\`speak dictionary_export\`', value: `辞書の内容をエクスポートします。`, inline: true }, - { name:'\`speak dictionary_import\`', value: `辞書をインポートします。`, inline: true }, - { name:'\`speak server_user-dictionary-list\`', value: `辞書の一覧又は読み上げないユーザーを表示します。`, inline: true }, - { name:'\`speak user_reset\`', value: `ユーザー設定初期化`, inline: true }, - { name:'\`speak setting_show\`', value: `読み上げ関連設定の表示`, inline: true }, - { name:'\`speak live_read\`', value: `ライブの読み上げ。`, inline: true }, - { name:'\`speak live_read-stop\`', value: `ライブの読み上げを停止します。`, inline: true } - ), - new EmbedBuilder() - .setTitle("読み上げ(管理者)") - .addFields( - { name:'\`speak server_read-user\`', value: `読み上げを行うユーザーの設定をします(BOTも設定可能です)`, inline: true }, - { name:'\`speak server_read-bot\`', value: `BOTの読み上げを許可するか決めます`, inline: true }, - { name:'\`speak server_voice\`', value: `サーバー話者を変更します`, inline: true }, - { name:'\`speak server_voice-setting\`', value: `サーバー各種voice設定をします`, inline: true }, - { name:'\`speak server_force-guild\`', value: `サーバー設定を強制するかどうか`, inline: true }, - { name:'\`speak server_read\`', value: `入退室時にユーザーを読み上げるか`, inline: true }, - { name:'\`speak server_auto-join\`', value: `自動で読み上げチャンネルに入室する`, inline: true }, - { name:'\`speak server_auto-join-delete\`', value: `自動で読み上げチャンネルに入室しない`, inline: true }, - { name:'\`speak server_exvoice\`', value: `exvoiceの操作`, inline: true }, - { name:'\`speak server_reset\`', value: `サーバー設定初期化`, inline: true }, - { name:'\`speak server_exvoice-word\`', value: `読み上げないexvoiceの追加`, inline: true }, - { name:'\`speak server_vc-only-tts\`', value: `ボイスチャンネル外のユーザー設定`, inline: true }, - { name:'\`speak dictionary_username\`', value: `ユーザー名に辞書を適応するか`, inline: true }, - { name:'\`speak read_through\`', value: `Discordのメッセージを読み上げるかどうか`, inline: true } - ), - new EmbedBuilder() - .setTitle("その他のコマンド1(全員)") - .addFields( - { name:'\`bot status\`', value: `BOTのステータスを表示します`, inline: true }, - { name:'\`bot report\`', value: `バグや要望を運営に送信します`, inline: true }, - { name:'\`jobpanel create\`', value: `新しい役職パネルを作成し、そのパネルを選択します`, inline: true }, - { name:'\`jobpanel copy\`', value: `選択しているパネルをコピーします`, inline: true }, - { name:'\`jobpanel delete\`', value: `選択したパネルを削除します`, inline: true }, - { name:'\`jobpanel add\`', value: `パネルに役職を追加します`, inline: true }, - { name:'\`jobpanel edit\`', value: `選択したパネルのタイトルやカラーを変更します`, inline: true }, - { name:'\`jobpanel remove\`', value: `パネルから役職を削除します`, inline: true }, - { name:'\`jobpanel selected\`', value: `現在選択しているパネルのリンクを返します`, inline: true }, - { name:'\`jobpanel refresh\`', value: `選択したパネルのリアクションをつけ直します`, inline: true }, - { name:'\`jobpanel autoremove\`', value: `選択しているパネルに含まれる削除されたロールを取り除きます`, inline: true }, - { name:'\`log create\`', value: `logチャンネルを指定します`, inline: true }, - { name:'\`log delete\`', value: `logチャンネルを削除します`, inline: true }, - { name:'\`ticket create\`', value: `チケットを作成します`, inline: true }, - { name:'\`ticket delete\`', value: `チケットログチャンネルを削除します`, inline: true }, - ), - new EmbedBuilder() - .setTitle("その他のコマンド2(全員)") - .addFields( - { name:'\`minecraft server-java\`', value: `Java版Minecraftサーバー情報`, inline: true }, - { name:'\`minecraft server-bedrock\`', value: `統合版Minecraftサーバー情報`, inline: true }, - { name:'\`minecraft user\`', value: `Minecraftユーザー情報`, inline: true }, - { name:'\`miscellaneous reserve\`', value: `指定した時間後にメッセージを送信します`, inline: true }, - { name:'\`miscellaneous screenshot\`', value: `Webサイトをスクリーンショットします`, inline: true }, - { name:'\`miscellaneous server-info\`', value: `サーバー情報を取得します`, inline: true }, - { name:'\`miscellaneous user-info\`', value: `ユーザー情報を表示します`, inline: true }, - { name:'\`miscellaneous wikipedia\`', value: `Wikipediaで何かを調べます`, inline: true }, - { name:'\`miscellaneous role\`', value: `ロールの情報を表示`, inline: true }, - { name:'\`miscellaneous channel\`', value: `チャンネルの情報を表示`, inline: true }, - { name:'\`miscellaneous translate\`', value: `コンテンツの言語を翻訳`, inline: true }, - { name:'\`poll create\`', value: `アンケートを作成します`, inline: true }, - { name:'\`poll excreate\`', value: `一人一つの投票にします`, inline: true }, - { name:'\`poll sum\`', value: `集計します`, inline: true }, - { name:'\`genshin build\`', value: `原神のビルドカードを作成します`, inline: true }, - ), - new EmbedBuilder() - .setTitle("サーバー管理コマンド(管理者)") - .addFields( - { name:'\`server-manage ban\`', value: `ユーザーをBANします`, inline: true }, - { name:'\`server-manage kick\`', value: `ユーザーをkickします`, inline: true }, - { name:'\`server-manage unban\`', value: `ユーザーのBANを解除します`, inline: true }, - { name:'\`server-manage clear\`', value: `指定の数のメッセージを削除します`, inline: true }, - { name:'\`server-manage mute\`', value: `指定したユーザーをミュートにします`, inline: true }, - { name:'\`server-manage unmute\`', value: `指定したユーザーのミュートを解除`, inline: true }, - { name:'\`server-manage show\`', value: `サーバーのデータ保存情報を表示します`, inline: true }, - ), - ]) - .setColor('Green') - .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | help" }) - .setPaginationFormat() - .build(); - } -} \ No newline at end of file From 646d164e4208ab8f0ba6ff4d29d02b064b259f3c Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Tue, 23 May 2023 23:10:44 +0900 Subject: [PATCH 52/90] =?UTF-8?q?env=E3=81=8B=E3=82=89=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E3=81=A8=E3=81=A3=E3=81=A6=E3=81=8F?= =?UTF-8?q?=E3=82=8B=E3=82=93=E3=81=98=E3=82=83=E3=81=AA=E3=81=8F=E3=81=A6?= =?UTF-8?q?package.json=E3=81=8B=E3=82=89=E3=81=A8=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=81=8F=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oldCommands/misc/bot/status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oldCommands/misc/bot/status.js b/oldCommands/misc/bot/status.js index 84c34d5..671fcaa 100644 --- a/oldCommands/misc/bot/status.js +++ b/oldCommands/misc/bot/status.js @@ -26,7 +26,7 @@ module.exports = async (interaction) => { { name: '視聴Youtube数', value: `\`${Object.keys(globalThis.ylivechat).length}\`チャンネル`, inline: true }, { name: 'BOT応答時間', value: `\`${msg.createdTimestamp - interaction.createdTimestamp}\`ms`, inline: true }, { name: 'API応答時間', value: `\`${interaction.client.ws.ping}\`ms`, inline: true }, - { name: 'バージョン', value: `\`${process.env.version}\``, inline: true }, + { name: 'バージョン', value: `\`${process.version}\``, inline: true }, ) .setTimestamp(new Date()) .setFooter({ iconURL: "https://media.discordapp.net/attachments/1081437402389811301/1082168221320364062/kuroneko.png", text: "© 2023 KURONEKOSERVER | status" }); From 1b49a0a9c7b3e84ed077b19fd9fefdd41e9391a0 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Tue, 23 May 2023 23:11:17 +0900 Subject: [PATCH 53/90] =?UTF-8?q?=E3=81=A8=E3=82=8A=E3=81=82=E3=81=88?= =?UTF-8?q?=E3=81=9A=E3=81=BE=E3=81=A0=E5=A4=89=E3=81=88=E3=81=A6=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=81=91=E3=81=A9example=E3=82=92=E7=BD=AE=E3=81=84?= =?UTF-8?q?=E3=81=A6=E3=81=8A=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.example.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 config.example.js diff --git a/config.example.js b/config.example.js new file mode 100644 index 0000000..1c3c66b --- /dev/null +++ b/config.example.js @@ -0,0 +1,28 @@ +module.exports = { + token: "", // Discord Bot Token + proxy: "localhost:8080", // ScreenShotコマンドに使用 + //推奨: Cloudflare WARP > ギアアイコン > 環境設定 > 詳細 > プロキシ モードを構成 + url: "", // 死活監視先url + db: { + host: "localhost", // DBホスト + user: "root", // DBユーザー + password: "root", // DBパスワード + port: 3306, // DBポート + limit: 5, // DB接続を試みる時間 + name: "newer-kuronekochanbot" // DB名(SQLにログインしてcreate database hogeで作成) + }, + spaek: { + voicevox: "http://127.0.0.1:50021", // VoiceVoxのURL + COEIROINK: "http://127.0.0.1:50031", // COEIRO INKのURL + SHAREVOX: "http://127.0.0.1:50025", // SHAREVOXのURL + exvoice: "./exvoice", // exvoiceのパス + max_message: 50, // 最大メッセージ数(以下省略まで) + timeout: 30, // 合成する際のタイムアウトの時間(秒) + maxFreeSockets: 100, // ソケットエラー出たら増やす(増えるほどリソース食います) + maxTotalSockets: 200, // ソケットエラー出たら増やす(増えるほどリソース食います) + }, + webhook: { + error: "", + report: "" + } +}; \ No newline at end of file From fb9eae53772ad0c160d9d9305e921b86e364064d Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 24 May 2023 12:18:40 +0900 Subject: [PATCH 54/90] =?UTF-8?q?collecter=E3=81=8C=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E3=81=AA=E3=81=AE=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=82=92=E5=87=BA=E5=8A=9B=E3=81=99=E3=82=8B=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E7=9B=B4=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/EmbedUtil.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/EmbedUtil.js b/libs/EmbedUtil.js index 5aaf721..7e1f54b 100644 --- a/libs/EmbedUtil.js +++ b/libs/EmbedUtil.js @@ -1,4 +1,7 @@ const { Colors, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const logger = require("./GetLogger"); +const Log = logger.createChannel("EmbedUtil"); +const pagesLog = Log.createChild("pages"); const footerCR = "© 2023 KURONEKOSERVER"; @@ -143,8 +146,11 @@ class EmbedPages { i.update({ embeds: [embed], components: [component], fetchReply: true }).then(collecter); }) .catch((error) => { - console.error(error) - message.edit({ components: [] }); + if (error.name === "Error [InteractionCollectorError]") { + message.edit({ components: [] }); + } else { + pagesLog.error(error); + } }) }); return this; From 79b8a543aa6782efb93c3b545f67ef4316454557 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 24 May 2023 22:34:43 +0900 Subject: [PATCH 55/90] =?UTF-8?q?process.env=E3=82=92=E3=81=A0=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=AA=E3=81=8F=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commands/speak/admin/setvoice.js | 6 +++--- config.example.js | 13 ++++++++----- events/bot/report.js | 3 ++- events/commands/ticket.js | 2 +- helpers/dbsetup.js | 12 ++++++------ helpers/sendwebhook.js | 5 +++-- helpers/speechlist.js | 26 +++++++++++++------------- libs/GetLogger.js | 5 ++--- libs/Utils.js | 12 +++++++----- oldEvents/misc/job_reaction_add.js | 2 +- oldEvents/misc/job_reaction_remove.js | 2 +- oldEvents/misc/voiceautoremove.js | 2 +- 12 files changed, 48 insertions(+), 42 deletions(-) diff --git a/commands/speak/admin/setvoice.js b/commands/speak/admin/setvoice.js index b56002e..5058593 100644 --- a/commands/speak/admin/setvoice.js +++ b/commands/speak/admin/setvoice.js @@ -42,7 +42,7 @@ module.exports = { if (selectedCount > 1) embed.typeError().setDescription("話者は一つしか選択できません。"); if (embed.data.title) return interaction.reply({ embeds: [embed], ephemeral: true }); - const serviceName = voicevox ? "voicevox" : coeiroink ? "COEIROINK" : "SHAREVOX"; + const serviceName = voicevox ? "voicevox" : coeiroink ? "coeiroink" : "sharevox"; const speakname = voicevox || coeiroink || sharevox; embed.typeSuccess().setDescription(`話者を変更しました。\n${speakname}のスタイルを選択してください。\n※3分後に自動キャンセルされます。`); const component = new ActionRowBuilder() @@ -50,7 +50,7 @@ module.exports = { new StringSelectMenuBuilder() .setCustomId("setvoice") .setPlaceholder("選択されていません") - .addOptions(...allList[serviceName.toLowerCase()] + .addOptions(...allList[serviceName] .filter(name => name.name === speakname)[0] .styles.map(option => ({ label: option.name, @@ -62,7 +62,7 @@ module.exports = { message.awaitMessageComponent({ filter: i => i.user.id === interaction.user.id, time: 3 * 60 * 1000 }) .then(async (i) => { const speakid = i.values[0]; - const speakhost = process.env[serviceName]; + const speakhost = interaction.client.config.speak[serviceName]; const getdata = await Utils.sql(`select * from server_speak where guildid="${interaction.guild.id}";`); let sqlStatus; if (getdata[0][0]?.guildid) { diff --git a/config.example.js b/config.example.js index 1c3c66b..5cb3305 100644 --- a/config.example.js +++ b/config.example.js @@ -1,3 +1,5 @@ +const path = require("path"); + module.exports = { token: "", // Discord Bot Token proxy: "localhost:8080", // ScreenShotコマンドに使用 @@ -11,15 +13,16 @@ module.exports = { limit: 5, // DB接続を試みる時間 name: "newer-kuronekochanbot" // DB名(SQLにログインしてcreate database hogeで作成) }, - spaek: { + speak: { voicevox: "http://127.0.0.1:50021", // VoiceVoxのURL - COEIROINK: "http://127.0.0.1:50031", // COEIRO INKのURL - SHAREVOX: "http://127.0.0.1:50025", // SHAREVOXのURL - exvoice: "./exvoice", // exvoiceのパス - max_message: 50, // 最大メッセージ数(以下省略まで) + coeiroink: "http://127.0.0.1:50031", // COEIROINKのURL + sharevox: "http://127.0.0.1:50025", // SHAREVOXのURL + exvoice: path.resolve(__dirname, "./exvoice"), // exvoiceのパス + maxMessage: 50, // 最大メッセージ数(以下省略まで) timeout: 30, // 合成する際のタイムアウトの時間(秒) maxFreeSockets: 100, // ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets: 200, // ソケットエラー出たら増やす(増えるほどリソース食います) + maxSockets: 100//ソケットエラー出たら増やす(増えるほどリソース食います) }, webhook: { error: "", diff --git a/events/bot/report.js b/events/bot/report.js index c3399bc..a18b919 100644 --- a/events/bot/report.js +++ b/events/bot/report.js @@ -1,7 +1,8 @@ const { WebhookClient, Colors, Events } = require("discord.js"); const { CustomEmbed } = require("../../libs"); +const config = require("../../config"); -const webhook = new WebhookClient({ url: process.env.reportwebhookurl }); +const webhook = new WebhookClient({ url: config.webhook.report }); module.exports = { name: Events.InteractionCreate, diff --git a/events/commands/ticket.js b/events/commands/ticket.js index ce56d3e..2afe7e8 100644 --- a/events/commands/ticket.js +++ b/events/commands/ticket.js @@ -16,7 +16,7 @@ module.exports = { deny: [PermissionsBitField.Flags.ViewChannel] }, { - id: process.env.clientId, + id: interaction.client.user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] }, { diff --git a/helpers/dbsetup.js b/helpers/dbsetup.js index 53f0458..ca9ddf8 100644 --- a/helpers/dbsetup.js +++ b/helpers/dbsetup.js @@ -1,13 +1,13 @@ -require('dotenv').config(); +const config = require("../config"); const mysql = require('mysql2/promise'); (async () => { const conn = await mysql.createConnection({ - host: process.env.db_host, - user: process.env.db_user, - password: process.env.db_password, - database: process.env.db_name, - port: process.env.db_port, + host: config.db.host, + user: config.db.user, + password: config.db.password, + database: config.db.name, + port: config.db.port, }); /** * サーバーIDとチャンネルIDを含むテーブルを自動生成する。 diff --git a/helpers/sendwebhook.js b/helpers/sendwebhook.js index 544cb6c..0e8b0fc 100644 --- a/helpers/sendwebhook.js +++ b/helpers/sendwebhook.js @@ -1,5 +1,6 @@ -const { WebhookClient } = require('discord.js'); -const webhookClient = new WebhookClient({ url: process.env.errorwebhook }); +const { WebhookClient } = require("discord.js"); +const config = require("../config"); +const webhookClient = new WebhookClient({ url: config.webhook.error }); module.exports = { async send(error) { diff --git a/helpers/speechlist.js b/helpers/speechlist.js index 30a1d21..ceff45d 100644 --- a/helpers/speechlist.js +++ b/helpers/speechlist.js @@ -1,29 +1,29 @@ //voicevox:http://127.0.0.1:50021/docs#/ //COEIROINK:http://127.0.0.1:50031/docs#/ //SHAREVOX:http://127.0.0.1:50025/docs#/ -const fs = require("node:fs"); +const fs = require("fs"); +const config = require("../config"); const { getJson } = require("./HttpUtils"); -require('dotenv').config(); (async () => { let speechlist = []; let list; - const voicevox = await getJson(`${process.env.voicevox}/speakers`); - const COEIROINK = await getJson(`${process.env.COEIROINK}/speakers`); - const SHAREVOX = await getJson(`${process.env.SHAREVOX}/speakers`); + const voicevox = await getJson(`${config.speak.voicevox}/speakers`); + const coeiroink = await getJson(`${config.speak.coeiroink}/speakers`); + const sharevox = await getJson(`${config.speak.sharevox}/speakers`); if (!voicevox.data) return console.log("voicevoxが起動していません"); - if (!COEIROINK.data) return console.log("COEIROINKが起動していません"); - if (!SHAREVOX.data) return console.log("SHAREVOXが起動していません"); + if (!coeiroink.data) return console.log("COEIROINKが起動していません"); + if (!sharevox.data) return console.log("SHAREVOXが起動していません"); list = speechlist .concat(voicevox.data.map(list => ({ name: list.name, value: String(list.styles[0].id) }))) - .concat(COEIROINK.data.map(list => ({ name: list.name, value: String(list.styles[0].id) }))) - .concat(SHAREVOX.data.map(list => ({ name: list.name, value: String(list.styles[0].id) }))); + .concat(coeiroink.data.map(list => ({ name: list.name, value: String(list.styles[0].id) }))) + .concat(sharevox.data.map(list => ({ name: list.name, value: String(list.styles[0].id) }))); fs.writeFileSync('./helpers/voicelist/allvoicelist.json', JSON.stringify(list)); fs.writeFileSync('./helpers/voicelist/voicevoxlist.json', JSON.stringify(voicevox.data.map(list => ({ name: list.name, value: list.name })))); - fs.writeFileSync('./helpers/voicelist/coeiroinklist.json', JSON.stringify(COEIROINK.data.map(list => ({ name: list.name, value: list.name })))); - fs.writeFileSync('./helpers/voicelist/sharevoxlist.json', JSON.stringify(SHAREVOX.data.map(list => ({ name: list.name, value: list.name })))); + fs.writeFileSync('./helpers/voicelist/coeiroinklist.json', JSON.stringify(coeiroink.data.map(list => ({ name: list.name, value: list.name })))); + fs.writeFileSync('./helpers/voicelist/sharevoxlist.json', JSON.stringify(sharevox.data.map(list => ({ name: list.name, value: list.name })))); fs.writeFileSync('./helpers/voicelist/allvoicevoxlist.json', JSON.stringify(voicevox.data)); - fs.writeFileSync('./helpers/voicelist/allcoeiroinklist.json', JSON.stringify(COEIROINK.data)); - fs.writeFileSync('./helpers/voicelist/allsharevoxlist.json', JSON.stringify(SHAREVOX.data)); + fs.writeFileSync('./helpers/voicelist/allcoeiroinklist.json', JSON.stringify(coeiroink.data)); + fs.writeFileSync('./helpers/voicelist/allsharevoxlist.json', JSON.stringify(sharevox.data)); console.log("正常更新") process.exit(1); })(); \ No newline at end of file diff --git a/libs/GetLogger.js b/libs/GetLogger.js index d68dd1b..ed27590 100644 --- a/libs/GetLogger.js +++ b/libs/GetLogger.js @@ -1,9 +1,8 @@ const { WebhookClient } = require("discord.js"); const chalk = require("chalk"); const Logger = require("./Logger"); -require("dotenv").config(); - -const errorWebhook = new WebhookClient({ url: process.env.errorwebhook }); +const config = require("../config"); +const errorWebhook = new WebhookClient({ url: config.webhook.error }); const logQueue = ["接続しました。"]; setInterval(() => { if (logQueue.length === 0) return; diff --git a/libs/Utils.js b/libs/Utils.js index b40a64a..793e719 100644 --- a/libs/Utils.js +++ b/libs/Utils.js @@ -13,6 +13,8 @@ const mysql = require("mysql2/promise"); const { COLORS } = require("../data.json"); const permissions = require("./Permissions"); +const config = require("../config"); + const logger = require("./GetLogger"); const Log = logger.createChannel("utils"); const ftpLog = Log.createChild("ftp"); @@ -174,11 +176,11 @@ class Utils { static async sql(command) { try { const connection = await mysql.createConnection({ - host: process.env.db_host, - user: process.env.db_user, - password: process.env.db_password, - database: process.env.db_name, - port: process.env.db_port, + host: config.db.host, + user: config.db.user, + password: config.db.password, + database: config.db.name, + port: config.db.port, }); const result = await connection.query(command); await connection.end(); diff --git a/oldEvents/misc/job_reaction_add.js b/oldEvents/misc/job_reaction_add.js index 1b19bc8..e44ee7b 100644 --- a/oldEvents/misc/job_reaction_add.js +++ b/oldEvents/misc/job_reaction_add.js @@ -12,7 +12,7 @@ module.exports = { const react_message = await react_channel.messages.fetch(getdata[0][0]?.messageid); const reaction = react_message.reactions.cache.get(react._emoji.name); if (!reaction.me) return await react.remove(); - if (react_message.author.id !== process.env.clientId) return; + if (react_message.author.id !== user.client.user.id) return; const num = Array.from(react_message.reactions.cache.keys()).indexOf(react._emoji.name); const content = react_message.embeds[0]?.data?.description.split("\n")[num]; const role = await react.message.guild.roles.fetch((content.split(/<@&(.+)>/)[1]?.match(/\d+/g)[0]) ? content.split(/<@&(.+)>/)[1]?.match(/\d+/g)[0] : content.split(":")[1]); diff --git a/oldEvents/misc/job_reaction_remove.js b/oldEvents/misc/job_reaction_remove.js index f06d0b4..65e7f20 100644 --- a/oldEvents/misc/job_reaction_remove.js +++ b/oldEvents/misc/job_reaction_remove.js @@ -11,7 +11,7 @@ module.exports = { const react_message = await react_channel.messages.fetch(getdata[0][0]?.messageid); const reaction = react_message.reactions.cache.get(react._emoji.name); if (!reaction.me) return await react.remove(); - if (react_message.author.id !== process.env.clientId) return; + if (react_message.author.id !== user.client.user.id) return; const num = Array.from(react_message.reactions.cache.keys()).indexOf(react._emoji.name); const content = react_message.embeds[0]?.data?.description.split("\n")[num]; const role = await react.message.guild.roles.fetch((content.split(/<@&(.+)>/)[1]?.match(/\d+/g)[0]) ? content.split(/<@&(.+)>/)[1]?.match(/\d+/g)[0] : content.split(":")[1]); diff --git a/oldEvents/misc/voiceautoremove.js b/oldEvents/misc/voiceautoremove.js index f29ba52..894038b 100644 --- a/oldEvents/misc/voiceautoremove.js +++ b/oldEvents/misc/voiceautoremove.js @@ -6,7 +6,7 @@ module.exports = { if (!oldState.channel && !newState.channel) return; const connection = getVoiceConnection(oldState.guild.id); //KICKされた場合 - if (oldState.member.user.id === process.env.clientId && oldState.channelId && !newState.channelId) { + if (oldState.member.user.id === oldState.client.user.id && oldState.channelId && !newState.channelId) { if (connection?.state?.status) connection.destroy(); if (globalThis.voice_channel[oldState.guild.id]) delete globalThis.voice_channel[oldState.guild.id]; if (globalThis.ylivechat[oldState.guild.id]) { From af3769e8df5c845bfb29b298bff9c14c66f16364 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 24 May 2023 22:34:54 +0900 Subject: [PATCH 56/90] =?UTF-8?q?ignore=E3=81=ABconfig.js=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1a5a662..5fd48dc 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,4 @@ dist .tern-port .env -.env +config.js \ No newline at end of file From 26f0eb963f0053c6b8a9b7745dcf886f4159c118 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 24 May 2023 22:35:26 +0900 Subject: [PATCH 57/90] =?UTF-8?q?read=E3=81=AE=E6=9B=B8=E3=81=8D=E7=9B=B4?= =?UTF-8?q?=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/read.js | 267 ++++++++++++++++++++++++++++-------------------- libs/SQL.js | 18 ++-- 2 files changed, 167 insertions(+), 118 deletions(-) diff --git a/helpers/read.js b/helpers/read.js index 6be131e..9332b63 100644 --- a/helpers/read.js +++ b/helpers/read.js @@ -1,44 +1,120 @@ -const http = require('http'); +const http = require("http"); +const fs = require("fs"); +const path = require("path"); +const axios = require("axios"); +const { createAudioPlayer, createAudioResource, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice"); + +const { SQL } = require("../libs"); + const { sql } = require("../libs/Utils"); const { escape } = require("mysql2") -const { createAudioPlayer, createAudioResource, getVoiceConnection, AudioPlayerStatus } = require('@discordjs/voice'); -const fs = require("node:fs"); -const axios = require("axios"); + const exvoice_list = {}; -const timeout = process.env.timeout -fs.readdirSync(`${process.env.exvoice}`).map(data => { - exvoice_list[data] = fs.readdirSync(`${process.env.exvoice}/${data}`).map(name => name.replace(".wav", "")); +const config = require("../config"); + +const { + timeout, + maxMessage, + maxFreeSockets, + maxTotalSockets, + maxSockets +} = config.speak; + +const hosts = { + voicevox: config.speak.voicevox, + coeiroink: config.speak.coeiroink, + sharevox: config.speak.sharevox +}; + +const defaultQuery = { + speaker: 3, + host: hosts.voicevox, + name: "ずんだもん", + speed: 1, + pitch: 0, + intonation: 1 +}; + +fs.readdirSync(config.speak.exvoice).forEach(data => { + exvoice_list[data] = []; + fs.readdirSync(path.resolve(config.speak.exvoice, data)) + .forEach((name) => { + if (name.endsWith(".wav")) exvoice_list[data].push(name); + }); }); -const max_message = process.env.max_message; module.exports = { - async read(message, user, live_content, skip, tmp) { + async read(message, user, liveContent, skip, tmp) { + const guildid = message.guild.id; + + const serverData = await SQL.select("server_speak", { guildid }); + const userData = await SQL.select("user_speak", { userid: message.member.id }); + const dictionaryData = await SQL.select("dictionary", { guildid }); + const globalDictionaryData = await SQL.select("globaldictionary"); + const dictionary = dictionaryData[0]?.map(c => c).concat(globalDictionaryData[0]).map(a => a)[0]; + const get_server_data = await sql(`select * from server_speak where guildid=${escape(message.guild.id)};`); - const getdata = await sql(`select * from user_speak where userid=${escape(message.member.id)};`); - const dictionary = ((await sql(`select * from dictionary where guildid=${escape(message.guild.id)};`))[0]?.map(c => c).concat(((await sql(`select * from globaldictionary;`))[0]).map(a => a)))[0]; - const speaker = (!get_server_data[0][0]?.force_voice) ? get_server_data[0][0]?.speakid || getdata[0][0]?.speakid || 3 : getdata[0][0]?.speakid || get_server_data[0][0]?.speakid || 3; - const host = (get_server_data[0][0]?.force_voice) ? get_server_data[0][0]?.speakhost || getdata[0][0]?.speakhost || process.env.voicevox : getdata[0][0]?.speakphost || get_server_data[0][0]?.speakhost || process.env.voicevox; - const name = (get_server_data[0][0]?.force_voice) ? get_server_data[0][0]?.speakname || getdata[0][0]?.speakname || "ずんだもん" : getdata[0][0]?.speakname || get_server_data[0][0]?.speakname || "ずんだもん"; - const speed = (get_server_data[0][0]?.force_args) ? get_server_data[0][0]?.speed || getdata[0][0]?.speed || 1 : getdata[0][0]?.speed || get_server_data[0][0]?.speed || 1; - const pitch = (get_server_data[0][0]?.force_args) ? get_server_data[0][0]?.pitch || getdata[0][0]?.pitch || 0 : getdata[0][0]?.pitch || get_server_data[0][0]?.pitch || 0; - const intonation = (get_server_data[0][0]?.force_args) ? get_server_data[0][0]?.intonation || getdata[0][0]?.intonation || 1 : getdata[0][0]?.intonation || get_server_data[0][0]?.intonation || 1; - const not_exvoice = (await sql(`select * from exvoiceword where guildid=${escape(message.guild.id)} and speakname=${escape(name)};`))[0].map(data => data.word); - const exvoice = (exvoice_list[name]) ? exvoice_list[name].filter(item => !not_exvoice.includes(item)) : null - const before_msg = (get_server_data[0][0]?.read_username && !get_server_data[0][0]?.dictionary_username) ? `${user}さんのメッセージ ${live_content}` : live_content; - const romajimsg = before_msg.replace(/(https?|ftp):\/\/[\w\/:%#\$\&\?\(\)~\.=\+\-]+/gi, 'リンク省略'); - const code = romajimsg.replace(/```[\s\S]*?```/gi, "コード省略"); - const format_msg = await axios.get(`https://eng-jpn-api.kuroneko6423.com/query?text=${code}`, { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - }).catch((ex) => { }); - const wara = format_msg.data ? format_msg.data : code.replace(/w|w|W|W/g, "わら"); - const msg = tmp ? `添付ファイル ${wara}`: wara; - const check = exvoice?.find(str => msg.includes(str)); - if (exvoice && check && !get_server_data[0][0]?.exvoice) { - const matchStr = exvoice?.find(str => msg.includes(str)); // 配列内に一致する要素を検索する - const result = msg.substring(msg.indexOf(matchStr), msg.indexOf(matchStr) + matchStr.length); - const array = msg.split(result)//result を基準に文字列を分割する + + const serverQuery = Object.assign({}, defaultQuery, serverData[0][0]); + const userQuery = Object.assign({}, defaultQuery, userData[0][0]); + const query = {}; + if (serverData[0][0]?.force_voice) { + query.speaker = serverQuery.speakid; + query.host = serverQuery.speakhost; + query.name = serverQuery.speakname; + } else { + query.speaker = userQuery.speakid; + query.host = userQuery.speakhost; + query.name = userQuery.speakname; + } + if (serverData[0][0]?.force_args) { + query.speed = serverQuery.speed; + query.pitch = serverQuery.pitch; + query.intonation = serverQuery.intone; + } else { + query.speed = userQuery.speed; + query.pitch = userQuery.pitch; + query.intonation = userQuery.intone; + } + + const exvoiceData = await SQL.sql(`SELECT * FROM exvoiceword WHERE guildid=${escape(message.guild.id)} and speakname=${escape(query.name)};`); + const notExvoice = exvoiceData[0].map(data => data.word); + const exvoice = (exvoice_list[query.name]) ? exvoice_list[query.name].filter(item => !notExvoice.includes(item)) : null; + + let speakText = liveContent; + if (serverData[0][0]?.read_username && !serverData[0][0]?.dictionary_username) speakText = `${user}さんのメッセージ ${liveContent}`; + speakText + .replace(/(https?|ftp):\/\/[\w\/:%#\$\&\?\(\)~\.=\+\-]+/gi, "リンク省略") + .replace(/```[\s\S]*?```/gi, "コード省略"); + const speakData = await axios.get(`https://eng-jpn-api.kuroneko6423.com/query?text=${speakText}`, { + httpAgent, + }).catch((error) => { }); + if (speakData.data) speakText = speakData.data; + else speakText = speakText.replace(/w|W|w|W/g, "わら"); + if (tmp) speakText = `添付ファイル ${speakText}`; + + const matchStr = exvoice?.find(str => speakText.includes(str)); + + const instance = axios.create({ + baseURL: query.host, + httpAgent: new http.Agent({ + keepAlive: true, + timeout: timeout * 1000, + keepAliveMsecs: Infinity, + maxFreeSockets, + maxTotalSockets, + maxSockets + }), + headers: { + "Content-Type": "application/json" + } + }); + + if (exvoice && matchStr && !serverData[0][0]?.exvoice) { + const result = speakText.substring(speakText.indexOf(matchStr), speakText.indexOf(matchStr) + matchStr.length); + const array = speakText.split(result); const splitResult = [array.shift(), array.join(result)]; - let string_array = []; + let stringArray = []; await Promise.all(splitResult?.map(async content => { if (dictionary.length !== 0) { let newString = content; @@ -50,61 +126,39 @@ module.exports = { newString = newString.replace(regex, after); }; }; - string_array.push(newString.replace(string_array[0], "")); + stringArray.push(newString.replace(stringArray[0], "")); }; })); - const last_content = (string_array.length === 0) ? - (splitResult.join("").length >= max_message) ? `${splitResult[1].slice(0, (max_message - splitResult[0].length <= 0) ? 0 : max_message - splitResult[0].length)}以下省略` : splitResult[1] : - (string_array.join("").length >= max_message) ? `${string_array[1].slice(0, (max_message - string_array[0].length <= 0) ? 0 : max_message - string_array[0].length)}以下省略` : string_array[1]; - const start_content = (string_array.length === 0) ? splitResult[0] : string_array[0]; - const text = (get_server_data[0][0]?.read_username && get_server_data[0][0]?.dictionary_username) ? - `${user}さんのメッセージ ${start_content}` : start_content; - const audio_query_response_start = await axios.post(`${host}/audio_query?text=${text}&speaker=${speaker}`, { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - 'Content-Type': 'application/json' - } - }); - const audio_query_response_last = await axios.post(`${host}/audio_query?text=${last_content}&speaker=${speaker}`, { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - 'Content-Type': 'application/json' - } - }); - const buffer_array = []; - const readmsg = async (audio_query_json) => { - audio_query_json["speedScale"] = speed; - audio_query_json["pitchScale"] = pitch; - audio_query_json["intonationScale"] = intonation; - const synthesis_response = await axios.post(`${host}/synthesis?speaker=${speaker}`, audio_query_json, { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - 'Content-Type': 'application/json', - 'accept': 'audio/wav' - }, - 'responseType': "arraybuffer", + const last_content = (stringArray.length === 0) ? + (splitResult.join("").length >= maxMessage) ? `${splitResult[1].slice(0, (maxMessage - splitResult[0].length <= 0) ? 0 : maxMessage - splitResult[0].length)}以下省略` : splitResult[1] : + (stringArray.join("").length >= maxMessage) ? `${stringArray[1].slice(0, (maxMessage - stringArray[0].length <= 0) ? 0 : maxMessage - stringArray[0].length)}以下省略` : stringArray[1]; + const start_content = (stringArray.length === 0) ? splitResult[0] : stringArray[0]; + const text = (serverData[0][0]?.read_username && serverData[0][0]?.dictionary_username) ? `${query.user}さんのメッセージ ${start_content}` : start_content; + + const audioQueryStart = await instance.post(`/audio_query?text=${text}&speaker=${query.speaker}`); + const audioQueryLast = await instance.post(`/audio_query?text=${last_content}&speaker=${query.speaker}`); + const bufferArray = []; + async function readmsg(audioQuery) { + audioQuery["speedScale"] = query.speed; + audioQuery["pitchScale"] = query.pitch; + audioQuery["intonationScale"] = query.intonation; + const synthesis = await instance.post(`/synthesis?speaker=${query.speaker}`, audioQuery, { + headers: { accept: "audio/wav" }, + responseType: "arraybuffer", }); - if (!synthesis_response?.data) return; - buffer_array.push(synthesis_response?.data.toString("base64")); + if (!synthesis?.data) return; + bufferArray.push(synthesis?.data.toString("base64")); }; - await readmsg(audio_query_response_start?.data); - await readmsg(audio_query_response_last?.data); - const exvoice_file = fs.readFileSync(`${process.env.exvoice}/${name}/${result}.wav`).toString("base64"); - buffer_array.splice(1, 0, exvoice_file); - const response = await axios.post( - `${host}/connect_waves`, - buffer_array, - { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - "accept": "audio/wav", - 'Content-Type': 'application/json', - }, - 'responseType': "stream", - } - ); + await readmsg(audioQueryStart?.data); + await readmsg(audioQueryLast?.data); + const exvoiceFile = fs.readFileSync(`${config.speak.exvoice}/${query.name}/${result}.wav`).toString("base64"); + bufferArray.splice(1, 0, exvoiceFile); + const response = await instance.post("/connect_waves", bufferArray, { + headers: { accept: "audio/wav" }, + responseType: "stream" + }); if (!response.data) return; - const voiceChannel = getVoiceConnection(message.guild.id); + const voiceChannel = getVoiceConnection(guildid); const player = createAudioPlayer(); if (!voiceChannel) return; if (skip) { @@ -113,14 +167,14 @@ module.exports = { await new Promise(resolve => { const subscription = voiceChannel.state.subscription; if (subscription && subscription.player.state.status !== AudioPlayerStatus.Idle) { - subscription.player.once('idle', () => resolve()); + subscription.player.once("idle", () => resolve()); } else resolve(); }); const resource = createAudioResource(response.data); player.play(resource); voiceChannel.subscribe(player); } else { - let newString = msg; + let newString = speakText; if (dictionary?.length !== 0) { for (let i = 0; i < dictionary.length; i++) { const before = dictionary[i].before_text; @@ -130,31 +184,20 @@ module.exports = { }; }; const content = (newString === "") ? - (msg.length >= max_message) ? `${msg.slice(0, max_message)}以下省略` : msg : - (newString.length >= max_message) ? `${newString.slice(0, max_message)}以下省略` : newString; - const text = (get_server_data[0][0]?.read_username && get_server_data[0][0]?.dictionary_username) ? - `${user}さんのメッセージ ${content}` : content; - const audio_query_response = await axios.post(`${host}/audio_query?text=${text}&speaker=${speaker}`, { - timeout: timeout * 1000, - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - 'Content-Type': 'application/json' - } - }); - const audio_query_json = await audio_query_response.data; - audio_query_json["speedScale"] = speed; - audio_query_json["pitchScale"] = pitch; - audio_query_json["intonationScale"] = intonation; - const synthesis_response = await axios.post(`${host}/synthesis?speaker=${speaker}`, audio_query_json, { - httpAgent: new http.Agent({ keepAlive: true, timeout: timeout * 1000, keepAliveMsecs: Infinity, maxFreeSockets: Number(process.env.maxFreeSockets), maxSockets: Number(process.env.maxSockets), maxTotalSockets: Number(process.env.maxTotalSockets) }), - headers: { - 'Content-Type': 'application/json', - 'accept': 'audio/wav' - }, - 'responseType': "stream" + (speakText.length >= maxMessage) ? `${speakText.slice(0, maxMessage)}以下省略` : speakText : + (newString.length >= maxMessage) ? `${newString.slice(0, maxMessage)}以下省略` : newString; + const text = (serverData[0][0]?.read_username && serverData[0][0]?.dictionary_username) ? `${user}さんのメッセージ ${content}` : content; + const audioQueryResponse = await instance.post(`/audio_query?text=${text}&speaker=${query.speaker}`); + const audioQuery = await audioQueryResponse.data; + audioQuery["speedScale"] = query.speed; + audioQuery["pitchScale"] = query.pitch; + audioQuery["intonationScale"] = query.intonation; + const synthesis = await instance.post(`/synthesis?speaker=${query.speaker}`, audioQuery, { + headers: { accept: "audio/wav" }, + responseType: "stream" }); - if (!synthesis_response.data) return; - const voiceChannel = getVoiceConnection(message.guild.id); + if (!synthesis.data) return; + const voiceChannel = getVoiceConnection(guildid); if (!voiceChannel) return; const player = createAudioPlayer(); if (skip) { @@ -163,11 +206,11 @@ module.exports = { await new Promise(resolve => { const subscription = voiceChannel.state.subscription; if (subscription && subscription.player.state.status !== AudioPlayerStatus.Idle) { - subscription.player.removeAllListeners('idle'); - subscription.player.once('idle', () => resolve()); + subscription.player.removeAllListeners("idle"); + subscription.player.once("idle", () => resolve()); } else resolve(); }); - const resource = createAudioResource(synthesis_response.data); + const resource = createAudioResource(synthesis.data); player.play(resource); voiceChannel.subscribe(player); }; diff --git a/libs/SQL.js b/libs/SQL.js index 873a9b4..e6a58ac 100644 --- a/libs/SQL.js +++ b/libs/SQL.js @@ -1,6 +1,7 @@ const mysql = require("mysql2/promise"); const { escape } = require("mysql2"); +const config = require("../config"); const logger = require("./GetLogger"); const Log = logger.createChannel("db"); @@ -11,17 +12,22 @@ const runCmdLog = Log.createChild("runCmd"); class SQL { constructor() { this.connectionOption = { - host: process.env.db_host, - port: process.env.db_port, - user: process.env.db_user, - password: process.env.db_password, - database: process.env.db_name, + host: config.db.host, + port: config.db.port, + user: config.db.user, + password: config.db.password, + database: config.db.name, }; } select(table, whereObject, columns = "*") { + const data = ["SELECT", columns, "FROM", table]; + if (whereObject) { + const where = this.whereParser(whereObject); + data.push("WHERE", where); + } const where = this.whereParser(whereObject); - return this.sql(`SELECT ${columns} FROM ${table} WHERE ${where}`); + return this.sql(`${data.join(" ")};`); } insert(table, data) { From 6c328fb23ada012760c94610442326617fcc9652 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Wed, 24 May 2023 22:35:52 +0900 Subject: [PATCH 58/90] =?UTF-8?q?SlashCommandHandler=E3=81=A7process.env?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E3=82=8F=E3=81=AA=E3=81=8F=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 11 +++++++---- libs/SlashCommandHandler.js | 9 ++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 53626c7..ecfe0a8 100644 --- a/index.js +++ b/index.js @@ -18,11 +18,11 @@ const client = new Client({ allowedMentions: { repliedUser: false }, rest: 60000 }); +client.config = require("./config"); const Log = logger.createChannel("main"); EventHandler(client, path.resolve(__dirname, "./events")); -client.commands = SlashCommandHandler(path.resolve(__dirname, "./commands")); globalThis.voice_channel = []; globalThis.ylivechat = {}; @@ -31,10 +31,10 @@ globalThis.tlivechat = {}; const enka = new EnkaClient({ showFetchCacheLog: true }); //死活監視 -if (process.env.URL) { +if (client.config.url) { Log.info("死活監視を開始します。"); setInterval(() => { - axios.get(process.env.URL) + axios.get(client.config.url) .then(response => { console.log(`[GETリクエスト] ${response.config.url} - ステータスコード: ${response.status}`); }) @@ -48,4 +48,7 @@ process.on("uncaughtException", (error) => { Log.error(error) }); -client.login(process.env.TOKEN); \ No newline at end of file +client.login(client.config.token) + .then(() => { + client.commands = SlashCommandHandler(client, path.resolve(__dirname, "./commands")); + }); \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js index cf8198b..2fef9e3 100644 --- a/libs/SlashCommandHandler.js +++ b/libs/SlashCommandHandler.js @@ -1,10 +1,9 @@ const { Collection, REST, Routes, SlashCommandBuilder, SlashCommandSubcommandBuilder } = require("discord.js"); const fs = require("fs"); const path = require("path"); -const logger = require("./GetLogger"); -function SlashCommandHandler(commandsPath) { - const Log = logger.createChannel("command"); +function SlashCommandHandler(client, commandsPath) { + const Log = client.logger.createChannel("command"); Log.info("Loading..."); const commands = new Collection(); fs.readdirSync(commandsPath).forEach((categoryDir) => { @@ -62,9 +61,9 @@ function SlashCommandHandler(commandsPath) { Log.info(`Loaded ${commands.size} commands`); Log.info("Deploying..."); - const rest = new REST({ version: "10" }).setToken(process.env.TOKEN); + const rest = new REST({ version: "10" }).setToken(client.config.token); rest.put( - Routes.applicationCommands(process.env.clientId), + Routes.applicationCommands(client.user.id), { body: commands.map(command => command.data) }, ).then((data) => { Log.info(`Deployed ${data.length} commands`); From b0fc90861df6942075fc29c02c4e77b1dca012f1 Mon Sep 17 00:00:00 2001 From: anmoti <77442643+anmoti@users.noreply.github.com> Date: Sun, 4 Jun 2023 09:41:53 +0900 Subject: [PATCH 59/90] =?UTF-8?q?messageCommand=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=95=E3=81=9B=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 16 +-- commands/bot/help.js | 9 +- commands/bot/ping.js | 8 +- commands/bot/test.js | 23 ++++ commands/speak/adminspeak.js | 3 +- commands/speak/speak.js | 5 +- config.example.js | 1 + events/bot/debug.js | 8 ++ events/bot/messageCommandHandler.js | 59 +++++++++ events/bot/ready.js | 24 +++- events/bot/slashCommandHandler.js | 20 ++++ events/bot/slashcommand.js | 35 ------ events/log/messageDelete.js | 2 +- helpers/commandHandler.js | 22 ++++ index.js | 9 +- libs/Command/CommandManager.js | 165 ++++++++++++++++++++++++++ libs/Command/Managers.js | 6 + libs/Command/MessageCommandManager.js | 131 ++++++++++++++++++++ libs/Command/MessageResponse.js | 85 +++++++++++++ libs/Command/SlashCommandManager.js | 46 +++++++ libs/Command/index.js | 5 + libs/CommandsBuilder.js | 129 ++++++++++++++++++++ libs/EventHandler.js | 9 +- libs/Logger.js | 86 +++++++------- libs/SlashCommandHandler.js | 76 ------------ libs/index.js | 39 +++--- 26 files changed, 809 insertions(+), 212 deletions(-) create mode 100644 commands/bot/test.js create mode 100644 events/bot/debug.js create mode 100644 events/bot/messageCommandHandler.js create mode 100644 events/bot/slashCommandHandler.js delete mode 100644 events/bot/slashcommand.js create mode 100644 helpers/commandHandler.js create mode 100644 libs/Command/CommandManager.js create mode 100644 libs/Command/Managers.js create mode 100644 libs/Command/MessageCommandManager.js create mode 100644 libs/Command/MessageResponse.js create mode 100644 libs/Command/SlashCommandManager.js create mode 100644 libs/Command/index.js create mode 100644 libs/CommandsBuilder.js delete mode 100644 libs/SlashCommandHandler.js diff --git a/.env b/.env index 1262d6f..8a1017a 100644 --- a/.env +++ b/.env @@ -1,15 +1,15 @@ -TOKEN=token -clientId=clientid +TOKEN=NzYxNjE2Njg5OTE3MDY3Mjc0.GIcPh3.lo9zXllhgmhuwpRqT6szDjAwsnZ7RFWjkeOB8w +clientId=761616689917067274 URL = "" db_host = "localhost"#localhost or serverip db_user = "root"#text -db_password = "test"#text +db_password = "root"#text db_port = 3306#int db_limit = 5#int(接続を試みる時間) -db_name = "test"#DBの名前(SQLにログインしてcreate database hogeで作成) +db_name = "newer-kuronekochanbot"#DBの名前(SQLにログインしてcreate database hogeで作成) core_host="s52.coreserver.jp" core_account="kuronekoserver.kuronekobot" -core_password="japak82issKWIOQ" +core_password=""#"japak82issKWIOQ" core_port="21" voicevox="http://127.0.0.1:50021" COEIROINK="http://127.0.0.1:50031" @@ -20,7 +20,7 @@ timeout=30#合成する際のタイムアウトの時間(秒) maxFreeSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) maxTotalSockets=200#ソケットエラー出たら増やす(増えるほどリソース食います) maxSockets=100#ソケットエラー出たら増やす(増えるほどリソース食います) -errorwebhook="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE"#エラーが発生した際指定したwebhookへメッセージを送信します -reportwebhookurl="https://discord.com/api/webhooks/1087937658317185115/we2RCdubcnmnBKGxPKyFlSpbHlneEcVB7xfVvM88ZwLYiU8sMNdnGrGMd2UBKC8UtTOE" +errorwebhook="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT"#エラーが発生した際指定したwebhookへメッセージを送信します +reportwebhookurl="https://discord.com/api/webhooks/1107217041666080849/ttlySV-Hr72tztlLzplkOD3XWuEkWgzy7aP788qPNEAxRMkmWnQvHkGyAmz3X0n1QsqT" version="1.0.3"#上がるタイミング分からんけど書いとく -Proxy="プロキシ" \ No newline at end of file +Proxy="プロキシ" diff --git a/commands/bot/help.js b/commands/bot/help.js index 89cf2b5..969d653 100644 --- a/commands/bot/help.js +++ b/commands/bot/help.js @@ -10,14 +10,11 @@ module.exports = { .addStringOption(option => option .setName("commandname") .setDescription("指定されたコマンドの詳細を表示します。") - /* SlashCommandHandlerに実装している - .setChoices(...{ name: command.data.name, value: `/${command.data.name}`}) - */ + .setAutocomplete(true) ) , - async autocomplete(interaction) { - const focusedValue = interaction.options.getFocused(); - await interaction.respond(all_voice_list.filter(data => data.name.startsWith(focusedValue))).catch(() => { }); + autoComplete(interaction) { + //commandnameのオートコンプリート }, execute(interaction) { const { commands } = interaction.client; diff --git a/commands/bot/ping.js b/commands/bot/ping.js index 499dbec..854516a 100644 --- a/commands/bot/ping.js +++ b/commands/bot/ping.js @@ -3,12 +3,12 @@ module.exports = { .setName("ping") .setDescription("ボットの応答速度を測定します。") , - async execute(interaction) { + async execute(command) { const base = ":ping_pong:Pong!\n"; - const message = await interaction.reply({ content: base + "取得中...", fetchReply: true }); - interaction.editReply( + const message = await command.reply({ content: base + "取得中..." }); + message.edit( base + - `Websocket: ${interaction.client.ws.ping}ms\n` + + `Websocket: ${command.client.ws.ping}ms\n` + `API Endpoint: ${Date.now() - message.createdTimestamp}ms` ); } diff --git a/commands/bot/test.js b/commands/bot/test.js new file mode 100644 index 0000000..76e51ae --- /dev/null +++ b/commands/bot/test.js @@ -0,0 +1,23 @@ +module.exports = { + builder: (builder) => builder + .setName("test") + .setDescription("ボットの応答速度を測定します。") + .addStringOption((option) => option + .setName("test") + .setDescription("テスト") + .setRequired(true) + .setAutocomplete(true) + ) + , + autocomplete(command) { + return [ + { + name: "test", + value: "test" + } + ]; + }, + async execute(command) { + command.reply(`test: ${command.options.getString("test")}`) + } +}; \ No newline at end of file diff --git a/commands/speak/adminspeak.js b/commands/speak/adminspeak.js index d9f96f0..9381c6e 100644 --- a/commands/speak/adminspeak.js +++ b/commands/speak/adminspeak.js @@ -1,12 +1,13 @@ const { SlashCommandBuilder, ChannelType, PermissionFlagsBits } = require("discord.js"); const fs = require("fs"); +const path = require("path"); //voicevox:http://127.0.0.1:50021/docs#/ //COEIROINK:http://127.0.0.1:50031/docs#/ //SHAREVOX:http://127.0.0.1:50025/docs#/ module.exports = { - subcommands: "./admin", + subcommands: path.resolve(__dirname, "./admin"), builder: (builder) => builder .setName("adminspeak") .setDescription("読み上げ関係のコマンド") diff --git a/commands/speak/speak.js b/commands/speak/speak.js index 2347e14..cc957ce 100644 --- a/commands/speak/speak.js +++ b/commands/speak/speak.js @@ -1,5 +1,8 @@ +const path = require("path"); + + module.exports = { - subcommands: "./general", + subcommands: path.resolve(__dirname, "./general"), builder: (builder) => builder .setName("speak") .setDescription("読み上げ関係のコマンド") diff --git a/config.example.js b/config.example.js index 5cb3305..72f77e0 100644 --- a/config.example.js +++ b/config.example.js @@ -1,6 +1,7 @@ const path = require("path"); module.exports = { + prefix: "nk!", //prefix token: "", // Discord Bot Token proxy: "localhost:8080", // ScreenShotコマンドに使用 //推奨: Cloudflare WARP > ギアアイコン > 環境設定 > 詳細 > プロキシ モードを構成 diff --git a/events/bot/debug.js b/events/bot/debug.js new file mode 100644 index 0000000..558bad2 --- /dev/null +++ b/events/bot/debug.js @@ -0,0 +1,8 @@ +const { Events } = require('discord.js'); + +module.exports = { + name: Events.Debug, + execute(message) { + //console.log(message); + } +}; \ No newline at end of file diff --git a/events/bot/messageCommandHandler.js b/events/bot/messageCommandHandler.js new file mode 100644 index 0000000..d1774c1 --- /dev/null +++ b/events/bot/messageCommandHandler.js @@ -0,0 +1,59 @@ +const { ActionRowBuilder, Events, StringSelectMenuOptionBuilder, StringSelectMenuBuilder } = require('discord.js'); +const { Command } = require('../../libs'); +const commandHandler = require('../../helpers/commandHandler'); +const config = require('../../config'); + +module.exports = { + name: Events.MessageCreate, + filter: (m) => m.content.startsWith(config.prefix), + async execute(message) { + const command = new Command.MessageCommandManager(message); + + const autocompleteOptions = command.options.data.filter((o) => o.autocomplete); + if (autocompleteOptions.length) { + let autocompleteMenu = []; + for (const option of autocompleteOptions) { + const index = command.options._hoistedOptions.findIndex((o) => o.name === option.name); + command.options._hoistedOptions[index].focused = true; + const optionData = await command.autocomplete(command); + command.options._hoistedOptions[index].focused = false; + if (!optionData.length) continue; + if (option.value === optionData[0].value) continue; + autocompleteMenu.push(new StringSelectMenuBuilder() + .setCustomId(`options_select_${option.name}`) + .setPlaceholder(`${option.name}のオプションを選択`) + .addOptions(new StringSelectMenuOptionBuilder() + .setLabel(option.value) + .setValue(option.value) + ) + .addOptions(optionData.map((o, index) => new StringSelectMenuOptionBuilder() + .setLabel(o.name) + .setValue(o.value) + ))); + } + + if (autocompleteMenu.length) { + const component = new ActionRowBuilder() + .addComponents(autocompleteMenu); + + const msg = await command.reply({ + content: 'オプションを選択してください', + components: [component] + }) + let error = false; + await msg.awaitMessageComponent({ filter: (i) => i.user.id === message.author.id, time: 60 * 1000 }) + .then((i) => { + const option = command.options.data.findIndex((o) => o.name === i.customId.slice(15)); + command.options.data[option].value = i.values[0]; + }) + .catch((err) => { + error = true; + }); + msg.delete(); + if (error) return; + } + } + if (!("execute" in command)) return; + commandHandler(command); + } +}; \ No newline at end of file diff --git a/events/bot/ready.js b/events/bot/ready.js index c282ed6..4d73ac0 100644 --- a/events/bot/ready.js +++ b/events/bot/ready.js @@ -1,11 +1,27 @@ -const { Events, ActivityType } = require("discord.js"); +const { REST, Routes, Events, ActivityType } = require("discord.js"); module.exports = { name: Events.ClientReady, async execute(client, Log) { - setInterval(() => { - client.user.setPresence({ activities: [{ name: `/help`, type: ActivityType.Streaming }] }); - }, 300 * 1000); Log.info(`Logged in as ${client.user.tag}`); + Log.info("Rebuiding command..."); + const commandsData = client.commands.map(command => command.build()); + Log.info(`Rebuilt ${commandsData.length} commands`); + Log.info("Deploying command..."); + const rest = new REST({ version: "10" }).setToken(client.token); + rest.put( + Routes.applicationCommands(client.user.id), + { body: commandsData }, + ).then((data) => { + Log.info(`Deployed ${data.length} commands`); + }).catch((error) => { + Log.error(error) + }); + + function setActivity() { + client.user.setPresence({ activities: [{ name: `/help`, type: ActivityType.Streaming }] }); + } + setActivity(); + setInterval(setActivity, 300 * 1000); } } \ No newline at end of file diff --git a/events/bot/slashCommandHandler.js b/events/bot/slashCommandHandler.js new file mode 100644 index 0000000..d500249 --- /dev/null +++ b/events/bot/slashCommandHandler.js @@ -0,0 +1,20 @@ +const { Events } = require('discord.js'); +const { Command } = require('../../libs'); +const commandHandler = require('../../helpers/commandHandler'); + +module.exports = { + name: Events.InteractionCreate, + filter: (i) => i.isCommand() || i.isAutocomplete(), + async execute(interaction) { + const command = new Command.SlashCommandManager(interaction); + + if (interaction.isCommand()) { + if (!("execute" in command)) return; + commandHandler(command); + } else { + if (!("autocomplete" in command)) return; + const result = await command.autocomplete(command); + interaction.respond(result); + } + } +}; \ No newline at end of file diff --git a/events/bot/slashcommand.js b/events/bot/slashcommand.js deleted file mode 100644 index 191202b..0000000 --- a/events/bot/slashcommand.js +++ /dev/null @@ -1,35 +0,0 @@ -const { Events } = require("discord.js"); -const { CustomEmbed } = require("../../libs"); - -module.exports = { - name: Events.InteractionCreate, - filter: (i) => i.isCommand() || i.isAutocomplete(), - async execute(interaction) { - const { client } = interaction; - const command = client.commands.get(interaction.commandName); - if (interaction.isAutocomplete()) { - try { - await command.autocomplete(interaction, command.logger); - } catch (error) { - command.logger.error(error); - } - } - try { - const response = await command.execute(interaction, command.logger); - if (command.subcommands) { - const subcommand = command.subcommands.get(interaction.options.getSubcommand()); - const args = response ?? []; - subcommand.execute(interaction, ...args, command.logger); - } - } catch (error) { - command.logger.error(error); - const embed = new CustomEmbed("error").typeError(); - if (error.message === "Missing Permissions") { - embed.setDescription("権限が足りません。\nBOTに権限を与えてください") - } else { - embed.setDescription(`不明なエラーが発生しました。\n詳細:${error.message}\n運営に問い合わせていただけると幸いです。`) - } - interaction.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); - } - } -}; \ No newline at end of file diff --git a/events/log/messageDelete.js b/events/log/messageDelete.js index 85b450d..a232921 100644 --- a/events/log/messageDelete.js +++ b/events/log/messageDelete.js @@ -4,7 +4,7 @@ const sendLog = require("../../helpers/sendLog"); module.exports = { name: Events.MessageDelete, - filter: (message) => !message.channel.isDMBased() && message.author.id !== message.client.user.id, + filter: (message) => !message.channel.isDMBased() && message.author?.id !== message.client.user.id, async execute(message) { sendLog(message.guild, () => ( new CustomEmbed("messagedelete") diff --git a/helpers/commandHandler.js b/helpers/commandHandler.js new file mode 100644 index 0000000..2509d94 --- /dev/null +++ b/helpers/commandHandler.js @@ -0,0 +1,22 @@ +const { CustomEmbed, Command } = require('../libs'); + +async function commandHandler(command) { + try { + await command.execute(command) + } catch (error) { + command.logger.error(error); + const embed = new CustomEmbed('error').typeError(); + if (error.message === 'Missing Permissions') { + embed.setDescription('権限が足りません。\nBOTに権限を与えてください') + } else { + embed.setDescription(`不明なエラーが発生しました。\n詳細:${error.message}\n運営に問い合わせていただけると幸いです。`) + } + if (command.type === Command.Managers.Message) { + command.reply({ embeds: [embed] }).catch(() => { }); + } else { + command.reply({ embeds: [embed], ephemeral: true }).catch(() => { }); + } + } +} + +module.exports = commandHandler; \ No newline at end of file diff --git a/index.js b/index.js index ecfe0a8..70c8a9d 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,7 @@ const chalk = require("chalk"); const { GetLogger: logger, EventHandler, - SlashCommandHandler + CommandsBuilder } = require("./libs"); require("dotenv").config(); @@ -19,10 +19,12 @@ const client = new Client({ rest: 60000 }); client.config = require("./config"); +client.logger = logger; const Log = logger.createChannel("main"); EventHandler(client, path.resolve(__dirname, "./events")); +client.commands = CommandsBuilder(client, path.resolve(__dirname, "./commands")); globalThis.voice_channel = []; globalThis.ylivechat = {}; @@ -48,7 +50,4 @@ process.on("uncaughtException", (error) => { Log.error(error) }); -client.login(client.config.token) - .then(() => { - client.commands = SlashCommandHandler(client, path.resolve(__dirname, "./commands")); - }); \ No newline at end of file +client.login(client.config.token); \ No newline at end of file diff --git a/libs/Command/CommandManager.js b/libs/Command/CommandManager.js new file mode 100644 index 0000000..11e0b1e --- /dev/null +++ b/libs/Command/CommandManager.js @@ -0,0 +1,165 @@ +const { Collection, Guild, Channel, GuildMember, Snowflake, Message, CommandInteraction, Base } = require("discord.js"); +const { LoggerChannel } = require("../Logger"); + +class CommandManager extends Base { + constructor(client, name, subcommand1, subcommand2) { + super(client); + this._baseCommand = client.commands.get(name); + if (!this._baseCommand) return; + const subcommandNames = [subcommand1, subcommand2]; + let subcommands = this._baseCommand.subcommands; + if ("subcommandGroups" in this._baseCommand) { + const parentGroup = this._baseCommand.subcommandGroups.get(subcommandNames[0]); + if (parentGroup) { + subcommandNames.shift(); + this._parentGroup = parentGroup; + subcommands = parentGroup.subcommands; + } else if (subcommands) { + this._parentGroup = null; + } else return; + } + if (subcommands) { + this._command = subcommands.get(subcommandNames.shift()); + if (!this._command) return; + } else { + this._command = this._baseCommand; + } + + /** + * コマンドの名前 + * @type {string} + */ + this.name = this._command.name; + + /** + * コマンドの説明 + * @type {string} + */ + this.description = this._command.description; + + /** + * コマンドのカテゴリ + * @type {string} + */ + this.category = this._command.category; + + /** + * コマンドの関数 + * @type {function} + */ + this.execute = this._command.execute; + + /** + * オートコンプリートの関数 + * @type {function} + */ + this.autocomplete = this._command.autocomplete; + + /** + * コマンドのロガー + * @type {LoggerChannel} + */ + this.logger = this._command.logger; + } + + /** + * コマンドの種類 (Managers.Message or Managers.Slash) + * @type {Managers} + */ + type = null; + + /** + * コマンドが実行されたメッセージ (メッセージコマンドのみ) + * @type {Message|null} + */ + message = null; + + /** + * コマンドが実行されたスラッシュインタラクション (スラッシュコマンドのみ) + * @type {CommandInteraction|null} + */ + interaction = null; + + /** + * コマンドのID + * @type {Snowflake} + */ + id = null; + + /** + * コマンドが実行されたギルド (ギルド内のみ) + * @type {Guild|null} + */ + guild = null; + + /** + * コマンドが実行されたギルドのID (ギルド内のみ) + * @type {Snowflake|null} + */ + guildId = null; + + /** + * コマンドが実行されたチャンネル + * @type {Channel} + */ + channel = null; + + /** + * コマンドが実行されたチャンネルのID + * @type {Snowflake} + */ + channelId = null; + + /** + * コマンドを実行したメンバー (ギルド内のみ) + * @type {GuildMember|null} + */ + member = null; + + /** + * コマンドが実行された日時 + * @type {Date} + */ + createdAt = null; + + /** + * コマンドが実行された時のタイムスタンプ + * @type {number} + */ + createdTimestamp = null; + + /** + * コマンドのプレフィックス + * @type {string} + */ + prefix = "/"; + + /** + * コマンドの引数 (引数がない時はnull) + * @type {CommandInteractionOptionResolver} + */ + options = null; + + /** + * Creates a reply to this command. + * @param {string|MessagePayload|InteractionReplyOptions} options + * @returns {Promise|Promise|Promise} + */ + reply() { } + + /** + * Fetch the reply to this command. + * @returns {Promise} + */ + fetchReply() { } + + /** + * Defers the reply to this interaction. + * @param {InteractionDeferReplyOptions} + * @returns {Promise|Promise|Promise} + */ + deferReply() { } + +} + +module.exports = CommandManager; \ No newline at end of file diff --git a/libs/Command/Managers.js b/libs/Command/Managers.js new file mode 100644 index 0000000..e751448 --- /dev/null +++ b/libs/Command/Managers.js @@ -0,0 +1,6 @@ +const Managers = { + Slash: 'SlashManager', + Message: 'MessageManager' +} + +module.exports = Managers; \ No newline at end of file diff --git a/libs/Command/MessageCommandManager.js b/libs/Command/MessageCommandManager.js new file mode 100644 index 0000000..992185c --- /dev/null +++ b/libs/Command/MessageCommandManager.js @@ -0,0 +1,131 @@ +const { ApplicationCommandOptionType, CommandInteractionOptionResolver } = require('discord.js'); +const Managers = require('./Managers'); +const CommandManager = require('./CommandManager'); +const MessageResponse = require('./MessageResponse'); + +class MessageCommandManager extends CommandManager { + constructor(message) { + const prefix = message.client.config.prefix; + let argsStr = message.content.slice(prefix.length).trim(); + const args = argsStr.split(/\s+/).filter(Boolean); + const name = args.shift(); + if (!name) return; + argsStr = argsStr.slice(name.length).trim(); + super(message.client, name, ...args.slice(0, 2).map((s) => s.toLowerCase())); + this.prefix = prefix; + if (!this.name) return; + if (this._parentGroup) args.shift(); + if (this._baseCommand !== this._command) args.shift(); + + const allOptions = this._command.options.filter(o => ![ApplicationCommandOptionType.SubcommandGroup, ApplicationCommandOptionType.Subcommand].includes(o.type)); + function searchOption(name) { + const indexOption = allOptions.findIndex((o) => o.name === name); + if (indexOption === -1) return null; + return allOptions.splice(indexOption, 1)[0]; + } + + let options = []; + const attachments = message.attachments.map((a) => a); + + function transformOption(optionData, value) { + const result = { + name: optionData.name, + type: optionData.type + }; + + if ( + optionData.autocomplete && + [ + ApplicationCommandOptionType.String, + ApplicationCommandOptionType.Integer, + ApplicationCommandOptionType.Number + ].includes(optionData.type) + ) result.autocomplete = optionData.autocomplete; + + if (value) result.value = /".+"|'.+'|`.+`/.test(value) ? value.slice(1, -1) : value; + if ([ + ApplicationCommandOptionType.User, + ApplicationCommandOptionType.Mentionable + ].includes(optionData.type)) { + result.user = message.client.users.cache.get(result.value); + result.member = message.guild.members.cache.get(result.value); + } + if ([ + ApplicationCommandOptionType.Role, + ApplicationCommandOptionType.Mentionable + ].includes(optionData.type)) result.role = message.guild.roles.cache.get(result.value); + + if (optionData.type === ApplicationCommandOptionType.Channel) result.channel = message.client.channels.cache.get(result.value); + if (optionData.type === ApplicationCommandOptionType.Attachment) result.attachment = attachments.shift(); + + return result; + } + + argsStr + .match(/(\w+\s{0,}(:|:)\s{0,})?(".+"|'.+'|`.+`|[^\s]+)/g) + ?.filter((_option) => { + let [name, value] = _option.split(/:|:/).map((s) => s.trim()); + if (!value) return true; + name = name.toLowerCase(); + const optionData = searchOption(name); + if (!optionData) return true; + options.push(transformOption(optionData, value)); + }) + .forEach((value) => options.push(transformOption(allOptions.shift(), value))); + + if (this._baseCommand !== this._command) { + options = [{ + name: this._command.name, + type: ApplicationCommandOptionType.Subcommand, + options + }]; + } + if (this._parentGroup) { + options = [{ + name: this._parentGroup.name, + type: ApplicationCommandOptionType.SubcommandGroup, + options + }]; + } + + this.options = new CommandInteractionOptionResolver(message.client, options, this._command.options); + + this.message = message; + this.id = message.id; + this.author = message.author; + this.channel = message.channel; + this.channelId = message.channel.id; + this.createdAt = message.createdAt; + this.createdTimestamp = message.createdTimestamp; + if (message.guild) { + this.guild = message.guild; + this.guildId = message.guild.id; + this.member = message.member; + } + } + + type = Managers.Message; + + reply(options) { + if (options.ephemeral) { + this._replyMessage = this.message.author.send(options); + } else { + this._replyMessage = this.message.reply(options); + } + return this._replyMessage.then((message) => { + if (options.ephemeral) this.message.delete(); + if (options.fetchReply) return message; + return new MessageResponse(message); + }); + } + + fetchReply() { + return this._replyMessage; + } + + deferReply(options) { + return this.reply(Object.assign({}, options, { content: "処理中です..."})); + } +} + +module.exports = MessageCommandManager; \ No newline at end of file diff --git a/libs/Command/MessageResponse.js b/libs/Command/MessageResponse.js new file mode 100644 index 0000000..7ef25ba --- /dev/null +++ b/libs/Command/MessageResponse.js @@ -0,0 +1,85 @@ +const { DiscordSnowflake } = require('@sapphire/snowflake'); +const { DiscordjsError, DiscordjsErrorCodes, InteractionType, InteractionCollector } = require('discord.js'); + +/** + * Represents an message response + */ +class MessageResponse { + constructor(message, id) { + /** + * The message associated with the message response + * @type {Message} + */ + this.message = message; + /** + * The id of the original message response + * @type {Snowflake} + */ + this.id = id ?? message.id; + this.client = message.client; + } + + /** + * The timestamp the message response was created at + * @type {number} + * @readonly + */ + get createdTimestamp() { + return DiscordSnowflake.timestampFrom(this.id); + } + + /** + * The time the message response was created at + * @type {Date} + * @readonly + */ + get createdAt() { + return new Date(this.createdTimestamp); + } + + /** + * Collects a single component message that passes the filter. + * The Promise will reject if the time expires. + * @param {AwaitMessageComponentOptions} [options={}] Options to pass to the internal collector + * @returns {Promise} + */ + awaitMessageComponent(options = {}) { + return this.message.awaitMessageComponent(options); + } + + /** + * Creates a message component message collector + * @param {MessageComponentCollectorOptions} [options={}] Options to send to the collector + * @returns {InteractionCollector} + */ + createMessageComponentCollector(options) { + return this.message.createMessageComponentCollector(options); + } + + /** + * Fetches the response as a {@link Message} object. + * @returns {Promise} + */ + async fetch() { + return this.message + } + + /** + * Deletes the response. + * @returns {Promise} + */ + delete() { + return this.message.delete(); + } + + /** + * Edits the response. + * @param {string|MessagePayload|WebhookMessageEditOptions} options The new options for the response. + * @returns {Promise} + */ + edit(options) { + return this.message.edit(options); + } +} + +module.exports = MessageResponse; \ No newline at end of file diff --git a/libs/Command/SlashCommandManager.js b/libs/Command/SlashCommandManager.js new file mode 100644 index 0000000..1fb683b --- /dev/null +++ b/libs/Command/SlashCommandManager.js @@ -0,0 +1,46 @@ +const Managers = require('./Managers'); +const CommandManager = require('./CommandManager'); + +class SlashCommandManager extends CommandManager { + constructor(interaction) { + const subcommandGroup = interaction.options.getSubcommandGroup(false); + const subcommand = interaction.options.getSubcommand(false); + if (subcommandGroup) { + super(interaction.client, interaction.commandName, subcommandGroup, subcommand); + } else { + super(interaction.client, interaction.commandName, subcommand); + } + if (!this.name) return; + + this.options = interaction.options; + + this.interaction = interaction; + this.id = interaction.id; + this.author = interaction.user; + this.channel = interaction.channel; + this.channelId = interaction.channelId; + this.createdAt = interaction.createdAt; + this.createdTimestamp = interaction.createdTimestamp; + if (interaction.guild) { + this.guild = interaction.guild; + this.guildId = interaction.guildId; + this.member = interaction.member; + }; + } + + type = Managers.Slash; + + reply(option) { + return this.interaction.reply(option); + } + + fetchReply() { + return this.interaction.fetchReply(); + } + + deferReply(option) { + return this.interaction.deferReply(option); + } +} + +module.exports = SlashCommandManager; \ No newline at end of file diff --git a/libs/Command/index.js b/libs/Command/index.js new file mode 100644 index 0000000..be3dcd1 --- /dev/null +++ b/libs/Command/index.js @@ -0,0 +1,5 @@ +module.exports.Managers = require('./Managers'); +module.exports.CommandManager = require('./CommandManager'); +module.exports.MessageCommandManager = require('./MessageCommandManager'); +module.exports.SlashCommandManager = require('./SlashCommandManager'); +module.exports.MessageResponse = require('./MessageResponse'); \ No newline at end of file diff --git a/libs/CommandsBuilder.js b/libs/CommandsBuilder.js new file mode 100644 index 0000000..c7a4d89 --- /dev/null +++ b/libs/CommandsBuilder.js @@ -0,0 +1,129 @@ +const { Base, Collection, SlashCommandBuilder, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } = require("discord.js"); +const fs = require("fs"); +const path = require("path"); + +function getCommandDatas(obj) { + if (typeof obj !== "string") return obj; + const commandFiles = fs.readdirSync(obj).filter(file => file.endsWith(".js")); + return commandFiles.map((commandFile) => require(path.resolve(obj, commandFile))); +} + +function isPromise(obj) { + return obj instanceof Promise || (obj && typeof obj.then === 'function'); +} + +class Subcommand { + constructor(data, parent, builderClass = SlashCommandSubcommandBuilder) { + this.builder = data.builder; + this.parent = parent; + if ("execute" in this.parent) { + this.execute = (...parentArgs) => { + const parentExcuteRes = this.parent.execute(...parentArgs) + if (isPromise(parentExcuteRes)) return parentExcuteRes.then(data.execute); + return data.execute(...parentExcuteRes); + }; + } else { + this.execute = data.execute; + } + this._builderClass = builderClass; + this.build(); + this.category = parent.category; + this.logger = parent.logger.createChild(this.name); + this.autoComplete = data.autoComplete; + + } + build() { + const builder = this.builder(new this._builderClass()); + this.name = builder.name; + this.description = builder.description; + this.options = builder.options; + return builder.toJSON(); + } +} + +class SubcommandGroup extends Subcommand { + constructor(data, parent) { + super(data, parent, SlashCommandSubcommandGroupBuilder); + this.subcommands = new Collection(); + getCommandDatas(data.subcommands).forEach(subcommandData => { + const subcommand = new Subcommand(subcommandData, this); + this.subcommands.set(subcommand.name, subcommand); + }); + } +} + +class Command extends Base { + constructor(client, data, Log) { + super(client); + this.logger = Log.createChild(data.builder(new SlashCommandBuilder()).name); + if ("subcommandGroups" in data) { + this.subcommandGroups = new Collection(); + data.subcommandGroups.forEach(subcommandGroupData => { + const subcommandGroup = new SubcommandGroup(subcommandGroupData, this); + this.subcommandGroups.set(subcommandGroup.name, subcommandGroup); + }); + } + if ("subcommands" in data) { + this.subcommands = new Collection(); + getCommandDatas(data.subcommands).forEach(subcommandData => { + const subcommand = new Subcommand(subcommandData, this); + this.subcommands.set(subcommand.name, subcommand); + }); + } + if (this.subcommandGroups || this.subcommands) { + this.builder = (builder) => { + data.builder(builder); + if (this.subcommandGroups) { + this.subcommandGroups.forEach(subcommandGroupData => { + builder.addSubcommandGroup(subcommandGroupData.builder); + }); + } + if (this.subcommands) { + this.subcommands.forEach(subcommandData => { + builder.addSubcommand(subcommandData.builder); + }); + } + return builder; + }; + } else { + this.builder = data.builder; + } + this.build(); + this.category = data.category; + this.execute = data.execute; + this.autocomplete = data.autocomplete; + } + build() { + const builder = this.builder(new SlashCommandBuilder()); + this.name = builder.name; + this.description = builder.description; + this.options = builder.options; + this.DMPermission = builder.dm_permission; + return builder.toJSON(); + } +} + +function CommandsBuilder(client, commandsPath) { + const Log = client.logger.createChannel("command"); + Log.info("Loading..."); + const commands = new Collection(); + fs.readdirSync(commandsPath).forEach((categoryDir) => { + Log.debug(`Loading category ${categoryDir}...`); + const categoryPath = path.resolve(commandsPath, categoryDir); + const categoryLog = Log.createChild(categoryDir); + const commandDatas = getCommandDatas(categoryPath); + for (const commandData of commandDatas) { + commandData.category = categoryDir; + const command = new Command(client, commandData, categoryLog); + commands.set(command.name, command); + Log.debug(`Loaded command ${command.category} ${command.name}`); + } + Log.debug(`Loaded category ${categoryDir} ${commands.size} commands`); + }); + Log.info(`Loaded ${commands.size} commands`); + + // コマンドのデプロイはReadyイベントで行う + return commands; +} + +module.exports = CommandsBuilder; \ No newline at end of file diff --git a/libs/EventHandler.js b/libs/EventHandler.js index 96f4621..3516dd4 100644 --- a/libs/EventHandler.js +++ b/libs/EventHandler.js @@ -9,12 +9,13 @@ function EventHandler(client, eventsPath) { const eventsMap = new Map(); fs.readdirSync(eventsPath).forEach((dir) => { Log.debug(`Loading ${dir}...`); + const eventsLog = Log.createChild(dir); const eventPath = path.resolve(eventsPath, dir); const eventFiles = fs.readdirSync(eventPath).filter(file => file.endsWith(".js")); for (const file of eventFiles) { - Log.debug(`Loading ${dir} ${file}...`); + eventsLog.debug(`Loading ${dir} ${file}...`); const event = require(path.resolve(eventPath, file)); - event.logger = Log.createChild(event.name); + event.logger = eventsLog.createChild(file); events.push(event); if (eventsMap.has(event.name)) { eventsMap.get(event.name).push(event); @@ -30,9 +31,9 @@ function EventHandler(client, eventsPath) { events .filter(event => event.filter ? event.filter(...args) : true) .forEach((event) => { - new Promise(async (resolve) => { + new Promise(async () => { try { - event.execute(...args, event.logger).then(resolve) + await event.execute(...args, event.logger); } catch (error) { event.logger.error(error); } diff --git a/libs/Logger.js b/libs/Logger.js index d30ec41..e90e412 100644 --- a/libs/Logger.js +++ b/libs/Logger.js @@ -19,46 +19,7 @@ const defaultOption = { * @property {(data: { lineText: string, level: string, time: string, location: string[] }) => any} writeLog */ -class Logger { - /** - * @param {LoggerOption} option - */ - constructor(option) { - this.setOption(option); - } - - /** - * @type {LoggerOption} - */ - option = defaultOption; - - /** - * @type {Channel[]} - */ - channels = []; - - /** - * @param {LoggerOption} option - * @returns {LoggerOption} - */ - setOption(option) { - return this.option = { - levels: (option.levels ?? this.option.levels).map(level => level.toUpperCase()), - timeFormat: option.timeFormat ?? this.option.timeFormat, - writeLog: option.writeLog ?? this.option.writeLog - }; - } - /** - * @param {string} locationStr - * @returns {Channel} - */ - createChannel(locationStr) { - const location = [locationStr]; - return new Channel(this, location, this.option); - } -} - -class Channel { +class LoggerChannel { /** * @param {Logger} logger * @param {string[]} location @@ -92,7 +53,7 @@ class Channel { option; /** - * @type {Channel[]} + * @type {LoggerChannel[]} */ childs = []; @@ -104,10 +65,51 @@ class Channel { createChild(locationStr) { const location = [...this.location, locationStr]; - const channel = new Channel(this.logger, location, this.option); + const channel = new LoggerChannel(this.logger, location, this.option); this.childs.push(channel); return channel; } } +class Logger { + /** + * @param {LoggerOption} option + */ + constructor(option) { + this.setOption(option); + } + + /** + * @type {LoggerOption} + */ + option = defaultOption; + + /** + * @type {LoggerChannel[]} + */ + channels = []; + + /** + * @param {LoggerOption} option + * @returns {LoggerOption} + */ + setOption(option) { + return this.option = { + levels: (option.levels ?? this.option.levels).map(level => level.toUpperCase()), + timeFormat: option.timeFormat ?? this.option.timeFormat, + writeLog: option.writeLog ?? this.option.writeLog + }; + } + /** + * @param {string} locationStr + * @returns {LoggerChannel} + */ + createChannel(locationStr) { + const location = [locationStr]; + return new LoggerChannel(this, location, this.option); + } + + static LoggerChannel = LoggerChannel; +} + module.exports = Logger; \ No newline at end of file diff --git a/libs/SlashCommandHandler.js b/libs/SlashCommandHandler.js deleted file mode 100644 index 2fef9e3..0000000 --- a/libs/SlashCommandHandler.js +++ /dev/null @@ -1,76 +0,0 @@ -const { Collection, REST, Routes, SlashCommandBuilder, SlashCommandSubcommandBuilder } = require("discord.js"); -const fs = require("fs"); -const path = require("path"); - -function SlashCommandHandler(client, commandsPath) { - const Log = client.logger.createChannel("command"); - Log.info("Loading..."); - const commands = new Collection(); - fs.readdirSync(commandsPath).forEach((categoryDir) => { - Log.debug(`Loading category ${categoryDir}...`); - const categoryPath = path.resolve(commandsPath, categoryDir); - const categoryLog = Log.createChild(categoryDir); - const commandFiles = fs.readdirSync(categoryPath).filter(file => file.endsWith(".js")); - for (const file of commandFiles) { - Log.debug(`Loading command ${categoryDir} ${file}...`); - const commandPath = path.resolve(categoryPath, file); - const command = require(commandPath); - const commandBuilder = command.builder(new SlashCommandBuilder()); - const name = commandBuilder.name; - command.category = categoryDir; - command.logger = categoryLog.createChild(name); - if ("subcommands" in command) { - Log.debug(`Loading subcommands for ${categoryDir} ${file}...`); - const subcommands = []; - if (typeof command.subcommands === "string") { - const subcommandFiles = fs.readdirSync(path.resolve(categoryPath, command.subcommands)).filter(file => file.endsWith(".js")); - for (const subcommandFile of subcommandFiles) { - const subcommandPath = path.resolve(categoryPath, command.subcommands, subcommandFile); - subcommands.push(require(subcommandPath)); - } - } else { - command.subcommands.forEach(subcommand => subcommands.push(subcommand)); - } - command.subcommands = new Collection(); - subcommands.forEach(subcommand => { - const subcommandBuilder = subcommand.builder(new SlashCommandSubcommandBuilder()); - commandBuilder.addSubcommand(subcommandBuilder); - subcommand.logger = command.logger.createChild(subcommandBuilder.name); - subcommand.data = subcommandBuilder.toJSON(); - command.subcommands.set(subcommandBuilder.name, subcommand); - }); - Log.debug(`Loaded ${subcommands.size} subcommands for ${categoryDir} ${file}`); - } - command.data = commandBuilder.toJSON(); - commands.set(command.data.name, command); - Log.debug(`Loaded command ${categoryDir} ${file}`); - } - Log.debug(`Loaded category ${categoryDir} ${commandFiles.length} commands`); - }); - - // helpコマンドの選択肢を指定 - const helpCommand = commands.get("help"); - helpCommand.logger.debug(`Loading Choices...`); - helpCommand.data.options[0].choices = commands.map((command) => { - return { - name: command.data.name, - value: `/${command.data.name}` - } - }); - helpCommand.logger.debug(`Loaded Choices`); - - Log.info(`Loaded ${commands.size} commands`); - Log.info("Deploying..."); - const rest = new REST({ version: "10" }).setToken(client.config.token); - rest.put( - Routes.applicationCommands(client.user.id), - { body: commands.map(command => command.data) }, - ).then((data) => { - Log.info(`Deployed ${data.length} commands`); - }).catch((error) => { - Log.error(error) - }); - return commands; -} - -module.exports = SlashCommandHandler; \ No newline at end of file diff --git a/libs/index.js b/libs/index.js index e9d797c..d349d3b 100644 --- a/libs/index.js +++ b/libs/index.js @@ -1,26 +1,15 @@ -const Logger = require("./Logger"); -const GetLogger = require("./GetLogger"); -const EventHandler = require("./EventHandler"); -const SlashCommandHandler = require("./SlashCommandHandler"); -const Utils = require("./Utils"); -const Permissions = require("./Permissions"); +module.exports.Logger = require("./Logger"); +module.exports.GetLogger = require("./GetLogger"); +module.exports.EventHandler = require("./EventHandler"); +module.exports.CommandsBuilder = require("./CommandsBuilder"); +module.exports.Utils = require("./Utils"); +module.exports.Permissions = require("./Permissions"); +module.exports.EmbedUtil = require("./EmbedUtil"); const EmbedUtil = require("./EmbedUtil"); -const { CustomEmbed, getEmbedName, ColorsChoice, EmbedPages } = EmbedUtil; -const ts2time = require("./ts2time"); -const SQL = require("./SQL"); - -module.exports = { - Logger, - GetLogger, - EventHandler, - SlashCommandHandler, - Utils, - Permissions, - EmbedUtil, - CustomEmbed, - getEmbedName, - ColorsChoice, - EmbedPages, - ts2time, - SQL -} \ No newline at end of file +module.exports.CustomEmbed = EmbedUtil.CustomEmbed; +module.exports.getEmbedName = EmbedUtil.getEmbedName; +module.exports.ColorsChoice = EmbedUtil.ColorsChoice; +module.exports.EmbedPages = EmbedUtil.EmbedPages; +module.exports.ts2time = require("./ts2time"); +module.exports.SQL = require("./SQL"); +module.exports.Command = require("./Command"); \ No newline at end of file From 7833878005476ee8c28bd275540f82bbea6503cd Mon Sep 17 00:00:00 2001 From: TanakaTakeshikun <85824872+TanakaTakeshikun@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:26:55 +0900 Subject: [PATCH 60/90] =?UTF-8?q?=E3=83=87=E3=82=B6=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/package-lock.json | 4538 ++++++++++++++++++++- dashboard/package.json | 10 +- dashboard/src/app/Button.jsx | 30 + dashboard/src/app/FadeIn.jsx | 38 + dashboard/src/app/assets/img/discord.webp | Bin 0 -> 10928 bytes dashboard/src/app/favicon.ico | Bin 67646 -> 67646 bytes dashboard/src/app/page.js | 27 +- dashboard/src/app/style/globals.css | 108 +- dashboard/yarn.lock | 4288 +++++++++++++++++++ 9 files changed, 8786 insertions(+), 253 deletions(-) create mode 100644 dashboard/src/app/Button.jsx create mode 100644 dashboard/src/app/FadeIn.jsx create mode 100644 dashboard/src/app/assets/img/discord.webp create mode 100644 dashboard/yarn.lock diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index ddcc284..7c2f26b 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -8,11 +8,134 @@ "name": "dashboard", "version": "0.1.0", "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.3", "eslint": "8.41.0", "eslint-config-next": "13.4.3", + "gsap": "^3.11.5", + "install": "^0.13.0", "next": "13.4.3", + "npm": "^9.6.7", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "react-router-dom": "^6.11.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/runtime": { @@ -26,6 +149,152 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -108,6 +377,262 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.3.tgz", + "integrity": "sha512-ErOMoGNpgf6BF5W+jgXDiRlXJnpSeg8XSRonuY5UCCMHIlOWtKDtt/LS3qDAbFFGb7tV/y6EBddbcMeexx+zHw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.13.3", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.3.tgz", + "integrity": "sha512-w4//nRIi9fiMow/MmhkForOezd8nc229EpSZZ5DzwpJNOmAXwypFTapOUVAGTUQiTJyeZXUNbQqYuUIrIs2nbg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.13.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.3.tgz", + "integrity": "sha512-10pek+Bz+PZ4rjUf3KTKfXWjPMUqU1nSnRPf4DAXABhsjzelGGfGW/EICgrLRrttYplTJZhoponWALezAge8ug==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.3", + "@mui/core-downloads-tracker": "^5.13.3", + "@mui/system": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", + "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@next/env": { "version": "13.4.3", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.3.tgz", @@ -307,6 +832,23 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", @@ -325,6 +867,47 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", + "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, "node_modules/@typescript-eslint/parser": { "version": "5.59.6", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", @@ -606,9 +1189,23 @@ "deep-equal": "^2.0.5" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/big-integer": { @@ -734,6 +1331,14 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -755,6 +1360,26 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -768,6 +1393,11 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -902,6 +1532,15 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -919,6 +1558,14 @@ "node": ">=10.13.0" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -1548,6 +2195,11 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1769,6 +2421,11 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, + "node_modules/gsap": { + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.11.5.tgz", + "integrity": "sha512-Q89nKCLgoX5xUjznh9LcaIUkz54k1voNucT1Rpf9SJNFIQznBwFqt5qUUQbeVInFyN/n18OUJkpeI6CNEDt74w==" + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1843,6 +2500,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -1896,6 +2561,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -1937,6 +2610,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -2271,6 +2949,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2329,207 +3012,3699 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.3.tgz", + "integrity": "sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==", + "dependencies": { + "@next/env": "13.4.3", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.3", + "@next/swc-darwin-x64": "13.4.3", + "@next/swc-linux-arm64-gnu": "13.4.3", + "@next/swc-linux-arm64-musl": "13.4.3", + "@next/swc-linux-x64-gnu": "13.4.3", + "@next/swc-linux-x64-musl": "13.4.3", + "@next/swc-win32-arm64-msvc": "13.4.3", + "@next/swc-win32-ia32-msvc": "13.4.3", + "@next/swc-win32-x64-msvc": "13.4.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/npm": { + "version": "9.6.7", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.7.tgz", + "integrity": "sha512-xwkU1hSZl6Qrkfw3fhxVmMfNWu0A67+aZZs5gz/LoehCeAPkVhQDB90Z2NFoPSI1KpfBWCJ6Bp28wXzv5U5/2g==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^6.2.9", + "@npmcli/config": "^6.1.7", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^3.1.0", + "@npmcli/run-script": "^6.0.2", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^17.1.2", + "chalk": "^4.1.2", + "ci-info": "^3.8.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.2", + "glob": "^10.2.4", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^6.1.1", + "ini": "^4.1.0", + "init-package-json": "^5.0.0", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^3.0.0", + "libnpmaccess": "^7.0.2", + "libnpmdiff": "^5.0.17", + "libnpmexec": "^5.0.17", + "libnpmfund": "^4.0.17", + "libnpmhook": "^9.0.3", + "libnpmorg": "^5.0.4", + "libnpmpack": "^5.0.17", + "libnpmpublish": "^7.2.0", + "libnpmsearch": "^6.0.2", + "libnpmteam": "^5.0.3", + "libnpmversion": "^4.0.2", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^9.3.1", + "nopt": "^7.1.0", + "npm-audit-report": "^4.0.0", + "npm-install-checks": "^6.1.1", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-profile": "^7.0.1", + "npm-registry-fetch": "^14.0.5", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^15.1.3", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "read-package-json": "^6.0.3", + "read-package-json-fast": "^3.0.2", + "semver": "^7.5.1", + "ssri": "^10.0.4", + "tar": "^6.1.14", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^3.0.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "6.2.9", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.2.9.tgz", + "integrity": "sha512-uC16dg+aykdctgIYPUKNa3pNGIDYh1egzk5vOf34d24cw5mwMsVArFiVdcRieKHmOGEv595se3x0fvbwNrBk8g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^3.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.0.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "6.1.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz", + "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", + "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.1.0.tgz", + "integrity": "sha512-qNPy6Yf9ruFST99xcrl5EWAvrb7qFrwgVbwdzcTJlIgxbArKOq5e/bgZ6rTL1X9hDgAdPbvL8RWx/OTLSB0ToA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.0.tgz", + "integrity": "sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz", + "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz", + "integrity": "sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "17.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-3.1.1.tgz", + "integrity": "sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw==", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz", + "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz", + "integrity": "sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0 || ^6.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-5.0.0.tgz", + "integrity": "sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-4.0.2.tgz", + "integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.2.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-7.0.2.tgz", + "integrity": "sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "5.0.17", + "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-5.0.17.tgz", + "integrity": "sha512-wptFvhrX+5dsjicG+D14j1dXWZUg4+vWDuL/m/8puZcrWhD3rdl7IunLmnw6eVQoep8EtxHv4DpARkQsW9xiqw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.9", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8", + "tar": "^6.1.13" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "5.0.17", + "resolved": "https://registry.npmjs.org/libnpmexec/-/libnpmexec-5.0.17.tgz", + "integrity": "sha512-HGO8XiNWojyxb//LHsXmYuDWehPi/NuGsrNTu9VeRp/WNT5ijq2p219nLRu8ZBxGlBFCkLj8AbVRj1lmIFPObA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.9", + "@npmcli/run-script": "^6.0.0", + "chalk": "^4.1.0", + "ci-info": "^3.7.1", + "npm-package-arg": "^10.1.0", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/libnpmfund/-/libnpmfund-4.0.17.tgz", + "integrity": "sha512-7cOf67KxpSNK/g5mWy3LWojxgXwuXHw62gGyeDSH7wVOUahD9pZPKqt5jwHtfiFgSOe9Lf51lcVIaeAS3wekqg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.9" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-9.0.3.tgz", + "integrity": "sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-5.0.4.tgz", + "integrity": "sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "5.0.17", + "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-5.0.17.tgz", + "integrity": "sha512-JvYZc3lLnZcbcmG9vOnbvGMd4Qfu4fQTi9zGlGn0KOUKUsWvkUGJYQwVHiW0/6r1yyn8kQ7/tCPj2+Ubz1njtQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.9", + "@npmcli/run-script": "^6.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^3.6.1", + "normalize-package-data": "^5.0.0", + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^1.4.0", + "ssri": "^10.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-6.0.2.tgz", + "integrity": "sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-5.0.3.tgz", + "integrity": "sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-4.0.2.tgz", + "integrity": "sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.1", + "@npmcli/run-script": "^6.0.0", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.1.0.tgz", + "integrity": "sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-4.0.0.tgz", + "integrity": "sha512-k2o5476sLrp94b6Gl819YzlS7LAdb8lgE6yQCysBEji5E3WoUdRve6tiVMLKAPPdLfItU4kOSUycWS5HFTrbug==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-7.0.1.tgz", + "integrity": "sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.0.tgz", + "integrity": "sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q==", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "15.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.9.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.0.tgz", + "integrity": "sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read/-/read-2.1.0.tgz", + "integrity": "sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", + "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.2.tgz", + "integrity": "sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.1.14", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "minipass": "^3.0.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">= 8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", + "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/npm/node_modules/tuf-js": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", + "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.0" + }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "inBundle": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "unique-slug": "^4.0.0" }, "engines": { - "node": ">=8.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mimic-fn": { + "node_modules/npm/node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" }, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "inBundle": true, + "license": "ISC" }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/npm/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "node-which": "bin/which.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } }, - "node_modules/next": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.3.tgz", - "integrity": "sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==", + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "inBundle": true, + "license": "MIT", "dependencies": { - "@next/env": "13.4.3", - "@swc/helpers": "0.5.1", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "zod": "3.21.4" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, - "bin": { - "next": "dist/bin/next" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16.8.0" + "node": ">=10" }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.3", - "@next/swc-darwin-x64": "13.4.3", - "@next/swc-linux-arm64-gnu": "13.4.3", - "@next/swc-linux-arm64-musl": "13.4.3", - "@next/swc-linux-x64-gnu": "13.4.3", - "@next/swc-linux-x64-musl": "13.4.3", - "@next/swc-win32-arm64-msvc": "13.4.3", - "@next/swc-win32-ia32-msvc": "13.4.3", - "@next/swc-win32-x64-msvc": "13.4.3" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "inBundle": true, + "license": "ISC" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2737,6 +6912,23 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2886,6 +7078,51 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-router": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "dependencies": { + "@remix-run/router": "1.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "dependencies": { + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -3152,6 +7389,14 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3302,6 +7547,11 @@ } } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3363,6 +7613,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3567,6 +7825,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 537abc4..20acb25 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -9,10 +9,18 @@ "lint": "next lint" }, "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.3", "eslint": "8.41.0", "eslint-config-next": "13.4.3", + "gsap": "^3.11.5", + "install": "^0.13.0", "next": "13.4.3", + "npm": "^9.6.7", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "react-router-dom": "^6.11.2" } } diff --git a/dashboard/src/app/Button.jsx b/dashboard/src/app/Button.jsx new file mode 100644 index 0000000..d2a87f6 --- /dev/null +++ b/dashboard/src/app/Button.jsx @@ -0,0 +1,30 @@ +import { Button } from "@mui/material"; +import Link from 'next/link'; +export default function FadeIn({ text, url }) { + return ( + + + + ); +} diff --git a/dashboard/src/app/FadeIn.jsx b/dashboard/src/app/FadeIn.jsx new file mode 100644 index 0000000..c1969e9 --- /dev/null +++ b/dashboard/src/app/FadeIn.jsx @@ -0,0 +1,38 @@ +import { useRef, useEffect } from "react"; +import { gsap } from "gsap"; +import { Divider, Typography } from "@mui/material"; + +const speed = 2; + +export default function FadeIn() { + const typographyRef = useRef(null); + const dividerRef = useRef(null); + + useEffect(() => { + const animate = (element) => { + gsap.fromTo( + element, + { opacity: 0 }, + { opacity: 1, duration: speed, ease: "power2.out" } + ); + }; + animate(typographyRef.current); + animate(dividerRef.current); + }, []); + + return ( + <> + + 黒猫ちゃんBOT Dashoard + + + + ); +} diff --git a/dashboard/src/app/assets/img/discord.webp b/dashboard/src/app/assets/img/discord.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c80f18ea7b0075367436c434aa162e7e4e9a10a GIT binary patch literal 10928 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 literal 0 HcmV?d00001 diff --git a/dashboard/src/app/favicon.ico b/dashboard/src/app/favicon.ico index 2f4d66f282cdcf8422c2f428c2f36d155993235e..d2bcc77e9db0075b5c70c0600fa189389f02f706 100644 GIT binary patch delta 4557 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 CW9o7M delta 15347 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 bKfm*J_@gY_+N7rWiZ-ulvj5Ng0onf#E01k; diff --git a/dashboard/src/app/page.js b/dashboard/src/app/page.js index cd0a61a..b7e2293 100644 --- a/dashboard/src/app/page.js +++ b/dashboard/src/app/page.js @@ -1,12 +1,19 @@ -import Header from './components/test'; - +"use client"; +import { Box } from "@mui/material"; +import FadeIn from "./FadeIn"; +import Button from "./Button"; export default function FirstPost() { return ( - <> -

Hello Home

-

-
-

- - ) -} \ No newline at end of file + + +