a fun bot for the hc slack

bug: stop spamming from working

dunkirk.sh 39287f5b d2c347cf

verified
Changed files
+39 -1
src
features
takes
handlers
libs
+38 -1
src/features/takes/handlers/upload.ts
···
export default async function upload() {
slackApp.anyMessage(async ({ payload, context }) => {
+
// Track user ID at the top level so it's available in catch block
+
const user = payload.user as string;
try {
-
const user = payload.user as string;
if (
payload.subtype === "bot_message" ||
···
});
return;
}
+
+
// Check if the user is already uploading - prevent multiple simultaneous uploads
+
if (userInDB.isUploading) {
+
await slackClient.chat.postMessage({
+
channel: payload.channel,
+
thread_ts: payload.ts,
+
text: "You already have an upload in progress. Please wait for it to complete before sending another one.",
+
});
+
+
await slackClient.reactions.add({
+
channel: payload.channel,
+
timestamp: payload.ts,
+
name: "hourglass_flowing_sand",
+
});
+
+
return;
+
}
+
+
// Set the upload lock
+
await db.update(usersTable)
+
.set({ isUploading: true })
+
.where(eq(usersTable.id, user));
// Add initial 'loading' reaction to indicate processing
await slackClient.reactions.add({
···
},
],
});
+
+
// Release the upload lock after successful processing
+
await db.update(usersTable)
+
.set({ isUploading: false })
+
.where(eq(usersTable.id, user));
} catch (error) {
console.error("Error handling file message:", error);
await slackClient.chat.postMessage({
···
timestamp: payload.ts,
name: "nukeboom",
});
+
+
// Release the upload lock in case of error
+
try {
+
await db.update(usersTable)
+
.set({ isUploading: false })
+
.where(eq(usersTable.id, user)); // Now user is in scope
+
} catch (lockError) {
+
console.error("Error releasing upload lock:", lockError);
+
}
Sentry.captureException(error, {
extra: {
+1
src/libs/schema.ts
···
lastTakeUploadDate: text("last_take_upload_date")
.notNull()
.default(TakesConfig.START_DATE.toISOString()),
+
isUploading: boolean("is_uploading").default(false).notNull(),
repoLink: text("repo_link"),
demoLink: text("demo_link"),
createdAt: text("created_at")