From 77ff2b43c11ff4e0df7ac68282bf83652de8ad11 Mon Sep 17 00:00:00 2001 From: MeowcaTheoRange Date: Sat, 31 Aug 2024 00:54:10 -0500 Subject: [PATCH] rss feed ????? --- index.js | 23 ++++++++++++++++ package-lock.json | 50 +++++++++++++++++++++++++++++++++- package.json | 3 +- views/components/page-head.ejs | 2 ++ views/pages/404.ejs | 12 ++++++++ views/pages/index.ejs | 4 +++ views/pages/sites.ejs | 4 +-- views/pages/updates.ejs | 21 ++++++++++++++ 8 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 views/pages/404.ejs create mode 100644 views/pages/updates.ejs diff --git a/index.js b/index.js index ae3bc79..e008101 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ import SQLite from 'better-sqlite3'; import { Kysely, SqliteDialect } from 'kysely'; import { nanoid } from "nanoid"; import { JSDOM } from "jsdom"; +import Parser from "rss-parser"; dotenvConfig(); @@ -18,6 +19,8 @@ const db = new Kysely({ }) }); +const rssParser = new Parser(); + rawDB.exec(`CREATE TABLE IF NOT EXISTS blurbs( 'id' TEXT, 'site' TEXT, 'blurb' TEXT, 'verified' INTEGER, 'time' INTEGER );`); rawDB.exec(`CREATE TABLE IF NOT EXISTS blacklist( 'domain' TEXT );`); @@ -68,6 +71,18 @@ app.get('/about', async (req, res) => { }); }); +app.get('/updates', async (req, res) => { + const rssXML = await fetch("https://cdn.abtmtr.link/site_content/rss.xml") + .catch(() => res.status(500).send()) + .then((res) => res.text()); + + const rssParsed = await rssParser.parseString(rssXML); + + res.render('updates', { + rss: rssParsed + }); +}); + app.get('/sites', async (req, res) => { const buttonsJson = await fetch("https://cdn.abtmtr.link/site_content/buttons.json") .catch(() => res.status(500).send()) @@ -211,6 +226,14 @@ app.get("/favicon.ico", (req, res) => { res.redirect("https://cdn.abtmtr.link/site_content/favicon.ico") }) +app.get(["/rss", "/rss.xml"], (req, res) => { + res.redirect("https://cdn.abtmtr.link/site_content/rss.xml") +}) + +app.all('*', (req, res) => { + res.status(404).render('404'); +}) + app.listen(process.env.PORT, () => { const url = new URL("http://localhost/"); url.port = process.env.PORT; diff --git a/package-lock.json b/package-lock.json index 44680a5..8fb8f9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "jsdom": "^25.0.0", "kysely": "^0.27.4", "nanoid": "^5.0.7", - "pg": "^8.12.0" + "pg": "^8.12.0", + "rss-parser": "^3.13.0" }, "devDependencies": { "nodemon": "^3.1.4" @@ -1805,6 +1806,25 @@ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "license": "MIT" }, + "node_modules/rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "license": "MIT", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + } + }, + "node_modules/rss-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1831,6 +1851,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -2327,6 +2353,28 @@ "node": ">=18" } }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index a8d8ba9..93456a8 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "jsdom": "^25.0.0", "kysely": "^0.27.4", "nanoid": "^5.0.7", - "pg": "^8.12.0" + "pg": "^8.12.0", + "rss-parser": "^3.13.0" }, "devDependencies": { "nodemon": "^3.1.4" diff --git a/views/components/page-head.ejs b/views/components/page-head.ejs index c66d43f..7dd2122 100644 --- a/views/components/page-head.ejs +++ b/views/components/page-head.ejs @@ -6,4 +6,6 @@ + + \ No newline at end of file diff --git a/views/pages/404.ejs b/views/pages/404.ejs new file mode 100644 index 0000000..849d692 --- /dev/null +++ b/views/pages/404.ejs @@ -0,0 +1,12 @@ + + + <%- include("../components/page-head.ejs") %> + +
+

404 Not Found

+

it seems the resource you're looking for doesn't exist.
try again later?

+

<< go back home

+
+ <%- include("../components/footer.ejs") %> + + \ No newline at end of file diff --git a/views/pages/index.ejs b/views/pages/index.ejs index 7231bff..0272df9 100644 --- a/views/pages/index.ejs +++ b/views/pages/index.ejs @@ -11,6 +11,10 @@

blurbs

what are other sites saying about abtmtr.link?

+
  • +

    updates

    +

    what's going on with abtmtr.link?

    +
  • servers

    about the services on abtmtr.link and the machines that serve them.

    diff --git a/views/pages/sites.ejs b/views/pages/sites.ejs index e9b4d3b..7a63e47 100644 --- a/views/pages/sites.ejs +++ b/views/pages/sites.ejs @@ -5,7 +5,7 @@

    sites

    a large collection of 88x31s.

    -

    friends (<%= b.length %>)

    +

    friends of abtmtr.link (<%= b.length %>)

    <% b.forEach((button) => { %> <% if (button.img != null) { %> @@ -15,7 +15,7 @@ <% } %> <% }) %>
    -

    following (<%= f.length %>)

    +

    sites of interest (<%= f.length %>)

    <% f.forEach((button) => { %> <% if (button.img != null) { %> diff --git a/views/pages/updates.ejs b/views/pages/updates.ejs new file mode 100644 index 0000000..547c8e8 --- /dev/null +++ b/views/pages/updates.ejs @@ -0,0 +1,21 @@ + + + <%- include("../components/page-head.ejs") %> + +
    +

    updates

    +

    <%= rss.description %>
    subscribe to the rss feed!

    +

    items

    +
      + <% rss.items.forEach((item) => { %> +
    • +

      <%= item.title %>

      +

      by <%= item.author %> / <%= new Date(item.isoDate).toLocaleString(rss.language) %> Central Time

      +

      <%= item.content.trim() %>

      +
    • + <% }) %> +
    +
    + <%- include("../components/footer.ejs") %> + + \ No newline at end of file