Dev #12
14
Dockerfile
14
Dockerfile
@@ -1,8 +1,14 @@
|
|||||||
FROM node:22-alpine
|
# Build stage
|
||||||
|
FROM node:20-alpine as build
|
||||||
ARG APP_DIR=app
|
ARG APP_DIR=app
|
||||||
RUN mkdir -p ${APP_DIR}
|
RUN mkdir -p ${APP_DIR}
|
||||||
WORKDIR ${APP_DIR}
|
WORKDIR ${APP_DIR}
|
||||||
|
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm install
|
RUN npm ci && npm cache clean --force
|
||||||
COPY ./build ./
|
CMD ["npm", "run", "build"]
|
||||||
CMD ["npm", "start"]
|
|
||||||
|
# Run stage
|
||||||
|
FROM node:20-alpine
|
||||||
|
COPY --from=build ./build ./
|
||||||
|
CMD ["node", "index.js"]
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
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 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); }
|
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 chalk = require('chalk');
|
||||||
var ImapFlow = require('imapflow').ImapFlow;
|
var ImapFlow = require('imapflow').ImapFlow;
|
||||||
var simpleParser = require('mailparser').simpleParser;
|
var simpleParser = require('mailparser').simpleParser;
|
||||||
var Telegraf = require('telegraf').Telegraf;
|
var Telegraf = require('telegraf').Telegraf;
|
||||||
|
var lib_1 = require("./lib");
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
var bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
|
var bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
|
||||||
var POLLING_TIMEOUT = process.env.POLLING_TIMEOUT;
|
var POLLING_TIMEOUT = process.env.POLLING_TIMEOUT;
|
||||||
@@ -59,7 +61,7 @@ var clientConfig = {
|
|||||||
pass: process.env.EMAIL_PASSWORD,
|
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 client, lock, listSeenMsgId, _loop_1, _a, _b, _c, e_1_1, e_2;
|
||||||
var _d, e_1, _e, _f;
|
var _d, e_1, _e, _f;
|
||||||
return __generator(this, function (_g) {
|
return __generator(this, function (_g) {
|
||||||
@@ -83,28 +85,36 @@ var main = function () { return __awaiter(_this, void 0, void 0, function () {
|
|||||||
case 5:
|
case 5:
|
||||||
_g.trys.push([5, 11, 12, 17]);
|
_g.trys.push([5, 11, 12, 17]);
|
||||||
_loop_1 = function () {
|
_loop_1 = function () {
|
||||||
var message, email, parsed;
|
var message, email, parsed, _h, title, groupName, subject, user, estimatedDate, estimatedTime, preparedMessage;
|
||||||
return __generator(this, function (_h) {
|
return __generator(this, function (_j) {
|
||||||
switch (_h.label) {
|
switch (_j.label) {
|
||||||
case 0:
|
case 0:
|
||||||
_f = _c.value;
|
_f = _c.value;
|
||||||
_a = false;
|
_a = false;
|
||||||
message = _f;
|
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();
|
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:
|
case 1:
|
||||||
parsed = _h.sent();
|
parsed = _j.sent();
|
||||||
console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text));
|
_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;
|
||||||
if (parsed.text) {
|
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');
|
||||||
bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, parsed.text)
|
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()
|
.then()
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
client.messageFlagsAdd(message.seq.toString(), ['\\Seen'])
|
client.messageFlagsAdd(message.seq.toString(), ['\\Seen'])
|
||||||
.then(function (result) { return console.log('📌', chalk.cyan("Set seen flag for id-".concat(message.seq)), result); })
|
.then(function (result) { return console.log('📌', chalk.cyan("Set seen flag for id-".concat(message.seq)), result); })
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
_h.label = 2;
|
_j.label = 2;
|
||||||
case 2: return [2 /*return*/];
|
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
|
//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) {
|
return __generator(this, function (_a) {
|
||||||
main().then().catch(console.error);
|
main().then().catch(console.error);
|
||||||
return [2 /*return*/];
|
return [2 /*return*/];
|
||||||
|
|||||||
34
build/lib.js
Normal file
34
build/lib.js
Normal file
@@ -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;
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "requestbot",
|
"name": "requestbot",
|
||||||
"version": "0.1.0",
|
"version": "0.7.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "/src/index.ts",
|
"main": "/src/index.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node index.js",
|
|
||||||
"watch": "npx nodemon ./src/index.ts",
|
"watch": "npx nodemon ./src/index.ts",
|
||||||
"build": "npx tsc ./src/index.ts --outDir ./build",
|
"build": "npx tsc ./src/index.ts --outDir ./build",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
|||||||
35
src/index.ts
35
src/index.ts
@@ -3,6 +3,8 @@ const {ImapFlow} = require('imapflow');
|
|||||||
const simpleParser = require('mailparser').simpleParser
|
const simpleParser = require('mailparser').simpleParser
|
||||||
const {Telegraf} = require('telegraf');
|
const {Telegraf} = require('telegraf');
|
||||||
|
|
||||||
|
import {parseMessage} from './lib'
|
||||||
|
|
||||||
require('dotenv').config()
|
require('dotenv').config()
|
||||||
|
|
||||||
const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
|
const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
|
||||||
@@ -41,36 +43,7 @@ const main = async () => {
|
|||||||
const parsed = await simpleParser(email)
|
const parsed = await simpleParser(email)
|
||||||
//console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text));
|
//console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text));
|
||||||
|
|
||||||
let messageArr = parsed.text.slice().split('\n').filter((el: string) => el !== '')
|
let {title, groupName, subject, user, estimatedDate, estimatedTime} = parseMessage(parsed.text)
|
||||||
|
|
||||||
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]
|
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
`📌 Новое обращение: ${title}`, '\n',
|
`📌 Новое обращение: ${title}`, '\n',
|
||||||
@@ -87,7 +60,7 @@ const main = async () => {
|
|||||||
`${subject}\n` +
|
`${subject}\n` +
|
||||||
`Время выполнения: ${estimatedDate} ${estimatedTime}\n`
|
`Время выполнения: ${estimatedDate} ${estimatedTime}\n`
|
||||||
|
|
||||||
if (parsed.text) {
|
if (preparedMessage) {
|
||||||
bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage)
|
bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage)
|
||||||
.then()
|
.then()
|
||||||
.catch(console.error)
|
.catch(console.error)
|
||||||
|
|||||||
42
src/lib.ts
Normal file
42
src/lib.ts
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user