const { Events } = require('discord.js'); const { readDb } = require('../../backend/db.js'); module.exports = { name: Events.GuildMemberAdd, async execute(member) { try { const api = require('../api'); const settings = (await api.getServerSettings(member.guild.id)) || {}; const welcome = { enabled: settings.welcomeEnabled || false, channel: settings.welcomeChannel || '', message: settings.welcomeMessage || 'Welcome {user} to {server}!' }; if (welcome && welcome.enabled && welcome.channel) { const channel = member.guild.channels.cache.get(welcome.channel); if (channel) { try { const message = (welcome.message).replace('{user}', member.user.toString()).replace('{server}', member.guild.name); await channel.send(message); } catch (error) { console.error(`Could not send welcome message to channel ${welcome.channel} in guild ${member.guild.id}:`, error); } } } const autorole = settings.autorole || {}; if (autorole && autorole.enabled && autorole.roleId) { const role = member.guild.roles.cache.get(autorole.roleId); if (role) { try { // Re-check that role is assignable const botHighest = member.guild.members.me.roles.highest.position; if (role.id === member.guild.id || role.managed || role.position >= botHighest) { console.warn(`Autorole ${role.id} in guild ${member.guild.id} is not assignable (everyone/managed/too high). Skipping.`); return; } await member.roles.add(role); } catch (error) { console.error(`Could not assign autorole in guild ${member.guild.id}:`, error); } } } } catch (error) { console.error(`Error in guildMemberAdd event for guild ${member.guild.id}:`, error); // fallback to local db try { const db = readDb(); const settings = db[member.guild.id]; if (settings && settings.welcomeEnabled && settings.welcomeChannel) { const channel = member.guild.channels.cache.get(settings.welcomeChannel); if (channel) { try { const message = (settings.welcomeMessage || 'Welcome {user} to {server}!').replace('{user}', member.user.toString()).replace('{server}', member.guild.name); await channel.send(message); } catch (innerErr) { /* ignore */ } } } if (settings && settings.autorole && settings.autorole.enabled && settings.autorole.roleId) { const role = member.guild.roles.cache.get(settings.autorole.roleId); if (role) { try { await member.roles.add(role); } catch (innerErr) { /* ignore */ } } } } catch (inner) { // ignore fallback errors } } }, };