diff options
| author | LLLL Colonq <llll@colonq> | 2026-08-18 03:04:31 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-08-18 03:04:31 -0400 |
| commit | 23cc4ab7b5695f77ffd15f5ee5e7cc414237642f (patch) | |
| tree | 07ac5ee48cc3773664fda24b227618422b468ec9 /src/gizmo/wasp-leaderboard.el | |
| parent | f04ada478f4bfa5637744876f00ff56f85dcf552 (diff) | |
Diffstat (limited to 'src/gizmo/wasp-leaderboard.el')
| -rw-r--r-- | src/gizmo/wasp-leaderboard.el | 75 |
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 |
