Skip to content

Commit c1ed1d6

Browse files
committed
EMERGENCY - Fixed missing code crashing
1 parent 1f4793d commit c1ed1d6

2 files changed

Lines changed: 115 additions & 63 deletions

File tree

src/events/guildMemberUpdate.ts

Lines changed: 103 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
EmbedBuilder,
55
Events,
66
GuildMember,
7+
PermissionFlagsBits,
78
TextChannel,
89
} from "discord.js";
910
import {
@@ -40,16 +41,57 @@ export default {
4041
const isBoostingNow = newMember.premiumSince !== null;
4142

4243
if (!wasBoostingBefore && isBoostingNow) {
43-
await onBoostStart(newMember);
44+
try {
45+
await onBoostStart(newMember);
46+
} catch (error) {
47+
logger.error(
48+
`onBoostStart failed for user ${newMember.id} in guild ${newMember.guild.id}:`,
49+
error,
50+
);
51+
}
4452
} else if (wasBoostingBefore && !isBoostingNow) {
45-
await onBoostEnd(newMember);
53+
try {
54+
await onBoostEnd(newMember);
55+
} catch (error) {
56+
logger.error(
57+
`onBoostEnd failed for user ${newMember.id} in guild ${newMember.guild.id}:`,
58+
error,
59+
);
60+
}
4661
}
4762
},
4863
};
4964

5065
async function getGuildSettings(guildId: string) {
5166
return prisma.guildSetting.findUnique({ where: { gid: guildId } });
5267
}
68+
async function safeSend(
69+
channel: TextChannel | undefined,
70+
payload: Parameters<TextChannel["send"]>[0],
71+
): Promise<void> {
72+
if (!channel) return;
73+
74+
const me = channel.guild.members.me;
75+
const perms = me ? channel.permissionsFor(me) : null;
76+
77+
if (
78+
!perms?.has([
79+
PermissionFlagsBits.ViewChannel,
80+
PermissionFlagsBits.SendMessages,
81+
])
82+
) {
83+
logger.warn(
84+
`Missing permission to send in channel ${channel.id} (guild ${channel.guild.id})`,
85+
);
86+
return;
87+
}
88+
89+
try {
90+
await channel.send(payload);
91+
} catch (error) {
92+
logger.error(`Failed to send message in channel ${channel.id}:`, error);
93+
}
94+
}
5395

