AeThex-Bot-Master/aethex-bot/events/guildMemberUpdate.js
sirpiglr ddea985e6f Integrate security features and administration tools into the main bot
Add Sentinel anti-nuke listeners, federation role syncing, ticket system, and admin commands to the unified AeThex bot, consolidating functionality and enhancing security monitoring.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e72fc1b7-94bd-4d6c-801f-cbac2fae245c
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Event-Id: 00c4494a-b436-4e48-b794-39cd745fb604
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3bdfff67-975a-46ad-9845-fbb6b4a4c4b5/e72fc1b7-94bd-4d6c-801f-cbac2fae245c/7DQc4BR
Replit-Helium-Checkpoint-Created: true
2025-12-07 22:16:10 +00:00

80 lines
3.3 KiB
JavaScript

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);
}
},
};