2018-08-15 20:00:52 +02:00

87 lines
2.2 KiB
TypeScript

require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
require('ssl-root-cas').inject();
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
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());
console.log("Received Data");
let feed: Feed = await parser.parseString(data).catch(console.error);
//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(console.error)
}
} catch (error) {
console.error(error);
}
}
async function sendFeed(feed: Feed, item: FeedItem) {
console.log("Sending Mail!")
let mailOptions = {
from: process.env.MAIL_SENDER,
to: process.env.MAIL_RECEIVER,
subject: '[OSPLUS_UPDATE] ' + unescape(item.title),
text: item.contentSnippet,
html: item.content
};
let info = await transporter.sendMail(mailOptions);
console.log('Message sent: %s', info.messageId);
db.set(calculateHash(item), true).write();
}
setInterval(() => check(), 1000 * 60 * 60 * 12);
check();