From 8e425b4f12aca5577572f84f3511866183257a75 Mon Sep 17 00:00:00 2001 From: Timo Behrendt Date: Wed, 8 Jan 2025 19:07:16 +0100 Subject: [PATCH 1/2] refactor: application structure (#11) Reviewed-on: https://gitea.t000-n.de/t.behrendt/ts3gotify/pulls/11 Co-authored-by: Timo Behrendt Co-committed-by: Timo Behrendt --- Dockerfile | 2 +- package.json | 6 +- src/app.ts | 141 ----------------------------------------------- src/main.ts | 64 +++++++++++++++++++++ src/ts3gotify.ts | 106 +++++++++++++++++++++++++++++++++++ src/types.ts | 5 ++ 6 files changed, 179 insertions(+), 145 deletions(-) delete mode 100644 src/app.ts create mode 100644 src/main.ts create mode 100644 src/ts3gotify.ts diff --git a/Dockerfile b/Dockerfile index 77f6014..c17f812 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,4 +20,4 @@ FROM base AS release COPY --from=install /temp/prod/node_modules node_modules COPY --from=build /app/dist . -CMD [ "bun", "/app/app.js"] \ No newline at end of file +CMD [ "bun", "/app/main.js"] \ No newline at end of file diff --git a/package.json b/package.json index 868d630..fe696b8 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "scripts": { - "build": "bun build --minify --target bun --outdir dist --sourcemap src/app.ts", + "build": "bun build --minify --target bun --outdir dist --sourcemap src/main.ts", "check:code": "eslint src/ --ext .ts", "check:spell": "cspell --config cspell.code.json **/*.ts", - "start": "bun run src/app.ts" + "start": "bun run src/main.ts" }, "devDependencies": { "@types/ts3-nodejs-library": "^2.0.1", @@ -22,6 +22,6 @@ "ts3-nodejs-library": "^3.4.1" }, "name": "ts3gotify", - "module": "src/app.ts", + "module": "src/main.ts", "type": "module" } diff --git a/src/app.ts b/src/app.ts deleted file mode 100644 index 897ab56..0000000 --- a/src/app.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Gotify } from "gotify"; -import { - QueryProtocol, - TeamSpeak, - TextMessageTargetMode, -} from "ts3-nodejs-library"; - -import { pino } from "pino"; - -import { - GOTIFY_TITLE, - GOTIFY_TOKEN, - GOTIFY_URL, - LOG_LEVEL, - MODE, - TS3_HOST, - TS3_NICKNAME, - TS3_PASSWORD, - TS3_QUERY_PORT, - TS3_SERVER_PORT, - TS3_USERNAME, -} from "./env"; -import type { Mode } from "./types"; - -const logger = pino({ - level: LOG_LEVEL, - name: "ts3gotify", -}); - -const gotify = new Gotify({ - server: GOTIFY_URL, -}); - -const gotifyConfig = { - app: GOTIFY_TOKEN, - title: GOTIFY_TITLE, -}; - -function getModes(): { - [key in Mode]: boolean; -} { - const modes = MODE.map((mode) => { - return { [mode]: true }; - }); - - return { - connect: false, - disconnect: false, - moved: false, - message: false, - ...modes, - }; -} - -function sendNotification(message: string) { - gotify - .send({ - ...gotifyConfig, - message: message, - }) - .catch((error: Error) => { - logger.error(`Error sending message to gotify: ${error.message}`); - }); -} - -function resolveMessageTarget(target: TextMessageTargetMode): string { - if (target === 1) { - return "Client"; - } else if (target === 2) { - return "Channel"; - } else { - return "Server"; - } -} - -function handleMessage(message: string) { - logger.debug(message); - sendNotification(message); -} - -TeamSpeak.connect({ - host: TS3_HOST, - queryport: TS3_QUERY_PORT, - serverport: TS3_SERVER_PORT, - protocol: QueryProtocol.RAW, - username: TS3_USERNAME, - password: TS3_PASSWORD, - nickname: TS3_NICKNAME, -}).then((teamspeak) => { - const mode = getModes(); - - logger.info( - `connected to TS3 in modes: ${Object.entries(mode) - .filter(([_, value]) => value) - .map(([key]) => key) - .join(", ")}` - ); - - logger.info("connected to TS3"); - - if (mode.connect) { - teamspeak.on("clientconnect", (event) => { - handleMessage(`${event.client.nickname} connected`); - }); - } - - if (mode.disconnect) { - teamspeak.on("clientdisconnect", (event) => { - handleMessage(`${event.client?.nickname} disconnected`); - }); - } - - if (mode.message) { - teamspeak.on("textmessage", (event) => { - handleMessage( - `${event.invoker.nickname} wrote ${ - event.msg - } to a ${resolveMessageTarget(event.targetmode)}` - ); - }); - } - - if (mode.moved) { - teamspeak.on("clientmoved", (event) => { - handleMessage( - `${event.client.nickname} got moved to ${event.channel.name}` - ); - }); - } - - teamspeak.on("close", async () => { - logger.debug("disconnected, trying to reconnect..."); - await teamspeak.reconnect(5, 1000); - logger.info("reconnected!"); - }); - - teamspeak.on("error", (error: Error) => { - logger.error(`Error connecting to TS3 server: ${error.message}`); - process.exit(1); - }); -}); diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..fa1cf39 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,64 @@ +import { Gotify } from "gotify"; +import { QueryProtocol, TeamSpeak } from "ts3-nodejs-library"; + +import { pino } from "pino"; + +import { + GOTIFY_TITLE, + GOTIFY_TOKEN, + GOTIFY_URL, + LOG_LEVEL, + MODE, + TS3_HOST, + TS3_NICKNAME, + TS3_PASSWORD, + TS3_QUERY_PORT, + TS3_SERVER_PORT, + TS3_USERNAME, +} from "./env"; +import type { Mode } from "./types"; +import { getModes, ts3gotifyFactory } from "./ts3gotify"; + +async function main() { + const logger = pino({ + level: LOG_LEVEL, + name: "ts3gotify", + }); + + const gotify = new Gotify({ + server: GOTIFY_URL, + }); + + const teamspeak = await TeamSpeak.connect({ + host: TS3_HOST, + queryport: TS3_QUERY_PORT, + serverport: TS3_SERVER_PORT, + protocol: QueryProtocol.RAW, + username: TS3_USERNAME, + password: TS3_PASSWORD, + nickname: TS3_NICKNAME, + }); + logger.info("connected to TS3"); + + const modeList = getModes(MODE); + const enabledModeNames = Object.entries(modeList) + .filter(([, value]) => value) + .map(([key]) => key); + + logger.info(`connected to TS3 in modes: ${enabledModeNames.join(", ")}`); + + const ts3gotify = ts3gotifyFactory( + teamspeak, + gotify, + { + app: GOTIFY_TOKEN, + title: GOTIFY_TITLE, + }, + logger + ); + + for (const mode of enabledModeNames) + ts3gotify.registerEventListenerForMode(mode as Mode); +} + +main(); diff --git a/src/ts3gotify.ts b/src/ts3gotify.ts new file mode 100644 index 0000000..0426a80 --- /dev/null +++ b/src/ts3gotify.ts @@ -0,0 +1,106 @@ +import type { Gotify } from "gotify"; +import type { Logger } from "pino"; +import type { TeamSpeak, TextMessageTargetMode } from "ts3-nodejs-library"; +import type { GotifyConfig, Mode } from "./types"; +import { + ClientConnect, + ClientDisconnect, + ClientMoved, + TextMessage, +} from "ts3-nodejs-library/lib/types/Events"; + +function resolveMessageTarget(target: TextMessageTargetMode): string { + if (target === 1) { + return "Client"; + } else if (target === 2) { + return "Channel"; + } else { + return "Server"; + } +} + +export function getModes(mode: Mode[]): { + [key in Mode]: boolean; +} { + const modes = mode + .map((mode) => { + return { [mode]: true }; + }) + .reduce((acc, cur) => { + return { ...acc, ...cur }; + }); + + return { + connect: false, + disconnect: false, + moved: false, + message: false, + ...modes, + }; +} + +export function ts3gotifyFactory( + ts3Client: TeamSpeak, + gotifyClient: Gotify, + gotifyConfig: GotifyConfig, + logger: Logger +) { + function sendNotification(message: string) { + gotifyClient + .send({ + ...gotifyConfig, + message: message, + }) + .catch((error: Error) => { + logger.error(`Error sending message to gotify: ${error.message}`); + }); + } + + function registerEventListenerForMode(mode: Mode) { + switch (mode) { + case "connect": + ts3Client.on("clientconnect", (event: ClientConnect) => + sendNotification(`${event.client.nickname} connected`) + ); + break; + case "disconnect": + ts3Client.on("clientdisconnect", (event: ClientDisconnect) => + sendNotification(`${event.client?.nickname} disconnected`) + ); + break; + case "moved": + ts3Client.on("clientmoved", (event: ClientMoved) => + sendNotification( + `${event.client.nickname} got moved to ${event.channel.name}` + ) + ); + break; + case "message": + ts3Client.on("textmessage", (event: TextMessage) => + sendNotification( + `${event.invoker.nickname} wrote ${ + event.msg + } to a ${resolveMessageTarget(event.targetmode)}` + ) + ); + break; + } + } + + ts3Client.on("close", async () => { + logger.info("disconnected, trying to reconnect..."); + await ts3Client.reconnect(5, 1000); + logger.info("reconnected!"); + }); + + ts3Client.on("error", (error: Error) => { + logger.error(`Error connecting to TS3 server: ${error.message}`); + process.exit(1); + }); + + return { + registerEventListenerForMode, + }; +} + +export type Ts3Gotify = ReturnType; diff --git a/src/types.ts b/src/types.ts index b372a3b..53a97eb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,8 @@ export type Mode = "connect" | "disconnect" | "moved" | "message"; export type LogLevel = "error" | "info" | "debug"; + +export type GotifyConfig = { + app: string; + title: string; +}; -- 2.49.1 From 074a9aa4abd7f4112c239bdf0e903d75b4197cca Mon Sep 17 00:00:00 2001 From: Timo Behrendt Date: Tue, 25 Mar 2025 21:50:59 +0100 Subject: [PATCH 2/2] chore: remove bun.lockb --- .gitea/workflows/cd.yaml | 2 +- Dockerfile | 8 ++++---- bun.lockb | Bin 123426 -> 0 bytes 3 files changed, 5 insertions(+), 5 deletions(-) delete mode 100755 bun.lockb diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index 93f7429..e4dc898 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -21,7 +21,7 @@ jobs: bun-version-file: ".bun-version" - name: Install dependencies - run: bun install --frozen-lockfile + run: bun install - name: Run lint run: bun run check:code diff --git a/Dockerfile b/Dockerfile index c17f812..c2e2d28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,12 +4,12 @@ WORKDIR /app FROM base AS install RUN mkdir -p /temp/dev -COPY package.json bun.lockb /temp/dev/ -RUN cd /temp/dev && bun install --frozen-lockfile +COPY package.json /temp/dev/ +RUN cd /temp/dev && bun install RUN mkdir -p /temp/prod -COPY package.json bun.lockb /temp/prod/ -RUN cd /temp/prod && bun install --frozen-lockfile --production +COPY package.json /temp/prod/ +RUN cd /temp/prod && bun install --production FROM base AS build COPY --from=install /temp/dev/node_modules node_modules diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index b55622b3177216a5cdd26f90a8f2f51953abb9da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123426 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%0AKHfg6Ppmf9`MzH|Hv-F-{~O!8bJa<74V^LIQFQV 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 bAJz!@aB@