From f0f4d9479cdcfb7c41b17740e3719072bf0b2d49 Mon Sep 17 00:00:00 2001 From: RedRock Date: Thu, 16 May 2024 23:35:24 +0300 Subject: [PATCH 1/2] refactor: move to lib.ts --- src/index.ts | 35 ++++------------------------------- src/lib.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 src/lib.ts diff --git a/src/index.ts b/src/index.ts index 4d92cef..581c2c7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,8 @@ const {ImapFlow} = require('imapflow'); const simpleParser = require('mailparser').simpleParser const {Telegraf} = require('telegraf'); +import {parseMessage} from './lib' + require('dotenv').config() const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN); @@ -41,36 +43,7 @@ const main = async () => { const parsed = await simpleParser(email) //console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text)); - let messageArr = parsed.text.slice().split('\n').filter((el: string) => el !== '') - - const title = - messageArr[1] - .slice() - .split(' ') - .at(-1) - - const groupName = - messageArr[1] - .slice() - .replace('В АС СТП на Вашу группу Адлер ', '') - .replace(' назначено обращение', '') - .split(' ') - .slice(0, -1) - .join(' ') - - const user = messageArr[4] - - const subject = messageArr[6] - - const estimatedDate = - messageArr[7] - .slice() - .split(' ')[3] - - const estimatedTime = - messageArr[7] - .slice() - .split(' ')[4] + let {title, groupName, subject, user, estimatedDate, estimatedTime} = parseMessage(parsed.text) console.log( `📌 Новое обращение: ${title}`, '\n', @@ -87,7 +60,7 @@ const main = async () => { `${subject}\n` + `Время выполнения: ${estimatedDate} ${estimatedTime}\n` - if (parsed.text) { + if (preparedMessage) { bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage) .then() .catch(console.error) diff --git a/src/lib.ts b/src/lib.ts new file mode 100644 index 0000000..0fa1fb6 --- /dev/null +++ b/src/lib.ts @@ -0,0 +1,42 @@ +export function parseMessage(message: string) { + + let messageArr = message.slice().split('\n').filter((el: string) => el !== '') + + const title = + messageArr[1] + .slice() + .split(' ') + .at(-1) + + const groupName = + messageArr[1] + .slice() + .replace('В АС СТП на Вашу группу Адлер ', '') + .replace(' назначено обращение', '') + .split(' ') + .slice(0, -1) + .join(' ') + + const user = messageArr[4] + + const subject = messageArr[6] + + const estimatedDate = + messageArr[7] + .slice() + .split(' ')[3] + + const estimatedTime = + messageArr[7] + .slice() + .split(' ')[4] + + return { + title, + groupName, + user, + subject, + estimatedDate, + estimatedTime + } +} \ No newline at end of file -- 2.49.1 From 8f7929d2d6e9f432ba6d1871456a018a8cdfc236 Mon Sep 17 00:00:00 2001 From: RedRock Date: Fri, 17 May 2024 08:53:42 +0300 Subject: [PATCH 2/2] fix: update dockerfile, gh workflow --- Dockerfile | 14 ++++++++++---- build/index.js | 36 +++++++++++++++++++++++------------- build/lib.js | 34 ++++++++++++++++++++++++++++++++++ package.json | 3 +-- 4 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 build/lib.js diff --git a/Dockerfile b/Dockerfile index e11c3ce..55b080c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,14 @@ -FROM node:22-alpine +# Build stage +FROM node:20-alpine as build ARG APP_DIR=app RUN mkdir -p ${APP_DIR} WORKDIR ${APP_DIR} + COPY package*.json ./ -RUN npm install -COPY ./build ./ -CMD ["npm", "start"] \ No newline at end of file +RUN npm ci && npm cache clean --force +CMD ["npm", "run", "build"] + +# Run stage +FROM node:20-alpine +COPY --from=build ./build ./ +CMD ["node", "index.js"] \ No newline at end of file diff --git a/build/index.js b/build/index.js index 0322a33..db5835e 100644 --- a/build/index.js +++ b/build/index.js @@ -1,3 +1,4 @@ +"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -41,11 +42,12 @@ var __asyncValues = (this && this.__asyncValues) || function (o) { function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; -var _this = this; +Object.defineProperty(exports, "__esModule", { value: true }); var chalk = require('chalk'); var ImapFlow = require('imapflow').ImapFlow; var simpleParser = require('mailparser').simpleParser; var Telegraf = require('telegraf').Telegraf; +var lib_1 = require("./lib"); require('dotenv').config(); var bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN); var POLLING_TIMEOUT = process.env.POLLING_TIMEOUT; @@ -59,7 +61,7 @@ var clientConfig = { pass: process.env.EMAIL_PASSWORD, } }; -var main = function () { return __awaiter(_this, void 0, void 0, function () { +var main = function () { return __awaiter(void 0, void 0, void 0, function () { var client, lock, listSeenMsgId, _loop_1, _a, _b, _c, e_1_1, e_2; var _d, e_1, _e, _f; return __generator(this, function (_g) { @@ -83,28 +85,36 @@ var main = function () { return __awaiter(_this, void 0, void 0, function () { case 5: _g.trys.push([5, 11, 12, 17]); _loop_1 = function () { - var message, email, parsed; - return __generator(this, function (_h) { - switch (_h.label) { + var message, email, parsed, _h, title, groupName, subject, user, estimatedDate, estimatedTime, preparedMessage; + return __generator(this, function (_j) { + switch (_j.label) { case 0: _f = _c.value; _a = false; message = _f; - if (!message.envelope.subject.includes(MARK_STRING)) return [3 /*break*/, 2]; + if (!(message.envelope.subject && message.envelope.subject.includes(MARK_STRING))) return [3 /*break*/, 2]; email = Buffer.from(message.source).toString(); - return [4 /*yield*/, simpleParser(email)]; + return [4 /*yield*/, simpleParser(email) + //console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text)); + ]; case 1: - parsed = _h.sent(); - console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text)); - if (parsed.text) { - bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, parsed.text) + parsed = _j.sent(); + _h = (0, lib_1.parseMessage)(parsed.text), title = _h.title, groupName = _h.groupName, subject = _h.subject, user = _h.user, estimatedDate = _h.estimatedDate, estimatedTime = _h.estimatedTime; + console.log("\uD83D\uDCCC \u041D\u043E\u0432\u043E\u0435 \u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0435: ".concat(title), '\n', "\u0413\u0440\u0443\u043F\u043F\u0430: ".concat(groupName), '\n', "".concat(user), '\n', "".concat(subject), '\n', "\u0412\u0440\u0435\u043C\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F: ".concat(estimatedDate, " ").concat(estimatedTime), '\n'); + preparedMessage = "\uD83D\uDCCC \u041D\u043E\u0432\u043E\u0435 \u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0435: ".concat(title, "\n") + + "\u0413\u0440\u0443\u043F\u043F\u0430: ".concat(groupName, "\n") + + "".concat(user, "\n") + + "".concat(subject, "\n") + + "\u0412\u0440\u0435\u043C\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F: ".concat(estimatedDate, " ").concat(estimatedTime, "\n"); + if (preparedMessage) { + bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage) .then() .catch(console.error); } client.messageFlagsAdd(message.seq.toString(), ['\\Seen']) .then(function (result) { return console.log('📌', chalk.cyan("Set seen flag for id-".concat(message.seq)), result); }) .catch(console.error); - _h.label = 2; + _j.label = 2; case 2: return [2 /*return*/]; } }); @@ -158,7 +168,7 @@ var main = function () { return __awaiter(_this, void 0, void 0, function () { }); }); }; //main().then().catch(err => console.error(err)); // start once for development -setInterval(function () { return __awaiter(_this, void 0, void 0, function () { +setInterval(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { main().then().catch(console.error); return [2 /*return*/]; diff --git a/build/lib.js b/build/lib.js new file mode 100644 index 0000000..1b0b1f8 --- /dev/null +++ b/build/lib.js @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseMessage = void 0; +function parseMessage(message) { + var messageArr = message.slice().split('\n').filter(function (el) { return el !== ''; }); + var title = messageArr[1] + .slice() + .split(' ') + .at(-1); + var groupName = messageArr[1] + .slice() + .replace('В АС СТП на Вашу группу Адлер ', '') + .replace(' назначено обращение', '') + .split(' ') + .slice(0, -1) + .join(' '); + var user = messageArr[4]; + var subject = messageArr[6]; + var estimatedDate = messageArr[7] + .slice() + .split(' ')[3]; + var estimatedTime = messageArr[7] + .slice() + .split(' ')[4]; + return { + title: title, + groupName: groupName, + user: user, + subject: subject, + estimatedDate: estimatedDate, + estimatedTime: estimatedTime + }; +} +exports.parseMessage = parseMessage; diff --git a/package.json b/package.json index b8d5954..5bf41a4 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,9 @@ { "name": "requestbot", - "version": "0.1.0", + "version": "0.7.0", "description": "", "main": "/src/index.ts", "scripts": { - "start": "node index.js", "watch": "npx nodemon ./src/index.ts", "build": "npx tsc ./src/index.ts --outDir ./build", "test": "echo \"Error: no test specified\" && exit 1" -- 2.49.1