#node.js #discord.js
Вопрос:
Хорошо, я понимаю, что мне, возможно, потребуется добавить команду типа if(!фильтр) в следующее, но я не уверен, где и как.
Файл кода находится:
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('859879787614437427');
const onlineUsers = client.channels.fetch('859879824403202059');
const onlineStaff = client.channels.fetch('859879875531374672');
client.guilds.fetch('802700035544317972')
.then(guild => console.log(guild.name))
.catch(console.error);
setInterval(function() {
console.log('Getting stats update..')
var userCount = client.memberCount;
var onlineCount = client.members.filter(m => m.presence.status === 'online').size
var coderCount = client.roles.get('802711739006582846').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);
codeMonkeys.setName("Online Staff: " coderCount)
.then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
.catch(console.error);
}, 30000)
;
Мое сообщение об ошибке выглядит так:
Getting stats update..
[Error] An exception happened in process:
TypeError: Cannot read property 'filter' of undefined
at Timeout._onTimeout (/home/container/events/Stats.js:17:36)
at listOnTimeout (node:internal/timers:557:17)
at processTimers (node:internal/timers:500:7)
У меня есть половина представления об исправлении, но я не уверен в его фактическом выполнении. Любая помощь будет признательна.
Ответ №1:
Discord.js, начиная с версии 12.0.0, предоставляет только предварительно созданное свойство client.members
для участников, которые кэшируются Discord. Пользователи, которые не кэшируются, должны быть извлечены и разрешены, поскольку fetch()
метод возвращает обещание.
Что касается вашего вопроса, то к этому свойству можно получить доступ с помощью его ключа cache
.
var onlineCount = client.members.cache.filter(m => m.presence.status === 'online').size
В качестве примечания, пожалуйста, приучите себя использовать let
, const
когда var
в этом нет необходимости.
Ответ №2:
Внимательно прочитайте ошибку, ее не if(!filter)
нужно проверять. Это то, что вы пытаетесь отфильтровать, то есть undefined
.
В вашем случае это линия виновника:
var onlineCount = client.members.filter(m => m.presence.status === 'online').size
Похоже, что client.members
на данный момент это не определено.
Простое решение состоит в том, чтобы проверить, существуют ли участники перед фильтрацией:
if(client.members !== undefined) {
// I'm also guessing this is an array, the right property to get array size is .length
var onlineCount = client.members.filter(m => m.presence.status === 'online').length
}
Редактировать
Я быстро взглянул на discord.js
API(предполагая, что вы его используете), и я не смог найти никакого members
свойства client
объекта. Может быть, ты пытаешься заполучить членов гильдии?
Комментарии:
1. На данный момент у меня в коде нет функции If; нужно ли ее добавлять? Отредактировал сообщение, чтобы включить полную ошибку из консоли
2. Это не функция, это оператор if выражение, я отредактирую для ясности.
3. По сути, я следовал учебнику, который означает, что он должен автоматически обновлять определенные каналы, чтобы обновить общее количество участников сервера, общее количество онлайн-пользователей и сотрудников, находящихся в настоящее время в сети. (Я расширюсь позже, как только у меня будут основы!)
4. Не стесняйтесь редактировать вопрос со ссылкой на учебник, который поможет сузить круг вопросов.
5. Оригинальный урок, которому я следовал, был таким: youtube.com/watch?v=k9fqGh5Cr5s