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

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

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

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

1回答

1225閲覧

Discord.jsを使い、特定のチャンネルから特定のボットのメッセージを抽出して、コマンドを実行した全てのチャンネルへメッセージを配信する。

DHMO

総合スコア0

Discord

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2021/09/28 08:59

編集2021/09/30 03:20

前提

  • この質問のソースコードは「Cボット」のもの
  • 「Ωサーバー」の「Aチャンネル」の「Bボット」はそのチャンネルにしか存在できず、仕方なく「Cボット」を使用している。

実現したいこと

  • サーバーの管理者権限を持つユーザーが「${prefix}mirroron」というコマンドを実行すると、「Ωサーバー」の「Aチャンネル」の「Bボット」のメッセージを抽出すること。
  • 先のコマンドを実行したすべてのチャンネルに「Bボット」のメッセージを転送すること。
  • さらに転送先をコマンドで追加できること。

環境

  • Glitch-hello-node
  • node:12.x
  • discord.js ^12.5.3
  • discord-reply ^0.1.0

発生している問題・エラーメッセージ

特になし

試したこと

「Ωサーバー」の「Aチャンネル」の「Bボット」のメッセージを抽出して、「Σサーバー」の「Dチャンネル」に転送することはできた。
その時はCチャンネルをIDで指定していたため、コマンドで転送先を追加できなかった。

該当のソースコード

