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

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

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

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

Node.js

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

JavaScript

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

Q&A

解決済

2回答

1582閲覧

時間になったらサーバー中のボイスチャットに接続している人全員を切断させるdiscordbotを作る。

grapeapi

総合スコア1

Discord

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

Node.js

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

JavaScript

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

0グッド

1クリップ

投稿2022/02/26 00:53

前提・実現したいこと

discord.jsを使って時間になったらサーバー中のボイスチャットに接続している人全員を切断させるbotを作る。

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

時間になっても切断されない。

エラーメッセージ 特になし

該当のソースコード

Javascript

1setTimeout(() => { 2 client.on("message", message => { 3 const member = message.member; 4 member.voice.setChannel(null); 5}); 6 console.log(new Date()) 7 8 }, new Date().setHours(0, 33, 0, 0) - new Date()) /

試したこと

 bot自体動作していないと思い、コマンドを打つと特定のテキストチャンネルにメッセージが送られるようなコードを書いたが、これは普通に動いた。

setTimeoutの中身が動いていないと思い、console.log(new Date())を追加して動くか試してみたところ、console.log(new Date())のみ実行された。

https://scrapbox.io/discordjs-japan/ボイスチャットからユーザーを蹴る
↑このサイトを参考にmember.voice.kick()を使ってみたが、動かなかった。

コマンドを打ったらmember.voice.setChannel(null)を実行するようにコードを書いたら、コマンドを打った人のみ切断された。(全員切断はできなかった)

補足情報(FW/ツールのバージョンなど)

node v12.16.1
discord.js 12.3.1

参考にしたサイト
https://disbot.info/bot-make/repl-djs-1/
https://zenn.dev/suimin_taro/articles/8c288daf6e542fd68768

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

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

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

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

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

guest

回答2

0

ベストアンサー

動作確認はdiscord.js v13.6.0でしているので適宜修正箇所があったら修正してください\(^o^)/
質問などありましたら、どうぞ〰

javascript

1client.on('message', message => { 2 if (message.content !== '反応させたいメッセージ') return; 3 const voiceChannels = message.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0); 4 5 voiceChannels.forEach(c => c.members.every(m => m.voice.disconnect())); 6}) 7

投稿2022/03/07 23:56

Kawachan99

総合スコア114

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

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

grapeapi

2022/03/08 23:57

動作が確認できました。 時間指定する際に下のようにしましたが、これでは動きませんでした。 ``` setTimeout(() => { client.on('message', message => { const voiceChannels = message.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0); voiceChannels.forEach(c => c.members.every(m => m.voice.disconnect())); }) }, new Date().setHours(0, 33, 0, 0) - new Date()) / ``` なので代わりにこのようにしました。 ``` setTimeout(() => { client.channels.cache.get('テキストチャンネルID').send('切断') }, new Date().setHours(23, 41, 0, 0) - new Date()) / client.on('message', message => { if (message.content !== '切断') return; const voiceChannels = message.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0); voiceChannels.forEach(c => c.members.every(m => m.voice.disconnect())); }) ``` これで一応動きました。 動いたのですがコンソール画面にmessageCreateを使えと書いてあったのですがこれはどうしたらいいですか? ``` (node:4727) DeprecationWarning: The message event is deprecated. Use messageCreate instead (Use `node --trace-deprecation ...` to show where the warning was created) ```
Kawachan99

2022/03/09 00:21 編集

