Можно сделать так, протестировал, вроде работает, ботов не захватывает
( внимание, проверки писал на скорую руку и я вообще сам почти новичок )
function СhCounter( guild, ChCounter, UpdateTime = 10000 ) {
// guild - Объект гильдии, ChCounter - Объект канала в этой гильдии, UpdateTime - обновлять каждые N ms
if ( !guild || !ChCounter || UpdateTime < 1000 ) return 0; // Проверка на валидность
const Users = guild.members.cache.filter(m => m.user.bot === false) //Все юзеры
const OnlineCount = Users.filter(m => m.presence.status != 'offline').size //Число юзеров онлайн
ChCounter.setName(`${OnlineCount} / ${Users.size} online members`); // Меняем название канала
setTimeout( СhCounter, UpdateTime, guild, ChCounter, UpdateTime ); // Вызываем повторно через UpdateTime ms
}
Потом просто вызываете функцию и сообщаете ей нужные параметры
( например, во время инициализации бота )
//Токен уже введёт, логин произведён
const couterConfig = {
guildID: "YOU GUILD ID",
chID: "YOU CHANNEL ID"
}
client.on("ready", () => {
test_GUILD = client.guilds.cache.get(couterConfig.guildID);
if (!test_GUILD ) return console.log("Не могу найти гильдию для подсчёта") // Проверочка валидности
test_Channel = test_GUILD.channels.cache.get(couterConfig.chID);
if (!test_GUILD ) return console.log("Не могу найти канал для подсчёта") // Проверочка валидности
console.log("Начинаю считать");
СhCounter(test_GUILD, test_Channel, 5000); // Вызов ф-и
}