반응형
Notice
Recent Posts
Recent Comments
Link
안 쓰던 블로그
[디스코드봇] 이모지를 누르면 봇이 반응하기2 (wait_for()사용) 본문
반응형
이전 글: 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 )
실행하고 리액션을 하면 봇도 반응해 준다
설정한 시간이 지나면 끝났다고 반응한다
반응형
'언어 > 파이썬 디스코드봇' 카테고리의 다른 글
[디스코드봇] 봇이 특정 메시지에 메시지로 반응하기 (2) | 2020.09.11 |
---|---|
[디스코드봇] 이모지를 누르면 봇이 반응하기 (15) | 2020.09.07 |
[디스코드봇] 메시지를 이쁘게 출력하기 embed (0) | 2020.09.07 |
[디스코드봇] 봇 프로필에 ~하는 중이라고 표시하기 (0) | 2020.09.07 |
[디스코드봇] 봇이 이모지로 반응하기 (0) | 2020.09.07 |
Comments