diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gizmo/wasp-flymake.el | 4 | ||||
| -rw-r--r-- | src/gizmo/wasp-heartrate.el | 2 | ||||
| -rw-r--r-- | src/gizmo/wasp-leaderboard.el | 75 | ||||
| -rw-r--r-- | src/gizmo/wasp-top.el | 10 | ||||
| -rw-r--r-- | src/wasp-ai.el | 2 | ||||
| -rw-r--r-- | src/wasp-chat.el | 1 | ||||
| -rw-r--r-- | src/wasp-db.el | 21 | ||||
| -rw-r--r-- | src/wasp-gizmo.el | 4 | ||||
| -rw-r--r-- | src/wasp-obs.el | 13 | ||||
| -rw-r--r-- | src/wasp-setup.el | 4 | ||||
| -rw-r--r-- | src/wasp-twitch-chat-commands.el | 6 | ||||
| -rw-r--r-- | src/wasp-user-badges.el | 14 | ||||
| -rw-r--r-- | src/wasp-user-whitelist.el | 1 | ||||
| -rw-r--r-- | src/wasp-user.el | 9 |
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." |
