aboutsummaryrefslogtreecommitdiffstats
path: root/webstats/stats.paren
blob: b9d3974e35c1b382622c8134cb2a6ac8304eba73 (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
;; -*- 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)))))

(add-event-listener
 "load"
 (lambda ()
   (instrument-links)
   (register-page-load)))