summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-leaderboard.el
blob: 6a573e50ace7d6f0677cc60087b65a24ea2f40b2 (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
64
65
66
67
68
69
70
71
72
73
74
75
;;; wasp-leaderboard --- description -*- lexical-binding: t; -*-
;;; Commentary:
;;; Code:

(require 'wasp-utils)
(require 'wasp-db)

(defvar-local w/leaderboard-id nil)

(defconst w/leaderboard-url-base "https://api.colonq.computer/api/leaderboard")

(defun w/leaderboard-url (lid)
  "Return the URL for the leaderboard LID."
  (s-concat w/leaderboard-url-base "/" lid))

(defun w/leaderboard-buffer-name (lid)
  "Return the buffer name for the leaderboard LID."
  (format "*wasp-leaderboard %s*" lid))

(defun w/leaderboard-fetch (lid k)
  "Fetch the leaderboard LID and pass it to K."
  (w/fetch-json (w/leaderboard-url lid)
    (lambda (data)
      (funcall k
        (--map (seq-into it 'list) (seq-into data 'list))))))

(define-derived-mode w/leaderboard-mode tabulated-list-mode "leaderboard"
  "Major mode for displaying a leaderboard."
  :group 'wasp
  (setq-local tabulated-list-format
    [ ("Name" 32 t)
      ("Score" 32 t)
      ])
  (add-hook 'tabulated-list-revert-hook #'w/leaderboard-refresh nil t)
  (tabulated-list-init-header))

(defun w/leaderboard-get-buffer (lid)
  "Return the leaderboard buffer for LID."
  (let ((nm (w/leaderboard-buffer-name lid)))
    (unless (get-buffer nm)
      (with-current-buffer (get-buffer-create nm)
        (w/leaderboard-mode)
        (setq-local w/leaderboard-id lid)))
    (get-buffer nm)))

(defun w/leaderboard-render (lid d)
  "Render the fetched leaderboard data D for LID."
  (with-current-buffer (w/leaderboard-get-buffer lid)
    (setq-local tabulated-list-entries
      (--map
        (list (car it)
          (vector
            (format "%s" (cadr it))
            (format "%s" (caddr it))))
        d))
    (tabulated-list-print)))

(defun w/leaderboard-update (lid)
  "Fetch and render the leaderboard LID."
  (w/leaderboard-fetch lid
    (lambda (d)
      (w/leaderboard-render lid d))))

(defun w/leaderboard-refresh ()
  "Refresh the leaderboard displayed in the current buffer."
  (interactive)
  (when (and (eq major-mode 'w/leaderboard-mode) w/leaderboard-id)
    (w/leaderboard-update w/leaderboard-id)))

(defun w/leaderboard-set-score (lid user score)
  "Update the SCORE for USER in leaderboard LID."
  (w/db-zadd (s-concat "leaderboard:" lid) (format "%s" score) user))

(provide 'wasp-leaderboard)
;;; wasp-leaderboard.el ends here