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