From f7f09cd9e5111417212ab8d0f8e0ba82f0f5864e Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Sun, 28 Sep 2025 21:09:11 +0200 Subject: [PATCH] Send message to Discord when reaching 50, 100, ..., users --- backend/api/src/create-user.ts | 30 ++++++++++++++++++++++++++++-- common/src/discord/core.ts | 11 ++++++----- common/src/secrets.ts | 3 ++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/backend/api/src/create-user.ts b/backend/api/src/create-user.ts index bde7c0e6..44d60105 100644 --- a/backend/api/src/create-user.ts +++ b/backend/api/src/create-user.ts @@ -13,7 +13,7 @@ import {createSupabaseDirectClient} from 'shared/supabase/init' import {insert} from 'shared/supabase/utils' import {convertPrivateUser, convertUser} from 'common/supabase/users' import {getBucket} from "shared/firebase-utils"; -import {sendDiscordNewUser} from "common/discord/core"; +import {sendDiscordMessage} from "common/discord/core"; export const createUser: APIHandler<'create-user'> = async ( props, @@ -130,10 +130,36 @@ export const createUser: APIHandler<'create-user'> = async ( console.log('Failed to track create profile', e) } try { - await sendDiscordNewUser(user) + await sendDiscordMessage( + `**${user.name}** just created a profile at https://www.compassmeet.com/${user.username}`, + 'members', + ) } catch (e) { console.log('Failed to send discord new user', e) } + try { + const nProfiles = await pg.one( + `SELECT count(*) FROM users`, + [], + (r) => Number(r.count) + ) + + const isMilestone = (n: number) => { + return ( + [15, 20, 30, 40].includes(n) || // early milestones + n % 50 === 0 + ) + } + if (isMilestone(nProfiles)) { + await sendDiscordMessage( + `We just reached **${nProfiles}** total profiles! 🎉`, + 'general', + ) + } + + } catch (e) { + console.log('Failed to send discord user milestone', e) + } } return { diff --git a/common/src/discord/core.ts b/common/src/discord/core.ts index 1d00cbbc..02dea8fc 100644 --- a/common/src/discord/core.ts +++ b/common/src/discord/core.ts @@ -1,14 +1,15 @@ -import {User} from "common/user"; - -export const sendDiscordNewUser = async (user: User) => { - const webhookUrl = process.env.DISCORD_WEBHOOK_NEW_USERS +export const sendDiscordMessage = async (content: string, channel: string) => { + const webhookUrl = { + members: process.env.DISCORD_WEBHOOK_MEMBERS, + general: process.env.DISCORD_WEBHOOK_GENERAL, + }[channel] if (!webhookUrl) return const response = await fetch(webhookUrl!, { method: 'POST', headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({content: `**${user.name}** just created a profile at https://www.compassmeet.com/${user.username}`}), + body: JSON.stringify({content}), }) if (!response.ok) { diff --git a/common/src/secrets.ts b/common/src/secrets.ts index 06f4c1ae..fcdc22df 100644 --- a/common/src/secrets.ts +++ b/common/src/secrets.ts @@ -18,7 +18,8 @@ export const secrets = ( 'RESEND_KEY', 'COMPASS_API_KEY', 'NEXT_PUBLIC_FIREBASE_API_KEY', - 'DISCORD_WEBHOOK_NEW_USERS', + 'DISCORD_WEBHOOK_MEMBERS', + 'DISCORD_WEBHOOK_GENERAL', // Some typescript voodoo to keep the string literal types while being not readonly. ] as const ).concat()