a fun bot for the hc slack
at v0.0.3 2.5 kB view raw
1import { SlackApp } from "slack-edge"; 2 3import * as features from "./features/index"; 4 5import { t } from "./libs/template"; 6import { blog } from "./libs/Logger"; 7import { version, name } from "../package.json"; 8import { apiRouter, video } from "./features/api"; 9const environment = process.env.NODE_ENV; 10 11import * as Sentry from "@sentry/bun"; 12 13// Check required environment variables 14const requiredVars = [ 15 "SLACK_BOT_TOKEN", 16 "SLACK_SIGNING_SECRET", 17 "SLACK_REVIEW_CHANNEL", 18 "SLACK_LOG_CHANNEL", 19 "SLACK_SPAM_CHANNEL", 20 "SLACK_USER_TOKEN", 21 "API_URL", 22 "SENTRY_DSN", 23] as const; 24const missingVars = requiredVars.filter((varName) => !process.env[varName]); 25 26if (missingVars.length > 0) { 27 throw new Error( 28 `Missing required environment variables: ${missingVars.join(", ")}`, 29 ); 30} 31 32Sentry.init({ 33 dsn: process.env.SENTRY_DSN, 34 environment, 35 release: version, 36}); 37 38console.log( 39 `----------------------------------\n${name} Server\n----------------------------------\n`, 40); 41console.log(`🏗️ Starting ${name}...`); 42console.log("📦 Loading Slack App..."); 43console.log("🔑 Loading environment variables..."); 44 45const slackApp = new SlackApp({ 46 env: { 47 SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN as string, 48 SLACK_SIGNING_SECRET: process.env.SLACK_SIGNING_SECRET as string, 49 SLACK_LOGGING_LEVEL: "INFO", 50 }, 51 startLazyListenerAfterAck: true, 52}); 53const slackClient = slackApp.client; 54 55console.log(`⚒️ Loading ${Object.entries(features).length} features...`); 56for (const [feature, handler] of Object.entries(features)) { 57 console.log(`📦 ${feature} loaded`); 58 if (typeof handler === "function") { 59 handler(); 60 } 61} 62 63export default { 64 port: process.env.PORT || 3000, 65 async fetch(request: Request) { 66 const url = new URL(request.url); 67 const path = `/${url.pathname.split("/")[1]}`; 68 69 switch (path) { 70 case "/": 71 return new Response(`Hello World from ${name}@${version}`); 72 case "/health": 73 return new Response("OK"); 74 case "/slack": 75 return slackApp.run(request); 76 case "/api": 77 return apiRouter(url); 78 default: 79 return new Response("404 Not Found", { status: 404 }); 80 } 81 }, 82}; 83 84console.log( 85 `🚀 Server Started in ${ 86 Bun.nanoseconds() / 1000000 87 } milliseconds on version: ${version}!\n\n----------------------------------\n`, 88); 89 90blog( 91 t("app.startup", { 92 environment, 93 }), 94 "start", 95 { 96 channel: process.env.SLACK_SPAM_CHANNEL || "", 97 }, 98); 99 100console.log("\n----------------------------------\n"); 101 102export { slackApp, slackClient, version, name, environment };