Files
request-bot/src/index.ts

116 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const chalk = require('chalk');
const {ImapFlow} = require('imapflow');
const simpleParser = require('mailparser').simpleParser
const {Telegraf} = require('telegraf');
require('dotenv').config()
const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
const POLLING_TIMEOUT = process.env.POLLING_TIMEOUT
const MARK_STRING = process.env.MARK_STRING
const clientConfig = {
host: process.env.EMAIL_IMAP_SERVER,
port: process.env.EMAIL_IMAP_SERVER_PORT,
secure: true,
auth: {
user: process.env.EMAIL_ADDRESS,
pass: process.env.EMAIL_PASSWORD,
}
}
const main = async () => {
const client = new ImapFlow(clientConfig);
await client.connect(); // Wait until client connects and authorizes
const lock = await client.getMailboxLock('INBOX'); // Open mailbox
try {
let listSeenMsgId = await client.search({seen: false}); // search only unseen messages
console.log('📌', chalk.cyan('UNSEEN LIST:'), listSeenMsgId)
for await (let message of client.fetch(listSeenMsgId,
{
envelope: true,
source: true
})) {
if (message.envelope.subject && message.envelope.subject.includes(MARK_STRING)) {
let email = Buffer.from(message.source).toString()
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]
console.log(
`📌 Новое обращение: ${title}`, '\n',
`Группа: ${groupName}`, '\n',
`${user}`, '\n',
`${subject}`, '\n',
`Время выполнения: ${estimatedDate} ${estimatedTime}`, '\n'
)
const preparedMessage =
`📌 Новое обращение: ${title}\n` +
`Группа: ${groupName}\n` +
`${user}\n` +
`${subject}\n` +
`Время выполнения: ${estimatedDate} ${estimatedTime}\n`
if (parsed.text) {
bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage)
.then()
.catch(console.error)
}
client.messageFlagsAdd(message.seq.toString(), ['\\Seen'])
.then((result: any) => console.log('📌', chalk.cyan(`Set seen flag for id-${message.seq}`), result))
.catch(console.error)
}
}
} catch (e) {
console.log(e)
} finally {
lock.release(); // mandatory release mailbox
await client.logout(); // log out and close connection
console.log('🧡', chalk.cyan('Heartbeat is ok'))
}
};
//main().then().catch(err => console.error(err)); // start once for development
setInterval(async () => {
main().then().catch(console.error);
}, Number(POLLING_TIMEOUT) * 1000)