본문 바로가기

프로그래밍/discord.py

discord.py 4편 - modal, args

모달이란

https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8B%AC_%EC%9C%88%EB%8F%84

 

모달 윈도 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

라고 하는데 백문이불여일견 이라는 말이 있듯이 글로 보는것보다 그냥 직접 써보는게 더 빠르다.

@tree.command(guild= discord.Object(id=GUILD_ID),name="modal", description="modal 만들기")
async def mkmodal(interaction:Interaction):
  class ModalExample(ui.Modal,title="모달"):
    answer = ui.TextInput(
      label="모달명1",
      style=discord.TextStyle.short, # long
      placeholder="설명",
      default="안녕하세요"
    )
    async def on_submit(self, interaction: Interaction):
      await interaction.response.send_message(self.answer)
  await interaction.response.send_modal(ModalExample())

이건 전송 버튼을 누르면 on_submit 이라는 함수가 작동한다.

self.answer는 위에서 만든 answer 라는 변수를 불러온것이고 당연하게도 다른 변수명으로 여러개를 만든다면 

이렇게 여러개를 설정할수도 있다. 

모달을 이용한다면 긴 문자를 입력받을때나 설문조사등 여러곳에 쓸수 있다.

 

 

또한 discord.py 에서 자체적으로 지원하는 기능이 있는데 그것은 바로 인수(arguments)라고 하는 녀석을 받아줄수 있는데 이게 활용방법이 무궁무진하다 다른건 몰라도 이건 알아야된다. 전에 했던 버튼에 적용해보자면

이런식으로 활용이 가능하다.

@tree.command(guild= discord.Object(id=GUILD_ID),name="button", description="button 만들기")
async def mkbutton(interaction:Interaction,버튼이름:str):
  button = ui.Button(style=ButtonStyle.green,label=버튼이름,disabled=False)
  view = ui.View()
  view.add_item(button)
  async def button_callback(interaction:Interaction):
    await interaction.response.edit_message(content="버튼 눌러짐!")
  button.callback=button_callback
  await interaction.response.send_message(view=view)

기본적으로 async def 함수명(interaction:Interaction,인수이름:타입) 인데 여기서 타입을 안정해줘버리면 에러가 나기때문에 꼭 타입을 입력해야한다. 

이걸 보는 사람들은 다 파이썬을 알겠지만 혹시나 모르는 사람이 있을까봐 적는다.

int : 정수

float : 실수

bool : 참거짓

str : 문자

 

또한 저런식으로 인수를 설정하면 값을 무조건 입력해야한다. 하지만 필수인수가 아닌 인수를 만드려면 어떻게 해야할까?

async def mkbutton(interaction:Interaction,버튼이름:str="안녕하세요"):

그저 뒤에다가 = 하고 값을 넣어주기만 하면 인수값을 지정하지 않고 명령어를 쓰더라도 명령어는 잘 작동한다. 여기서 주의할 점은 = 를 붙여서 필수인수가 아니게된 인수들은 필수인수 앞에 올수 없다.

async def mkbutton(interaction:Interaction,버튼이름:str="안녕하세요",hello:int): #에러

async def mkbutton(interaction:Interaction,hello:int,버튼이름:str="안녕하세요"): #정상

근데 여기서 문제가 있다. 나는 저 인수에 사람들이 빨강,파랑,초록,노랑,주황 만 입력할수 있게 하고싶다.

그럴때는 어떻게 할수 있을까? 그것은 외부라이브러리를 끌어오면된다.

이번엔 embed로 가보자

from enum import Enum

class ArgumentColors(Enum):
  빨강=discord.Color.red()
  초록=discord.Color.green()
  파랑=discord.Color.blue()
  노랑=discord.Color.yellow()
  주황=discord.Color.orange()
  
@tree.command(guild= discord.Object(id=GUILD_ID),name="embed", description="embed 만들기")
async def mkembed(interaction:Interaction,색:ArgumentColors):
  embed = discord.Embed(title="제목",color=색.value) #name:오른쪽, value:왼쪽 빨간색을 골랐다면 name은 빨강 value는 discord.Color.red()
  embed.add_field(name="하위요소1",value="값1",inline=True)
  embed.add_field(name="하위요소2",value="값2",inline=True)
  embed.add_field(name="하위요소3",value="값3",inline=False)
  #embed.set_thumbnail(url=url)
  embed.set_footer(text="글아래")
  await interaction.response.send_message(embed=embed)

이렇게 하면 사용자들이 뻘짓을 못하게 사전에 차단할 수 있다.

'프로그래밍 > discord.py' 카테고리의 다른 글

discord.py 6편 - 함수  (0) 2022.08.17
discord.py 5편 - 더 이쁘게 하기  (0) 2022.08.16
discord.py 3편 - button , select  (0) 2022.08.16
discord.py 2편 - embed  (0) 2022.08.16
discord.py 1편  (0) 2022.08.16