web-dev-qa-db-ja.com

埋め込みメッセージが更新されない

埋め込みメッセージで投票したいです。
誰かがリアクションを追加したときに、いいねを追加して、埋め込みのいいねの数を表示したいと思います。ここに例があります:
Example

誰かが「いいね」をクリックするたびに、すべてのコード行が機能し、最終的に「いいね」にリンクされているフィールド値を次のように変更します。

messageReaction.message.embeds[0].fields[0] = "Some much like";

ただし、埋め込みメッセージは更新されません。
次のメッセージを更新しようとしました:

function doAfakeEdit(message){
  message.edit(message.content);
}

それはまだフィールドの古い値を保持します。
私は何をすべきか?

3
Mister Aqua

あなたの問題は、変数名を再利用しているのか、古いデータを編集したメッセージに戻すのか、それとも何か他のものなのか、疑問に思います。とにかく、これが私のために働いたものです:

1)ユーザーに送信するEmbedを作成します(すでにこれを行っていると思います。imgrに表示したEmbedを作成します):

_const embed = new Discord.RichEmbed({
  title: 'Suggestion by someone',
  description: 'This is a test suggestion. Can you please like it or dislike it :)',
  fields: [{
    name: 'Like:',
    value: '<3'
  }]
});
_

2)Embedをあなたのチャンネルに送信します(私はそれにいくつかのReactionsを追加しました-おそらくあなたと同じ方法です):

_// add reaction emojis to message
message.channel.send(embed)
  .then(msg => msg.react('✅'))
  .then(mReaction => mReaction.message.react('❎'))
  .then(mReaction => {
    // fun stuff here
  })
  .catch(console.log);
_

3)_// fun stuff here_を配置した場所にReactionCollectorを作成します(別のreactionFilterと時間制限を使用できます):

_const reactionFilter = (reaction, user) => reaction.emoji.name === '✅';

// createReactionCollector - responds on each react, AND again at the end.
const collector = mReaction.message
  .createReactionCollector(reactionFilter, {
    time: 15000
  });

// set collector events
collector.on('collect', r => {
  // see step 4
});
// you can put anything you want here
collector.on('end', collected => console.log(`Collected ${collected.size} reactions`));
_

4)_'collect'_イベント(_// see step 4_を配置)で、ほぼ同様の値を持つ新しいEmbedを作成し(または変更しないでください)、その新しいEmbedを元のメッセージに戻します.edit(...)経由:

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

// update 'field' with new value - you probably want emojis here
embedLikeField.value = '<3 <3 <3';

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

// edit message with new embed
// NOTE: can only edit messages you author
r.message.edit(newEmbed)
  .then(newMsg => console.log(`new embed added`)) // this is not necessary
  .catch(console.log); // useful for catching errors
_

したがって、全体は次のようになります。

_const reactionFilter = (reaction, user) => reaction.emoji.name === '✅';

const embed = new Discord.RichEmbed({
  title: 'Suggestion by someone',
  description: 'This is a test suggestion. Can you please like it or dislike it :)',
  fields: [{
    name: 'Like:',
    value: '<3'
  }]
});

// add reaction emoji to message
message.channel.send(embed)
  .then(msg => msg.react('✅'))
  .then(mReaction => mReaction.message.react('❎'))
  .then(mReaction => {
    // createReactionCollector - responds on each react, AND again at the end.
    const collector = mReaction.message
      .createReactionCollector(reactionFilter, {
        time: 15000
      });

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

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

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

      // edit message with new embed
      // NOTE: can only edit messages you author
      r.message.edit(newEmbed)
        .then(newMsg => console.log(`new embed added`))
        .catch(console.log);
    });
    collector.on('end', collected => console.log(`Collected ${collected.size} reactions`));
  })
  .catch(console.log);
_

私のコードでは、楽しみのために、✅絵文字が押されたときにのみ編集が行われます。上記のコードの編集についてサポートが必要な場合はお知らせください。それが役に立てば幸い。

非常に遅い答え。しかし、誰かがこれを見つけた場合に備えて。はるかに短い方法があります。

また、大きな埋め込みがあり、埋め込み全体を再構築したくない場合は、さらに便利です。

message.embeds[0].fields[0] = "Some much like;
message.edit(new Discord.RichEmbed(message.embeds[0]));
0
omnomnom