diff --git a/utils/queueManager.js b/utils/queueManager.js index 5e3ce4a..5212722 100644 --- a/utils/queueManager.js +++ b/utils/queueManager.js @@ -1,6 +1,8 @@ const { createAudioPlayer, createAudioResource, AudioPlayerStatus, joinVoiceChannel } = require('@discordjs/voice'); const fs = require('fs'); -const { spawn } = require('child_process') +const { spawn, exec } = require('child_process'); +const path = require('path'); +const { v4: uuidv4 } = require('uuid'); const queueMap = new Map(); const playerMap = new Map(); @@ -8,6 +10,44 @@ const currentTrackMap = new Map(); const repeatMap = new Map(); const voiceChannelMap = new Map(); +const lastActivityMap = new Map(); +const cookieRefreshTimers = new Map(); +const IDLE_THRESHOLD = 3 * 60 * 60 * 1000; +const COOKIE_REFRESH_URL = 'https://www.youtube.com/watch?v=ORMRfFYMwVU'; + +function refreshCookies() { + console.log('Refreshing cookies by downloading video...'); + const tempFilePath = path.join(__dirname, 'tmp', `cookie_refresh_${uuidv4()}.mp3`); + const ytDlpPath = path.join(__dirname, '../yt-dlp'); + + exec(`"${ytDlpPath}" --cookies ${path.join(__dirname, '../cookies.txt')} --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" --sleep-interval 1 --max-sleep-interval 3 --format bestaudio --output "${tempFilePath}" "${COOKIE_REFRESH_URL}"`, (error, stdout, stderr) => { + if (error) { + console.error('Cookie refresh failed:', error); + } else { + console.log('Cookie refresh successful'); + fs.unlink(tempFilePath, (err) => { + if (err) console.error('Error deleting cookie refresh file:', err); + else console.log('Cookie refresh file deleted'); + }); + } + }); +} + +function updateActivity(guildId) { + lastActivityMap.set(guildId, Date.now()); + + if (cookieRefreshTimers.has(guildId)) { + clearTimeout(cookieRefreshTimers.get(guildId)); + } + + const timer = setTimeout(() => { + console.log(`Guild ${guildId} has been idle for 3 hours, refreshing cookies...`); + refreshCookies(); + }, IDLE_THRESHOLD); + + cookieRefreshTimers.set(guildId, timer); +} + function addToQueue(guildId, filePath, title, voiceChannel, url, requester, avatarURL, thumbnailUrl) { if (!queueMap.has(guildId)) { queueMap.set(guildId, []); @@ -18,6 +58,8 @@ function addToQueue(guildId, filePath, title, voiceChannel, url, requester, avat voiceChannelMap.set(guildId, voiceChannel); } + updateActivity(guildId); + const audioPlayer = playerMap.get(guildId); if (!audioPlayer || audioPlayer.state.status !== AudioPlayerStatus.Playing) { @@ -95,6 +137,8 @@ function playTrack(guildId, voiceChannel, track) { adapterCreator: voiceChannel.guild.voiceAdapterCreator, }); + updateActivity(guildId); + let audioPlayer = playerMap.get(guildId); if (!audioPlayer) { @@ -187,4 +231,13 @@ function clearQueue(guildId) { queueMap.set(guildId, []); } -module.exports = { addToQueue, getQueue, getCurrentTrack, playNextInQueue, skipTrack, toggleRepeat, clearQueue, removeFromQueue, getPlayer }; \ No newline at end of file +function cleanupGuild(guildId) { + // Clear the cookie refresh timer when bot leaves or guild is cleaned up + if (cookieRefreshTimers.has(guildId)) { + clearTimeout(cookieRefreshTimers.get(guildId)); + cookieRefreshTimers.delete(guildId); + } + lastActivityMap.delete(guildId); +} + +module.exports = { addToQueue, getQueue, getCurrentTrack, playNextInQueue, skipTrack, toggleRepeat, clearQueue, removeFromQueue, getPlayer, cleanupGuild }; \ No newline at end of file