/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ /* eslint-disable @typescript-eslint/naming-convention -- we are making raw API calls. */ const channelIds = { community: "1386105484313886820", products: "1386105452881776661", } as const; const roleIds = { community: "1386107941224054895", products: "1386107909699666121", } as const; /** * Forwards an announcement to our Discord server. * @param title - The title of the announcement. * @param content - The main body of the announcement. * @param type - Whether the announcement is for a product or community. * @returns A message indicating the success or failure of the operation. */ export const announceOnDiscord = async( title: string, content: string, type: "products" | "community", ): Promise => { const messageRequest = await fetch( `https://discord.com/api/v10/channels/${channelIds[type]}/messages`, { body: JSON.stringify({ allowed_mentions: { parse: [ "users", "roles" ] }, content: `# ${title}\n\n${content}\n-# <@&${roleIds[type]}>`, }), headers: { "Authorization": `Bot ${process.env.DISCORD_TOKEN ?? ""}`, "Content-Type": "application/json", }, method: "POST", }, ); if (messageRequest.status !== 200) { return "Failed to send message to Discord."; } // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- fetch does not accept generics. const message = await messageRequest.json() as { id?: string }; if (message.id === undefined) { return "Failed to parse message ID, cannot crosspost."; } const crosspostRequest = await fetch( `https://discord.com/api/v10/channels/${channelIds[type]}/messages/${message.id}/crosspost`, { headers: { "Authorization": `Bot ${process.env.DISCORD_TOKEN ?? ""}`, "Content-Type": "application/json", }, method: "POST", }, ); if (!crosspostRequest.ok) { return "Failed to crosspost message to Discord."; } return "Successfully sent and published message to Discord."; };