【discord.py】wait for 関数 条件設定~特定の数字しか受け付けない~事例

discord.py のwait_for 関数は、メッセージやリアクションがある迄処理を待機する関数だ。


そのwait_for 関数の条件設定で、ある特定のワードがくるまで、待機
=別のワードが来ても受け付けない方法の一例を紹介する。

環境
python 3.9 64-bit
discord.py 1.7.3



    def check(a):
       return a.channel == ctx.channel and a.author.id != BotID
   try:
       a = await bot.wait_for("message", check=check, timeout=120)
   except asyncio.TimeoutError:
       await ctx.message.channel.send(f'時間切れです')
       sys.exit()
   else:
     ・・・・・・・


check 関数で待機中の処理を再開させる条件を設定する。

今は、単純にメッセージを送られると再開され、

そのメッセージが、コマンドを起動させたチャンネルと同じチャンネルからメッセージが送られること
そして、メッセージの送り主がBotでないことだ。


これでは、例えば ”くぁzwsぇdc”と打っても再開される。


私は、今回Botの対話式のプログラムの中で、

Bot 
以下から数字を入力してください。
1.りんご 2.なし 3.ばなな 4.かき 5.ぶどう

〇〇
1

Bot
次に、~~~の中から数字を入力してください。
・・・・・

のように、Botの誘導の下、こちらは数字を選んでいき、最後選んだ数字の内容をすべて返すものを考えている。


まずこちらが返すメッセージは「1、2、3、4、5」のいずれかを想定している。 
リスト形式で、~~にあたる内容を記載し、入力された数字にあわせてリスト要素を抽出して、別の変数で代入。

List = ["りんご", "なし", "ばなな", "かき", "ぶどう"]
# aは入力された数字
# リスト要素は0スタートのため、入力された数字-1のリスト要素が、選んだものになる

answer = List[a-1]



ただ、a に想定しているもの以外のものがくるとその時点でエラーになる。

「1、2、3、4、5」以外の数字の時点で、望んでいるものが得られない。
6以上であれば、要素は5個のため、指定されたものがない。
負の要素があるが、後ろから(右から)数える要素を指定するため、ずれてしまう。

もちろん、文字列の時点でエラーを吐き出す。


そのため、以下のようにした。

def check(a):
    aid = a.content.isdigit()
       if aid == True :
           return c.channel == ctx.channel  and c.author.id != BotID and 1 <= a <= 5
       
   try:
       a = await bot.wait_for("message", check=check, timeout=120)
   except asyncio.TimeoutError:
       await ctx.message.channel.send(f'時間切れです')
       sys.exit()
   else:
     ・・・・・・・
   
   

check関数内でまず、a.content.isdigit() にて、入力されたものが整数かどうか判断している。

そして、if構文でa.content.isdigit()が数字=True であれば、return の内容を返り値として返すことになる。

このIf構文は、”くぁzwsぇdc”のようなものを弾くためにいれている。

そして、入力されたものが整数である以上、「1、2、3、4、5」に限定するにはcheckに 1 <= a <= 5 を増やしてやればいい。


一応、これで意図した答えのみを受け付けるようにしています。

noteの内容に共感していただければ、ぜひともサポートを宜しくお願いします。今後の記事投稿の励みになります。