반응에 의한 직책 부여, 면도

우선 소개



이 기사는 해외의 개발자님 Anson 님의 코드를 일본어로 조금 알기 쉽게 해설한 것이 됩니다. 또, 본인에게의 확인을 허가를 받고 있기 때문에 2차 배포를 금지해, 개인 이용에만 사용 가능하게 합니다.

원본 소스 게재 페이지
본인의 해설 동영상

개요



여기 최근 Discord의 Bot 개발에 몰두하고 있습니다만, 자주(잘) 대형의 서버에 들어 있는 bot로 리액션을 붙이면 직책이 부여되는 아레, 어떻게 하면 잘 실현할 수 있을까...라고 고민하면서 command.commands 녀석을 살펴보거나 뭐든지 여러가지 찾아보는 건 좋지만, 똑같이 하고 좋을 만큼 확실히 오는 파이썬용 일본어 기사가 없었어요. 그래서 내가 조사한 해외 개발자 Anson님의 코드를 일부 변경한 것을 게재, 간단한 해설을 망비록으로.

필자의 환경



전회의 기사와 변함없이입니다만 일단.
  • Windows10
  • Pycharm Community Edition
  • 파이썬 3.7.4
  • discord.py 1.2.4

  • 전제 조건



    이쪽도 전회와 변함없이 python과 discord.py가 움직이는 환경이 있는 전제로 이야기합니다.
    없어, 라는 분은 각자 조사해 주세요. 여기서는 전혀 설명하지 않습니다.
    또, 같은 이름의 커스텀 이모티콘과 직책이 없으면 이하의 bot에서는 직책을 부여할 수 없으므로 사전에 설정해 두십시오.

    * 예
    *



    주제


    import discord
    
    client = discord.Client()
    
    
    @client.event
    async def on_raw_reaction_add(payload):
    
        if payload.message_id == ID:
    
            print(payload.emoji.name)
            guild_id = payload.guild_id
            guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)
    
            role = discord.utils.find(lambda r: r.name == payload.emoji.name, guild.roles)
    
            if role is not None:
                print(role.name + " was found!")
                print(role.id)
                member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members)
                await member.add_roles(role)
                print("done")
    
    
    @client.event
    async def on_raw_reaction_remove(payload):
        if payload.message_id == ID:
            print(payload.emoji.name)
    
            guild_id = payload.guild_id
            guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)
            role = discord.utils.find(lambda r: r.name == payload.emoji.name, guild.roles)
    
            if role is not None:
                member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members)
                await member.remove_roles(role)
                print("done")
    
    
    @client.event
    async def on_ready():
        print("Botは正常に起動しました!")
        print(client.user.name)  # ボットの名前
        print(client.user.id)  # ボットのID
        print(discord.__version__)  # discord.pyのバージョン
        print('------')
        await client.change_presence(activity=discord.Game(name="役職を管理!"))
    
    client.run("TOKEN")
    

    이쪽이 됩니다. 이번에는
    on_raw_reaction_add(payload)
    

    그리고
    on_raw_reaction_remove(payload)
    

    키가됩니다.

    그럼 조금이지만 간단한 해설을 아래에.

    간단한 해설



    코멘트 아웃 쪽에 해설을 써 받습니다.
    @client.event
    async def on_raw_reaction_add(payload):
        # メッセージにリアクションが追加されたときに以下の動作が呼び出されます
    
        if payload.message_id == ID:
            # ここでリアクションを追加して欲しいメッセージをあらかじめ設定しておきます(IDに該当メッセージのIDをコピペしてください)
    
            guild_id = payload.guild_id
            guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)
    
            role = discord.utils.find(lambda r: r.name == payload.emoji.name, guild.roles)
    

    lambda 함수의 경우
    htps : // 이 m / 나가타 아 아 / ms / 531b1fc5 세 42 아 791c7df
    (nagataaaas님의 기사)를 읽으면 이해할 수 있다고 생각합니다.
            if role is not None:
                # 対応する役職があった場合以下の動作を行います
    
    @client.event
    async def on_raw_reaction_remove(payload):
        # メッセージからリアクションが削除されたときに呼び出されます
    
        if payload.message_id == ID:
        # IDには先ほどon_raw_reaction_add(payload)の方で使ったIDと同じものを利用してください。
    

    이런 건가요? 유사한 설명의 코드는 생략했습니다.

    마지막으로



    discord.py의 일본어 기사는 적은 or version이 오래된 것이 많네요 ...
    이 bot에 관해서도 구현하고 싶다 ...하지만 일본어의 기사에서 그것 같은 것은 발견되지 않고 ... 초학자 분이라도 이것하고 싶지만 그것 같은 것 찾을 수 없어! 그건 문서 읽어도 모르겠어! 라는 분은 해외를 참고로 해 보는 것은?

    다시 한번, 이번 참고로 하신 사이트나 개발자님의 URL을 실어 〆하고 생각합니다.

    Anson의 youtube 채널
    공식 문서의 on_raw_reaction_add (payload) 페이지
    nagataaaas님의 Qiita 페이지

    좋은 웹페이지 즐겨찾기