변명은 만개 결과는 한개

[Discord] bot.command 와 on_message 같이쓰기 본문

공부/Discord

[Discord] bot.command 와 on_message 같이쓰기

노마십가 2020. 9. 3. 02:27
728x90
반응형

결론은 포스트 최하단에 있습니다 :)


서론

처음에 디스코드 python 봇 코드를 본 뒤 조금 만지작 거리다 의아했던점은

@bot.command()
@bot.eventon_message 이벤트는 같이 쓰지 못하는걸까?

였다.

그도 그럴것이,

1
2
3
4
5
6
7
8
9
@bot.command()
async def ABC(ctx):
    print("ABC 커맨드 호출 :)")
    pass
 
@bot.event
async def on_message(message):
    print("on_message 이벤트 호출 :)")
    pass
cs

 

일때, ABC 커맨드는 호출되지 않고 on_message 이벤트만 호출되었기 때문이다.

아니면,

@bot.command()@bot.event 가 양립하지 못하는건가? ㅎㅎ

까지 생각까지 했었으나,

 

그 생각은 이내 텍스트의 이모지 처리를 위해 on_raw_reaction_add 이벤트를 @bot.command() 와 같이 사용하다보니 자연스레 접어졌다.

 


본론

그렇게 잊고 살다가...


별 생각없이 기존에 구현해놓은 특정 커맨드가 있는 파일에 @bot.event - on_message 이벤트를 통해 처리하는 새로운 동작을 구현하였는데, 기존 커맨드가 동작하지 않는다는 리포팅을 받았다.

 

이전에도 서론에서 의아해 하였던 궁금증을 구글링해보긴 하였지만 둘중에 한가지 함수만을 가지고 처리하기 충분하였고, 그때그때 마음에 드는 방식으로 처리하였다.

 

하지만 이번에 오기가 생겨 구글링해보니 bot.process_commands(message) 라는 훌륭한 코루틴 함수가 있었으며, 이는 기본적으로 on_message 함수를 override 하지 않는이상 on_message 에 들어가 호출되며, override 한 경우에는 직접 invoke하여 사용해야한다고 한다.

 

@bot.event - on_message 를 불러 사용하는경우, @bot.command() 를 사용하고싶다면 원하는 타이밍에 bot.process_commands(message) 를 호출하라는것! :)

 

참고로, 코루틴 함수이기때문에 await 로 호출해주셔야합니다!


결론

아래는 위 사항을 참고하여 새로 짠 코드입니다 :)

1
2
3
4
5
6
7
8
9
@bot.command()
async def 커맨드(ctx):
    # 커맨드 action code
 
@bot.event
async def on_message(msg):
    # on_message action codes ...
 
    await bot.process_commands(msg)
cs

 

한가지 명심해야할게, on_message 에서 구현해놓은 코드중에 bot.process_commands 에 닿기 전에 return 되는 경우, return 전에 호출해주면 좋을것같다 :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@bot.command()
async def 커맨드(ctx):
    # 커맨드 action code
 
@bot.event
async def on_message(msg):
    if something:
        # another action codes ...
        await bot.process_commands(msg)
        return
 
    # on_message action codes ...
 
    await bot.process_commands(msg)
cs

이렇게!

 

 


혹시 글 내용중에 틀리거나 충분히 더 나은 방법이 있다면 댓글로 공유해주세요!
읽어주셔서 감사합니다:)

728x90
반응형