Closed4

d.pyのmodalの仕様/動作とそれに合わせたいい感じのコードを考える

hawk_tomyhawk_tomy

Modalの仕様

discord.pyのModalで使用する側が関数を与えられるものとしてon_submiton_erroron_timeoutがある。
それぞれ、on_submitはユーザーからの送信があった時、on_erroron_submit内でエラーがあった時、on_timeoutはModalに与えたtimeoutがNoneではなくて、かつModalの場合はModalの送信後にその秒数分経過した時、に実行される。

hawk_tomyhawk_tomy

Modalの仕様を試す

pipx runとかでテスト用のコードを実行して仕様を見てみる。

一応ここにも貼る。

先に書いた仕様の通りに動いた。(つまり、テキストを書いて送信ボタンを押して処理に成功する時、同失敗する時、送信ボタンをtimeoutの時間押さない時の三つ。)
また、モーダルを表示した直後にモーダルを閉じても何も起こらない(今回であればタイムアウトするのみ)。

hawk_tomyhawk_tomy

これを踏まえて、モーダルとモーダルを送信するボタンのよさげな実装を考える(他の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にある値が入力された値としてテキストの入力がされたと処理すればよい。
hawk_tomyhawk_tomy

とりあえずここまでの分をもとに、手を動かしてみた。
こんな感じになった。

一応ここにも(略

いくつか手を動かす中で追加された欲しい仕様とか、本題ではない改善点とかはあるものの、求めていたものは出来たのでとりあえずクローズでよさそう。

このスクラップは2ヶ月前にクローズされました