5496
async function onBoostStart(member: GuildMember): Promise<void> {
5597
const guild = member.guild;
@@ -76,48 +118,48 @@ async function onBoostStart(member: GuildMember): Promise<void> {
76118
const greetChannel = guild.channels.cache.get(settings.greetChannelId) as
77119
| TextChannel
78120
| undefined;
79-
if (greetChannel) {
80-
const embed = new EmbedBuilder()
81-
.setColor(0xf47fff)
82-
.setTitle("New Server Boost! 🎉")
83-
.setDescription(`${member} has boosted the server!`)
84-
.addFields(
85-
{
86-
name: "Total Boosts",
87-
value: String(record.boostCounts ?? 1),
88-
inline: true,
89-
},
90-
{ name: "Member", value: member.user.tag, inline: true },
91-
)
92-
.setThumbnail(member.displayAvatarURL({ size: 512 }))
93-
.setFooter({ text: "Thank youuu!"})
94-
.setTimestamp();
95-
await greetChannel.send({ embeds: [embed] });
96-
}
121+
122+
const embed = new EmbedBuilder()
123+
.setColor(0xf47fff)
124+
.setTitle("New Server Boost! 🎉")
125+
.setDescription(`${member} has boosted the server!`)
126+
.addFields(
127+
{
128+
name: "Total Boosts",
129+
value: String(record.boostCounts ?? 1),
130+
inline: true,
131+
},
132+
{ name: "Member", value: member.user.tag, inline: true },
133+
)
134+
.setThumbnail(member.displayAvatarURL({ size: 512 }))
135+
.setFooter({ text: "Thank youuu!" })
136+
.setTimestamp();
137+
138+
await safeSend(greetChannel, { embeds: [embed] });
97139

98140
const logChannel = guild.channels.cache.get(settings.logChannelId) as
99141
| TextChannel
100142
| undefined;
101-
if (logChannel) {
102-
const logEmbed = new EmbedBuilder()
103-
.setColor(0x57f287)
104-
.setTitle("Boost Started")
105-
.addFields(
106-
{
107-
name: "User",
108-
value: `${member.user.tag} (${member.id})`,
109-
inline: false,
110-
},
111-
{
112-
name: "Total Boost Count",
113-
value: String(record.boostCounts ?? 1),
114-
inline: true,
115-
},
116-
)
117-
.setThumbnail(member.displayAvatarURL({ size: 512 }))
118-
.setTimestamp();
119-
await logChannel.send({ embeds: [logEmbed] });
120-
}
143+
144+
const logEmbed = new EmbedBuilder()
145+
.setColor(0x57f287)
146+
.setTitle("Boost Started")
147+
.addFields(
148+
{
149+
name: "User",
150+
value: `${member.user.tag} (${member.id})`,
151+
inline: false,
152+
},
153+
{
154+
name: "Total Boost Count",
155+
value: String(record.boostCounts ?? 1),
156+
inline: true,
157+
},
158+
)
159+
.setThumbnail(member.displayAvatarURL({ size: 512 }))
160+
.setTimestamp();
161+
162+
await safeSend(logChannel, { embeds: [logEmbed] });
121163

122164
try {
123165
await member.send(
@@ -146,24 +188,24 @@ async function onBoostEnd(member: GuildMember): Promise<void> {
146188
const logChannel = guild.channels.cache.get(settings.logChannelId) as
147189
| TextChannel
148190
| undefined;
149-
if (logChannel) {
150-
const logEmbed = new EmbedBuilder()
151-
.setColor(0xed4245)
152-
.setTitle("Boost Ended")
153-
.addFields(
154-
{
155-
name: "User",
156-
value: `${member.user.tag} (${member.id})`,
157-
inline: false,
158-
},
159-
{
160-
name: "Historical Boost Count",
161-
value: String(result.boostCounts ?? 0),
162-
inline: true,
163-
},
164-
)
165-
.setThumbnail(member.displayAvatarURL({ size: 512 }))
166-
.setTimestamp();
167-
await logChannel.send({ embeds: [logEmbed] });
168-
}
169-
}
191+
192+
const logEmbed = new EmbedBuilder()
193+
.setColor(0xed4245)
194+
.setTitle("Boost Ended")
195+
.addFields(
196+
{
197+
name: "User",
198+
value: `${member.user.tag} (${member.id})`,
199+
inline: false,
200+
},
201+
{
202+
name: "Historical Boost Count",
203+
value: String(result.boostCounts ?? 0),
204+
inline: true,
205+
},
206+
)
207+
.setThumbnail(member.displayAvatarURL({ size: 512 }))
208+
.setTimestamp();
209+
210+
await safeSend(logChannel, { embeds: [logEmbed] });
211+
}

src/services/boosterService.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,13 @@ export async function removeBoost(userId: string, guildDiscordId: string) {
193193
});
194194
if (!guild) return null;
195195

196-
return prisma.booster.update({
196+
const existing = await prisma.booster.findUnique({
197197
where: { userId_guildId: { userId, guildId: guild.id } },
198+
});
199+
if (!existing) return null;
200+
201+
return prisma.booster.update({
202+
where: { id: existing.id },
198203
data: { active: false },
199204
include: { customRole: true },
200205
});
@@ -210,8 +215,13 @@ export async function addBoostCount(
210215
});
211216
if (!guild) return null;
212217

213-
return prisma.booster.update({
218+
const existing = await prisma.booster.findUnique({
214219
where: { userId_guildId: { userId, guildId: guild.id } },
220+
});
221+
if (!existing) return null;
222+
223+
return prisma.booster.update({
224+
where: { id: existing.id },
215225
data: { boostCounts: { increment: amount } },
216226
});
217227
}

0 commit comments

Comments
 (0)