const pool = global.pool const fpbx = global.fpbx const client = global.client const log = global.log module.exports = {}; module.exports.handleScheduled = async () => { 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; 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}`); await fpbx.deleteExtension(deletion.extension); await fpbx.reload(); await pool.query('DELETE FROM discord_deletions WHERE discordId = ?', [deletion.discordId]); return; } } }; module.exports.findOrphans = async () => { 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]); } } };