From e4622adc67ad5c8d298f43a4e8618ade9d8c5c1f Mon Sep 17 00:00:00 2001 From: Kyle Fang Date: Mon, 1 May 2023 15:25:57 +0800 Subject: [PATCH] chore: add thread support --- package.json | 3 +- pnpm-lock.yaml | 102 +------------------------------------------------ src/index.ts | 41 +++++++++++++------- src/message.ts | 18 ++++++--- 4 files changed, 43 insertions(+), 121 deletions(-) diff --git a/package.json b/package.json index 8391c8e..ce4bbb1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "test": "vitest" }, "dependencies": { - "@cfworker/web": "^1.12.5", - "telegraf": "^4.12.2" + "@cfworker/web": "^1.12.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bd0b93..c1d96e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ dependencies: '@cfworker/web': specifier: ^1.12.5 version: 1.12.5 - telegraf: - specifier: ^4.12.2 - version: 4.12.2 devDependencies: '@cloudflare/workers-types': @@ -741,13 +738,6 @@ packages: pretty-format: 27.5.1 dev: true - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -801,21 +791,6 @@ packages: fill-range: 7.0.1 dev: true - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: false - - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: false - - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: false - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -924,6 +899,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -1011,11 +987,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - /execa@6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1238,13 +1209,9 @@ packages: ufo: 1.1.1 dev: true - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} @@ -1262,18 +1229,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -1314,11 +1269,6 @@ packages: yocto-queue: 1.0.0 dev: true - /p-timeout@4.1.0: - resolution: {integrity: sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==} - engines: {node: '>=10'} - dev: false - /parse-package-name@1.0.0: resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} dev: true @@ -1425,17 +1375,6 @@ packages: fsevents: 2.3.2 dev: true - /safe-compare@1.1.4: - resolution: {integrity: sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==} - dependencies: - buffer-alloc: 1.2.0 - dev: false - - /sandwich-stream@2.0.2: - resolution: {integrity: sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==} - engines: {node: '>= 0.10'} - dev: false - /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false @@ -1544,24 +1483,6 @@ packages: acorn: 8.8.2 dev: true - /telegraf@4.12.2: - resolution: {integrity: sha512-PgwqI4wD86cMqVfFtEM9JkGGnMHgvgLJbReZMmwW4z35QeOi4DvbdItONld4bPnYn3A1jcO0SRKs0BXmR+x+Ew==} - engines: {node: ^12.20.0 || >=14.13.1} - hasBin: true - dependencies: - abort-controller: 3.0.0 - debug: 4.3.4 - mri: 1.2.0 - node-fetch: 2.6.9 - p-timeout: 4.1.0 - safe-compare: 1.1.4 - sandwich-stream: 2.0.2 - typegram: 4.3.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /time-zone@1.0.0: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} @@ -1588,19 +1509,11 @@ packages: is-number: 7.0.0 dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /typegram@4.3.0: - resolution: {integrity: sha512-pS4STyOZoJ++Mwa9GPMTNjOwEzMkxFfFt1By6IbMOJfheP0utMP/H1ga6J9R4DTjAYBr0UDn4eQg++LpWBvcAg==} - dev: false - /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} @@ -1749,22 +1662,11 @@ packages: - terser dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - /well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/src/index.ts b/src/index.ts index 1af7326..aff9793 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,52 +31,61 @@ router.post("/bot", async (context) => { }); router.post("/t/:webhookId/raw", async (context) => { - const chatId = await TG_GROUPS.get( + const chat = await TG_GROUPS.get( `webhook-chat:${context.req.params.webhookId}` ); - if (chatId == null) { + if (chat == null) { context.res.body = { ok: false, error: "chatId not found" }; context.res.status = 404; + return; } const result = await context.req.body.text(); - await sendToChat(Number(chatId), result); + await sendToChat(JSON.parse(chat), result); context.res.body = { ok: true }; }); router.post("/t/:webhookId", async (context) => { - const chatId = await TG_GROUPS.get( + const chat = await TG_GROUPS.get( `webhook-chat:${context.req.params.webhookId}` ); - if (chatId == null) { + if (chat == null) { context.res.body = { ok: false, error: "chatId not found" }; context.res.status = 404; + return; } const result: RichMessage = await context.req.body.json(); - await sendToChat(Number(chatId), formatRichMessage(result), "HTML"); + await sendToChat(JSON.parse(chat), formatRichMessage(result), "HTML"); context.res.body = { ok: true }; }); new Application().use(router.middleware).listen(); async function processUpdate(update: Update): Promise { + console.log(JSON.stringify(update, null, 2)); if (update.message == null) { return; } if (update.message.text === "/webhook") { const chatId = update.message.chat.id; - const key = `chat-webhook:${chatId}`; + const chat = { + chatId, + messageThreadId: update.message.message_thread_id, + }; + const key = `chat-webhook:${JSON.stringify(chat)}`; const result = await TG_GROUPS.get(key); let webhookUrl: string; if (result == null) { const uuid = crypto.randomUUID(); await TG_GROUPS.put(key, uuid); - await TG_GROUPS.put(`webhook-chat:${uuid}`, chatId.toString()); + await TG_GROUPS.put(`webhook-chat:${uuid}`, JSON.stringify(chat)); webhookUrl = `${WEBHOOK_PREFIX}/t/${uuid}`; } else { - await TG_GROUPS.put(`webhook-chat:${result}`, chatId.toString()); + await TG_GROUPS.put(`webhook-chat:${result}`, JSON.stringify(chat)); webhookUrl = `${WEBHOOK_PREFIX}/t/${result}`; } - await sendToChat(chatId, `${webhookUrl} + await sendToChat( + chat, + `${webhookUrl} { @@ -88,12 +97,17 @@ async function processUpdate(update: Update): Promise { } } -`, 'HTML'); +`, + "HTML" + ); } } async function sendToChat( - chatId: number, + chat: { + chatId: number; + messageThreadId?: number; + }, text: string, parseMode?: "HTML" ): Promise { @@ -103,7 +117,8 @@ async function sendToChat( "Content-Type": "application/json", }, body: JSON.stringify({ - chat_id: chatId, + chat_id: chat.chatId, + message_thread_id: chat.messageThreadId, text, parse_mode: parseMode, }), diff --git a/src/message.ts b/src/message.ts index e15af7e..5a09b97 100644 --- a/src/message.ts +++ b/src/message.ts @@ -1,5 +1,5 @@ export type RichMessage = { - topic: string; + channel?: string; event: string; text?: string; emoji?: string; @@ -10,13 +10,19 @@ export function formatRichMessage(message: RichMessage): string { const metadata = Object.entries(message.metadata ?? {}) .map(([key, value]) => `#${key}: ${value}`) .join("\n"); - return `${message.emoji ? message.emoji + " • " : ""}#${ - message.topic - } + return `${message.emoji ? message.emoji + " • " : ""}${ + message.channel + ? `#${message.channel} -${message.event}${message.text ? ` +` + : "" + }${message.event}${ + message.text + ? ` -${message.text}` : ""} +${message.text}` + : "" + } ${metadata}`; }