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

Discord嵌入编辑系统两处功能异常问题排查求助

问题1:Footer编辑提交后无法重新打开编辑模态框

报错信息

2023-11-01 20:00:18 ERROR    discord.ui.view Ignoring exception in view <MainView timeout=180.0 children=4> for item <Button style=<ButtonStyle.secondary: 2> url=None disabled=False label='Edit Footer' emoji=None row=None>
Traceback (most recent call last):
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ui\view.py", line 427, in _scheduled_task
    await item.callback(interaction)
  File "c:\Users\trace\Desktop\MU LFG\lfg bot\main.py", line 181, in edit_footer
    await interaction.response.send_modal(footer(original_embed=interaction.message.embeds[0]))
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\interactions.py", line 972, in send_modal
    await adapter.create_interaction_response(
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\webhook\async_.py", line 151, in request
    to_send = utils._to_json(payload)
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\utils.py", line 650, in _to_json
    return json.dumps(obj, separators=(',', ':'), ensure_ascii=True)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable

问题原因

在footer模态框的__init__方法里,直接将original_embed.timestamp(datetime对象)赋值给self.time.default。而Discord模态框的TextInput组件要求default是字符串类型,发送模态框时需要序列化数据,datetime对象无法被JSON序列化,导致报错。另外初始化时的判断条件if original_embed.footer:逻辑错误,会导致无Footer的Embed无法设置Timestamp默认值。

修复方案

修改footer类的初始化方法,将Timestamp状态转为字符串:

def __init__(self, original_embed: discord.Embed):
    super().__init__()
    # 设置Footer文本和图标默认值
    if original_embed.footer:
        self.ftext.default = original_embed.footer.text
        self.fticon.default = original_embed.footer.icon_url
    # 根据是否存在timestamp设置Yes/No默认值
    self.time.default = "Yes" if original_embed.timestamp else "No"

存储疑问解答

只存储Embed名称完全不够。要持久化Embed数据,应该用discord.Embed.to_dict()把Embed转成字典,再保存到JSON文件;加载时用discord.Embed.from_dict()从字典还原,这样能完整保留所有属性(Timestamp、颜色、Footer等),避免编辑时丢失信息。


问题2:Embed颜色编辑失败

报错信息

2023-11-01 20:17:15 ERROR    discord.ui.modal Ignoring exception in modal <general timeout=None children=3>:
Traceback (most recent call last):
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ui\modal.py", line 188, in _scheduled_task
    await self.on_submit(interaction)
  File "c:\Users\trace\Desktop\MU LFG\lfg bot\main.py", line 159, in on_submit
    embed.color = discord.Color.from_str(your_hex)
  File "C:\Users\trace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\colour.py", line 199, in from_str
    if value[0] == '#':
TypeError: 'TextInput' object is not subscriptable

问题原因

  1. 错误传递对象:your_hex = self.hex_color直接赋值了TextInput组件对象,而非输入值self.hex_color.value,导致from_str无法处理。
  2. 初始化判断错误:用if original_embed.footer:判断Footer存在性,而非颜色,导致颜色默认值无法正确设置。
  3. 颜色格式错误:original_embed.color.value是整数,直接赋值给hex_color.default会显示为整数,不符合用户输入的十六进制格式。

修复方案

修改general类的初始化和提交方法:

class general(ui.Modal,title="edit general info"):
    embed_title = ui.TextInput(label="edit title",placeholder="life",style=discord.TextStyle.long,required=False)
    embed_description = ui.TextInput(label="edit description",placeholder="life",style=discord.TextStyle.long,required=False)
    hex_color = ui.TextInput(label="edit hex color code",placeholder="#000fff",style=discord.TextStyle.short,required=False)

    def __init__(self, original_embed: discord.Embed):
        super().__init__()
        # 设置标题和描述默认值
        self.embed_title.default = original_embed.title or ""
        self.embed_description.default = original_embed.description or ""
        # 将整数颜色值转为带#的十六进制字符串
        if original_embed.color:
            self.hex_color.default = f"#{original_embed.color.value:06x}"
        else:
            self.hex_color.default = ""

    async def on_submit(self, interaction:discord.Interaction):
        embed = interaction.message.embeds[0]
        # 更新标题
        if self.embed_title.value.strip():
            embed.title = self.embed_title.value.strip()
        # 更新描述
        if self.embed_description.value.strip():
            embed.description = self.embed_description.value.strip()
        # 更新颜色
        if self.hex_color.value.strip():
            try:
                embed.color = discord.Color.from_str(self.hex_color.value.strip())
            except ValueError:
                await interaction.response.send_message("无效的十六进制颜色代码!", ephemeral=True)
                return
        else:
            embed.color = None
        # 保存修改
        await interaction.response.edit_message(embed=embed)

颜色编辑疑问解答

Discord完全支持编辑Embed颜色。只要传递正确的十六进制字符串(如#ff0000),通过discord.Color.from_str()转成Color对象后赋值给embed.color即可,上面的修复方案已处理输入值获取、格式转换和错误处理,能正常实现颜色编辑功能。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:50:56