如何使用Pycord存储Modal字段值(关闭后保留至提交)?
在Pycord中保留模态框字段值的实现方案
由于Discord API本身不提供模态框关闭事件,也不会实时同步用户输入内容,我们只能通过持久化存储用户提交过的内容,让用户下次打开模态框时自动填充之前的输入。以下是具体实现步骤:
1. 初始化存储容器
在bot实例化后,添加一个全局字典用于保存每个用户的模态框数据:
import discord import pytz bot = discord.Bot() # 存储用户模态框数据:键为用户ID(int),值为包含输入字段的字典 bot.user_modal_data = {}
2. 修改Modal类,支持默认值填充
修改MyModal3类,在初始化时接收默认值并设置给输入框,同时在提交时更新存储:
class MyModal3(discord.ui.Modal): def __init__(self, default_dias="", default_motivo="") -> None: super().__init__(title="Comunicado de Ausência") # 第一个输入框:设置默认值 self.add_item(discord.ui.InputText( label="Quantos dias ficará ausente?", placeholder="Digite aqui", style=discord.InputTextStyle.long, min_length=2, max_length=100, default=default_dias )) # 第二个输入框:设置默认值 self.add_item(discord.ui.InputText( label="Digite o motivo:", placeholder="Digite aqui", style=discord.InputTextStyle.long, min_length=10, max_length=100, default=default_motivo )) async def callback(self, interaction: discord.Interaction): # 获取当前用户输入的内容 dias_input = self.children[0].value motivo_input = self.children[1].value # 将输入内容保存到全局存储中 bot.user_modal_data[interaction.user.id] = { "dias": dias_input, "motivo": motivo_input } # 生成并发送嵌入消息 embed = discord.Embed(title="Registro de Ausência 🗒️", color=discord.Color.blurple()) embed.add_field(name="👮 | Registrado por:", value=interaction.user.mention, inline=False) embed.add_field(name="```🗓️ | Dias ausente:```", value=dias_input, inline=False) embed.add_field(name="```📋| Motivo:```", value=motivo_input, inline=False) embed.set_thumbnail(url=interaction.user.avatar.url) channel = bot.get_channel(1161789446262378566) await channel.send(embed=embed) # 给用户发送提交成功的反馈 await interaction.response.send_message("Registro salvo com sucesso!", ephemeral=True)
3. 修改Slash命令,加载用户历史数据
在打开模态框前,先从存储中读取用户之前提交的数据,作为默认值传入Modal:
brasilia = pytz.timezone('America/Sao_Paulo') @bot.slash_command(guild_ids=servers, name="ausência", description="Utilize este comando para registrar os dias que ficará ausente.") async def ausencia(ctx): # 获取用户历史数据,无数据则用空字符串 user_history = bot.user_modal_data.get(ctx.author.id, {"dias": "", "motivo": ""}) # 初始化模态框并传入默认值 modal = MyModal3(default_dias=user_history["dias"], default_motivo=user_history["motivo"]) await ctx.interaction.response.send_modal(modal)
注意事项
- 这种方式只能保存用户提交过的内容,如果用户输入内容后未提交就关闭模态框,临时输入的内容无法被保存(Discord API不提供此类事件)。
- 上述存储是内存级的,重启bot后数据会丢失。如果需要持久化保存,可以改用数据库(如SQLite、MongoDB)或本地文件存储。
内容的提问来源于stack exchange,提问作者Zecadaxx
相关产品推荐
相关产品推荐

