Closed4
d.pyのmodalの仕様/動作とそれに合わせたいい感じのコードを考える
Modalの仕様
discord.pyのModalで使用する側が関数を与えられるものとしてon_submit
とon_error
とon_timeout
がある。
それぞれ、on_submit
はユーザーからの送信があった時、on_error
はon_submit
内でエラーがあった時、on_timeout
はModalに与えたtimeoutがNoneではなくて、かつModalの場合はModalの送信後にその秒数分経過した時、に実行される。
Modalの仕様を試す
pipx runとかでテスト用のコードを実行して仕様を見てみる。
一応ここにも貼る。
先に書いた仕様の通りに動いた。(つまり、テキストを書いて送信ボタンを押して処理に成功する時、同失敗する時、送信ボタンをtimeoutの時間押さない時の三つ。)
また、モーダルを表示した直後にモーダルを閉じても何も起こらない(今回であればタイムアウトするのみ)。
これを踏まえて、モーダルとモーダルを送信するボタンのよさげな実装を考える(他のinteractionで送信してもよいがとりあえずボタンで送信する時を考える)。
前提条件は、モーダルはボタンで送信されることと、このモーダルは必ずテキストの入力を受け取らなければならないということ。
とりあえず思いつくのは次の通り。
- ModalのtimeoutはNoneでよい。
- 入力に時間がかかってでも受け取る必要があるから
- ViewのtimeoutもNoneでよい。
- モーダルを間違って閉じたときに開きなおすにはViewのボタンが動く必要があるから
- ModalのtimeoutをNoneとするなら
on_timeout
の実装の必要はない - Modalの
on_error
は、on_submit
をバグらせたときにのみ必要となるため、必要に応じての実装でよい。 - Modalは、ボタンを押されるごとに起動しかつ送信ボタンが押された以降は反応できないため、on_submitの内部で
self.stop()
を呼び出してよい。 - ボタンが押されてモーダルを送信した後に、最初の
on_submit
が呼び出された時、もしくは最初に(ひとつ前のそれによる)Modal.wait()
が値を返した時に、そのModalにある値が入力された値としてテキストの入力がされたと処理すればよい。
このスクラップは2ヶ月前にクローズされました