123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- const TurndownService = require("turndown");
- const RSSParser = require("rss-parser");
- const db = require("../db.js");
- const interval = require("interval-promise");
- const client = require("../client.js");
- const turndown = new TurndownService();
- turndown.addRule("image", {
- filter: "img",
- replacement: () => ""
- });
- turndown.addRule("link", {
- filter: node => node.nodeName === "A" &&node.getAttribute("href"),
- replacement: (content, node) => node.getAttribute("href")
- });
- const parser = new RSSParser();
- const RSS_UPDATE_INTERVAL_MIN = 5;
- function getThreadId(url) {
- let result = url.substring(url.lastIndexOf(".") + 1);
- if(result.endsWith("/"))
- result = result.substring(0, result.length - 1);
- return result;
- }
- async function checkFeeds() {
- console.log(`Checking feeds on ${new Date().toISOString()}`);
- let feeds = db.get("rssFeeds").value();
- let outlets = db.get("feedOutputs").value();
- let oldNews = db.get("postedNewsGuids");
- for(let feedEntry of feeds) {
- let feed = await parser.parseURL(feedEntry.url);
- if(feed.items.length == 0)
- continue;
- let printableItems = feed.items.filter(i => i.isoDate > feedEntry.lastUpdate).sort((a, b) => a.isoDate.localeCompare(b.isoDate));
- if(printableItems.length > 0) {
- printableItems.forEach(item => {
- let itemID = getThreadId(item.guid);
- if(oldNews.has(itemID).value())
- return;
- outlets.forEach(ch => {
- client.channels.get(ch).send(`**${item.title}**\nPosted by ${item.creator}\n${item.link}\n\n${turndown.turndown(item[feedEntry.contentElement]).replace(/( {2}\n|\n\n){2,}/gm, "\n").replace(item.link, "")}`);
- });
- oldNews.set(itemID, true).write();
- });
- let lastUpdateDate = printableItems[printableItems.length - 1].isoDate;
- console.log(`Setting last update marker on ${feedEntry.url} to ${lastUpdateDate}`);
- db.get("rssFeeds").find({ url: feedEntry.url}).assign({lastUpdate: lastUpdateDate}).write();
- }
- }
- }
- const onStart = () => {
- interval(checkFeeds, RSS_UPDATE_INTERVAL_MIN * 60 * 1000);
- };
- module.exports = {
- onStart: onStart
- };
|