rss_checker.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const TurndownService = require("turndown");
  2. const RSSParser = require("rss-parser");
  3. const db = require("../db.js");
  4. const interval = require("interval-promise");
  5. const client = require("../client.js");
  6. const turndown = new TurndownService();
  7. turndown.addRule("image", {
  8. filter: "img",
  9. replacement: () => ""
  10. });
  11. turndown.addRule("link", {
  12. filter: node => node.nodeName === "A" &&node.getAttribute("href"),
  13. replacement: (content, node) => node.getAttribute("href")
  14. });
  15. const parser = new RSSParser();
  16. const RSS_UPDATE_INTERVAL_MIN = 5;
  17. function getThreadId(url) {
  18. let result = url.substring(url.lastIndexOf(".") + 1);
  19. if(result.endsWith("/"))
  20. result = result.substring(0, result.length - 1);
  21. return result;
  22. }
  23. async function checkFeeds() {
  24. console.log(`Checking feeds on ${new Date().toISOString()}`);
  25. let feeds = db.get("rssFeeds").value();
  26. let outlets = db.get("feedOutputs").value();
  27. let oldNews = db.get("postedNewsGuids");
  28. for(let feedEntry of feeds) {
  29. let feed = await parser.parseURL(feedEntry.url);
  30. if(feed.items.length == 0)
  31. continue;
  32. let printableItems = feed.items.filter(i => i.isoDate > feedEntry.lastUpdate).sort((a, b) => a.isoDate.localeCompare(b.isoDate));
  33. if(printableItems.length > 0) {
  34. printableItems.forEach(item => {
  35. let itemID = getThreadId(item.guid);
  36. if(oldNews.has(itemID).value())
  37. return;
  38. outlets.forEach(ch => {
  39. 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, "")}`);
  40. });
  41. oldNews.set(itemID, true).write();
  42. });
  43. let lastUpdateDate = printableItems[printableItems.length - 1].isoDate;
  44. console.log(`Setting last update marker on ${feedEntry.url} to ${lastUpdateDate}`);
  45. db.get("rssFeeds").find({ url: feedEntry.url}).assign({lastUpdate: lastUpdateDate}).write();
  46. }
  47. }
  48. }
  49. const onStart = () => {
  50. interval(checkFeeds, RSS_UPDATE_INTERVAL_MIN * 60 * 1000);
  51. };
  52. module.exports = {
  53. onStart: onStart
  54. };