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 Portal → message_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
결과
반응형
'Discord > Discord Bot Python' 카테고리의 다른 글
디스코드 봇 - 유튜브 음악 재생 봇 설정 및 실행 방법 (1) | 2024.06.05 |
---|---|
Examples - 디스코드 봇 길드 기본(discord py) (0) | 2023.08.13 |
Discord 봇 만들기 - Link and Search (0) | 2023.06.21 |
Discord 봇 만들기 - Dropdown (0) | 2023.06.16 |
디스코드 봇 개발 시 Error 관련 (2) | 2023.05.30 |