在执行命令的公会中更改机器人昵称(Discord js)

时间:2021-05-09 16:21:16

标签: javascript discord.js

我很快就会制作一个免费的公共机器人,但我遇到了一些麻烦。 我正在尝试使用一个命令(例如:-bitcoin)使机器人每 30 秒在公会(机器人昵称)中更改一次名称,但是当创建一个函数并循环它以使其成为可能时,机器人不能再次获取公会ID,因为第二次及以后没有消息回复。

if(command === 'bitcoin'){
  updateNickname(message);
  setInterval(updateNickname, 30000);
}

async function updateNickname(message) {
  const { data } = await axios.get(`https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=eur`);
  return message.guild.me.setNickname(`BTC = ${data.bitcoin.eur}€`);
}

有人可以帮我吗?

免责声明:我不能只缓存一个 id,因为它不能在其他服务器上工作,它只能在我发短信的服务器 id 中工作,所以我希望它同时在多个服务器上工作(在进一步的开发中,人们将能够为各个服务器选择自己的加密货币和货币)。

1 个答案:

答案 0 :(得分:3)

我可能会将这些数据保存在数据库中(因为我猜您希望它在机器人重新启动之间保持不变)。

然后,我将每 30 秒运行 1 次间隔,一次更新所有公会。这在你的机器人上也应该更容易,因为你没有为每个安装了这个机器人的公会设置不同的间隔。

if(command === 'bitcoin'){
  updateNickname(message.guild, message.data);
  await persistInDatabase({
    guildId: message.guild.id
    coin: message.data
  });
}

// run this every 30 seconds.
setInterval(updateNicknames, 30000);

// change nickname for a single guild
async function updateNickname(guild, coin) {
  const { data } = await axios.get(`https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=eur`);
  return guild.me.setNickname(`BTC = ${data.bitcoin.eur}€`);
}

// change nickname for ALL guilds this bot is installed on
async function updateNicknames() {
  const allGuilds = await getAllFromDb();
  for(let dbGuild of allGuilds) {
    const guild = client.guilds.get(dbGuild.guildId);
    updateNickname(guild, dbGuild.coin);
  }
}
  • 我没有包含数据库功能,但它应该很简单。只需选择您最喜欢的数据库:-)
  • 我将硬币类型保存在数据库中,但如果您不需要它,可以将其删除。
  • 您可以缓存 axios 调用,这样您就不会为安装了此机器人的每个公会都执行此操作。