【问题标题】:Discord Guild and Members CacheDiscord 公会和成员缓存
【发布时间】:2021-09-04 19:40:35
【问题描述】:

所以我的机器人需要缓存公会及其成员,但我不知道该怎么做。我也不确定我是否需要在这个模块中缓存(以及任何其他也需要缓存的模块),或者我是否可以缓存在一个中心模块中(例如配置/索引)并稍后再引用。需要建议,请!

const Discord = require('discord.js');
const config = require('../settings/config.js');
const client = require('../index.js').client;
const Guild_ID = require('../settings/configuration').BOT_SETTINGS;
const totalUsers = client.channels.fetch('883654989271154728');
const onlineUsers = client.channels.fetch('883655041813200926');
const onlineStaff = client.channels.fetch('883655107902844978');

let guild = client.guilds.fetch('867657498827948032')
.then(guild => console.log(guild.name))
.catch(console.error);

setInterval(function() {
console.log('Getting stats update..')

var userCount = client.memberCount;
var onlineCount = guild.members.cache.filter(m => m.presence.status === 'online').size
var coderCount = client.roles.get('867673073440391188').members.size;

console.log("Total Users: " + userCount);
console.log("Online Users: " + onlineCount);
console.log("Online Staff: " + coderCount);

totalUsers.setName("Total Users: " + userCount)
.then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
.catch(console.error);

onlineUsers.setName("Online Users: " + onlineCount)
.then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
.catch(console.error);

onlineStaff.setName("Online Staff: " + coderCount)
.then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
.catch(console.error);
}, 30000)

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    fetch 返回一个必须解决的承诺。每当使用.then() 解析promise 时,结果都在回调函数中可用。

    但是,如果您有公会对象,则无需获取频道,它们将被缓存。

    您必须使用async/await 或在.then() 内部工作。我还建议获取所有 GuildMembers 以将它们全部缓存(这将需要启用公会成员意图)

    为了方便我们,我将使用 async/await,将您的代码包装在 update 函数中。

    async function update() {
       try {
          const guild = await client.guilds.fetch('867657498827948032');
    
          const totalUsers = guild.channels.cache.get('883654989271154728');
          const onlineUsers = guild.channels.cache.get('883655041813200926');
          const onlineStaff = guild.channels.cache.get('883655107902844978');
    
          const guildMembers = await guild.members.fetch();
    
          var onlineCount = guildMembers.filter(m => m.presence.status === 'online').size;
    
          // Access the role via the guild object
          var coderCount = guild.roles.cache.get('867673073440391188').members.size;
    
          // Update channel name code...
       } catch (err) {
          console.error(err);
       }
    }
    
    setInterval(update, 30000);
    

    注意:由于此函数每 30 秒运行一次,并且正在获取多个数据。这被视为 API 垃圾邮件。我建议要么重构你的函数或显着增加间隔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-18
      • 2018-09-16
      • 2021-02-18
      • 1970-01-01
      • 2021-01-31
      • 2021-10-16
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多