(page "index.html"
(:require [app.rpc :as rpc]))
(defc= scoreboard (merge (sorted-map) rpc/scoreboard))
(defc= problems (mapcat (fn [[id person]]
(map (partial vector id) (:problems person)))
scoreboard))
(defc= scores
(reverse (sort
(map (fn [[id person]]
[(apply
+
(concat
(map (fn [[prob state]]
(if (and
(= :solved state)
(not (contains? (:problems person) prob)))
1
0))
(:scores person))
(map (fn [prob]
(if (some (fn [[id2 person2]]
(and
(= :solved
(get (:scores person) prob))
(= :solved
(get (:scores person2) prob))
(not= id id2)))
scoreboard)
1
0))
(:problems person))))
id])
scoreboard))))
(defc token nil)
(defc= logged-in? rpc/token-ok)
(defc= error rpc/error)
(defc= error-message (when error (.-message error)))
(rpc/init)
(html
(head
(link :rel "stylesheet" :type "text/css" :href "css/main.css")
(title "Potluck CTF"))
(body
(h1 "Potluck CTF")
(div
:id "error"
:click #(reset! rpc/error nil)
:toggle (cell= (not (nil? rpc/error)))
(text "Error: ~{error-message}"))
(let [token-input (input :name "token")]
(form
:toggle (cell= (not logged-in?))
:submit #(do (reset! token (.-value token-input))
(rpc/check-token @token)
(set! (.-value token-input) nil))
(text "Registration Token:")
token-input
(input :type "submit")))
(let [name-input (input :name "name")]
(form
:toggle logged-in?
:submit #(do (rpc/set-name! @token (.-value name-input))
(set! (.-value name-input) nil))
(text "Change Name:")
name-input
(input :type "submit")))
(let [flag-input (input :name "flag")]
(form
:toggle logged-in?
:submit #(do (rpc/submit-flag! @token (.-value flag-input))
(set! (.-value flag-input) nil))
(text "Flag:")
flag-input
(input :type "submit")))
(form
:toggle logged-in?
:submit #(do (reset! token nil)
(reset! rpc/token-ok false))
(input :type "submit" :value "Logout"))
(h2 "Scoreboard")
(table
(thead
(tr
(th :colspan 2
:style "border:none")
(loop-tpl :bindings [probs (cell= (partition-by first problems))]
(th :text (cell= (:name (get scoreboard
(first (first probs)))))
:colspan (cell= (count probs)))))
(tr
(th "Player")
(th "Score")
(loop-tpl :bindings [[owner name] problems]
(th :text name))))
(tbody
(loop-tpl :bindings [[score id] scores]
(let [player (cell= (get scoreboard id))]
(tr
(td :text (cell= (:name player)))
(td :text score)
(loop-tpl :bindings [[owner _name] problems]
(td :text (cell=
(name (get (:scores player)
_name
:unsolved))))))))
))))
;; vim: set expandtab ts=2 sw=2 filetype=clojure :