我试图让我的一个更大的不和谐机器人保存它从另一个分片抓取的所有自定义表情符号到缓存,这样我就可以为每个分片提供更好的响应时间。举一个理论上的例子,我的机器人产生了 4 个分片,只有一个分片服务于包含我想在所有分片中使用的所有自定义表情符号的公会。我正在使用此功能来抓取表情符号,但我需要等待每个表情符号,它可以使我的响应时间长达 15 秒,因为我需要抓取许多表情符号:

function findEmoji(id) {
    const temp = this.emojis.get(id);
    if (!temp) return null;

    const emoji = Object.assign({}, temp);
    if (emoji.guild) emoji.guild = emoji.guild.id;
    emoji.require_colons = emoji.requiresColons;

    return emoji;
  }
  async function grabEmoji(emojiID) {
    const emojiArray = await client.shard.broadcastEval(`(${findEmoji}).call(this, '${emojiID}')`);

    const foundEmoji = emojiArray.find(emoji => emoji);
    if (!foundEmoji) return;

    const raw = await client.rest.makeRequest('get', Discord.Constants.Endpoints.Guild(foundEmoji.guild).toString(), true);
    const guild =  new Discord.Guild(client, raw);
    const emoji =  new Discord.Emoji(guild, foundEmoji);

    return await emoji;
  }
// then when I send the message, I call the function with the said ID of the emoji I want:
await grabEmoji("530800350656200705");

另一方面,当我删除等待时,它会给我监听器错误(达到 maxListeners)或其他什么,然后显示“null”。

这是我尝试过的,但我无法让它工作。
const emojiMap = new Map();
createMap();
async function createMap() {
  let woodenPick = await grabEmoji("601256699629797379"),
      stonePick  = await grabEmoji("601256431076769803"),
      ironPick=  await grabEmoji("601257055285673987"),
      goldPick = await grabEmoji("601256566670491658"),
      diamondPick= await grabEmoji("601256973798998016"),
      emeraldPick = await grabEmoji("601256896577404938"),
      rubyPick = await grabEmoji("601256312696733696"),
      ultimatePick=  await grabEmoji("629817042954092545"),
      sandstonePick = await grabEmoji("629817043142705152"),
      aquaPick = await grabEmoji("629817733902761985"),
      techPick = await grabEmoji("502940161085014046"),
      stone = await grabEmoji("502940717883064321"),
      coal = await grabEmoji("502940528149659649"),
      iron  =await grabEmoji("502940160942669824"),
      gold = await grabEmoji("493801062856392705"),
      diamond= await grabEmoji("493805522466766849"),
      obsidian  =await grabEmoji("493801062671581184"),
      emerald = await grabEmoji("630846535025819649"),
      ruby  =await grabEmoji("502940161001259018"),
      lapis = await grabEmoji("502940160988807188"),
      redstone=  await grabEmoji("632411168601931822"),
      silver = await grabEmoji("632413243503149087"),
      neonite = await grabEmoji("632413243708801024"),
      pulsatingStar=  await grabEmoji("632404511759138816"),
      sapphire = await grabEmoji("642799734192341013"),
      developerBadge = await grabEmoji("642799734209118221"),
      staffBadge = await grabEmoji("642799734209118221"),
      donatorBadge = await grabEmoji("642799734247129089"),
      contributorBadge = await grabEmoji("642799734247129089");

      emojiMap.set(['woodenPick', woodenPick])
      emojiMap.set(['stonePick', stonePick])
      emojiMap.set(['ironPick', ironPick])
      emojiMap.set(['goldPick', goldPick])
      emojiMap.set(['diamondPick', diamondPick])
      emojiMap.set(['emeraldPick', emeraldPick])
      emojiMap.set(['rubyPick', rubyPick])
      emojiMap.set(['ultimatePick', ultimatePick])
      emojiMap.set(['sandstonePick', sandstonePick])
      emojiMap.set(['aquaPick', aquaPick])
      emojiMap.set(['techPick', techPick])
      emojiMap.set(['stone', stone])
      emojiMap.set(['coal', coal])
      emojiMap.set(['iron', iron])
      emojiMap.set(['gold', gold])
      emojiMap.set(['diamond', diamond])
      emojiMap.set(['obsidian', obsidian])
      emojiMap.set(['emerald', emerald])
      emojiMap.set(['ruby', ruby])
      emojiMap.set(['lapis', lapis])
      emojiMap.set(['redstone', redstone])
      emojiMap.set(['silver', silver])
      emojiMap.set(['neonite', neonite])
      emojiMap.set(['pulsatingStar', pulsatingStar])
      emojiMap.set(['sapphire', sapphire])
      emojiMap.set(['developerBadge', developerBadge])
      emojiMap.set(['staffBadge', staffBadge])
      emojiMap.set(['donatorBadge', donatorBadge])
      emojiMap.set(['contributorBadge', contributorBadge])
}

