ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디스코드 봇 만들기 (5) - 사용할 수 있는 이벤트 알아보기 (1)
    IT/파이썬 응용 프로그래밍 2021. 9. 23. 12:06
    728x90
    SMALL

    앞의 1,2,3,4 편에서는 디스코드 봇을 세팅하고, 구동시켜봤다면 이번 편에서는 어떤 활용할만한 이벤트들이 있는지 알아볼 것이다.

     

    1. 봇의 상태 설정하기

    처음 봇을 활성화시키면 아래와 같이 봇이 온라인 상태로 되어있을 것이다. 이 봇의 상태를 바꿀 수 있는 이벤트가 있다.

    @bot.event
    async def on_ready():
        game = discord.Game("개발")
        await bot.change_presence(status=discord.Status.idle, activity=game)

    on_ready() 이벤트는 봇이 처음 구동될 때 발생되는 이벤트이다. 이 때 활동 상태를 discord.Game()으로 설정해줄 수 있다. 임시로 "개발"이라는 활동 상태를 넣어보았다. 그 후 봇을 재시작해보면, 아래와 같이 상태가 변한다.

    그런데, 자리비움 상태로 표시 되고 있다. 이 상태는 status가 idle로 설정되어 있기 때문에 이렇게 나오므로, status 부분을 바꿔주면 해결된다. 설정할 수 있는 status의 종류는 여러 개가 있다.

     

    - discord.Status.idle : 자리비움

    - discord.Status.online : 온라인

    - discord.Status.offline : 오프라인

    - discord.Status.dnd : 다른 용무 중

    - discord.Status.do_not_disturb : 다른 용무 중

    - discord.Status.invisible : 오프라인

     

    설정하고 싶은 상태에 따라서 설정해주면 된다.

     

    2. 입 / 퇴장 이벤트

    멤버가 join하거나 서버를 나갔을 때는 on_member_join(), on_member_remove() 이벤트가 발생된다.

    intents = discord.Intents.all()
    intents.members = True
    
    
    @bot.event
    async def on_member_join(member):
        msg = "안녕하세요!"
        await member.send(msg) # 개인 DM으로 보내기
        channel = bot.get_channel('Your Channel Id')
        await channel.send(msg) # channel에 보내
    
    
    @bot.event
    async def on_member_remove(member):
        msg = "안녕히가세요!"
        channel = bot.get_channel('Your Channel Id')
        await channel.send(msg)

    그런데, 이걸 하기 전에 반드시 해줘야 하는 작업이 intents라는 거를 설정해주어야 한다. 실제로 discord api reference에도 on_member_join()과 on_member_remove()를 사용하기 전 Intents를 반드시 설정하라고 명시되어있다.

    문서를 보고 싶다면 아래 링크를 참조하자.

    (https://discordpy.readthedocs.io/en/stable/api.html#event-reference)

    위의 코드에서 channel id만 바꿔서 넣어주면 멤버 입 퇴장시 알림을 보내는 것을 알 수 있다.

     

    3. 채팅 창에 타이핑 이벤트

    멤버가 디스코드 서버 채팅 창에 타이핑을 하면 발생되는 이벤트이다. 

    @bot.event
    async def on_typing(channel, user, when):
        print(channel) # 채널 이름
        print(user) # 유저 닉네임
        print(when) # 날짜 및 시간

    실제로, 디스코드 채팅창에 채팅을 쳐보면 로그에 채널 이름, 유저 닉네임, 날짜 / 시간이 찍히는 것을 확인 할 수 있다.

     

    4. 메시지가 삭제되었을 때 이벤트 

    메시지를 삭제하게 되면 발생되는 이벤트이다.

    # 메시지 삭제 이벤트
    @bot.event
    async def on_message_delete(message):
        print(message)

    message 파라미터는 삭제된 메시지로, 어떤 메시지가 삭제되었는지 알 수 있다.

     

    5. 메시지가 수정되었을 때 이벤트

    메시지가 수정되면 발생하는 이벤트이다. before, after 변수로 수정되기 전, 후를 알 수 있다.

    @bot.event
    async def on_message_edit(before, after):
        print(before)
        print(after)

    한가지 재밌는 점은 메시지를 고정(pin)시키거나 고정을 해제했을 때도 해당 이벤트가 발생한다.

     

    6. 리액션이 추가되었을 때 이벤트

    메시지에 리액션이 추가되면 발생되는 이벤트이다.

    @bot.event
    async def on_reaction_add(reaction, user):
        print(reaction)
        print(user)

    어떤 유저가, 어떤 리액션을 추가했는지 알 수 있다.

     

    7. 리액션이 제거되었을 때 이벤트

    메시지에 리액션이 제거되었을 때 발생하는 이벤트이다.

    @bot.event
    async def on_reaction_remove(reaction, user):
        print(reaction)
        print(user)

    이 이벤트 역시 어떤 유저가 어떤 리액션을 제거했는지 알 수 있다.

     

    8. 모든 리액션 제거 이벤트

    메시지에서 모든 리액션이 제거됐을 때 발생하는 이벤트이다.

    @bot.event
    async def on_reaction_clear(message, reactions):
        print(message)
        print(reactions)

     

    9. 특정 이모지 제거 이벤트

    특정 이모지가 제거 되었을 때 발생하는 이벤트이다.

    @bot.event
    async def on_reaction_clear_emoji(reaction):
        print(reaction)

     

    10. 프라이빗 채널 생성 이벤트

    프라이빗 채널이 생성되었을 때 발생하는 이벤트이다.

    @bot.event
    async def on_private_channel_create(channel):
        print(channel)

     

    11. 프라이빗 채널 제거 이벤트

    프라이빗 채널이 제거 되었을 때 발생하는 이벤트이다.

    @bot.event
    async def on_private_channel_delete(channel):
        print(channel)

     

    우선 최근에 실험해본 이벤트는 여기까지이다. 기타 다른 이벤트들은 다음 편에서 또 포스팅하도록 하겠다.

    이 외에도 정말 다양한 이벤트들이 있다. 유저가 밴 되었을 때, 유저 정보가 업데이트 되었을 때 등등 여러가지 이벤트가 있다. 여기 포스팅된 이벤트를 보고 더 상세하게 알고싶은 점이 있다면 discord api reference를 참조하면된다.

    (https://discordpy.readthedocs.io/en/stable/api.html#event-reference)

     

    728x90
    LIST

    댓글

Designed by Tistory.