summaryrefslogtreecommitdiff
path: root/src/mulk/benki/lazychat.clj
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2012-04-09 16:43:53 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2012-04-09 16:43:53 +0200
commitf7eb36d782508cbf3cc73e1f05630776d4a207bd (patch)
tree7a56c51baa4e220ec4db1bdf5a0c169a0ec830be /src/mulk/benki/lazychat.clj
parenta315bdaf6dea23da17c09d279f374421c6d88549 (diff)
Lafargue: Add Atom feed.
Diffstat (limited to 'src/mulk/benki/lazychat.clj')
-rw-r--r--src/mulk/benki/lazychat.clj72
1 files changed, 58 insertions, 14 deletions
diff --git a/src/mulk/benki/lazychat.clj b/src/mulk/benki/lazychat.clj
index 7546f45..189b562 100644
--- a/src/mulk/benki/lazychat.clj
+++ b/src/mulk/benki/lazychat.clj
@@ -18,6 +18,8 @@
(:import [org.apache.abdera Abdera]))
+(defonce abdera (Abdera.))
+
(defn create-lazychat-message! [{content :content, visibility :visibility
format :format, targets :targets,
referees :referees, id :id}]
@@ -74,6 +76,23 @@
:href (resolve-uri "/style/lafargue.css")
:type "text/css"}])})
+(defmacro with-messages-visible-by-user [[messages user] & body]
+ `(sql/with-query-results ~messages
+ ["SELECT m.id, m.author, m.date, m.content, m.format, u.first_name, u.last_name
+ FROM lazychat_messages m
+ JOIN users u ON (author = u.id)
+ WHERE (visibility = 'public'
+ OR (visibility = 'protected' AND (?::INTEGER) IS NOT NULL)
+ OR (visibility = 'personal'
+ AND EXISTS (SELECT *
+ FROM lazychat_targets t
+ WHERE t.target = (?::INTEGER)
+ AND message = m.id)))
+ ORDER BY m.date DESC"
+ ~user ~user]
+ ~@body))
+
+
(defpage "/lafargue" {}
(with-dbt
(layout lafargue-list-page "Lafargue Lazy Chat"
@@ -90,19 +109,7 @@
[:input {:type "radio", :name "visibility", :value "public"} "Public"]]
[:div [:input {:type "submit"}]]]]
[:ul {:class "lafargue-list"}
- (sql/with-query-results messages
- ["SELECT m.id, m.author, m.date, m.content, m.format, u.first_name, u.last_name
- FROM lazychat_messages m
- JOIN users u ON (author = u.id)
- WHERE (visibility = 'public'
- OR (visibility = 'protected' AND (?::INTEGER) IS NOT NULL)
- OR (visibility = 'personal'
- AND EXISTS (SELECT *
- FROM lazychat_targets t
- WHERE t.target = (?::INTEGER)
- AND message = m.id)))
- ORDER BY m.date DESC"
- *user* *user*]
+ (with-messages-visible-by-user [messages *user*]
(doall
(for [message messages]
[:li {:class "lafargue-message"}
@@ -113,8 +120,45 @@
[:span {:class "lafargue-message-owner"}
" by " (escape-html (:first_name message))]]
[:div {:class "lafargue-message-body"}
- (sanitize-html (markdown->html (:content message)))]])))]])))
+ (sanitize-html (markdown->html (:content message)))]])))
+ [:div {:id "lafargue-footer"}
+ (let [feed-link (linkrel :lafargue :feed)]
+ [:span {:id "lafargue-footer-text"}
+ "[" [:a {:href (resolve-uri feed-link)} "Atom"] "]"
+ (when *user*
+ (list
+ " [" [:a {:href (resolve-uri (authlink feed-link))} "Atom auth"] "]"
+ " [" [:a {:href (authlink (:uri (request/ring-request)))} "authlink"] "]"))])]]])))
+
+
+(defn lazychat-feed-for-user [user]
+ (with-dbt
+ (with-messages-visible-by-user [messages user]
+ (let [last-updated (sql/with-query-results results
+ ["SELECT MAX(date) AS maxdate FROM lazychat_messages"]
+ (:maxdate (first results)))
+ feed (doto (.newFeed abdera)
+ (.setId (fmt nil "tag:~A,2012:/lafargue"
+ (:tag-base @benki-config)))
+ (.setTitle "Lafargue Lazy Chat")
+ (.setUpdated last-updated)
+ (.addLink (link :lafargue)))]
+ (doseq [item messages]
+ (doto (.addEntry feed)
+ (.setId (fmt nil "tag:~A,2012:/lafargue/~D"
+ (:tag-base benki-config)
+ (:id item)))
+ (.setSummaryAsHtml (sanitize-html (markdown->html (:content item))))
+ (.setPublished (:date item))
+ ;;(.setAuthor (fmt nil "~A ~A" (:first_name item) (:last_name item)))
+ ;;(.addLink (link :lafargue (:id item)))
+ ))
+ (.toString feed)))))
+
+(defpage "/lafargue/feed" {}
+ (response/content-type "application/atom+xml; charset=UTF-8"
+ (lazychat-feed-for-user *user*)))
(defpage [:any "/lafargue/post"] {content :content, visibility :visibility
format :format, targets :targets,