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
80 lines
3.3 KiB
JavaScript
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);
|
|
}
|
|
},
|
|
};
|