const pool = global.pool const fpbx = global.fpbx const client = global.client const log = global.log module.exports = {}; var error_shown = false; module.exports.handleScheduled = async () => { if (error_shown) return; if (!process.env.DISCORD_GUILD) { error_shown = true; return log.error(`Environment variable DISCORD_GUILD is not set! Cannot handle automatic deletions. Please set this variable and restart to enable this feature.`); } const deletions = await pool.query('SELECT * FROM discord_deletions'); if (!deletions) return; for (const deletion of deletions) { const guild = client.guilds.cache.get(process.env.DISCORD_GUILD); const member = guild ? await guild.members.fetch(deletion.discordId).catch(() => null) : null; const ext = await fpbx.getExtension(deletion.extension); if (!ext) { log.error(`Failed to get extension for deletion: ${deletion.discordId}. Assuming it's already gone. Deleting from database.`); await pool.query('DELETE FROM discord_deletions WHERE discordId = ?', [deletion.discordId]); await pool.query('DELETE FROM discord_users WHERE discordId = ?', [deletion.discordId]); return; } if (member) { log.info(`User ${deletion.discordId} rejoined, removing deletion`); await pool.query('DELETE FROM discord_deletions WHERE discordId = ?', [deletion.discordId]); return; } else if (new Date(deletion.deleteAt) < new Date()) { log.info(`Deleting extension for ${deletion.discordId}`); const deleteResp = await fpbx.deleteExtension(deletion.extension); if (!deleteResp[0].deleteExtension.status) { log.error(`Failed to delete extension for ${deletion.discordId}`); await pool.query('DELETE FROM discord_deletions WHERE discordId = ?', [deletion.discordId]); return; } else { log.info(`Deleted extension for ${deletion.discordId}`); await pool.query('DELETE FROM discord_users WHERE discordId = ?', [deletion.discordId]); } await fpbx.reload(); await pool.query('DELETE FROM discord_deletions WHERE discordId = ?', [deletion.discordId]); return; } } }; module.exports.findOrphans = async () => { if (error_shown) return; if (!process.env.DISCORD_GUILD) { error_shown = true; return log.error(`Environment variable DISCORD_GUILD is not set! Cannot handle automatic deletions. Please set this variable and restart to enable this feature.`); } const users = await pool.query('SELECT * FROM discord_users'); const deletions = await pool.query('SELECT * FROM discord_deletions'); const guild = client.guilds.cache.get(process.env.DISCORD_GUILD); if (!users) return for (const user of users) { const member = guild ? await guild.members.fetch(user.discordId).catch(() => null) : null; if (!member) { log.info(`User ${user.discordId} not found in guild, marking for deletion`); const isMarkedForDeletion = deletions.some(deletion => deletion.discordId === user.discordId); if (isMarkedForDeletion) { log.info(`User ${user.discordId} is already marked for deletion`); continue; } const deleteAt = new Date(Date.now() + 60 * 60 * 1000); // 1 hour in the future await pool.query('INSERT INTO discord_deletions (discordId, extension, deleteAt) VALUES (?, ?, ?)', [user.discordId, user.extension, deleteAt]); } } };