質問するログイン新規登録
Discord

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

Python 3.x

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

Python

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

Q&A

1回答

623閲覧

discord.pyでの条件分岐に関して

mashingan0302

総合スコア0

Discord

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/06/24 11:26

0

0

実現したいこと

・discord.pyで、ユーザーがbotをメンションすると起動し、その後に「チーム分け」もしくは「ちーむわけ」を含むメッセージを送ったときだけ、処理を実行するbotを作りたい

前提

discord.pyを使用してdiscord でチーム分けbotを作成する。ユーザーがbotをメンションすると起動し、その後に「チーム分け」もしくは「ちーむわけ」を含むメッセージを送ったときだけ、処理を実行する。

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

botが起動した後に、ユーザーが無関係の文字列を送った際にもチーム分けのプログラムが実行されてしまう

該当のソースコード

python

1@client.event 2async def on_message(message): 3 4 channel = message.channel #メッセージが送信されたチャンネルを取得し、変数に格納する 5 6 if message.author.bot: #メッセージの送信元がbotの場合、何も実行しない 7 return 8 9 #メンションでbotが起動 10 if client.user.mentioned_in(message): 11 await message.channel.send("おはよー...なにするー...?") 12 try: 13 nextMessage = await client.wait_for("message",timeout = 30) #メッセージが30秒入力されなかった場合タイムアウトさせる 14 str(nextMessage.content) #入力された文字列をint型に変換 15 16 #str型に変換できない文字列が入力された場合 17 except ValueError: 18 await message.channel.send("しらないことばー...さいしょからやりなおしてー...") #メッセージを送信 19 return ##処理の終了 20 21 #その他のエラーが発生した場合 22 except: 23 await message.channel.send("つかれたー...ねるー...") #メッセージを送信 24 return ##処理の終了 25 26 if "できること" in message.content: 27 await message.channel.send("こずえはねー...ちーむわけができるよー...") 28 await message.channel.send("つぎはなにするー?") 29 30 if message.content == "おやすみ": 31 await message.channel.send("おやすみー...ぷろでゅーさーもねろー...") 32 return 33 34 35 #チーム分け機能 36 if "チーム分け" or "ちーむわけ" in message.content: #「チーム分け」を含むメッセージが送信されたときに以下のコードを実行 37 if message.author.bot: #メッセージの送信元がbotの場合、何も実行しない 38 return 39 40 voice_channel = message.author.voice.channel #メッセージの送信者が入っているボイスチャンネルを取得 41 await message.channel.send("ふわぁ...ちーむわけー...するー...") #メッセージを送信 42 43 #ボイスチャンネルに入っているメンバーをリスト化して、ランダムに並べ替える 44 attendee = voice_channel.members #ボイスチャンネルに入っているメンバーを取得 45 attend_member = [attendee.name for attendee in attendee] #メンバーをリスト化する 46 print(attend_member) #デバック用、ボイスチャンネルの参加者を表示 47 teamL = random.sample(attend_member, len(attend_member)) #参加者をランダムに並べ替える 48 49 await message.channel.send("ちーむはいくつつくるー...?") #メッセージを送信、割り振りたいチーム数を要求 50 51 print(type(message.content)) #デバック用、入力されたメッセージのデータ型を確認 52 print(message.content) #デバック用、入力されたメッセージを確認 53 54 #想定外のメッセージが入力された時の処理 55 try: 56 nextMessage = await client.wait_for("message",timeout = 30) #メッセージが30秒入力されなかった場合タイムアウトさせる 57 int(nextMessage.content) #入力された文字列をint型に変換 58 59 #int型に変換できない文字列が入力された場合 60 except ValueError: 61 await message.channel.send("しらないことばー...さいしょからやりなおせー...") #メッセージを送信 62 return ##処理の終了 63 64 #その他のエラーが発生した場合 65 except: 66 await message.channel.send("ふわぁ...ねむたい...ねちゃだめー...ねるー...") #メッセージを送信 67 return ##処理の終了 68 69 print(nextMessage.content) #デバック用、入力された文字列を表示 70 teamNum = int(nextMessage.content) #入力された文字列をint型に変換 71 print(teamNum) #デバック用、変換した文字列を表示 72 print(type(teamNum)) #デバック用、変換した文字列のデータ型を表示 73 74 #チームに割り振り不可能な値が入力された場合 75 if teamNum > len(teamL): #メンバーの数より多かった場合 76 await message.channel.send("ちーむすう...おおいー...ねむくなってきたー") 77 return #処理の終了 78 elif teamNum == 0: #0だった場合 79 await message.channel.send("0ちーむにはわけられないよー...") 80 return 81 elif teamNum < 0: #その他の想定外の数値が入力された場合 82 await message.channel.send("このかずにはわりふれないよー...") 83 return #処理の終了 84 85 #以下、メンバーを任意のチーム数に割り振る処理 86 team = [[] for i in range(teamNum)] #多次元リスト内に、入力された値分の空のリストを作る 87 print(team) #デバック用、作成した多次元リストを表示 88 89 #それぞれの空のリストに、メンバーを割り振っていく 90 A = 0 91 while A <= teamNum: 92 for i in teamL: 93 if teamL.index(i) % teamNum == A: #teamL内の要素を番号に置き換えて処理する。割り算の余りがいくつになるかで各チームに振り分ける 94 team[A].append(teamL.index(i)) #チームごとに別のリストにメンバーを振り分ける。 95 A += 1 96 97 print(team) #デバック用、チームごとに振り分けられてるかの確認 98 99 #チームごとに割り振った結果をメッセージにして送信する 100 N = 0 101 while N < teamNum: 102 await message.channel.send(f'🌸ちーむ{N + 1}🌸') 103 for i in team[N]: 104 await message.channel.send(teamL[i]) 105 N += 1 106

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

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

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

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

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

guest

回答1

0

この回答はGPT-4による自動生成回答です

問題は、if "チーム分け" or "ちーむわけ" in message.content: という条件文です。これは、"チーム分け"True と評価されるため、常に True になります。正しい条件文は以下のようになります。

python

1if "チーム分け" in message.content or "ちーむわけ" in message.content:

また、nextMessage を使用している部分では、message を使用しているため、ユーザーが入力したメッセージが反映されません。nextMessage.content を使用するように修正してください。

修正後のコードは以下のようになります。

python

1@client.event 2async def on_message(message): 3 4 channel = message.channel 5 6 if message.author.bot: 7 return 8 9 if client.user.mentioned_in(message): 10 await message.channel.send("おはよー...なにするー...?") 11 try: 12 nextMessage = await client.wait_for("message",timeout = 30) 13 str(nextMessage.content) 14 15 except ValueError: 16 await message.channel.send("しらないことばー...さいしょからやりなおしてー...") 17 return 18 19 except: 20 await message.channel.send("つかれたー...ねるー...") 21 return 22 23 if "できること" in nextMessage.content: 24 await message.channel.send("こずえはねー...ちーむわけができるよー...") 25 await message.channel.send("つぎはなにするー?") 26 27 if nextMessage.content == "おやすみ": 28 await message.channel.send("おやすみー...ぷろでゅーさーもねろー...") 29 return 30 31 if "チーム分け" in nextMessage.content or "ちーむわけ" in nextMessage.content: 32 # 以下のコードは変更なし

これで、ユーザーが無関係の文字列を送った際にチーム分けのプログラムが実行されなくなります。

投稿2023/06/24 11:26

teratail-ai

Powered by GPT-4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問