본문 바로가기
Discord/Discord Bot Python

Examples - Ephemeral, Confirm

by 깐테 2023. 7. 20.

https://discordpy.readthedocs.io/en/latest/interactions/api.html?highlight=ui#bot-ui-kit

 

아래 코드에서 사용되는 ui 커맨드는 위 공식 문서를 참조한다.

 

 

Examples - Ephemeral

  • 개인만 확인할 수 있는 메시지로 클릭 버튼을 전송하고 동작하도록 하는 예제
  • 오직 커맨드를 입력한 사람에게만 표시되며, 다른 사람은 볼 수 없다.
  • Discord Developer Portal → Message Content 활성

해당 코드에서는 사용자가 버튼을 클릭하면 개인 메시지로 클릭할 수 있는 버튼이 활성화 된다.
이후 해당 버튼을 5회 클릭하면 버튼이 비활성 처리된다.

소스 코드

# This example requires the 'message_content' privileged intent to function.
from tokenize import Token
from discord.ext import commands

import discord
from dico_token import Token

class EphemeralCounterBot(commands.Bot):
    def __init__(self):
        intents = discord.Intents.default()
        intents.message_content = True

        super().__init__(command_prefix=commands.when_mentioned_or('$'), intents=intents)

    async def on_ready(self):
        print(f'Logged in as {self.user} (ID: {self.user.id})')
        print('------')

# Define a simple View that gives us a counter button
class Counter(discord.ui.View):

    # Define the actual button
    # When pressed, this increments the number displayed until it hits 5.
    # When it hits 5, the counter button is disabled and it turns green.
    # note: The name of the function does not matter to the library

    # 5회 클릭하면 disable 처리.
    @discord.ui.button(label='0', style=discord.ButtonStyle.red)
    async def count(self, interaction: discord.Interaction, button: discord.ui.Button):
        number = int(button.label) if button.label else 0
        if number + 1 >= 5:
            button.style = discord.ButtonStyle.green
            button.disabled = True
        button.label = str(number + 1)

        # Make sure to update the message with our updated selves
        await interaction.response.edit_message(view=self)

# Define a View that will give us our own personal counter button
class EphemeralCounter(discord.ui.View):
    # 명령어를 입력하면 클릭 버튼이 활성화된다.
    # 클릭 버튼을 누르는 순간 Interaction 메시지를 이용해 Ephemeral로 전달된다.
    @discord.ui.button(label='클릭!', style=discord.ButtonStyle.blurple)
    async def receive(self, interaction: discord.Interaction, button: discord.ui.Button):
        # ephemeral=True makes the message hidden from everyone except the button presser
        await interaction.response.send_message('5회 클릭하고 확인해 보세요!', view=Counter(), ephemeral=True)

bot = EphemeralCounterBot()

@bot.command()
async def counter(ctx: commands.Context):
    """Starts a counter for pressing."""
    await ctx.send('클릭해 보세요!', view=EphemeralCounter())

bot.run(Token)
  • EphemeralConunter : ephemeral 활성 클래스
  • view: Counter() 사용.

 

 

결과

 

 

 


 

 

Examples - Confirm

  • 사용자가 버튼을 누르면 해당하는 버튼에 맞게 반응.
  • 봇을 이용한 서버 승인이나 취소와 관련한 기능으로 사용할 수 있을듯?
  • ephemeral → True로 설정하면 개인 사용자만 확인, False로 설정하면 전체 사용자 모두가 확인 가능.
  • Discord Developer Portalmessage_content → intents에 체크가 되어있어야 사용 가능

 

소스코드

# This example requires the 'message_content' privileged intent to function.
from discord.ext import commands

import discord
from dico_token import Token

# intents 사용. 봇 초기화
class Bot(commands.Bot):
    def __init__(self):
        intents = discord.Intents.default()
        intents.message_content = True

        super().__init__(command_prefix=commands.when_mentioned_or('$'), intents=intents)

    async def on_ready(self):
        print(f'Logged in as {self.user} (ID: {self.user.id})')
        print('------')

# Confirmation 메뉴를 정의.
class Confirm(discord.ui.View):
    def __init__(self):
        super().__init__()
        self.value = None

    # When the confirm button is pressed, set the inner value to `True` and
    # stop the View from listening to more input.
    # We also send the user an ephemeral message that we're confirming their choice.

    # ephemeral을 True로 설정하면 개인만 확인 가능한 일시적인 메시지를 설정 할 수 있다.
    @discord.ui.button(label='Confirm', style=discord.ButtonStyle.green)
    async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_message('승인되었습니다.', ephemeral=True)
        self.value = True
        self.stop() # 버튼 동작 수행을 중지.

    # ephemeral을 False로 설정하면 서버 내 모든 사용자에게 메시지를 전달한다.
    @discord.ui.button(label='Cancel', style=discord.ButtonStyle.grey)
    async def cancel(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_message('사용자가 취소하였습니다.', ephemeral=True)
        self.value = False
        self.stop()

bot = Bot()

@bot.command()
async def ask(ctx: commands.Context):
    """Asks the user a question to confirm something."""
    # We create the view and assign it to a variable so we can wait for it later.
    view = Confirm()
    await ctx.send('계속 진행하시겠습니까?', view=view)
    # Wait for the View to stop listening for input...
    await view.wait()
    if view.value is None:
        print('시간이 초과되었습니다....')
    elif view.value:
        print('승인되었습니다. 승인된 사용자:{0.author.name}'.format(ctx))
    else:
        print('취소되었습니다.')

bot.run(Token)

 

- 해당 코드의 라이브러리가 없다고 출력되는 경우 discord-ui 설치.
pip install discord-ui

 

 

결과

반응형