client.on('message', ... //rest of the code continues for my command handler.

//grab emojis
  let woodenPick =   emojiMap.get('woodenPick')
  let stonePick =   emojiMap.get('stonePick')
  let ironPick =   emojiMap.get('ironPick')
  let goldPick =   emojiMap.get('goldPick')
  let diamondPick =   emojiMap.get('diamondPick')
  let emeraldPick =  emojiMap.get('emeraldPick')
  let rubyPick =   emojiMap.get('rubyPick')
  let ultimatePick =   emojiMap.get('ultimatePick')
  let sandstonePick =   emojiMap.get('sandstonePick')
  let aquaPick =   emojiMap.get('aquaPick')
  let techPick =   emojiMap.get('techPick')
  let stone =   emojiMap.get('stone')
  let coal =   emojiMap.get('coal')
  let iron =   emojiMap.get('iron')
  let gold =   emojiMap.get('gold')
  let diamond =   emojiMap.get('diamond')
  let obsidian =   emojiMap.get('obsidian')
  let emerald =   emojiMap.get('emerald')
  let ruby =   emojiMap.get('ruby')
  let lapis =   emojiMap.get('lapis')
  let redstone =   emojiMap.get('redstone')
  let silver =   emojiMap.get('silver')
  let neonite =   emojiMap.get('neonite')
  let pulsatingStar =   emojiMap.get('pulsatingStar')
  let sapphire =   emojiMap.get('sapphire')
  let developerBadge=   emojiMap.get('developerBadge')
  let staffBadge =   emojiMap.get('staffBadge')
  let donatorBadge =   emojiMap.get('donatorBadge')
  let contributorBadge =   emojiMap.get('contributorBadge')

这样做会返回 undefined,如下所示:javascript - 从另一个分片缓存自定义表情符号-LMLPHP

有没有人有任何想法?我直接将表情符号对象保存到 map ,以为我可以稍后使用它。

最佳答案

获取 discord.js 对 Emoji 对象的抽象以便在消息中显示它是非常不必要的,但我不能责怪您,因为 discord.js 倾向于将其用户推向这些类型的实践。

已经知道 表情符号名称和 ID。您无需从机器人尚未拥有的其他分片中获取其他信息。在 Discord 消息中,自定义表情符号表示如下:

Custom Emoji            - <:NAME:ID>  -> <:mmLol:216154654256398347>

Custom Emoji (Animated) - <a:NAME:ID> -> <a:b1nzy:392938283556143104>

来源:discord api docs reference

因此,您不需要发出任何请求、任何广播评估或任何类型的东西:您只需要 静态数据 。像这样:
let emojiMap = {
  woodenPick: "601256699629797379",
  stonePick: "601256431076769803",
  //etc
};

我推荐使用 util 函数将表情符号放入消息中:
function getEmoji(name) {
  return `<:${name}:${emojiMap[name]}>`;
}

像这样使用它:
await msg.react(emojiMap.woodenPick); //might need to be :name:id
//etc, probably use an array for that (or Object.keys(emojiMap))

//make embed
let description = `${getEmoji("woodenPick")} --> Wooden Pickaxe\netc...`;

关于javascript - 从另一个分片缓存自定义表情符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59441311/

10-15 10:06