summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-03-19 22:22:07 +0800
committereltrac <hi@eltr.ac>2026-03-19 22:22:22 +0800
commitaa3f1573272a5c87a627bf4baf0e6d9e025d06a8 (patch)
treebec0c7cffc2291ebd9610201dc0ed434b4a9295a /src
parentd4ed811bdde40e17f79bf28fb91dd50f2ea9a426 (diff)
feat: rss feed for each domain
Diffstat (limited to 'src')
-rw-r--r--src/weepinbell/feed.clj32
-rw-r--r--src/weepinbell/handler.clj3
2 files changed, 35 insertions, 0 deletions
diff --git a/src/weepinbell/feed.clj b/src/weepinbell/feed.clj
new file mode 100644
index 0000000..638699d
--- /dev/null
+++ b/src/weepinbell/feed.clj
@@ -0,0 +1,32 @@
+(ns weepinbell.feed
+ (:require [clj-rss.core :as rss]
+ [weepinbell.utils :refer [get-domain]]
+ [weepinbell.config :refer [get-config]]
+ [weepinbell.storage :as storage]
+ [digest :as digest])
+ (:import [java.time Instant]))
+
+(def feed-length (get-config :feed-length))
+
+(defn rss
+ [domain]
+ (let [wms (storage/get-wms-by-domain domain)]
+ {:headers {"Content-Type" "application/xml"}
+ :body (rss/channel-xml
+ {:title "Weepinbell Feed"
+ :link (get-config :base-url)
+ :description (str "Webmentions sent to " domain)}
+ (->> wms
+ (map #(let [wm (:webmention %)
+ id (if-let [id (:id wm)] id
+ (digest/md5 (str (:source wm) (:target wm))))
+ permalink (str (get-config :base-url) "/api/mention/" id)
+ modified (:modified wm)
+ pub-date (when modified
+ (Instant/ofEpochMilli modified))]
+ {:title (str (-> wm :source get-domain) " -> " (:target wm))
+ :link (:source wm)
+ :guid permalink
+ :pubDate pub-date}))
+ (take-last feed-length)
+ doall))}))
diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj
index f1d0c7f..80c2d2f 100644
--- a/src/weepinbell/handler.clj
+++ b/src/weepinbell/handler.clj
@@ -9,6 +9,7 @@
[weepinbell.retriever :as retriever]
[weepinbell.processor :refer [process-webmention]]
[weepinbell.ui :as ui]
+ [weepinbell.feed :as feed]
[clojure.core.async :refer [chan]]))
(def wmc (chan))
@@ -34,6 +35,8 @@
(context "/mention" []
(GET "/:id" [id] (retriever/by-id id))
(GET "/" [source target] (retriever/by-st-pair source target))))
+ ;; RSS feed
+ (GET "/feed/:domain" [domain] (feed/rss domain))
;; host proxied avatars (microformats photos)
(route/files "/avatars/" {:root "data/avatars"})
;; 404