;;; 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