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

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

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

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

Q&A

2回答

2930閲覧

Discord.pyにてボイスチャンネルとテキストチャンネルの判別ができない

yukugura

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2021/08/22 02:35

編集2021/08/22 06:25

前提・実現したいこと

Discord.pyにてBOTの作成を始めたPython初心者です。
Discord鯖にBOTが参加した際にその鯖のボイスチャンネルのみのIDだけ取得し、
それを配列の中に格納し、VCに人が参加したり抜けた時にその入退室ログを「vclog」という
テキストチャンネルに送りたいのですが、どうして良いのかわかりません。
監視するボイスチャンネルと入退室ログを送るテキストチャンネルのチャンネルIDを手動で設定し、
BOTを動かすことはできたのですが、これでは毎度IDで指定しなくてはならず非常に不便です。

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

判別の方法がわからない。

該当のソースコード

Python

1#入退室ログBOT 2import discord 3from time import sleep 4 5client = discord.Client() 6 7#vclog.txtのファイルパス 8vclogpath = "/mnt/share/vclog.txt" 9 10#入退室ログの表示を行うチャンネルのID 11logch = 878058288883834951 12#testVC_870078948246171708 13 14#監視するVCのチャンネルID 15acvc01 = 872387756381319178 16#testVC_VC_847993185254113314 17acvc02 = 856780992958431232 18#testVC_test_878057066286153788 19acvc03 = 849616978021056532 20acvc04 = 853495690026418206 21acvc05 = 870151770159054849 22acvc06 = 876407340528697375 23 24# 起動時処理 25@client.event 26async def on_ready(): 27 #コンソールへの起動通知と追記処理 28 for channel in client.get_all_channels(): 29 print("----------") 30 print("チャンネル名:" + str(channel.name)) 31 print("チャンネルID:" + str(channel.id)) 32 print("----------") 33 #チャンネル名とIDの追記 34 with open(vclogpath, mode="a", encoding="utf-8") as fout: 35 fout.write("Name:" + str(channel.name) + "___") 36 fout.write("ID:" + str(channel.id) + "\n") 37 fout.write("----------\n") 38 39##########入退室ログの表示 40@client.event 41async def on_voice_state_update(member, before, after): 42 43 #チャンネルへの入室ステータスが変更されたとき(ミュートON、OFFに反応しないように分岐) 44 if before.channel != after.channel: 45 #logを書き込むテキストチャンネル(チャンネルID) 46 botRoom = client.get_channel(logch) 47 48 #監視するボイスチャンネル(チャンネルID) 49 announceChannelIds = [acvc01, acvc02, acvc03, acvc04, acvc05, acvc06] 50 51 #退室log 52 if before.channel is not None and before.channel.id in announceChannelIds: 53 await botRoom.send("**" + before.channel.name + "** を__" + member.name + "__ が抜けました!" + " ID_" + str(member.id)) 54 print(member.name + "_が_" + before.channel.name + "_をLeft" + "___ID_" + str(member.id)) 55 with open(vclogpath, mode="a", encoding="utf-8") as fout: 56 fout.write(member.name + "_が_" + before.channel.name + "_をLeft" + "___ID_" + str(member.id) + "\n") 57 58 #入室log 59 if after.channel is not None and after.channel.id in announceChannelIds: 60 await botRoom.send("**" + after.channel.name + "** へ__" + member.name + "__ が参加しました!" + " ID_" + str(member.id)) 61 print(member.name + "_が_" + after.channel.name + "_にJoin" + "___ID_" + str(member.id)) 62 with open(vclogpath, mode="a", encoding="utf-8") as fout: 63 fout.write(member.name + "_が_" + after.channel.name + "_Join" + "___ID_" + str(member.id) + "\n") 64 65client.run()#←BOT-token

上記のソースコード

上記のソースコードでBOT起動時にチャンネルの名前とIDを取得できますが、
ボイスチャンネルとテキストチャンネルの判別ができません。

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

discord.py
Python3.9.1

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

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

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

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

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

koucha0

2021/08/22 03:35

少し整理させていただきたいのですが、 やりたいこととしては ・ユーザーがどこかしらのVCに参加 ・それを特定のチャンネルにメッセージを送る というような形かと思います。 その、「ログ」の内容は具体的に何が送信できれば良いとお考えでしょうか...? 例えば、ボイスチャンネル名や、ユーザーなど具体的なものを教えていただけると幸いです????
yukugura

2021/08/22 04:18

