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 { 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 };