質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

378閲覧

jsonデータを別の形(配列等)として出力したい

sumwave

総合スコア11

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/08/27 06:37

編集2022/08/27 06:48

問題

JavaScriptでDiscord.jsのbotを作っています。
バージョンはnode.jsは16.17.0、Discord.jsが14.2.0です。
jsonに記載されている値などをembedsの配列?に変換しようとしてますが、方法がわかりません。
jsonの内容は追加したりするため、その度にコードを書き換えるのをやめたいです。

実現したいこと

config.json

1{ 2 "data": [ 3 { 4 "command": "simane", 5 "name": "島根", 6 "explanation": "それはそう" 7 }, 8 { 9 "command": "tottori", 10 "name": "鳥取", 11 "explanation": "これはどう" 12 } 13 ] 14} 15

上記のjsonファイルをforなどを使用し、以下のようにしたいです

const config = require("./config.json"); //jsonの取得 //ここから var embed = { title: "タイトル, description: "内容", fields: [ { name: "島根", value:"simane" }, { name: "鳥取" value:"tottori" } ] }; //ここまでのコードを自動化したい //そしてそのデータを送信する message.channel.send({ embeds: [embed] });

jsonの内容が変わった際に、fieldsの内容が増えたりするようforでコードを作りたいです。
足りない点や意味が分からない場合は指摘してくれると嬉しいです。

現時点の全体のコード

bot.js

1const { Client, GatewayIntentBits, Partials } = require('discord.js'), 2 client = new Client({ 3 partials: [Partials.Channel], 4 intents: [ 5 GatewayIntentBits.Guilds, 6 GatewayIntentBits.GuildVoiceStates, 7 GatewayIntentBits.GuildMessages, 8 GatewayIntentBits.GuildMessageReactions, 9 GatewayIntentBits.DirectMessages, 10 GatewayIntentBits.MessageContent 11 ] 12 }), 13 config = require('./config.json'); 14var args, command; 15 16client.on("ready", () => { 17 console.log("よう"); 18 client.user.setPresence({ 19 activities: [{ 20 name: config.play //プレイ中の内容 21 }], 22 status: "online" 23 }); 24}); 25client.on('messageCreate', message => { 26 if (message.author.bot) return; //bot自身なら実行停止 27 if (message.content.startsWith(config.prefix)) { //ボットのプレフィックスからメッセージが始まっているか確認 28 args = message.content.slice(config.prefix.length).trim().split(/ +/g); 29 command = args.shift().toLowerCase(); 30 if (command == "help") { 31 message.channel.send({ 32 embeds: [{ 33 title: "ヘルプ", 34 description: "全てのコマンドの初めに`" + config.prefix + "`をつける必要があります。\n今調べられる都道府県の数は、`" + config.data.length + "`個調べられます", 35 url: '', 36 fields: [ 37 { name: "沖縄", value: "`okinawa`" }, 38 { name: "鹿児島", value: "`kagosima`" }, 39 { name: "宮崎", value: "`miyazaki`" }, 40 { name: "大分", value: "`ooita`" }, 41 { name: "熊本", value: "`kumamoto`" }, 42 { name: "長崎", value: "`nagasaki`" }, 43 { name: "佐賀", value: "`saga`" }, 44 { name: "福岡", value: "`fukuoka`" }, 45 { name: "山口", value: "`yamaguti`" }, 46 { name: "広島", value: "`hirosima`" }, 47 { name: "岡山", value: "`okayama`" }, 48 { name: "島根", value: "`simane`" }, 49 { name: "鳥取", value: "`tottori`" }, 50 { name: "ヘルプ", value: "`help`" } 51 ], 52 }] 53 }); 54 } else { 55 message.channel.send("有効なコマンド名ではありません。`" + config.prefix + "help`でコマンドを確認できます。"); 56 }; 57 }; 58});

config.json

1{ 2 "token": "tokentokentokentokentokent.tokent.tokentokentokentokentokentokentokentok", 3 "prefix": "a!", 4 "data": [ 5 { 6 "command": "okinawa", 7 "name": "沖縄", 8 "explanation": "" 9 }, 10 { 11 "command": "kagosima", 12 "name": "鹿児島", 13 "explanation": "" 14 }, 15 { 16 "command": "miyazaki", 17 "name": "宮崎", 18 "explanation": "" 19 }, 20 { 21 "command": "ooita", 22 "name": "大分", 23 "explanation": "" 24 }, 25 { 26 "command": "kumamoto", 27 "name": "熊本", 28 "explanation": "" 29 }, 30 { 31 "command": "nagasaki", 32 "name": "長崎", 33 "explanation": "" 34 }, 35 { 36 "command": "saga", 37 "name": "佐賀", 38 "explanation": "" 39 }, 40 { 41 "command": "fukuoka", 42 "name": "福岡", 43 "explanation": "" 44 }, 45 { 46 "command": "yamaguti", 47 "name": "山口", 48 "explanation": "" 49 }, 50 { 51 "command": "hirosima", 52 "name": "広島", 53 "explanation": "" 54 }, 55 { 56 "command": "okayama", 57 "name": "岡山", 58 "explanation": "" 59 }, 60 { 61 "command": "simane", 62 "name": "島根", 63 "explanation": "" 64 }, 65 { 66 "command": "tottori", 67 "name": "鳥取", 68 "explanation": "" 69 } 70 ] 71} 72

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これで動くと思います。

js

1const { Client, GatewayIntentBits, Partials, EmbedBuilder } = require('discord.js'), 2 client = new Client({ 3 partials: [Partials.Channel], 4 intents: [ 5 GatewayIntentBits.Guilds, 6 GatewayIntentBits.GuildVoiceStates, 7 GatewayIntentBits.GuildMessages, 8 GatewayIntentBits.GuildMessageReactions, 9 GatewayIntentBits.DirectMessages, 10 GatewayIntentBits.MessageContent 11 ] 12 }), 13 config = require('./config.json'); 14var args, command; 15let length = Object.keys(config.data).length; 16client.on("ready", () => { 17 console.log("よう"); 18 client.user.setPresence({ 19 activities: [{ 20 name: config.play //プレイ中の内容 21 }], 22 status: "online" 23 }); 24}); 25client.on('messageCreate', message => { 26 if (message.author.bot) return; //bot自身なら実行停止 27 if (message.content.startsWith(config.prefix)) { //ボットのプレフィックスからメッセージが始まっているか確認 28 args = message.content.slice(config.prefix.length).trim().split(/ +/g); 29 command = args.shift().toLowerCase(); 30 if (command == "help") { 31 const embed = new EmbedBuilder().setTitle("ヘルプ").setDescription("全てのコマンドの初めに`" + config.prefix + "`をつける必要があります。\n今調べられる都道府県の数は、`" + length + "`個調べられます"); 32 let n = 0; 33 if (length > 25) { 34 var e = new Error("フィールドは25個までです。"); 35 36 e.name = "Embed生成エラー"; 37 throw e; 38 } 39 while (true) { 40 if (length != n) { 41 embed.addFields({ 42 name: config.data[n].name, 43 value: config.data[n].command, 44 }); 45 n++; 46 } else { 47 break; 48 } 49 } 50 51 message.channel.send({ 52 embeds: [embed], 53 }); 54 } else { 55 message.channel.send("有効なコマンド名ではありません。`" + config.prefix + "help`でコマンドを確認できます。"); 56 }; 57 }; 58});

↓動作確認済み
image

投稿2022/08/30 04:59

編集2022/08/30 05:01
gx1285

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問