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

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

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

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

Python

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

Q&A

解決済

1回答

1487閲覧

Discord BotでDMとサーバーのメッセージを分けて待つ仕組みがわからない

mochizuki_grand

総合スコア2

Discord

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

Python

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

0グッド

0クリップ

投稿2021/11/10 09:11

以下のURLで質問した時の回答でソースコードの通りの解決策が提示されたのですが、
プログラムを理解できていません。
is_dmとis_same_userにTrueが入らないと続行できない仕組みなのはわかりますが、

check関数の戻り値の使い方、wait_for文の引数のcheck=checkの意味が分からないです。

Python初心者というか、プログラミング初心者ですので丁寧に教えていただければ幸いです。
※環境は下記URLと同じですので参考までに

解決策が提示された質問

Python

1def check(waited_message): 2 is_dm = type(waited_message.channel) == discord.DMChannel 3 is_same_user = waited_message.author == message.author 4 return is_dm and is_same_user 5 6 #各評定割合を入力 7 await message.author.send('課題評価割合を入力(半角)') 8 kadai_persent = await client.wait_for('message',check=check)

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

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

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

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

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

guest

回答1

0

ベストアンサー

同回答者です。
wait_for関数についてのドキュメントに沿って説明させて頂きます。

check関数の設計

check関数は以下の二つが両方trueであればtrueを、そうでなければfalseを返すように設計しています。

  • 受け取ったメッセージがdmで送信されているかどうか(@commands.dm_only()はコマンドがdmだけで使用できるようにするもので、wait_forが待つメッセージの種類を制限するものではないです。)
  • 受け取ったメッセージの送信者がhsコマンドを送信したユーザーと一致しているかどうか

wait_for文の引数のcheck=checkの意味

「wait_for関数の引数のcheck=checkの意味」として解釈しておきます。
check=check の左側はcheckという引数に値を渡したいと宣言するために書いています。(詳しくはキーワード引数と位置引数でググってください。)
check=check の右側は前述したcheck関数を表しています。wait_for関数はcheckに渡す値に関数を求めるように定義されている(リファレンス参照)ようなので、関数自体を渡してあげます。ちなみに、check()にすると戻り値のtrue, falseが渡ってしまうのでつけてはいけません。

check関数の使い方

こちら側はwait_for関数にcheck関数を渡しただけなので、wait_for関数がゴニョゴニョやってくれてます。なのでwait_for関数が使うって感じです。しいていうなら、「wait_for関数のcheck引数にcheck関数を渡すという使い方」になるのかな。

関数を貰う側(今回ならwait_for関数)を高階関数、引数として渡す側(今回ならcheck関数)をコールバック関数と言ったりします。

投稿2021/11/28 14:48

編集2021/11/30 13:52
Tai4

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問