49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
/**
|
|
* Staff presence detection — checks Discord presence status for staff members.
|
|
* Requires GuildPresences intent enabled in Discord Developer Portal.
|
|
*/
|
|
const { CONFIG } = require('../config');
|
|
|
|
/**
|
|
* Get categorized availability of all configured staff members.
|
|
* @param {import('discord.js').Guild} guild
|
|
* @returns {{ online: string[], dnd: string[], offline: string[], unknown: string[] }}
|
|
*/
|
|
function getStaffAvailability(guild) {
|
|
const results = {
|
|
online: [],
|
|
dnd: [],
|
|
offline: [],
|
|
unknown: []
|
|
};
|
|
|
|
for (const staffId of CONFIG.STAFF_IDS) {
|
|
const member = guild.members.cache.get(staffId);
|
|
if (!member) { results.offline.push(staffId); continue; }
|
|
|
|
const status = member.presence?.status;
|
|
if (!status) { results.unknown.push(staffId); continue; }
|
|
|
|
if (status === 'online' || status === 'idle') results.online.push(staffId);
|
|
else if (status === 'dnd') results.dnd.push(staffId);
|
|
else results.offline.push(staffId);
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* Check if any staff member is currently available.
|
|
* @param {import('discord.js').Guild} guild
|
|
* @returns {{ available: boolean|null, source: string }}
|
|
*/
|
|
function isAnyStaffAvailable(guild) {
|
|
const { online, dnd, unknown } = getStaffAvailability(guild);
|
|
if (online.length > 0) return { available: true, source: 'presence' };
|
|
if (CONFIG.STAFF_DND_COUNTS_AS_AVAILABLE && dnd.length > 0) return { available: true, source: 'presence_dnd' };
|
|
if (unknown.length === CONFIG.STAFF_IDS.length) return { available: null, source: 'unknown' };
|
|
return { available: false, source: 'presence' };
|
|
}
|
|
|
|
module.exports = { getStaffAvailability, isAnyStaffAvailable };
|