From 1890f14f9ea3c600e0c52a1d128735c6916a60a5 Mon Sep 17 00:00:00 2001 From: Felisp Date: Tue, 24 Sep 2024 00:58:24 +0200 Subject: [PATCH] Implement support for multiple filters Allows for adding more filters so regex or searching by thread number will be much easier --- src/rss_thread_watch/feed_generator.clj | 39 +++++++++++-------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/rss_thread_watch/feed_generator.clj b/src/rss_thread_watch/feed_generator.clj index 9b0bf83..c5528c3 100644 --- a/src/rss_thread_watch/feed_generator.clj +++ b/src/rss_thread_watch/feed_generator.clj @@ -69,9 +69,8 @@ (defn filter-chod-posts "Return list of all threads with equal or higher ChoD than requested - ;;resume READS FROM GLOBALS: watcher.time-of-cache" - [query-vec chod-treshold repeat? board-cache] + [filters chod-treshold repeat? board-cache] (let [{time-of-generation :time cache :data} board-cache guid-fn (case repeat? @@ -82,25 +81,21 @@ cache)) ;; So we don't have to search thru everything we have cached needed-cache-part (subvec cache cache-start-index) - ;; Here we gonna run fmap but not really - actuall-matches (keep (fn [t] - (let [title (:title t)] - ;; Todo: Man, wouldn't it be cool to know which querry matched the thread? - ;; Would be so much easier for user to figure out why is it showing - ;; and it would solve the problem of super long titles (or OPs instead of titles) - (when (some (fn [querry] - (s/includes? (s/lower-case title) (s/lower-case querry))) - query-vec) - t))) + actuall-matches (keep (fn [thread] + (some + (fn [fun] + (when (fun thread (get filters fun)) + thread)) + (keys filters))) (reverse needed-cache-part))] ;; Finally generate and append GUIDs (map guid-fn actuall-matches))) (defn thread-to-rss-item "Converts cached thread item to feed item which can be serialized into RSS" - [t host board] - (let [link-url (s/replace host "{threadnum}" (str (:no t)))] ;Hardcode emergency bugfix - {:title (format "%.2f%% - %s" (:chod t) (:title t)) ;TODO: Generate link from the target somehow, or just include it from API response + [t host] + (let [link-url (s/replace host "{threadnum}" (str (:no t)))] + {:title (format "%.2f%% - %s" (:chod t) (:title t)) ;; :url link-url <- this is supposed to be for images according to: https://cyber.harvard.edu/rss/rss.html :description (format "The thread: '%s' has %.2f%% chance of dying" (:title t) (:chod t)) :link link-url @@ -108,9 +103,8 @@ (defn generate-feed "Generates feed from matching items" - [query-vec chod-treshold repeat? cache board-config self-link] - (let [items (filter-chod-posts query-vec chod-treshold repeat? cache) - served-filename (get @conf/GLOBAL-CONFIG :served-filename) + [filters chod-treshold repeat? cache board-config self-link] + (let [items (filter-chod-posts filters chod-treshold repeat? cache) head {:title (str "RSS Thread watcher v" conf/VERSION) ;; :link is the homepage of the channel :link (get @conf/GLOBAL-CONFIG :homepage) @@ -141,9 +135,10 @@ query :query-string scheme :scheme server-name :server-name} rqst - filters (make-filters prms) - ;; qrs (prms "q") - self-uri (str (s/replace-first scheme ":" "") + filters (make-filters prms f/known-filters) + ;; BUG if local fileserver not running -> FileNotFound exception is thrown and it fucks up the feed generation + ;; Should be handled because wrong config and thus url generation could do the same + self-uri (str (s/replace-first scheme ":" "") ; "://" server-name uri "?" query) board-config (get-in @conf/GLOBAL-CONFIG [:boards-enabled board]) real-chod (try (max (Integer/parseInt (or (and (vector? chod) @@ -187,7 +182,7 @@ ;; There shouldn't be any problems with this mime type but if there are ;; replace with "text/xml", or even better, get RSS reader that is not utter shit :header {"Content-Type" "application/rss+xml"} - :body (generate-feed queries real-chod repeat? (watcher/get-thread-data board @conf/GLOBAL-CONFIG) board-config self-uri)}) + :body (generate-feed filters real-chod repeat? (watcher/get-thread-data board @conf/GLOBAL-CONFIG) board-config self-uri)}) (catch Exception e ;; Ex-info has been crafted to match HTTP response body so we can send it (if-let [caught (ex-data e)]