const { EmbedBuilder } = require('discord.js'); module.exports = { name: 'guildMemberUpdate', async execute(oldMember, newMember, client) { try { const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id)); if (addedRoles.size === 0 && removedRoles.size === 0) return; const REALM_GUILDS = client.REALM_GUILDS; const realmGuildIds = Object.values(REALM_GUILDS).filter(Boolean); if (!realmGuildIds.includes(newMember.guild.id)) return; const federationMappings = client.federationMappings; for (const [roleId, role] of addedRoles) { const mapping = federationMappings.get(roleId); if (!mapping) continue; console.log(`[Federation] Syncing role ${role.name} for ${newMember.user.tag} across realms`); for (const targetGuildId of realmGuildIds) { if (targetGuildId === newMember.guild.id) continue; try { const targetGuild = client.guilds.cache.get(targetGuildId); if (!targetGuild) continue; const targetMember = await targetGuild.members.fetch(newMember.user.id).catch(() => null); if (!targetMember) continue; const targetRole = targetGuild.roles.cache.find(r => r.name === role.name); if (!targetRole) continue; if (!targetMember.roles.cache.has(targetRole.id)) { await targetMember.roles.add(targetRole, '[Federation] Cross-server sync'); console.log(`[Federation] Added ${role.name} to ${newMember.user.tag} in ${targetGuild.name}`); } } catch (err) { console.error(`[Federation] Sync error for guild ${targetGuildId}:`, err.message); } } } for (const [roleId, role] of removedRoles) { const mapping = federationMappings.get(roleId); if (!mapping) continue; console.log(`[Federation] Removing synced role ${role.name} for ${newMember.user.tag} across realms`); for (const targetGuildId of realmGuildIds) { if (targetGuildId === newMember.guild.id) continue; try { const targetGuild = client.guilds.cache.get(targetGuildId); if (!targetGuild) continue; const targetMember = await targetGuild.members.fetch(newMember.user.id).catch(() => null); if (!targetMember) continue; const targetRole = targetGuild.roles.cache.find(r => r.name === role.name); if (!targetRole) continue; if (targetMember.roles.cache.has(targetRole.id)) { await targetMember.roles.remove(targetRole, '[Federation] Cross-server sync'); console.log(`[Federation] Removed ${role.name} from ${newMember.user.tag} in ${targetGuild.name}`); } } catch (err) { console.error(`[Federation] Sync error for guild ${targetGuildId}:`, err.message); } } } } catch (error) { console.error('[Federation] guildMemberUpdate error:', error); } }, };