如何在Discord机器人模态框中获取用户display_name?
Discord机器人模态框获取用户display_name及密码笔记功能修复
核心问题拆解
- 模态框类定义阶段没有用户交互上下文,直接在这里执行文件读取、获取用户信息的操作完全无效。
add函数里的file_name属于局部变量,模态框类没法直接访问,得通过实例化时传参解决。- 验证密码和写入笔记时,错误直接引用类的
TextInput属性,实际应该取用户输入的value值。
修正后的完整代码
import os import discord from discord import ui @Client.tree.command(name="add", description="Adds a new note") async def add(interaction: discord.Interaction): # 用display_name生成文件名,匹配你要获取的用户昵称 file_name = f"{interaction.user.display_name}.txt" if not os.path.isfile(file_name): await interaction.response.send_message("You do not have a personal Notes file.") return # 实例化模态框时把文件名传进去 modal = Add(file_name=file_name) await interaction.response.send_modal(modal) class Add(ui.Modal, title='Add Note'): # 初始化方法接收外部传递的文件名 def __init__(self, file_name: str): super().__init__() self.file_name = file_name # 在这里读取密码,此时已经拿到了对应用户的文件 with open(self.file_name, 'r') as file: self.pwd = file.readline().strip() # 去掉换行符,避免验证时出错 Password = ui.TextInput(label='Enter password') Note = ui.TextInput(label='Enter your Note', style=discord.TextStyle.paragraph) async def on_submit(self, interaction: discord.Interaction): # 在这里直接获取用户的display_name,这是正确的上下文 user_display_name = interaction.user.display_name print(user_display_name) # 取用户输入的密码内容 input_pwd = self.Password.value.strip() if input_pwd != self.pwd: await interaction.response.send_message(f'You entered a wrong password', ephemeral=True) else: note_content = self.Note.value with open(self.file_name, 'a') as file: # 可以把用户名加到笔记里,方便区分 file.write(f"\n[{user_display_name}] {note_content}") await interaction.response.send_message(f'Note Added', ephemeral=True)
关键修复说明
- 上下文传递:在
add函数里实例化模态框时,把生成好的file_name传给模态框的初始化方法,解决跨函数变量访问问题。 - 正确读取密码:把读取密码的操作放在模态框的
__init__方法里,确保此时已经拿到了对应用户的文件路径。 - 获取用户昵称:在
on_submit方法中,通过interaction.user.display_name直接拿到当前提交模态框的用户昵称,这是官方推荐的正确方式。 - 获取输入内容:必须通过
self.Password.value和self.Note.value获取用户在模态框里输入的内容,直接引用类属性拿不到用户输入值。 - 处理换行符:读取和输入密码时用
strip()去掉多余换行,避免文件里的换行导致密码验证失败。
内容的提问来源于stack exchange,提问作者Callmemartin_
相关产品推荐
相关产品推荐

