안 쓰던 블로그

[디스코드봇] 이모지를 누르면 봇이 반응하기2 (wait_for()사용) 본문

언어/파이썬 디스코드봇

[디스코드봇] 이모지를 누르면 봇이 반응하기2 (wait_for()사용)

proqk 2020. 9. 11. 19:46
반응형

이전 글: foxtrotin.tistory.com/277

저번 글에서 썼던 코드는 몇 가지 문제가 있었다

 

1. 다른 사람이 반응을 눌러도 봇이 반응한다

2. 반응을 취소했다가 다시 누르면 또 반응한다

3. 메시지를 올릴 때마다 중복된다

 

해결 방법은 다음과 같다

 

1->if문으로 현재 message에 반응한 유저와 명령어를 실행한 유저가 동일 인물인지 확인

2->try문으로 한 번만 실행하게 한다

3->유저가 반응하면 바로 끝나고, 반응하지 않으면 일정 시간 뒤 자동 종료한다

 

@client.event
async def on_message(message):
    if message.content.startswith('!thumb'):
        channel = message.channel
        await channel.send('👍 리액션을 해 주세요')

        def check(reaction, user):
            return user == message.author and str(reaction.emoji) == '👍'

        try:
            reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check)
        except asyncio.TimeoutError:
            await channel.send('👎')
        else:
            await channel.send('👍')

check()는 대기할 대상을 확인하는 함수이다

return문에 있는 조건을 만족하는 사람의 반응을 대기하게 된다

 

wait_for()은 코루틴 함수로, websocket이벤트가 전달되기를 기다린다

사용 방법은 wait_for(event, *, check=None, timeout=None) 이렇다

timeout을 설정하면 해당 시간이 지났을 때  timeout에러를 뿜는다(docs.python.org/3/library/asyncio-exceptions.html#asyncio.TimeoutError )

 

 

실행하고 리액션을 하면 봇도 반응해 준다

설정한 시간이 지나면 끝났다고 반응한다

반응형
Comments