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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7404閲覧

Discord.py ボイスチャンネルの移動をしたい

kkrn

総合スコア15

Discord

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/21 13:39

前提・実現したいこと

前提
・Discord.pyを使って開発しています。
・OS:CentOS8
※必要なライブラリ等は入っています。

やりたいこと
・ボイスチャンネルに接続して指定の音声を再生したい。

できること
・ボイスチャンネルに接続して、音声を再生すること

できないこと(実現したいこと)
・ボイスチャンネルにBotが接続しているときに
そのBotが接続している別のチャンネルに移動して音声を再生するコマンドを送信し
Botが自分のチャンネルに来て音声を再生する。
※それ以外の機能は正常に動作しています。

・おそらくチャンネルを移動するメソッド等も用意されていると思います。
もしそれもご存知の方がいればご教授いただければ幸いです。

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

Ignoring exception in on_message Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event await coro(*args, **kwargs) File "main.py", line 33, in on_message elif message.author.voice_channel.is_connected() == True: AttributeError: 'Member' object has no attribute 'voice_channel'

該当のソースコード

import discord TOKEN = "~~" fastHunt = "!" client = discord.Client() @client.event async def on_ready(): ~~ @client.event async def on_message(message: discord.Message): ~~ if message.content == fastHunt + "join": if message.author.voice is None: await message.channel.send("あなたはボイスチャンネルに接続していません。") return if message.guild.voice_client is None: await discord.VoiceChannel.connect(message.author.voice.channel) elif message.author.voice_channel.is_connected() == True: await message.channel.send("切断しました。") await discord.VoiceChannel.connect(message.author.voice.channel) message.guild.voice_client.play(discord.FFmpegPCMAudio("voice/1.mp3")) elif message.content == fastHunt + "!leave": if message.guild.voice_client is None: await message.channel.send("接続していません。") return ~~

試したこと

elif message.author.is_connected() == True:

のように、該当の個所をわかる範囲で書き換えたりしました。

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

elif message.author.voice_channel.is_connected() == True: await message.channel.send("切断しました。") await discord.VoiceChannel.connect(message.author.voice.channel)

を削除すると正常と思われる

ClientException -- You are already connected to a voice channel.

が出ます。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

接続

python

1await discord.VoiceChannel.connect(message.author.voice.channel)

ではなく

python

1await message.author.voice.channel.connect()

です。
discord.VoiceChannel.connect はVoiceChannelのインスタンスにそのメソッドがあるよということなので、message.author.voice.channel.connectになります。

同じVCにいるか

「VCに接続されている」かつ「そのVCにBotがはいっている」を実装するには、

python

1elif message.author.voice_channel.is_connected() == True:

python

1elif message.author.voice is not None and message.guild.me in message.author.voice.channel.members:

にします。

VCの移動

他人を移動するにはMember.move_to、自分を移動するにはVoiceClient.move_toを使います。

python

1 elif message.author.voice is not None and message.guild.me in message.author.voice.channel.members: == True: 2 await message.channel.send("切断しました。") 3 await message.author.voice.channel.connect()

python

1 elif message.author.voice is not None and message.guild.me not in message.author.voice.channel.members: 2 await message.channel.send("移動しました。") 3 await message.guild.voice_client.move_to(message.author.voice.channel)

にします。

投稿2021/01/21 20:56

編集2021/01/22 07:05
sevenc-nanashi

総合スコア643

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

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

kkrn

2021/01/21 23:48

回答ありがとうございます。 1.同じVCにいるかの判定についてエラーが出てしまいました。 Ignoring exception in on_message Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event await coro(*args, **kwargs) File "/root/work/hoshikawa_voice/main.py", line 55, in on_message elif message.author.voice is not None and message.guild.me in message.author.voice.channel: TypeError: argument of type 'VoiceChannel' is not iterable message.author.voice is not None and を削除して試してみましたが、ダメでした。 私の調べた限りでは型違い?らしいんですが、Bean(?)を見る方法がわかりませんでした。 2.ボットが音声を再生しているかを判定できるのでしょうか 調べてみてもわからなかったことで、もしご存知でしたらご教授いただけないでしょうか。 お手すきの際に回答いただければ幸いです。
sevenc-nanashi

2021/01/22 07:06

==1== .membersを忘れていました。ごめんなさい。 ==2== ボットが音声を再生しているかを判定できるのでしょうか VoiceClient.is_playing()があります。 この場合はmessage.guild.voice_client.is_playing()が使えます。
kkrn

2021/01/22 22:06 編集

ありがとうございます!BA上げられず申し訳ないです。 message.author.voice.channel.members is not None and message.guild.me in message.author.voice.channel.members: ということでしょうか?これだと、チャンネルを移動していても、既存のチャンネルで再生されているようで移動してくれませんでした。すいません。 また message.guild.voice_client.is_playing() については、 NoneType' object has no attribute 'is_playing' となってしまいます。
kkrn

2021/01/22 22:05 編集

あ!なるほど! message.author.voice.channel.members is not None and not message.guild.me in message.author.voice.channel.members: で動きました!お手数をおかけしました。本当にありがとうございます。
guest

0

自己解決

解決法↓
とりあえずボットのチャンネルと自分のチャンネルが同じかどうかで判定することにしました。

質問外↓
移動するときの機能はわかりませんでした。
あと、音声が再生されていたらという判定も必要だと思ったんですけど、結局無理でした。

投稿2021/01/21 18:35

kkrn

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問