summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsostler <sbostler@gmail.com>2010-04-11 16:50:40 -0400
committersostler <sbostler@gmail.com>2010-04-11 16:50:40 -0400
commit57c3298cbb88181ab2a9e2dd5309b7a5df6eb30f (patch)
treee9ca474c5a1fa584728b152bf95ac5471943253c /src
parent57be29ee7b7782830cf981d9437b18c88620f8ed (diff)
Initial muting implementation
Diffstat (limited to 'src')
-rw-r--r--src/admin.clj69
-rw-r--r--src/site.clj103
-rwxr-xr-xsrc/utils.clj59
3 files changed, 137 insertions, 94 deletions
diff --git a/src/admin.clj b/src/admin.clj
new file mode 100644
index 0000000..a7eced1
--- /dev/null
+++ b/src/admin.clj
@@ -0,0 +1,69 @@
+(ns admin
+ (:import java.io.File)
+ (:require [clojure.contrib.str-utils2 :as s])
+ (:use compojure
+ email
+ utils))
+
+;; Debug Page
+
+(defn exception-to-string [e]
+ (let [sw (java.io.StringWriter.)
+ pw (java.io.PrintWriter. sw)]
+ (.printStackTrace e pw)
+ (.toString sw)))
+
+(defn lookup-templates [dir selected]
+ (for [f (.listFiles (File. dir))
+ :when (and (.isFile f) (.endsWith (.getName f) ".st"))]
+ (let [n (s/butlast (.getName f) 3)]
+ {"template" n
+ "selected" (= selected n)})))
+
+(defn debug-page [session flash]
+ (if-vip
+ (let [st (fetch-template "debug" session)]
+ (.setAttribute st "flash" (:msg flash))
+ (.setAttribute st "mailtemps" (lookup-templates "template/mail" "welcome"))
+ (.toString st))))
+
+(defn debug-commmand! [session params]
+ (if-vip
+ (let [action (:action params)
+ msg (try
+ (cond (= action "regemail")
+ (do (send-registration-email (params :nick) (params :to) (params :template))
+ (str "Sent registration mail to " (params :to)))
+ :else (str "Unknown action: " action))
+ (catch Exception e
+ (str "<h2 color=\"red\">Caught Exception in " action " --"
+ (.getMessage e)
+ "</h2><br><pre>"
+ (exception-to-string e)
+ "</pre>")))]
+ [(flash-assoc :msg msg)
+ (redirect-to "/debug")])))
+
+;; Muting
+
+(defn mute-status [session]
+ (if-vip
+ (println session)))
+
+(defn parse-pos-interval [time unit]
+ (let [t (maybe-parse-int time 0)
+ u (lower-case unit)]
+ (and (> t 0)
+ (#{"minute" "hour" "day"} u)
+ (str time " " u))))
+
+(defn mute! [session params]
+ (if-vip
+ (let [nick (params :user)
+ user_id (:user_id (fetch-nick nick))
+ interval (parse-pos-interval (params :time) (params :unit))
+ reason (params :reason)
+ admin-user-id (session :user_id)]
+ (cond (not user_id) [400 "INVALID_NICK"]
+ (not interval) [400 "INVALID_INTERVAL"]
+ :else (do "OK")))))
diff --git a/src/site.clj b/src/site.clj
index 084f34c..85e93d1 100644
--- a/src/site.clj
+++ b/src/site.clj
@@ -6,9 +6,7 @@
java.io.File
javax.imageio.ImageIO
org.apache.commons.codec.digest.DigestUtils
- javax.servlet.http.Cookie
- org.antlr.stringtemplate.StringTemplateGroup)
- (:require [clojure.contrib.str-utils2 :as s])
+ javax.servlet.http.Cookie)
(:use clojure.xml
clojure.contrib.command-line
clojure.contrib.duck-streams
@@ -16,6 +14,7 @@
clojure.contrib.sql
clojure.contrib.str-utils
clojure.contrib.def
+ admin
compojure
email
utils
@@ -28,9 +27,6 @@
(def *flusher-sleep* (seconds 4))
(def *user-timeout* (seconds 15))
-(def template-group (new StringTemplateGroup "dumpfm" "template"))
-(.setRefreshInterval template-group 3)
-
(defstruct user-struct :nick :user_id :avatar :last-seen)
(defstruct message-struct :nick :content :created_on :msg_id)
@@ -74,6 +70,9 @@
;; Utils
+(defn id [x]
+ x)
+
(defn open-file [dir-comps filename]
(let [d (str-join (System/getProperty "file.separator")
(cons *root-directory* dir-comps))
@@ -92,31 +91,6 @@
(.setTimeZone df (TimeZone/getTimeZone "GMT"))
(.format df dt))))
-;; 404
-
-(defn unknown-page []
- [404 "Page not Found"])
-
-;; User authentication
-
-(def nick-regex #"^[A-Za-z0-9\-_∆˚†]*$")
-
-(defn is-invalid-nick? [n]
- (cond
- (< (count n) 3) "NICK_TOO_SHORT"
- (not (re-matches nick-regex n)) "NICK_INVALID_CHARS"))
-
-(defn check-nick [nick]
- (let [query "SELECT * FROM users WHERE LOWER(nick) = ? LIMIT 1"]
- (> (count (do-select [query (s/lower-case nick)])) 0)))
-
-(defn fetch-nick [nick]
- (let [query "SELECT * FROM users WHERE nick = ? LIMIT 1"]
- (first (do-select [query nick]))))
-
-(defn authorize-nick-hash [nick hash]
- (let [db-user (fetch-nick nick)]
- (and db-user (= (db-user :hash) hash) db-user)))
;; Room handling
@@ -290,9 +264,6 @@
;; Login code
-(defn is-vip? [session]
- (session :is_admin))
-
(defn session-map-from-db
[user-info]
{:user_id (user-info :user_id)
@@ -309,21 +280,6 @@
:avatar (user-info :avatar)
:password_login true))
-;; Templates
-
-;; TODO: avoid exception
-(defn fetch-template [template session]
- (let [st (.getInstanceOf template-group template)]
- (if (session :nick)
- (do (.setAttribute st "user_email" (session :email))
- (.setAttribute st "user_nick" (session :nick))
- (if (non-empty-string? (session :avatar)) (.setAttribute st "user_avatar" (session :avatar)))
- (.setAttribute st "isadmin" (is-vip? session))))
- st))
-
-(defn serve-template [template session]
- (.toString (fetch-template template session)))
-
;; login-token functions
(defn logged-in?
@@ -847,8 +803,6 @@
(str "RawFavs=" (json-str favs))))
-
-
;; Account resets
(defn reset-page [session]
@@ -947,47 +901,6 @@
(not (session :nick)) [200 "NOT_LOGGED_IN"]
:else (do-upload-avatar session image))))
-;; Debug Page
-
-(defn exception-to-string [e]
- (let [sw (java.io.StringWriter.)
- pw (java.io.PrintWriter. sw)]
- (.printStackTrace e pw)
- (.toString sw)))
-
-(defn lookup-templates [dir selected]
- (for [f (.listFiles (File. dir))
- :when (and (.isFile f) (.endsWith (.getName f) ".st"))]
- (let [n (s/butlast (.getName f) 3)]
- {"template" n
- "selected" (= selected n)})))
-
-(defn debug-page [session flash]
- (if (is-vip? session)
- (let [st (fetch-template "debug" session)]
- (.setAttribute st "flash" (:msg flash))
- (.setAttribute st "mailtemps" (lookup-templates "template/mail" "welcome"))
- (.toString st))
- (unknown-page)))
-
-(defn debug-commmand! [session params]
- (if (is-vip? session)
- (let [action (:action params)
- msg (try
- (cond (= action "regemail")
- (do (send-registration-email (params :nick) (params :to) (params :template))
- (str "Sent registration mail to " (params :to)))
- :else (str "Unknown action: " action))
- (catch Exception e
- (str "<h2 color=\"red\">Caught Exception in " action " --"
- (.getMessage e)
- "</h2><br><pre>"
- (exception-to-string e)
- "</pre>")))]
- [(flash-assoc :msg msg)
- (redirect-to "/debug")])
- (unknown-page)))
-
;; Compojure Routes
@@ -1055,8 +968,14 @@
(GET "/reset" (reset-page session))
(POST "/reset-request" (reset-account-request! session params))
(POST "/reset/:key" (reset-account! session (-> request :route-params :key)))
+
+ ;; Admin stuff (should be own route?)
(GET "/debug" (debug-page session flash))
(POST "/debug" (debug-commmand! session params))
+ (GET "/mute-status" (mute-status session))
+ (POST "/mute" (mute! session params))
+
+ ;; Footer pages
(GET "/about_us" (serve-template "about_us" session))
(GET "/goodies" (serve-template "goodies" session))
(GET "/help" (serve-template "help" session))
diff --git a/src/utils.clj b/src/utils.clj
index 3f2f4e4..3e77710 100755
--- a/src/utils.clj
+++ b/src/utils.clj
@@ -1,7 +1,8 @@
(ns utils
(:import java.text.SimpleDateFormat
java.util.Date
- java.net.URLDecoder)
+ java.net.URLDecoder
+ org.antlr.stringtemplate.StringTemplateGroup)
(:use clojure.contrib.json.write
clojure.contrib.sql))
@@ -94,4 +95,58 @@
(defn #^String lower-case
"Converts string to all lower-case."
[#^String s]
- (.toLowerCase s)) \ No newline at end of file
+ (.toLowerCase s))
+
+;; 404
+
+(defn unknown-page [& more]
+ [404 "Page not Found"])
+
+;; Templates
+
+(def template-group (new StringTemplateGroup "dumpfm" "template"))
+(.setRefreshInterval template-group 3)
+
+;; TODO: handle exception
+(defn fetch-template [template session]
+ (let [st (.getInstanceOf template-group template)]
+ (if (session :nick)
+ (do (.setAttribute st "user_email" (session :email))
+ (.setAttribute st "user_nick" (session :nick))
+ (if (non-empty-string? (session :avatar)) (.setAttribute st "user_avatar" (session :avatar)))
+ (.setAttribute st "isadmin" (session :is_admin)))) ;; TODO: consolidate session/user code
+ st))
+
+(defn serve-template [template session]
+ (.toString (fetch-template template session)))
+
+
+;; User authentication
+; TODO: move to user module
+
+(def nick-regex #"^[A-Za-z0-9\-_∆˚†]*$")
+
+(defn is-invalid-nick? [n]
+ (cond
+ (< (count n) 3) "NICK_TOO_SHORT"
+ (not (re-matches nick-regex n)) "NICK_INVALID_CHARS"))
+
+(defn check-nick [nick]
+ (let [query "SELECT * FROM users WHERE LOWER(nick) = ? LIMIT 1"]
+ (> (count (do-select [query (lower-case nick)])) 0)))
+
+(defn fetch-nick [nick]
+ (let [query "SELECT * FROM users WHERE nick = ? LIMIT 1"]
+ (first (do-select [query nick]))))
+
+(defn authorize-nick-hash [nick hash]
+ (let [db-user (fetch-nick nick)]
+ (and db-user (= (db-user :hash) hash) db-user)))
+
+(defn is-vip? [session]
+ (session :is_admin))
+
+(defmacro if-vip [e]
+ "Evaluates expr if user is vipm otherwise returns 404 string. Can only be used
+ where session is defined."
+ `(if (is-vip? ~'session) ~e (unknown-page)))