You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键修复说明

  1. 上下文传递:在add函数里实例化模态框时,把生成好的file_name传给模态框的初始化方法,解决跨函数变量访问问题。
  2. 正确读取密码:把读取密码的操作放在模态框的__init__方法里,确保此时已经拿到了对应用户的文件路径。
  3. 获取用户昵称:在on_submit方法中,通过interaction.user.display_name直接拿到当前提交模态框的用户昵称,这是官方推荐的正确方式。
  4. 获取输入内容:必须通过self.Password.value和self.Note.value获取用户在模态框里输入的内容,直接引用类属性拿不到用户输入值。
  5. 处理换行符:读取和输入密码时用strip()去掉多余换行,避免文件里的换行导致密码验证失败。

内容的提问来源于stack exchange,提问作者Callmemartin_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:37:21