summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-leaderboard.el
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-08-18 03:04:31 -0400
committerLLLL Colonq <llll@colonq>2026-08-18 03:04:31 -0400
commit23cc4ab7b5695f77ffd15f5ee5e7cc414237642f (patch)
tree07ac5ee48cc3773664fda24b227618422b468ec9 /src/gizmo/wasp-leaderboard.el
parentf04ada478f4bfa5637744876f00ff56f85dcf552 (diff)
Diffstat (limited to 'src/gizmo/wasp-leaderboard.el')
-rw-r--r--src/gizmo/wasp-leaderboard.el75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/gizmo/wasp-leaderboard.el b/src/gizmo/wasp-leaderboard.el
new file mode 100644
index 00000000..6a573e50
--- /dev/null
+++ b/src/gizmo/wasp-leaderboard.el
@@ -0,0 +1,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