78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
const bot = require('./Bot')
|
|
const dlog = require('loguix').getInstance('Discord')
|
|
const {ActivityType} = require('discord.js')
|
|
|
|
// Regroupement des mises à jour de présence : pas de clignotement entre deux morceaux, pas de rate limit
|
|
const REFRESH_DELAY = 1500
|
|
// Statuts où le bot "écoute" quelque chose
|
|
const ACTIVE_STATUS = ["playing", "loading", "stalled"]
|
|
|
|
let refreshTimer = null
|
|
// Dernière présence envoyée : on n'appelle Discord que si elle change
|
|
let lastActivity = null
|
|
|
|
function getActivity() {
|
|
const client = bot.getClient()
|
|
return client.user.presence.activities[0]
|
|
}
|
|
|
|
function applyActivity(text) {
|
|
const client = bot.getClient()
|
|
if(!client?.user) return false
|
|
if(text === lastActivity) return true
|
|
try {
|
|
client.user.setActivity(text, {
|
|
type: ActivityType.Listening
|
|
});
|
|
lastActivity = text
|
|
dlog.log(`Activité mise à jour : ${text}`)
|
|
return true
|
|
} catch(e) {
|
|
dlog.error(`Impossible de mettre à jour l'activité : ${e?.message || e}`)
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Set All type of activities
|
|
|
|
function setMusicActivity(songName, artistName) {
|
|
applyActivity(`${songName} - ${artistName}`)
|
|
}
|
|
|
|
function idleActivity() {
|
|
applyActivity("le silence absolu")
|
|
}
|
|
|
|
/**
|
|
* Calcule la présence à partir de TOUS les players (cohérente en multi-serveur)
|
|
*/
|
|
function computeActivity() {
|
|
const { getAllPlayers } = require('../player/Player')
|
|
const active = getAllPlayers().filter(player => ACTIVE_STATUS.includes(player.status) && player.queue?.current)
|
|
if(active.length === 0) return "le silence absolu"
|
|
if(active.length === 1) {
|
|
const song = active[0].queue.current
|
|
return `${song.title} - ${song.author}`
|
|
}
|
|
return `de la musique sur ${active.length} serveurs`
|
|
}
|
|
|
|
/**
|
|
* Demande une mise à jour de la présence (debounce de 1,5 s)
|
|
*/
|
|
function refresh() {
|
|
if(refreshTimer) return
|
|
refreshTimer = setTimeout(() => {
|
|
refreshTimer = null
|
|
try {
|
|
applyActivity(computeActivity())
|
|
} catch(e) {
|
|
dlog.error(`Erreur lors du calcul de l'activité : ${e?.message || e}`)
|
|
}
|
|
}, REFRESH_DELAY)
|
|
refreshTimer.unref?.()
|
|
}
|
|
|
|
|
|
module.exports = {getActivity, setMusicActivity, idleActivity, refresh}
|