尝试编辑用户操作上的特定嵌入字段

Posted

技术标签:

【中文标题】尝试编辑用户操作上的特定嵌入字段【英文标题】:Trying to edit a specific embed field on a user action 【发布时间】:2020-02-01 04:56:46 【问题描述】:

我正在尝试触发对嵌入(已发送)消息的编辑,同时保持所有其他字段的值相同

我发现这个答案是一种灵感(适用于示例):Embed message doesn't update 但这似乎并没有涵盖所有领域,只有第一个领域。没有更多关于这个主题的内容(或者我不擅长谷歌搜索:))。

所以新嵌入只是第一个字段,而不是所有(未更改的)字段。

    activityMsg = new Discord.RichEmbed(
      title: 'Some text',
      description: 'Description',
      color: 3447003,
      footer: 
        icon_url: image,
        text: image
      ,
      thumbnail: 
        url: image
      ,
      fields: [
        
          name: 'Text',
          value: 'Text2',
        ,
        
          name: 'Date and time',
          value: '2pm',
        ,
        
          name: 'Participants',
          value: '@User',
        ,
        
          name: 'Waiting list',
          value: '@user2',
        ,
        
          name: 'Max players',
          value: '22',
        
      ]
    );

    const reactionFilterPlus = (reaction, user) => reaction.emoji.name === emoji_plus;

    if(typeof title != undefined && title != null && data.length == 4 && error == '')
      var title = title[0].replace('[','').replace(']','');

      // add reaction emoji to message
      msg.channel.send(activityMsg)
        .then(msg => msg.react(constants.emoji_plus))
        .then(mReaction => 
          // createReactionCollector - responds on each react, AND again at the end.
          const collector = mReaction.message
            .createReactionCollector(reactionFilterPlus, 
              time: 15000
            );

          // set collector events
          collector.on('collect', r => 
            // immutably copy embed's Like field to new obj
            let embedLikeField = Object.assign(, activityMsg.fields[0]);

            // update 'field' with new value
            embedLikeField.value = `$user <3`;

            // create new embed with old title & description, new field
            const newEmbed = new Discord.RichEmbed(
              title: activityMsg.title,
              description: activityMsg.description,
              fields: [embedLikeField]
            );

            // edit message with new embed
            // NOTE: can only edit messages you author
            r.message.edit(newEmbed)
              .catch(console.log);
          );
        )
        .catch(console.log);
      

我希望这一行能够获取所有字段,但事实并非如此。

   // immutably copy embed's Like field to new obj
   let embedLikeField = Object.assign(, activityMsg.fields[0]);

我已尝试let embedLikeField = Object.assign(, activityMsg.fields[0] === 'Participants'),但随后我收到以下关于字段名不存在的错误。

 DiscordAPIError: Invalid Form Body
embed.fields[0].name: This field is required
    at item.request.gen.end (/usr/src/app/node_modules/discord.js/src/client/rest/RequestHandlers/Sequential.js:79:15)
    at then (/usr/src/app/node_modules/snekfetch/src/index.js:215:21)
    at process._tickCallback (internal/process/next_tick.js:68:7)

英语不是我的母语,我仍在学习 nodejs 对这些问题提前抱歉。

【问题讨论】:

【参考方案1】:

Object.assign() 对源执行浅层克隆,您是要克隆整个嵌入还是仅克隆它的第一个字段?

activityMsg.fields[0] 指的是您的activityMsg 对象中称为字段的列表中的第一个元素。尝试使用 activityMsg 作为源调用您的 assign()。

【讨论】:

以上是关于尝试编辑用户操作上的特定嵌入字段的主要内容,如果未能解决你的问题,请参考以下文章

关于访问和编辑全局字段的多个线程

更新数据库记录并重定向到不同页面的动态操作

ViewContainer 中 ViewController 上的条形按钮操作

Ext JS:获取特定行的操作列

在Qt中单击图像时尝试立即显示用户编辑操作的结果

Mailchimp:自定义配置文件更新表单中的字段