No1. client.on("message" ~~~~というのはmessageクラスで何かのイベントが起きたときに、ボットくんにあれこれしろ!という内容を書くものです。なので、settimeoutを使用してもそのときにメッセージに関するeventがなかったらボットくんは何も反応してくれません。 setTimeoutで特定の時間に動作を行いたいのであれば setTimeout(() => client.guilds.cache.get('ギルドID').channels.cache.filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0).forEach(c => c.members.every(m => m.voice.disconnect()), new Date().setHours(0, 33, 0, 0) - new Date()); この様な形になります。動作確認なし No2. 主さんのdiscord.jsのバージョンが時代遅れなのでバージョンを最新にしたときに動かなくなるよとnode君が警告しています。 なので、私が使用しているv13.6.0のdiscord.jsを使用するとeventの名前がmessageCreateでないと動きません。
grapeapi

2022/03/09 01:36 編集

discord.jsとnodeをインストールし直して最新にしてNo1を試してみましたが、このようなエラーが出ました。 TypeError: Cannot read properties of undefined (reading 'channels') channelsをなんとかすればいいのでしょうか? 無知ですいません。
Kawachan99

2022/03/09 01:58

ギルドIDの箇所にdiscordサーバーのIDを入れましたか?'2342346332456' <-こんな感じのIDです。
grapeapi

2022/03/09 02:08

サーバーのIDはサーバー設定のウィジェットにあるサーバーIDですよね? 入れたのですがまだエラーが出ます。
Kawachan99

2022/03/09 02:10

現在の全体のコードを見せていただけますか?
grapeapi

2022/03/09 02:15

const express = require("express") const app = express() app.get("/",(req, res) =>{ res.send("ready") }) app.listen(3000, () => { console.log("the project is ready") }) let Discord = require("discord.js") let client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] }) setTimeout(() => client.guilds.cache.get('サーバーID').channels.cache.filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0).forEach(c => c.members.every(m => m.voice.disconnect()), new Date().setHours(2, 2, 0, 0) - new Date())) client.login(process.env.token)
Kawachan99

2022/03/09 02:33

えっとですね。 client.on('ready', (client) => { ここにコードを書かないといけないです } 上記でも述べたように何かのイベントが行われないとbot君は実行してくれません
grapeapi

2022/03/09 05:16

やってみます。 何かあったらここでコメントします。
grapeapi

2022/03/09 15:04

すみませんサンプルの方を編集してしまいました。 自分なりに直しましたがこれであっていますか?
Kawachan99

2022/03/09 21:54

えっと、修正していただいたrepl.itのrepoのurlを共有していただかないとこちらからは確認できません。 右上あたりにshareボタンみたいなのがあると思われます。
grapeapi

2022/03/10 00:29 編集

https://replit.com/@KawaProg/Sample-21#index.js これでしょうか。 ちょっとだけ変えたら動きました。 client.on('ready', () => { setTimeout(() => client.guilds.cache.get('サーバーID') .channels.cache .filter(c => c.type === 'GUILD_VOICE' && c.members.size !== 0) .forEach(c => c.members.every(m => m.voice.disconnect())), new Date().setHours(0, 28, 0, 0) - new Date()); })
Kawachan99

2022/03/10 03:39

replitは自分で編集したものを自分のrepoに保存してそのurlを送ってもらわないとこちらからは見れません。 それで、おそらく大丈夫です。 あと、時間指定をするのであれば、インスタンスを作ってするより単純にmsで指定したほうがよろしいかと思います。 setTimeout( hander, 1000) 上記のような形です。 詳しくはMDNを見てください。 https://developer.mozilla.org/en-US/docs/Web/API/setTimeout
grapeapi

2022/03/10 07:19

長々とお付き合いいただきありがとうございました。
guest

0

コマンドを打ったらmember.voice.setChannel(null)を実行するようにコードを書いたら、コマンドを打った人のみ切断された。

それって打ったひとが切断されるってだけのはなしでは
他人を切断させるのは無理ってことなんでは

投稿2022/02/26 01:13

編集2022/02/26 01:19
y_waiwai

総合スコア87749

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

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

grapeapi

2022/02/26 06:21

他人を切断させるのは、人間にはできてbotにはできないということなんですかね。
y_waiwai

2022/02/26 06:34

少なくともそのコードでは他人は無理ということなんでは? どこからそれを引っ張ってきたかはしりませんが。 で、人間はできるんでしょうか?
grapeapi

2022/02/26 07:04

権限与えればできます。
y_waiwai

2022/02/26 07:11

それ、BANするってことでしょ あなたのやりたいことはそういうことなんですか? 接続している人全員そこからBANさせるってこと?
grapeapi

2022/02/26 07:37

BANではありません。 私のやりたいことはボイスチャットから全員切断させることです。
y_waiwai

2022/02/26 07:53

BOTごときにそういう事ができるなら、アラシさんが嫌がらせやり放題ってことになってしまうんで、そもそもできないってことなんでしょうね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問