根據前篇的方式,
試做一個類式投票的內容。
本人想用slash_command去觸發,
因為如果有錯誤,不會像command留有命令字樣。
但slash_command 在輸入參數時,
如有換行的內容比較處理不利,
所以想用discord.ui.Modal 來處理內容。
在實作時,我找尋了不依靠新套件來觸發,
但偶爾會出現 沒有 add_reaction 的function 所以無法添加的訊息。
所以我找了原檔整理一下可以觸發的情境,
首先:
add_reaction 只有是訊息才能觸發
discord.Message.add_reaction
callback ctx: discord.ext.commands.context
傳出訊息的函式為 send ,
而 RETURN TYPE: Message
所以是可以直接操作的。
callback ctx:discord.ApplicationContext
而在函式裡面為傳出訊息我認識的有大概3個:
respond
send_modal
send_response
(這三個一定要發一個,要不然 Interaction 會判斷沒回傳,但也可以額外再發ctx.send())
回傳皆為 Interaction 是一個互動而非訊息。
所以需要取得它的訊息。
original_response()
original_message()
皆可。
class MyModal(discord.ui.Modal):
def __init__(self, title, embTitle, embNum):
super().__init__(title=title)
self.add_item(discord.ui.InputText(label="標題", value=embTitle, required=True))
self.add_item(discord.ui.InputText(label="內容", style=discord.InputTextStyle.long, placeholder="詳細介紹投票內容", required=True))
self.add_item(discord.ui.InputText(label="選項數量", value=embNum, required=True))
async def callback(self, interaction: discord.Interaction):
embed = discord.Embed(title=f"{self.children[0].value}", description=f"{self.children[1].value}")
resp = await interaction.response.send_message(embeds=[embed])
request = await resp.original_response()
for emoji in range(int(self.children[2].value)):
await request.add_reaction(emojis[emoji + 1])