a fun bot for the hc slack
1import { slackClient } from "../index";
2
3import Bottleneck from "bottleneck";
4import Queue from "./queue";
5
6import colors from "colors";
7import type {
8 ChatPostMessageRequest,
9 ChatPostMessageResponse,
10} from "slack-edge";
11
12// Create a rate limiter with Bottleneck
13const limiter = new Bottleneck({
14 minTime: 1000, // 1 second between each request
15});
16
17const messageQueue = new Queue();
18
19function sendMessage(
20 message: ChatPostMessageRequest,
21): Promise<ChatPostMessageResponse> {
22 return limiter.schedule(() => slackClient.chat.postMessage(message));
23}
24
25async function slog(
26 logMessage: string,
27 location?: {
28 thread_ts?: string;
29 channel: string;
30 },
31): Promise<void> {
32 const message: ChatPostMessageRequest = {
33 channel: location?.channel || process.env.SLACK_LOG_CHANNEL || "",
34 thread_ts: location?.thread_ts,
35 text: logMessage.substring(0, 2500),
36 blocks: [
37 {
38 type: "section",
39 text: {
40 type: "mrkdwn",
41 text: logMessage
42 .split("\n")
43 .map((a) => `> ${a}`)
44 .join("\n"),
45 },
46 },
47 {
48 type: "context",
49 elements: [
50 {
51 type: "mrkdwn",
52 text: `${new Date().toString()}`,
53 },
54 ],
55 },
56 ],
57 };
58
59 messageQueue.enqueue(() => sendMessage(message));
60}
61
62type LogType = "info" | "start" | "cron" | "error";
63
64export async function clog(logMessage: string, type: LogType): Promise<void> {
65 switch (type) {
66 case "info":
67 console.log(colors.blue(logMessage));
68 break;
69 case "start":
70 console.log(colors.green(logMessage));
71 break;
72 case "cron":
73 console.log(colors.magenta(`[CRON]: ${logMessage}`));
74 break;
75 case "error":
76 console.error(
77 colors.red.bold(
78 `Yo <@S0790GPRA48> deres an error \n\n [ERROR]: ${logMessage}`,
79 ),
80 );
81 break;
82 default:
83 console.log(logMessage);
84 }
85}
86
87export async function blog(
88 logMessage: string,
89 type: LogType,
90 location?: {
91 thread_ts?: string;
92 channel: string;
93 },
94): Promise<void> {
95 slog(logMessage, location);
96 clog(logMessage, type);
97}
98
99export { clog as default, slog };