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
|