【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 を増やしてやればいい。
一応、これで意図した答えのみを受け付けるようにしています。