回答ありがとうございます。 わかりにくい質問内容で本当にすみません。 VCの入退室ログを表示するBOTの作成を目指しています。 監視対象のVCと入退室ログを表示するテキストチャンネルのIDを手動で設定することで、 目的の動作をさせることには成功しているのですが、IDで指定しているため他のサーバーでも使用する場合に毎度IDを入力する必要が出てきます。これをなんとかしたいと考えています。 https://www.youtube.com/watch?v=wvCl4TgsZhs
koucha0

2021/08/22 04:38

では、目的の動作をさせることに成功しているコードを追記していただければ回答しやすいかと思います。
yukugura

2021/08/22 06:31

先程「該当のソースコード」の部分を修正いたしました。
guest

回答2

0

python

1announceChannelIds = [acvc01, acvc02, acvc03, acvc04, acvc05, acvc06]

これに該当するチャンネルにしか反応されないようになっているので、
これ以外のチャンネルも反応するために

python

1 #入室log 2 if after.channel is not None:

として、 and after.channel.id in announceChannelIdsというふうにすれば限定されません。

次にログチャンネルですが、
もし監視したい複数のサーバーの「ログチャンネル名」が同じであれば、

python

1#ログチャンネル取得 2logch = discord.utils.get(after.channel.guild.voice_channels, name="ログのチャンネル名")

とすることで、それぞれのサーバーに対応できると思います。

投稿2021/08/22 06:42

koucha0

総合スコア72

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

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

yukugura

2021/08/22 22:42

回答ありがとうございます。 こういうことでしょうか?すみません。 ```Python ##########入退室ログの表示 @client.event async def on_voice_state_update(member, before, after): #チャンネルへの入室ステータスが変更されたとき(ミュートON、OFFに反応しないように分岐) if before.channel != after.channel: #logを書き込むテキストチャンネル(チャンネルID) botRoom = discord.utils.get(after.channel.guild.voice_channels, name="vclog") #監視するボイスチャンネル(チャンネルID) announceChannelIds = [acvc01, acvc02, acvc03, acvc04, acvc05, acvc06] #退室log if before.channel is not None: await botRoom.send("**" + before.channel.name + "** を__" + member.name + "__ が抜けました!" + " ID_" + str(member.id)) print(member.name + "_が_" + before.channel.name + "_をLeft" + "___ID_" + str(member.id)) with open(vclogpath, mode="a", encoding="utf-8") as fout: fout.write(member.name + "_が_" + before.channel.name + "_をLeft" + "___ID_" + str(member.id) + "\n") #入室log if after.channel is not None: await botRoom.send("**" + after.channel.name + "** へ__" + member.name + "__ が参加しました!" + " ID_" + str(member.id)) print(member.name + "_が_" + after.channel.name + "_にJoin" + "___ID_" + str(member.id)) with open(vclogpath, mode="a", encoding="utf-8") as fout: fout.write(member.name + "_が_" + after.channel.name + "_Join" + "___ID_" + str(member.id) + "\n") ```
koucha0

2021/08/23 11:19

はい、それでやってみてください
yukugura

2021/08/24 09:04

VCに参加すると以下のメッセージが表示され、 Ignoring exception in on_voice_state_update Traceback (most recent call last): File "C:\Users\makot\AppData\Roaming\Python\Python39\site-packages\discord\client.py", line 343, in _run_event await coro(*args, **kwargs) File "Y:\Development-or-Study\Python\入退室ログBOT.py", line 62, in on_voice_state_update await botRoom.send("**" + after.channel.name + "** へ__" + member.name + "__ が参加しました!" + " ID_" + str(member.id)) AttributeError: 'NoneType' object has no attribute 'send' VCを抜けると以下のメッセージが表示されずうまくできませんでした. Ignoring exception in on_voice_state_update Traceback (most recent call last): File "C:\Users\makot\AppData\Roaming\Python\Python39\site-packages\discord\client.py", line 343, in _run_event await coro(*args, **kwargs) File "Y:\Development-or-Study\Python\入退室ログBOT.py", line 48, in on_voice_state_update botRoom = discord.utils.get(after.channel.guild.voice_channels, name="vclog") AttributeError: 'NoneType' object has no attribute 'guild'
guest

0

https://discordpy.readthedocs.io/ja/latest/api.html#textchannel

チャンネルオブジェクトには全てtypeという属性がありますので、これで判断します。

追記
その他の部分は内容がよく分からないでの、とりあえず主題と思われる「ボイスチャンネルとテキストチャンネルの判別」部分だけの回答です。

投稿2021/08/22 03:38

編集2021/08/22 03:41
udon-ken

総合スコア657

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問