90 lines
2.4 KiB
TypeScript
90 lines
2.4 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 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(); |