require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create(); require('ssl-root-cas').inject(); process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; import Logging from "@hibas123/nodelogging"; import * as dotenv from "dotenv"; dotenv.config(); import rss from "rss-parser"; const parser = new rss(); import fetch from "node-fetch"; import { createHash } from "crypto"; import low from "lowdb"; import FileSync from "lowdb/adapters/FileSync"; const adapter = new FileSync<{ test }>("db.json"); const db = low(adapter); db.defaults({}); import { createTransport } from "nodemailer"; let transporter = createTransport({ host: process.env.MAIL_SERVER, port: 587, secure: false, // true for 465, false for other ports auth: { user: process.env.MAIL_USERNAME, pass: process.env.MAIL_PASSWORD } }); interface Feed { title: string; language: string; description: string; copyright: string; items: FeedItem[]; } interface FeedItem { title: string; link: string; content: string, contentSnippet: string; guid: string; } function calculateHash(item: FeedItem) { let hash = createHash("sha512"); hash.update(item.content + item.guid + item.title); return hash.digest("hex"); } async function check() { try { let data = await fetch(process.env.FEED).then(res => res.text()); Logging.log("Received Data"); let feed: Feed = await parser.parseString(data).catch(err => Logging.error(err)); //Check for new entries let items = feed.items.filter(item => { return db.get(calculateHash(item)).value() !== true; }) for (let item of items) { await sendFeed(feed, item).catch(err => Logging.error(err)) } } catch (error) { Logging.error(error); } } import {AllHtmlEntities} from "html-entities"; const entities = new AllHtmlEntities(); async function sendFeed(feed: Feed, item: FeedItem) { Logging.log("Sending Mail!") let mailOptions = { from: process.env.MAIL_SENDER, to: process.env.MAIL_RECEIVER, subject: '[OSPLUS_UPDATE] ' + entities.decode(item.title), text: item.contentSnippet, html: item.content }; let info = await transporter.sendMail(mailOptions); Logging.log('Message sent: %s', info.messageId); db.set(calculateHash(item), true).write(); } setInterval(() => check(), 1000 * 60 * 5); check();