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

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

ただいまの
回答率

88.92%

Discord.pyのwait_forを実行しても望んだ結果が得られません

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 235

crepscolo

score 1

前提・発生している問題

Discord.pyでDiscordのbot作成を試みています。
wait_forを使いユーザーのリアクションを待って反応を返したいのですが、
リアクションを返してもタイムアウトとなってしまい望んだ結果が得られません。
お力を貸していただけないでしょうか。

該当のソースコード

import discord
import asyncio
from discord.ext import commands

emojis = ["{}\N{COMBINING ENCLOSING KEYCAP}".format(num) for num in range(1, 10)]

@bot.event
async def on_message(message):
    if message.content.startswith('$thumb'):
        channel = message.channel
        await channel.send('Send me that' + emojis[0] + 'reaction, mate')

        def check_emj(reaction, user):
            emj = str(reaction.emoji)
            return (user == message.author) and (emj == emojis[0]) or (emj == emojis[1])

        try:
            reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check_emj)
        except asyncio.TimeoutError:
            await channel.send(emojis[2])
        else:
            if str(reaction.emoji) == emojis[0]:
                await channel.send(emojis[5])
            if str(reaction.emoji) == emojis[1]:
                await channel.send(emojis[4])

試したこと

def check_emjのreturn以下に問題があるかと思い、括弧で括ってみたりしたのですがダメでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

これでどうでしょうか?
わざわざreturnに絵文字条件を含めなくてもelse内で分岐すればいいと思われます。
下に例を出しておきますのでご確認ください

def check(reaction,user):
    return user == message.author
try:
    reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
except asyncio.TimeoutError:
    await channel.send('タイムアウト')
else:
    if str(reaction.emoji) == '1⃣': #どの絵文字を使いたいのか分かってません、おそらくこれ?
        await channel.send('1の絵文字が押されたよ'):

一点質問とは関係ないですが、discord.botを使うならcommand使ったほうがやりやすいと思います

emojis = ["{}\N{COMBINING ENCLOSING KEYCAP}".format(num) for num in range(1, 10)]
これ本当にユニコードなんでしょうか?自分もそこまで詳しくないので何とも言えないですが、\NはPython内では改行として認識されていると思われます。(システム上逆スラッシュが\になってしまっています)

効率化するよりもelse内にif,elif...書いていくほうがいいです
どうしても効率化したいのなら

def create_unicode(num):
    return str(num)+r'\N{COMBINING ENCLOSING KEYCAP}'
def check(reaction,user):
    return user == message.author
try:
    reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
except asyncio.TimeoutError:
    await channel.send('タイムアウト')
else:
    for i in range(1,10):
        unicode = create_unicode(i)
        if str(reaction.emoji) == 'unicode':
            await channel.send(str(i)+'の絵文字が押されたよ')
            continue
        else:
            pass

こんな感じで関数にすることをお勧めします

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/29 17:17

    とても詳細かつ丁寧な回答、ありがとうございます。
    絵文字も分かりづらい表記をしてしまい、失礼いたしました。

     先ず、ご回答頂きましたコードで思った通りの反応が得られました。

     当方IDLEのみを使ってコード作成を行っており、1⃣の絵文字を使うとIDLEがクラッシュしてしまうため
    どこかのサイトで見かけた["{}\N{COMBINING ENCLOSING KEYCAP}".format(num) for num in range(1, 10)]を使って1⃣~9⃣を出力していました。

     まだDiscord.botを作り始めて間もなく、関数に関してもまだ理解不足ですので、書いてくださった補足情報をじっくり読み込んで今後に活かせればと思っております。(elifの存在もここ数日で知りました…)

     今回は本当にありがとうございました。

    キャンセル

  • 2020/07/29 17:19

    お役に立ててよかったです
    関数などの基礎知識を身に付けるには
    https://tutorials.chainer.org/ja/tutorial.html
    こちらのサイトがおすすめです

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る