blob: 472127211dd769d334fd1a2fc6cc61cebea1c28e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
;; -*- mode: lisp; -*-
;; (pushnew '(SLYNK:*STRING-ELISION-LENGTH* . nil) slynk:*slynk-pprint-bindings* :test #'equal)
(in-package :webstats-js)
(defun register-visit (data)
(fetch "http://localhost/stats/visit"
(create :method "POST"
:headers (create "Content-Type" "application/x-www-form-urlencoded")
:body (new (-u-r-l-search-params data)))))
(defun register-click (event)
(when (or (= 1 (@ event which))
(= 2 (@ event which)))
(chain event (prevent-default))
(let ((link (getprop event 'target 'href)))
(chain
(register-visit (create :click link
:page (@ document location href)))
(finally (lambda ()
(if (= 1 (@ event which))
(setf (@ window location href) link)
(chain window (open link "_blank")))))))))
(defun instrument-links ()
(for-of (link ((@ document query-selector-all) "a"))
(setf (@ link onclick) #'register-click)
(setf (@ link onauxclick) #'register-click)))
(defun register-page-load ()
(let ((data (create :title (@ document title)
:page (@ document location href)
:referer (@ document referrer))))
(chain
(register-visit data)
(then (lambda (r)
((@ console log) r)
((@ r text))))
(then (@ console log)))))
(defun response-to-json (response)
(if (@ response ok)
(chain response (json))
(throw (new (-error "not 2XX resp")))))
(defun plot (data)
(new
(u-plot
(create
:title "Site activity visits"
:width 450
:height 400
:cursor (create sync (create key "moo"))
:series (list (create label "Time")
(create label "visits" stroke "red")))
data
(chain document (get-element-by-id "graph")))))
(add-event-listener
"load"
(lambda ()
(instrument-links)
(register-page-load)))
|