a fun bot for the hc slack
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 };