10. 입력(이벤트) 기다리기

chaejm55·2021년 4월 8일
1

디스코드봇

목록 보기
12/18
post-thumbnail

0. 들어가기 전에

이번엔 봇이 유저의 입력(이벤트)를 기다리는 기능을 만들어 보겠다. 대부분의 상황에서는 메시지를 입력 받는데 사용하지만, 이벤트(reaction 추가 등)을 기다리는 것이기 때문에 다양한 상황에서 사용이 가능하다.

1. async wait_for()

Websocket event가 발생하는 것을 기다리는 메서드이다. timeout을 사용하여 시간제한을 둘 수있고, check 메서드로 조건을 지정해야한다. 지정한 이벤트 중 가장 먼저 발생하는 이벤트를 반환한다.
공식문서에 두 가지 예시가 있다.
예전 방식의 코드라 약간의 유의가 필요하다.

2. 코드 예시

5초간 입력을 기다리고, 시간이 초과 되면 오류 메시지를 출력하는 커맨드이다.

import random
import asyncio

@bot.command(name="기다리기")
async def wait(ctx):
    timeout = 5 // 기다릴 시간 정하기
    send_message = await ctx.send(f'{timeout}초간 기다립니다!')

    def check(m): // check 메서드 정의
        return m.author == ctx.message.author and m.channel == ctx.message.channel // 같은 채널에서 같은 메시지를 보낸 사람의 이벤트를 체크

    try: // 5초간 기다림
    	// 이벤트 입력 시 앞의 'on_'은 떼고 입력함
        msg = await bot.wait_for('message', check=check, timeout=timeout)
    except asyncio.TimeoutError: // 5초가 지나면 TimeoutError 발생
        await ctx.send(f'시간초과 입니다...({timeout}초)')
    else: // 5초 안에 'on_message' 이벤트 수신 시
        await ctx.send(f'{msg.content}메시지를 {timeout}초 안에 입력하셨습니다!')

1) 시간 초과

2) 시간 안에 입력

3. 마무리

유저의 입력(이벤트)를 기다려서 응답하는 방법을 알아봤다. 이번엔 딱히 발생할 오류가 없기에 발생할 법할 오류를 작성하지는 않았다. wait_for() 메서드로 유저의 필요에 알맞게 반응해보자.

github 전체 코드

time.sleep(259200)
profile
여러가지를 시도하는 학생입니다

0개의 댓글