client.on('message', async (message) => { if (message.content === prefix + "mirroron" && message.guild) { if (!message.member.permissions.has("ADMINISTRATOR")) return //権限を確認し、持っていなかったらここで処理を止める message.channel.send("権限を確認...完了"); //ここまでは完璧に動作する let channelid = message.channel.id; let oktext = `このチャンネルのIDを取得...ID:${channelid}...完了` message.channel.send(oktext); if (message.channel.id === "818812720094117918") //channel「Aチャンネル」から取得 if (message.author.id === "777891431041073203") //メッセージをbot「Bボット」に絞る client.channels.cache.get(channelid).send(message.content); //channel「${channelid}」に送り付ける } });

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

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

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

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

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

guest

回答1

0

Keyv使います。

keyv @keyv/sqlite

このパッケージを追加してください。

js

1const Keyv = require("keyv"); 2const tensou = new Keyv("sqlite://db.sqlite", { table: "tensou" }); 3 4client.on('message', async (message) => { 5 if (message.content === "tensou" && message.guild) { 6 const ch = await tensou.get("channel") || []; 7 ch.push(message.channel.id); 8 await tensou.set("channel", ch); 9 message.channel.send("転送チャンネルを追加しました。"); 10 } 11 if (message.content === prefix + "mirroron" && message.guild) { 12 if (!message.member.permissions.has("ADMINISTRATOR")) return //権限を確認し、持っていなかったらここで処理を止める 13 message.channel.send("権限を確認...完了"); //ここまでは完璧に動作する 14 let channelid = message.channel.id; 15 let oktext = `このチャンネルのIDを取得...ID:${channelid}...完了` 16 message.channel.send(oktext); 17 let messages = await client.channels.cache.get("818812720094117918").messages.fetch(100) //channel「Aチャンネル」から取得 18 messages = messages.fliter(m => m.author.id === "777891431041073203")//メッセージをbot「Bボット」に絞る 19 client.channels.cache.get(channelid).send(messages.map(m => m.content).join("\n")); 20 const chs = await tensou.get("channel") || []; 21 chs.forEach(x => client.channels.cache.get(x).send(messages.map(m => m.content).join("\n"))); 22 } 23});

これでどうでしょうか

投稿2021/09/28 23:24

編集2021/09/30 00:42
Waki285

総合スコア2014

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

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

DHMO

2021/09/29 04:41 編集

const discord = require("discord.js"); require = "discordreply"; const client = new discord.Client(); const prefix = "<<"; const Keyv = require("keyv"); const tensou = new Keyv("sqlite://db.sqlite", { table: "tensou" }); 一番上のパッケージをこのようにしたのですが、 internal/modules/cjs/loader.js:613 throw err; ^ Error: Cannot find module 'keyv' Require stack: - /app/server.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:610:15) at Function.Module._load (internal/modules/cjs/loader.js:526:27) at Module.require (internal/modules/cjs/loader.js:666:19) at require (internal/modules/cjs/helpers.js:16:16) このようなエラーが出てきてしまいました。
DHMO

2021/09/29 04:55

先のエラーは単純に@keyv/sqliteしか入れていなかったから出ただけみたいです... ただまた新たなエラーが出ました... /app/server.js:7 const Keyv = require("keyv"); ^ TypeError: require is not a function at Object.<anonymous> (/app/server.js:7:14) at Module._compile (internal/modules/cjs/loader.js:759:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10) at Module.load (internal/modules/cjs/loader.js:628:32) at Function.Module._load (internal/modules/cjs/loader.js:555:12) at Function.Module.runMain (internal/modules/cjs/loader.js:826:10) at internal/main/run_main_module.js:17:11 一番上のパッケージは同じです。
Waki285

2021/09/29 07:30

えっとですね require = "discordreply"; を require("discord-reply"); にしてください
DHMO

2021/09/29 08:59 編集

エラーは出なかったですが、期待通りの動作にはなりませんでした... tensou→<<mirroron としましたが、メッセージは転送されませんでした。
Waki285

2021/09/30 00:43

すみません、私が間違ってました 編集したのでご確認ください
DHMO

2021/09/30 02:55

了解です。
DHMO

2021/09/30 02:58

やはり、メッセージは転送されないですね...
DHMO

2021/09/30 06:39 編集

データベースを使わない方法も試しましたが、初心者なもので全く形になりませんでした。 const copyTargets = new Set() // channelidに相当 client.on("message", message => { if (message.content === prefix + "mirroron" && message.guild) { copyTargets.add(`"${message.channel.id}"`) } if (message.channel.id === "818812720094117918") //channel「Aチャンネル」から取得 if (message.author.id === "777891431041073203") { //bot 「Bボット」に絞る client.channels.cache.get(channel => channel.id === copyTargets).forEach(channel => channel.send(message.contents)) //コマンドを実行した全てのチャンネルに送り付ける。 } }); こんな感じです
Waki285

2021/09/30 12:01

おっと... 私のコードでエラーなどは出ていますかね?
DHMO

2021/09/30 15:12

エラーは出ていないです ただ転送できなかったです
DHMO

2021/10/06 13:25

エラー出てました。 ログが正常だと表示されてたので気づかなかったです。 (node:10694) UnhandledPromiseRejectionWarning: TypeError: messages.fliter is not a function at Client.<anonymous> (/app/server.js:101:25) at processTicksAndRejections (internal/process/task_queues.js:88:5) (node:10694) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:10694) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Waki285

2021/10/06 23:11

const Keyv = require("keyv"); const tensou = new Keyv("sqlite://db.sqlite", { table: "tensou" }); client.on('message', async (message) => { if (message.content === "tensou" && message.guild) { const ch = await tensou.get("channel") || []; ch.push(message.channel.id); await tensou.set("channel", ch); message.channel.send("転送チャンネルを追加しました。"); } if (message.content === prefix + "mirroron" && message.guild) { if (!message.member.permissions.has("ADMINISTRATOR")) return //権限を確認し、持っていなかったらここで処理を止める message.channel.send("権限を確認...完了"); //ここまでは完璧に動作する let channelid = message.channel.id; let oktext = `このチャンネルのIDを取得...ID:${channelid}...完了` message.channel.send(oktext); let messages = await client.channels.cache.get("818812720094117918").messages.fetch({ limi: 100}) //channel「Aチャンネル」から取得 messages = messages.fliter(m => m.author.id === "777891431041073203")//メッセージをbot「Bボット」に絞る client.channels.cache.get(channelid).send(messages.map(m => m.content).join("\n")); const chs = await tensou.get("channel") || []; chs.forEach(x => client.channels.cache.get(x).send(messages.map(m => m.content).join("\n"))); } }); これでどうでしょうか
DHMO

2021/10/08 10:46

(node:733) UnhandledPromiseRejectionWarning: TypeError: messages.fliter is not a function at Client.<anonymous> (/app/server.js:93:21) at processTicksAndRejections (internal/process/task_queues.js:88:5) (node:733) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2) やはりエラーですね...
Waki285

2021/10/09 07:24 編集

let messages = の下に、 console.log(messages)を追加してもらえますか? それで、コンソールに出てきた内容を教えて下さい
DHMO

2021/10/09 14:48

}, '896392203008614460' => Message { channel: TextChannel { type: 'text', deleted: false, id: '818812720094117918', name: 'server-chat', rawPosition: 20, parentID: '812708448932200472', permissionOverwrites: [Collection], topic: '転送元のトピック内容, nsfw: false, lastMessageID: '896407237692637185', rateLimitPerUser: 0, lastPinTimestamp: 1627401531000, guild: [Guild], messages: [MessageManager], _typing: Map {} }, deleted: false, id: '896392203008614460', type: 'DEFAULT', system: false, content: ':green_circle: **?? さんがサーバーに参加しました**', author: User { id: '777891431041073203', system: false, locale: null, flags: [UserFlags], username: '2b2te BOT', bot: true, discriminator: '5955', avatar: '3a7f395cddbb442a8d944fa996fefc72', lastMessageID: null, lastMessageChannelID: null }, pinned: false, tts: false, nonce: null, embeds: [], attachments: Collection [Map] {}, createdTimestamp: 1633786955359, editedTimestamp: 0, reactions: ReactionManager { cacheType: [Function: Collection], cache: Collection [Map] {}, message: [Circular] }, mentions: MessageMentions { everyone: false, users: Collection [Map] {}, roles: Collection [Map] {}, _members: null, _channels: null, crosspostedChannels: Collection [Map] {} }, webhookID: null, application: null, activity: null, _edits: [], flags: MessageFlags { bitfield: 0 }, reference: null } } (node:540) UnhandledPromiseRejectionWarning: TypeError: messages.fliter is not a function at Client.<anonymous> (/app/server.js:94:21) at processTicksAndRejections (internal/process/task_queues.js:88:5) (node:540) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
DHMO

2021/10/09 14:51

メッセージは取得できているみたいですが、転送のあたりで問題が出ているのかもです。 いくつかのメッセージを取得するのですが、エラーが出るとメッセージの取得も止まってしまうみたいで。 あと、リアルタイムのメッセージ同期なので過去のメッセージは必要ないのですが、それも取得してしまっているようで...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問