diff --git a/src/events/guildMemberUpdate.ts b/src/events/guildMemberUpdate.ts index 9939da6..7fb9933 100644 --- a/src/events/guildMemberUpdate.ts +++ b/src/events/guildMemberUpdate.ts @@ -1,11 +1,30 @@ import { EmbedBuilder, Events, GuildMember, TextChannel } from "discord.js"; import { Config } from "../libs/loadVariables.js"; import { registerBoost, removeBoost } from "../services/boosterService.js"; -import { assignBoosterRole, removeBoosterRole, assignLevelRoles, removeAllLevelRoles, deleteCustomRole } from "../services/roleService.js"; +import { + assignBoosterRole, + removeBoosterRole, + assignLevelRoles, + removeAllLevelRoles, + deleteCustomRole, +} from "../services/roleService.js"; +import { logger } from "../libs/logger.js"; export default { name: Events.GuildMemberUpdate, - async execute(oldMember: GuildMember, newMember: GuildMember, config: Config) { + async execute( + oldMember: GuildMember, + newMember: GuildMember, + config: Config, + ) { + try { + if (oldMember.partial) oldMember = await oldMember.fetch(); + if (newMember.partial) newMember = await newMember.fetch(); + } catch (error) { + logger.error( + `Failed to fetch partials for user ${oldMember.user.username}`, + ); + } const wasBoostingBefore = oldMember.premiumSince !== null; const isBoostingNow = newMember.premiumSince !== null; @@ -14,17 +33,20 @@ export default { } else if (wasBoostingBefore && !isBoostingNow) { await onBoostEnd(newMember, config); } - } + }, }; -async function onBoostStart(member: GuildMember, config: Config): Promise { +async function onBoostStart( + member: GuildMember, + config: Config, +): Promise { const guild = member.guild; const record = await registerBoost( member.id, guild.id, guild.name, - guild.iconURL() + guild.iconURL(), ); if (!record) return; @@ -32,29 +54,45 @@ async function onBoostStart(member: GuildMember, config: Config): Promise await assignBoosterRole(member, config); await assignLevelRoles(member, record.boostCounts ?? 1); - const greetChannel = guild.channels.cache.get(config.greetChannelId) as TextChannel | undefined; + const greetChannel = guild.channels.cache.get(config.greetChannelId) as + | TextChannel + | undefined; if (greetChannel) { const embed = new EmbedBuilder() .setColor(0xf47fff) .setTitle("New Server Boost! 🎉") .setDescription(`${member} has boosted the server!`) .addFields( - { name: "Total Boosts", value: String(record.boostCounts ?? 1), inline: true }, - { name: "Member", value: member.user.tag, inline: true } + { + name: "Total Boosts", + value: String(record.boostCounts ?? 1), + inline: true, + }, + { name: "Member", value: member.user.tag, inline: true }, ) .setTimestamp(); await greetChannel.send({ embeds: [embed] }); } - const logChannel = guild.channels.cache.get(config.logChannelId) as TextChannel | undefined; + const logChannel = guild.channels.cache.get(config.logChannelId) as + | TextChannel + | undefined; if (logChannel) { const logEmbed = new EmbedBuilder() .setColor(0x57f287) .setTitle("Boost Started") .addFields( - { name: "User", value: `${member.user.tag} (${member.id})`, inline: false }, - { name: "Total Boost Count", value: String(record.boostCounts ?? 1), inline: true } + { + name: "User", + value: `${member.user.tag} (${member.id})`, + inline: false, + }, + { + name: "Total Boost Count", + value: String(record.boostCounts ?? 1), + inline: true, + }, ) .setTimestamp(); @@ -62,7 +100,9 @@ async function onBoostStart(member: GuildMember, config: Config): Promise } try { - await member.send(`Thank you for boosting the server! You now have access to booster perks.`); + await member.send( + `Thank you for boosting the server! You now have access to booster perks.`, + ); } catch { // DMs may be closed } @@ -78,17 +118,27 @@ async function onBoostEnd(member: GuildMember, config: Config): Promise { await removeAllLevelRoles(member); await deleteCustomRole(guild, member.id); - const logChannel = guild.channels.cache.get(config.logChannelId) as TextChannel | undefined; + const logChannel = guild.channels.cache.get(config.logChannelId) as + | TextChannel + | undefined; if (logChannel) { const logEmbed = new EmbedBuilder() .setColor(0xed4245) .setTitle("Boost Ended") .addFields( - { name: "User", value: `${member.user.tag} (${member.id})`, inline: false }, - { name: "Historical Boost Count", value: String(result.boostCounts ?? 0), inline: true } + { + name: "User", + value: `${member.user.tag} (${member.id})`, + inline: false, + }, + { + name: "Historical Boost Count", + value: String(result.boostCounts ?? 0), + inline: true, + }, ) .setTimestamp(); await logChannel.send({ embeds: [logEmbed] }); } -} \ No newline at end of file +}