diff options
Diffstat (limited to 'src/utils.clj')
| -rwxr-xr-x | src/utils.clj | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/src/utils.clj b/src/utils.clj index f42746c..628e4b8 100755 --- a/src/utils.clj +++ b/src/utils.clj @@ -56,7 +56,12 @@ :else s)) (defn seconds [t] (* t 1000)) -(defn minutes [t] (* t 60 1000)) +(defn minutes [t] (* 60 (seconds t))) +(defn hours [t] (* 60 (minutes t))) +(defn days [t] (* 24 (hours t))) + +(defn ms-ago [ms] + (- (System/currentTimeMillis) ms)) (defn kbytes [b] (* b 1024)) (defn mbytes [b] (* b 1024 1024)) @@ -72,12 +77,12 @@ (defn sha1-hash [& more] (DigestUtils/shaHex (apply str more))) -(defn gmt-string - ([] (gmt-string (new Date))) - ([dt] - (let [df (new SimpleDateFormat "EEE, dd MMM yyyy kk:mm:ss z")] - (.setTimeZone df (TimeZone/getTimeZone "GMT")) - (.format df dt)))) +(defmacro with-timing [e] + `(let [s# (System/nanoTime) + r# ~e + f# (System/nanoTime)] + [(int (/ (- f# s#) 1000000.0)) r#])) + ;; Formatters @@ -123,6 +128,13 @@ [k (f v)] [k v])))) +(defn gmt-string + ([] (gmt-string (new Date))) + ([dt] + (let [df (new SimpleDateFormat "EEE, dd MMM yyyy kk:mm:ss z")] + (.setTimeZone df (TimeZone/getTimeZone "GMT")) + (.format df dt)))) + ;; JSON responses (defmethod print-json Date @@ -168,6 +180,10 @@ (with-connection *db* (insert-values table cols values))) +(defn assert-update + ([res ok err] (if (not (= (first res) 1)) err ok)) + ([res] (assert-update res true false))) + ;; Parsing (defn maybe-parse-int @@ -197,43 +213,24 @@ (def template-group (new StringTemplateGroup "dumpfm" "template")) (.setRefreshInterval template-group 3) -;; TODO: handle exception +; TODO: handle exception, clean-up template setting (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 + (if (non-empty-string? (session :avatar)) + (.setAttribute st "user_avatar" (session :avatar))) + (.setAttribute st "isadmin" (session :is_admin)))) st)) (defn serve-template [template session] (.toString (fetch-template template session))) - -;; User authentication -; TODO: create user module - (defn first-or-nil [l] (if (empty? l) nil (first l))) -(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 fetch-nick [nick] - (let [q1 "SELECT * FROM users WHERE nick = ? LIMIT 1" - ; ORDER BY ensures consistent retrieval of ambiguious names - q2 "SELECT * FROM users WHERE lower(nick) = ? ORDER BY nick LIMIT 1"] - (or (first-or-nil (do-select [q1 nick])) - (first-or-nil (do-select [q2 (lower-case nick)]))))) - -(defn authorize-nick-hash [nick hash] - (let [db-user (fetch-nick nick)] - (and db-user (= (db-user :hash) hash) db-user))) +;; VIP (defn is-vip? [session] (session :is_admin)) |
