summaryrefslogtreecommitdiff
path: root/src/gizmo
diff options
context:
space:
mode:
Diffstat (limited to 'src/gizmo')
-rw-r--r--src/gizmo/wasp-flymake.el4
-rw-r--r--src/gizmo/wasp-heartrate.el2
-rw-r--r--src/gizmo/wasp-leaderboard.el75
-rw-r--r--src/gizmo/wasp-top.el10
4 files changed, 89 insertions, 2 deletions
diff --git a/src/gizmo/wasp-flymake.el b/src/gizmo/wasp-flymake.el
index 42c085b4..b727d2c9 100644
--- a/src/gizmo/wasp-flymake.el
+++ b/src/gizmo/wasp-flymake.el
@@ -56,8 +56,10 @@
(defun w/flymake-setup ()
"Setup stream Flymake errors."
- (add-hook 'flymake-diagnostic-functions #'w/flymake-backend nil t))
+ (unless (-contains? flymake-diagnostic-functions #'w/flymake-backend)
+ (add-hook 'flymake-diagnostic-functions #'w/flymake-backend nil t)))
(add-hook 'prog-mode-hook #'w/flymake-setup)
+(add-hook 'eglot-managed-mode-hook #'w/flymake-setup)
(provide 'wasp-flymake)
;;; wasp-flymake.el ends here
diff --git a/src/gizmo/wasp-heartrate.el b/src/gizmo/wasp-heartrate.el
index fa27d64d..08acfe76 100644
--- a/src/gizmo/wasp-heartrate.el
+++ b/src/gizmo/wasp-heartrate.el
@@ -39,7 +39,7 @@
(define-derived-mode w/heartrate-mode special-mode "heartrate"
"Major mode for displaying heartrate."
- :group 'w
+ :group 'wasp
(setq-local cursor-type nil))
(defun w/heartrate-get-buffer ()
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
diff --git a/src/gizmo/wasp-top.el b/src/gizmo/wasp-top.el
new file mode 100644
index 00000000..f82b2329
--- /dev/null
+++ b/src/gizmo/wasp-top.el
@@ -0,0 +1,10 @@
+;;; wasp-top --- description -*- lexical-binding: t; -*-
+;;; Commentary:
+;;; Code:
+
+(define-derived-mode w/top-mode tabulated-list-mode "Top Humans"
+ "Major mode for displaying top humans."
+ :group 'wasp)
+
+(provide 'wasp-top)
+;;; wasp-top.el ends here