summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/wasp-ai.el2
-rw-r--r--src/wasp-chat.el1
-rw-r--r--src/wasp-db.el21
-rw-r--r--src/wasp-gizmo.el4
-rw-r--r--src/wasp-obs.el13
-rw-r--r--src/wasp-setup.el4
-rw-r--r--src/wasp-twitch-chat-commands.el6
-rw-r--r--src/wasp-user-badges.el14
-rw-r--r--src/wasp-user-whitelist.el1
-rw-r--r--src/wasp-user.el9
14 files changed, 148 insertions, 18 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
diff --git a/src/wasp-ai.el b/src/wasp-ai.el
index 02c83152..8c59beef 100644
--- a/src/wasp-ai.el
+++ b/src/wasp-ai.el
@@ -82,7 +82,7 @@
;; (funcall k data))))
t)
-(defun w/ai-mod (question k &optional systemprompt user assistant)
+(defun w/ai (question k &optional systemprompt user assistant)
"Ask QUESTION to ChatGPT and pass the answer to K.
Optionally use SYSTEMPROMPT and the USER and ASSISTANT prompts."
(let* ((users (if (listp user) user (list user)))
diff --git a/src/wasp-chat.el b/src/wasp-chat.el
index 9316ab03..c6c704fc 100644
--- a/src/wasp-chat.el
+++ b/src/wasp-chat.el
@@ -276,6 +276,7 @@ Optionally, return the buffer NM in chat mode."
("Google" . "Facebook")
("Facebook" . "Apple")
("Apple" . "Amazon")
+ ("Walmart" . "HEB")
("darkrai" . "*******")
("hunter2" . "*******")
("*******" . "hunter2")
diff --git a/src/wasp-db.el b/src/wasp-db.el
index 2242d907..0311860b 100644
--- a/src/wasp-db.el
+++ b/src/wasp-db.el
@@ -130,6 +130,12 @@ If not, return nil."
(w/db-cmd `("KEYS" ,pat) k)
(error "Redis pattern must be string")))
+(defun w/db-exists (key k)
+ "Query whether KEY exists in Redis and pass the result to K."
+ (if (stringp key)
+ (w/db-cmd `("EXISTS" ,key) (lambda (res) (funcall k (= res 1))))
+ (error "Redis key must be a string")))
+
(defun w/db-set (key val)
"Set KEY to VAL in Redis."
(if (and (stringp key) (stringp val))
@@ -185,16 +191,23 @@ Afterward call K."
(w/db-cmd `("SADD" ,key ,@vals) (lambda (_) nil))
(error "Redis key must be a string")))
+(defun w/db-srem (key &rest vals)
+ "Remove VALS from the set at KEY in Redis."
+ (if (stringp key)
+ (w/db-cmd `("SREM" ,key ,@vals) (lambda (_) nil))
+ (error "Redis key must be a string")))
+
(defun w/db-smembers (key k)
"Pass the members of the set at KEY to K."
(if (stringp key)
(w/db-cmd `("SMEMBERS" ,key) k)
(error "Redis key must be a string")))
-(defun w/db-exists (key k)
- "Query whether KEY exists in Redis and pass the result to K."
- (if (stringp key)
- (w/db-cmd `("EXISTS" ,key) (lambda (res) (funcall k (= res 1))))
+(defun w/db-zadd (key score member &rest others)
+ "Add MEMBER to the sorted set KEY with SCORE.
+Also add any OTHERS."
+ (if (and (stringp key) (stringp score) (stringp member) (-all? #'stringp others))
+ (w/db-cmd `("ZADD" ,key ,score ,member ,@others) (lambda (_) nil))
(error "Redis key must be a string")))
(defun w/db-test ()
diff --git a/src/wasp-gizmo.el b/src/wasp-gizmo.el
index 677b2fb7..e0359c08 100644
--- a/src/wasp-gizmo.el
+++ b/src/wasp-gizmo.el
@@ -33,9 +33,9 @@
(defun w/gizmo-cycle-window (w)
"Cycle the gizmo in W."
(when-let*
- ((cur (buffer-name (window-buffer w)))
- (idx (--find-index (equal it cur) w/gizmo-buffer-names))
+ ((cur (window-buffer w))
(bufs (-non-nil (-map #'get-buffer w/gizmo-buffer-names)))
+ (idx (--find-index (equal it cur) bufs))
(nidx (mod (+ idx 1) (length bufs)))
(buf (nth nidx bufs)))
(set-window-buffer w buf)))
diff --git a/src/wasp-obs.el b/src/wasp-obs.el
index 921f497e..2fc65553 100644
--- a/src/wasp-obs.el
+++ b/src/wasp-obs.el
@@ -11,7 +11,12 @@
(defun w/obs-toggle (scene source)
"Toggle SOURCE in SCENE."
- (w/pub '(monitor obs toggle) (list (w/encode-string scene) (w/encode-string source))))
+ (w/binary-pub "monitor obs toggle" (s-concat scene "\0" source)))
+
+(defun w/obs-set-volume (input v)
+ "Set the volume for INPUT to V."
+ (unless (numberp v) (error "Volume should be a number, got %s" v))
+ (w/binary-pub "monitor obs set-volume" (s-concat input "\0" (format "%f" v))))
(defun w/obs-toggle-modclonk ()
"Toggle the MODCLONK panel."
@@ -60,12 +65,12 @@
(defun w/obs-toggle-activate-nixos ()
"Toggle the explosion effect."
- (w/pub '(monitor obs toggle) (list "Main" "Activate NixOS")))
+ (w/obs-toggle "Main" "Activate NixOS"))
(defun w/obs-set-clickbait-text (msg)
"Change the clickbait text to MSG."
- (w/pub '(monitor obs set-text)
- (list (w/encode-string "Red Arrow Text") (w/encode-string (s-trim msg)))))
+ (w/binary-pub "monitor obs set-text"
+ (s-concat "Red Arrow Text\0" (s-trim msg))))
(defun w/obs-toggle-clickbait (&optional msg)
"Toggle the clickbait arrow.
diff --git a/src/wasp-setup.el b/src/wasp-setup.el
index 2fea4d77..4c3ab1ba 100644
--- a/src/wasp-setup.el
+++ b/src/wasp-setup.el
@@ -78,10 +78,10 @@
(windmove-down)
(split-window-horizontally)
(switch-to-buffer w/friend-buffer)
- ;; (w/gizmo-tag-window)
+ (w/gizmo-tag-window)
(windmove-right)
(switch-to-buffer w/heartrate-buffer)
- ;; (w/gizmo-tag-window)
+ (w/gizmo-tag-window)
(windmove-right)
(split-window-vertically -28)
(switch-to-buffer w/chat-buffer)
diff --git a/src/wasp-twitch-chat-commands.el b/src/wasp-twitch-chat-commands.el
index aea0529d..4436db62 100644
--- a/src/wasp-twitch-chat-commands.el
+++ b/src/wasp-twitch-chat-commands.el
@@ -58,6 +58,12 @@
(w/tcg-random-user-card
(lambda (c)
(w/tcg-generate-card (s-downcase user) c)))))
+ (cons "!skipsong"
+ (lambda (_ user _)
+ (start-process "pkill" nil "pkill" "muzak")))
+ (cons "!clippy"
+ (lambda (_ user msg)
+ (w/overlay-clippy-say (format "%s: %s" user (s-chop-prefix "!clippy " msg)))))
(cons "!charsheet"
(lambda (uid user msg)
(let* ( (args (s-split " " msg))
diff --git a/src/wasp-user-badges.el b/src/wasp-user-badges.el
index 4c7fdb93..2144074c 100644
--- a/src/wasp-user-badges.el
+++ b/src/wasp-user-badges.el
@@ -76,6 +76,10 @@
"Give badge BID to user UID."
(w/db-sadd (s-concat "user:badges:" uid) bid))
+(defun w/badge-revoke (uid bid)
+ "Revoke badge BID from user UID."
+ (w/db-srem (s-concat "user:badges:" uid) bid))
+
(defun w/badge-custom-equity-text (user text)
"Give badge TEXT to USER."
(let ((bid (w/uuid)))
@@ -98,6 +102,12 @@
(lambda (uid)
(w/badge-grant uid "equitylord"))))
+(defun w/badge-undefault-equity (user)
+ "Give USER the default equity badge."
+ (w/user-id-from-name user
+ (lambda (uid)
+ (w/badge-revoke uid "equitylord"))))
+
;; (w/badge-create-icon "equitylord" "Equity Lord" "This user holds Equity Lordship status, entitling them to a vote at the shareholders' meeting." (w/asset "badges/equitylord.png"))
;; (w/badge-create-text "themale" "MALE" "This user is known as \"The Male\" by some." "πŸ§β€β™‚οΈ")
;; (w/badge-create-icon "slime" "Slime" "This user is \"slime\"." (w/asset "badges/slime.png"))
@@ -150,7 +160,6 @@
;; (w/badge-custom-equity-text "colinahscopy_" "⚜")
;; (w/badge-default-equity "eighteyedsixwingedseraph")
;; (w/badge-default-equity "a_tension_span")
-;; (w/badge-default-equity "tomaterr")
;; (w/badge-custom-equity-icon "realnaesten" (w/twitch-emote-path "emotesv2_4d2812c659c14c64a9a4044c3eff6d30"))
;; (w/badge-default-equity "fmega")
;; (w/badge-default-equity "cr4zyk1tty")
@@ -164,6 +173,9 @@
;; (w/badge-custom-equity-text "bigbookofbug" "(βœΏβ•Ήβ—‘β•Ή)οΎ‰β˜†.q β‚€:*゚")
;; (w/badge-custom-equity-text "peetseater" "πŸ•")
;; (w/badge-custom-equity-text "remblanc" "πŸ’Έ")
+;; (w/badge-custom-equity-text "pwfff" "β˜‰")
+;; (w/badge-custom-equity-text "tomaterr" "πŸ…")
+;; (w/badge-custom-equity-text "slowpvke" "Ξ¦")
(provide 'wasp-user-badges)
;;; wasp-user-badges.el ends here
diff --git a/src/wasp-user-whitelist.el b/src/wasp-user-whitelist.el
index 7b767482..458225b1 100644
--- a/src/wasp-user-whitelist.el
+++ b/src/wasp-user-whitelist.el
@@ -287,6 +287,7 @@
"backpackvacuum"
"xwth"
"marvin__28"
+ "mnxa_sn33d"
)))
(setq
diff --git a/src/wasp-user.el b/src/wasp-user.el
index de5df6f8..778d4f4b 100644
--- a/src/wasp-user.el
+++ b/src/wasp-user.el
@@ -6,6 +6,7 @@
(require 'ht)
(require 'wasp-utils)
(require 'wasp-db)
+(require 'wasp-leaderboard)
(defvar w/user-whitelist nil)
@@ -90,7 +91,9 @@
(lambda (scur)
(when-let* ( (cur (or (w/read-sexp scur) 0))
(_ (integerp cur)))
- (w/user-set-property uid "boost" (format "%s" (+ cur 1))))))))
+ (let ((new (+ cur 1)))
+ (w/user-set-property uid "boost" (format "%s" new))
+ (w/leaderboard-set-score "boost" uid new)))))))
(defun w/user-tsoob (uid)
"Decrement UID's boost power by 1."
@@ -99,7 +102,9 @@
(lambda (scur)
(when-let* ( (cur (or (w/read-sexp scur) 0))
(_ (integerp cur)))
- (w/user-set-property uid "boost" (format "%s" (- cur 1))))))))
+ (let ((new (- cur 1)))
+ (w/user-set-property uid "boost" (format "%s" new))
+ (w/leaderboard-set-score "boost" uid new)))))))
(defun w/user-avatar (user)
"Return USER's avatar as a unibyte string."