从另一个分片缓存自定义表情符号

时间:2019-12-22 02:53:46

标签: javascript node.js discord.js

im试图获得一个更大的我的不和谐机器人,以将它从另一个分片抓取的所有自定义表情符号保存到缓存中,以便为每个分片提供更好的响应时间。举一个理论上的例子,我的机器人生成了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");

另一方面,当我删除await时,它将给我侦听器错误(达到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')

这样做返回未定义,如下所示:resulting message

有人有什么想法吗?我直接将表情符号对象保存到地图上,以为以后可以使用。

1 个答案:

答案 0 :(得分:1)

完全没有必要获得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...`;