diff options
| author | LLLL Colonq <llll@colonq> | 2025-11-07 00:20:02 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2025-11-07 00:20:02 -0500 |
| commit | cf266a56f30daae8b9af7c9bc3267c61b1973192 (patch) | |
| tree | f365939f712973840ff19d9265c552af820cd1ef /src | |
| parent | 3d31c488fb06e9937964041f4d83d0cb1c9699ab (diff) | |
Update
Diffstat (limited to 'src')
32 files changed, 459 insertions, 360 deletions
diff --git a/src/gizmo/wasp-alert-message.el b/src/gizmo/wasp-alert-message.el index c645b01f..da5f214f 100644 --- a/src/gizmo/wasp-alert-message.el +++ b/src/gizmo/wasp-alert-message.el @@ -27,30 +27,21 @@ :group 'w (setq-local cursor-type nil)) -(defun w/get-alert-message-buffer () +(defun w/alert-message-get-buffer () "Return the alert message buffer." (unless (get-buffer w/alert-message-buffer) (with-current-buffer (get-buffer-create w/alert-message-buffer) (w/alert-message-mode))) (get-buffer w/alert-message-buffer)) -(defun w/render-alert-message () +(defun w/alert-message-update () "Render the heartrate buffer." - (with-current-buffer (w/get-alert-message-buffer) + (with-current-buffer (w/alert-message-get-buffer) (setq-local cursor-type nil) (let* ((inhibit-read-only t)) (erase-buffer) (w/write (w/pick-random w/alert-message-phrases))))) - -(defvar w/alert-message-timer nil) -(defun w/run-alert-message-timer () - "Run the alert message timer." - (when w/alert-message-timer - (cancel-timer w/alert-message-timer)) - (w/render-alert-message) - (setq - w/alert-message-timer - (run-with-timer 10 nil #'w/run-alert-message-timer))) +(add-hook 'w/gizmo-update-hook #'w/alert-message-update) (provide 'wasp-alert-message) ;;; wasp-alert-message.el ends here diff --git a/src/gizmo/wasp-animism.el b/src/gizmo/wasp-animism.el index 80c6f70e..de3b8510 100644 --- a/src/gizmo/wasp-animism.el +++ b/src/gizmo/wasp-animism.el @@ -51,7 +51,7 @@ Pass the resulting BulletML XML string to K." ((bml/barrage-toplevel b))) (progn (funcall k data)) - (w/write-chat-event "That spell card is too powerful... "))))) + (w/chat-write-event "That spell card is too powerful... "))))) (provide 'wasp-animism) ;;; wasp-animism.el ends here diff --git a/src/gizmo/wasp-bannerads.el b/src/gizmo/wasp-bannerads.el index 7d64ac1b..5ce7628e 100644 --- a/src/gizmo/wasp-bannerads.el +++ b/src/gizmo/wasp-bannerads.el @@ -8,6 +8,7 @@ (require 'ht) (require 'wasp-utils) (require 'wasp-chat) +(require 'wasp-model) (defvar w/banner-ad-block nil) @@ -21,16 +22,16 @@ :group 'w (setq-local cursor-type nil)) -(defun w/get-banner-ad-buffer () +(defun w/banner-ad-get-buffer () "Return the banner ad buffer." (unless (get-buffer w/banner-ad-buffer) (with-current-buffer (get-buffer-create w/banner-ad-buffer) (w/banner-ad-mode))) (get-buffer w/banner-ad-buffer)) -(defun w/render-banner-ad () +(defun w/banner-ad-update () "Render the banner ad buffer." - (with-current-buffer (w/get-banner-ad-buffer) + (with-current-buffer (w/banner-ad-get-buffer) (setq-local cursor-type nil) (let* ((inhibit-read-only t)) (erase-buffer) @@ -41,27 +42,18 @@ (img (create-image path nil nil :max-width 555 :max-height 175))) (image-animate img nil t) (w/write (propertize "bannerad" 'display img))))))) - -(defvar w/banner-ad-timer nil) -(defun w/run-banner-ad-timer () - "Run the banner ad timer." - (when w/banner-ad-timer - (cancel-timer w/banner-ad-timer)) - (w/render-banner-ad) - (setq - w/banner-ad-timer - (run-with-timer 60 nil #'w/run-banner-ad-timer))) +(add-hook 'w/gizmo-update-hook #'w/banner-ad-update) (defun w/banner-ad-block () "Toggle adblock." (setq w/banner-ad-block t) - (w/render-banner-ad) + (w/banner-ad-update) (w/model-toggle-set "adblock") (run-with-timer 10 nil (lambda () (setq w/banner-ad-block nil) (w/model-toggle-unset "adblock") - (w/render-banner-ad))) + (w/banner-ad-update))) nil) (provide 'wasp-bannerads) diff --git a/src/gizmo/wasp-biblicality.el b/src/gizmo/wasp-biblicality.el index c9b8cb44..10c38236 100644 --- a/src/gizmo/wasp-biblicality.el +++ b/src/gizmo/wasp-biblicality.el @@ -18,7 +18,7 @@ (w/asset "bible.txt")) (ht-set! w/bible-table user 1000)) -(defun w/populate-bible-table () +(defun w/bible-table-populate () "Populate `w/bible-table' from the Bible text file." (unless w/bible-table (let* ((bible-string (s-downcase (w/slurp (w/asset "bible.txt")))) diff --git a/src/gizmo/wasp-bless.el b/src/gizmo/wasp-bless.el index c3175548..fa79a4a7 100644 --- a/src/gizmo/wasp-bless.el +++ b/src/gizmo/wasp-bless.el @@ -49,8 +49,8 @@ (defun w/bless-apply-effect (e) "Apply the list of side effects E." (cl-case (car e) - (print (w/write-chat-event (format "%s" (cadr e)))) - (print-backwards (w/write-chat-event (reverse (format "%s" (cadr e))))) + (print (w/chat-write-event (format "%s" (cadr e)))) + (print-backwards (w/chat-write-event (reverse (format "%s" (cadr e))))) (soundboard (soundboard//play-clip (cadr e))) (model-toggle (w/model-toggle (cadr e))) (t (message "Unknown effect tag: %s" (car e))))) diff --git a/src/gizmo/wasp-chatsummary.el b/src/gizmo/wasp-chatsummary.el index 3087c18d..169c3a21 100644 --- a/src/gizmo/wasp-chatsummary.el +++ b/src/gizmo/wasp-chatsummary.el @@ -3,7 +3,7 @@ ;;; Code: (require 'wasp-ai) -(require 'wasp-friend) +(require 'wasp-friend-journalism) (defcustom w/chatsummary-buffer "*wasp-chatsummary*" "Name of buffer used to display chat summary." @@ -12,7 +12,7 @@ (define-derived-mode w/chatsummary-mode special-mode "Chat Summary" "Major mode for displaying chat summary." - :group 'w + :group 'wasp (setq-local cursor-type nil) (visual-line-mode)) @@ -23,7 +23,7 @@ (w/chatsummary-mode))) (get-buffer w/chatsummary-buffer)) -(defun w/update-chatsummary () +(defun w/chatsummary-update () "Update the chat summary." (w/ai (w/friend-journalism-input) @@ -38,21 +38,21 @@ "Given a list of recent YouTube chatter activity, produce a summary of the topics discussed. The summary should be very short, maximum two sentences total. Do not introduce yourself. Simply provide a short summary of the chat. Do not mention specific names of chatters. Keep it succinct. Do not mention that you are summarizing YouTube activity. Be laconic.")) (defvar w/chatsummary-timer nil) -(defun w/run-chatsummary-timer () +(defun w/chatsummary-run-timer () "Run the chat summary timer." (when w/chatsummary-timer (cancel-timer w/chatsummary-timer)) - (w/update-chatsummary) + (w/chatsummary-update) (setq w/chatsummary-timer - (run-with-timer 120 nil #'w/run-chatsummary-timer))) + (run-with-timer 120 nil #'w/chatsummary-run-timer))) -(defun w/start-chatsummary () +(defun w/chatsummary-start () "Enable fake chatters." (interactive) - (w/run-chatsummary-timer)) + (w/chatsummary-run-timer)) -(defun w/stop-chatsummary () +(defun w/chatsummary-stop () "Disable fake chatters." (interactive) (cancel-timer w/chatsummary-timer) diff --git a/src/gizmo/wasp-fakechat.el b/src/gizmo/wasp-fakechat.el index ffdd750a..ff7ed5d5 100644 --- a/src/gizmo/wasp-fakechat.el +++ b/src/gizmo/wasp-fakechat.el @@ -51,7 +51,7 @@ (unless (string-empty-p text-colored-bible) (when (s-contains? "hexadiCoding" trimmed) (soundboard//play-clip "developers.ogg")) - (w/write-chat-message + (w/chat-write-message (w/make-chat-message :user (w/fake-chatter-profile-username prof) :id "" @@ -87,21 +87,21 @@ (w/fake-chatter-run st))) (defvar w/fake-chatter-timer nil) -(defun w/run-fake-chatter-timer () +(defun w/fake-chatters-run-timer () "Run the fake chatter timer." (when w/fake-chatter-timer (cancel-timer w/fake-chatter-timer)) (w/fake-chatters-handle) (setq w/fake-chatter-timer - (run-with-timer 30 nil #'w/run-fake-chatter-timer))) + (run-with-timer 30 nil #'w/fake-chatters-run-timer))) -(defun w/start-fake-chatters () +(defun w/fake-chatters-start () "Enable fake chatters." (interactive) - (w/run-fake-chatter-timer)) + (w/fake-chatters-run-timer)) -(defun w/stop-fake-chatters () +(defun w/fake-chatters-stop () "Disable fake chatters." (interactive) (cancel-timer w/fake-chatter-timer) @@ -147,6 +147,7 @@ (defun w/fake-chatter-elevated-likeliness (st) "Compute the elevated likeliness for ST to chat." + (ignore st) 0.1) (defconst w/fake-chatter-profile-prodzpod @@ -179,7 +180,7 @@ :compute-likeliness #'w/fake-chatter-standard-likeliness :send-message (lambda (_) - (w/write-chat-event "eighteyedsixwingedseraph is lurking")))) + (w/chat-write-event "eighteyedsixwingedseraph is lurking")))) (defconst w/fake-chatter-profile-quasiconformal (w/make-fake-chatter-profile @@ -188,7 +189,7 @@ :compute-likeliness #'w/fake-chatter-standard-likeliness :send-message (lambda (_) - (w/write-chat-event "quasiconformal is lurking")))) + (w/chat-write-event "quasiconformal is lurking")))) (defconst w/fake-chatter-profile-nefrayu (w/make-fake-chatter-profile diff --git a/src/gizmo/wasp-friend-journalism.el b/src/gizmo/wasp-friend-journalism.el index 25d18bdb..c6415afb 100644 --- a/src/gizmo/wasp-friend-journalism.el +++ b/src/gizmo/wasp-friend-journalism.el @@ -26,12 +26,12 @@ AUTHOR was a contributing author btw." (w/friend-journalism-input)) (lambda (resp) (when resp - (w/write-chat-event (format "\"friend\" finished writing about: %s" headline)) + (w/chat-write-event (format "\"friend\" finished writing about: %s" headline)) (funcall (if (= (random 5) 0) #'w/newspaper-screenshot (lambda (k) (funcall k nil))) (lambda (img) (when img - (w/write-chat-event "...and the article included some photojournalism")) + (w/chat-write-event "...and the article included some photojournalism")) (push (w/make-newspaper-article :headline headline diff --git a/src/gizmo/wasp-friend-music.el b/src/gizmo/wasp-friend-music.el index 76e2c606..dfb376cd 100644 --- a/src/gizmo/wasp-friend-music.el +++ b/src/gizmo/wasp-friend-music.el @@ -20,7 +20,7 @@ (w/friend-respond (format "You just composed a song about %s called %s! Say something about it!" theme name) (lambda () - (w/write-chat-event (format "The song is called %s: %s" name song)) + (w/chat-write-event (format "The song is called %s: %s" name song)) (w/add-song (s-concat "friend's " name) song) (w/audio-muzak-enqueue "\"friend\"" song)))))) "Please compose a song about the provided theme. The format for the song is a sequence of characters with meanings as follows: / represents a rest, uppercase letters A through G indicate semitones, octaves are specified with a number following a semitone, ~ extends the duration of a note, square brackets like [] group notes together into a chord. The pipe character | separates tracks. Respond only with the song's name followed by a colon folowed by the song notes. Do not explain yourself. The song should ideally be 20 to 30 notes long." diff --git a/src/gizmo/wasp-friend.el b/src/gizmo/wasp-friend.el index aff6e358..dfa6f513 100644 --- a/src/gizmo/wasp-friend.el +++ b/src/gizmo/wasp-friend.el @@ -45,7 +45,7 @@ (defun w/friend-set-speech (msg &optional time) "Have \"friend\" say MSG for TIME." - (w/write-chat-event (s-concat "Friend says: " msg)) + (w/chat-write-event (s-concat "Friend says: " msg)) (setf w/friend-speech msg) (setf w/friend-speech-timer (or time 5))) @@ -158,11 +158,18 @@ If K is specified, call it after the response." (w/write (format-spec "%a\ - /----\\ + /\\ /\\ + \\----/ / %l %r \\ \\ %m / +----+\ " +;; "%a\ +;; /----\\ +;; / %l %r \\ +;; \\ %m / +;; +----+\ +;; " `((?a . ,(s-repeat (w/friend-get-offset) " \n")) (?l . ,(car face)) (?r . ,(cadr face)) diff --git a/src/gizmo/wasp-gdq.el b/src/gizmo/wasp-gdq.el index 03d9bb64..9ce3e60c 100644 --- a/src/gizmo/wasp-gdq.el +++ b/src/gizmo/wasp-gdq.el @@ -78,7 +78,7 @@ user (lambda (s) (let ((sp (s-split "|" s))) - (w/write-chat-event (format "%s donated %s!" (car sp) (cadr sp))) + (w/chat-write-event (format "%s donated %s!" (car sp) (cadr sp))) (w/tts (format "%s donated %s with the message: %s" diff --git a/src/gizmo/wasp-heartrate.el b/src/gizmo/wasp-heartrate.el index 91e758fd..fa27d64d 100644 --- a/src/gizmo/wasp-heartrate.el +++ b/src/gizmo/wasp-heartrate.el @@ -9,23 +9,13 @@ (require 'wasp-utils) (require 'wasp-chat) -(defun w/get-load () - "Get the current CPU load." - (let ((res (shell-command-to-string "uptime"))) - (string-to-number (s-trim (car (s-split "," (cadr (s-split "load average:" res)))))))) - -(defun w/get-disk-usage (disk) - "Get the current usage percent for DISK" - (let ((res (shell-command-to-string (format "df %s" disk)))) - (string-to-number (s-chop-suffix "%" (nth 4 (s-split " " (cadr (s-lines res)) t)))))) - -(defun w/get-heartrate () +(defun w/heartrate () "Get the streamer's heart rate." - (* 100 (w/get-load))) + (* 100 (w/cpu-load))) -(defun w/get-blood-pressure () +(defun w/heartrate-blood-pressure () "Get the streamer's blood pressure." - (format "%s/%s" (w/get-disk-usage "/") (w/get-disk-usage "/home"))) + (format "%s/%s" (w/disk-usage "/") (w/disk-usage "/home"))) (defface w/heartrate-big '((t @@ -52,32 +42,23 @@ :group 'w (setq-local cursor-type nil)) -(defun w/get-heartrate-buffer () +(defun w/heartrate-get-buffer () "Return the heartrate buffer." (unless (get-buffer w/heartrate-buffer) (with-current-buffer (get-buffer-create w/heartrate-buffer) (w/heartrate-mode))) (get-buffer w/heartrate-buffer)) -(defun w/render-heartrate () +(defun w/heartrate-update () "Render the heartrate buffer." - (with-current-buffer (w/get-heartrate-buffer) + (with-current-buffer (w/heartrate-get-buffer) (setq-local cursor-type nil) (let* ((inhibit-read-only t)) (erase-buffer) - (w/write-line (format "%3d bpm" (w/get-heartrate)) 'w/heartrate-big) - (w/write-line (format "blood pressure: %s" (w/get-blood-pressure)) 'w/heartrate-small) + (w/write-line (format "%3d bpm" (w/heartrate)) 'w/heartrate-big) + (w/write-line (format "blood pressure: %s" (w/heartrate-blood-pressure)) 'w/heartrate-small) (w/write (format "arbitrary counter: %s times" w/chat-bpm-count) 'w/heartrate-small)))) - -(defvar w/heartrate-timer nil) -(defun w/run-heartrate-timer () - "Run the heartrate timer." - (when w/heartrate-timer - (cancel-timer w/heartrate-timer)) - (w/render-heartrate) - (setq - w/heartrate-timer - (run-with-timer 1 nil #'w/run-heartrate-timer))) +(add-hook 'w/gizmo-update-hook #'w/heartrate-update) (provide 'wasp-heartrate) ;;; wasp-heartrate.el ends here diff --git a/src/gizmo/wasp-hex.el b/src/gizmo/wasp-hex.el index 1417f0c9..e483982b 100644 --- a/src/gizmo/wasp-hex.el +++ b/src/gizmo/wasp-hex.el @@ -30,6 +30,8 @@ ("ESUNA" . decurse) ("DECIMAL" . decimal) ("DROPBEAR" . upsidedown) + ("SOULBURN" . silence) + ("SPELLNAME" . spellname) )) (defconst w/hex-users (ht-create 'equal)) @@ -56,7 +58,7 @@ (ht-set! w/hex-users key nil)) (otherwise (if-let* ((defender (--find (eq 'counterspell (w/hex-type it)) cur))) - (w/write-chat-event (format "%s counterspelled %s's hex on %s!" (w/hex-caster defender) (w/hex-caster hex) user)) + (w/chat-write-event (format "%s counterspelled %s's hex on %s!" (w/hex-caster defender) (w/hex-caster hex) user)) (ht-set! w/hex-users key (cons hex cur)))))))) (defun w/hex-clear (user) @@ -231,6 +233,9 @@ (w/chat-message-text msg) (ttf/flip (w/chat-message-text msg))) (w/hex-transform-helper msg (cdr hexes) k)) + (spellname + (setf (w/chat-message-text msg) (w/pick-random (-map #'car w/hex-types))) + (w/hex-transform-helper msg (cdr hexes) k)) (t (w/hex-transform-helper msg (cdr hexes) k)))) (t (funcall k msg)))) (defun w/hex-transform (user msg) @@ -239,7 +244,7 @@ msg (w/hex-get user) (lambda (msg) (when msg - (w/write-chat-message msg))))) + (w/chat-write-message msg))))) (defun w/hex-tick (user) "Decrement timers for all of USER's hexes." diff --git a/src/gizmo/wasp-irish.el b/src/gizmo/wasp-irish.el index 5cbf0b47..aa96963e 100644 --- a/src/gizmo/wasp-irish.el +++ b/src/gizmo/wasp-irish.el @@ -358,7 +358,7 @@ Pass the path to the downloaded image to K." :command `("convert" ,p "-scale" "100x140!" ,p) :sentinel (lambda (_ _) - (w/write-chat-event "Uploading image to poster!") + (w/chat-write-event "Uploading image to poster!") (make-process :name "*wasp-irish-dough*" :buffer nil diff --git a/src/gizmo/wasp-prod.el b/src/gizmo/wasp-prod.el index 4ba6dd17..dbfe19c6 100644 --- a/src/gizmo/wasp-prod.el +++ b/src/gizmo/wasp-prod.el @@ -68,7 +68,7 @@ (unless (string-empty-p text-colored-bible) (when (s-contains? "hexadiCoding" trimmed) (soundboard//play-clip "developers.ogg")) - (w/write-chat-message + (w/chat-write-message (w/make-chat-message :user name :text (w/twitch-add-7tv-emotes text-colored-bible) diff --git a/src/gizmo/wasp-tcg.el b/src/gizmo/wasp-tcg.el new file mode 100644 index 00000000..b989eb31 --- /dev/null +++ b/src/gizmo/wasp-tcg.el @@ -0,0 +1,115 @@ +;;; wasp-tcg --- trading card game -*- lexical-binding: t; -*- +;;; Commentary: +;;; Code: + +(require 'cl-lib) +(require 'ht) +(require 'f) + +(require 'wasp-twitch) +(require 'wasp-user) + +(defconst w/tcg-bases + (-map #'f-base + (f-entries "/home/llll/src/newton/crates/renderer/src/assets/textures/tcg/bases"))) + +(defvar w/tcg-request-sequence 0) +(defvar w/tcg-request-handlers (ht-create)) + +(cl-defstruct (w/tcg-card (:constructor w/make-tcg-card)) + name + type + depicted-subject + element + color + faction + equity + boost-level + rarity + rarity-level + body-text + base-image-name + flags ;; comma-separated strings: inverse, etc. + ) + +(defun w/tcg-determine-rarity () + "Return a rarity level." + (let ((ret 0)) + (while (= (random 2) 0) + (cl-incf ret)) + ret)) + +(defun w/tcg-render-rarity (r) + "Convert rarity R to a string." + (cond + ((= 0 r) "C") + ((= 1 r) "R") + (t (s-concat (s-repeat (- r 1) "S") "R")))) + +(defun w/tcg-pick-flags (u) + "Return flags for the user U." + (ignore u) + (-concat + (when (= (random 20) 0) (list "inverse")))) + +(defun w/tcg-random-user-card (k) + "Generate a random `w/tcg-card' and pass it to K." + (let* ( (users (-map #'car w/twitch-chat-history)) + (name (w/pick-random users)) + (ud (w/user-cache-get name)) + (element (alist-get :element ud)) + (colornm (or (cadr (alist-get element w/user-elements nil nil #'s-equals?)) "grey")) + (color (w/color-value-to-html-code (color-values colornm))) + (faction (format "%s" (or (alist-get :faction ud) 'none))) + (equity (format "%s" (or (alist-get :equity ud) 0))) + (boost-level (format "%s" (or (alist-get :boost ud) "ABSTAINER"))) + (rarity-level (w/tcg-determine-rarity)) + (rarity (w/tcg-render-rarity rarity-level))) + (funcall k + (w/make-tcg-card + :name name + :type "user" + :depicted-subject name + :element (or element "neutral") + :color color + :faction faction + :equity equity + :boost-level boost-level + :rarity rarity + :rarity-level (format "%s" rarity-level) + :body-text "" + :base-image-name (w/pick-random w/tcg-bases) + :flags (s-join "," (w/tcg-pick-flags ud)))) + nil)) + +(defun w/tcg-encode-card (c) + "Encode C to a string." + (s-join "\t" + (list + (w/. name c) + (w/. type c) + (w/. depicted-subject c) + (w/. element c) + (w/. color c) + (w/. faction c) + (w/. equity c) + (w/. boost-level c) + (w/. rarity c) + (w/. rarity-level c) + (w/. body-text c) + (w/. base-image-name c) + (w/. flags c)))) + +(defun w/tcg-generate-card (c k) + "Generate the card C. +Pass the resulting PNG to K." + (let* ( (seq (cl-incf w/tcg-request-sequence)) + (msg (format "%s\t%s" seq (w/tcg-encode-card c)))) + (ht-set w/tcg-request-handlers seq + (lambda (resp) + (ht-remove w/tcg-request-handlers seq) + (funcall k resp))) + (w/binary-pub "overlay tcg generate" msg))) + +(provide 'wasp-tcg) +;;; wasp-tcg.el ends here diff --git a/src/gizmo/wasp-wikipedia.el b/src/gizmo/wasp-wikipedia.el index 74a6adf0..8f9f1580 100644 --- a/src/gizmo/wasp-wikipedia.el +++ b/src/gizmo/wasp-wikipedia.el @@ -40,7 +40,7 @@ Pass the resulting article summary to K." (dom (with-temp-buffer (insert ext) (libxml-parse-html-region (point-min) (point-max)))) ) (funcall k (s-trim (dom-texts dom))) - (w/write-chat-event (format "Could not find Wikipedia page: %s" pagename)))))) + (w/chat-write-event (format "Could not find Wikipedia page: %s" pagename)))))) nil)) (defcustom w/wiki-buffer "*wasp-wiki*" diff --git a/src/wasp-ai.el b/src/wasp-ai.el index 2c696c56..31ca001a 100644 --- a/src/wasp-ai.el +++ b/src/wasp-ai.el @@ -80,49 +80,6 @@ ;; (funcall k data)))) t) -(defvar-local w/ai-callback nil) -(defun w/ai-old (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 ((tmpfile (make-temp-file "wasp-ai")) - (tmpfilesystem (make-temp-file "wasp-ai-system")) - (tmpfileuser (make-temp-file "wasp-ai-user")) - (tmpfileassistant (make-temp-file "wasp-ai-assistant")) - (buf (generate-new-buffer w/ai-buffer))) - (with-temp-file tmpfile (insert question)) - (when systemprompt - (with-temp-file tmpfilesystem (insert systemprompt))) - (when user - (with-temp-file tmpfileuser - (if (stringp user) - (insert (s-concat user "\n")) - (--each user - (insert (s-concat it "\n")))))) - (when assistant - (with-temp-file tmpfileassistant - (if (stringp assistant) - (insert (s-concat assistant "\n")) - (--each assistant - (insert (s-concat it "\n")))))) - (with-current-buffer buf - (setq-local w/ai-callback k) - (erase-buffer)) - (make-process - :name w/ai-process - :buffer buf - :command - (list - "chatgpt" - tmpfile - (if systemprompt tmpfilesystem "systemprompt.txt") - (if user tmpfileuser "userprompt.txt") - (if assistant tmpfileassistant "assistantprompt.txt")) - :stderr (get-buffer-create w/ai-error-buffer) - :sentinel - (lambda (_ _) - (with-current-buffer buf - (funcall w/ai-callback (s-trim (buffer-string)))))))) - (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." diff --git a/src/wasp-chat.el b/src/wasp-chat.el index badb6856..b20d897d 100644 --- a/src/wasp-chat.el +++ b/src/wasp-chat.el @@ -49,7 +49,7 @@ :group 'wasp (setq mode-line-format nil)) -(defun w/get-chat-overlay-buffer (user) +(defun w/chat-get-overlay-buffer (user) "Return the stats buffer for USER." (let ((name (format "*wasp-chatter %s*" user))) (unless (get-buffer name) @@ -74,7 +74,7 @@ (defun w/chat-overlay-display-element (e) "Return a propertized string representing E." - (if-let ((dinfo (alist-get e w/user-elements nil nil #'s-equals?))) + (if-let* ((dinfo (alist-get e w/user-elements nil nil #'s-equals?))) (propertize (format "%s %s" (car dinfo) e) 'face (list :foreground (cadr dinfo))) @@ -84,7 +84,7 @@ (w/user-get user (lambda (db) - (with-current-buffer (w/get-chat-overlay-buffer user) + (with-current-buffer (w/chat-get-overlay-buffer user) (let* ((inhibit-read-only t) (faction (alist-get :faction db)) (element (alist-get :element db)) @@ -117,7 +117,7 @@ (defvar w/chat-overlay-frame nil) (defvar w/chat-overlay-cur nil) -(defun w/create-chat-overlay-frame () +(defun w/chat-create-overlay-frame () "Build a frame for displaying chatter stats on mouseover." (when (framep w/chat-overlay-frame) (delete-frame w/chat-overlay-frame)) @@ -145,59 +145,59 @@ (cursor-type . nil) (background-color . "black")))))) -(defun w/show-chat-overlay-frame (vis) +(defun w/chat-show-overlay-frame (vis) "If VIS is non-nil, make the chat overlay frame visible. Otherwise make it invisible." (if vis (make-frame-visible w/chat-overlay-frame) (setq w/chat-overlay-cur nil) (make-frame-invisible w/chat-overlay-frame))) -(defun w/move-chat-overlay-frame (x y) +(defun w/chat-move-overlay-frame (x y) "Move the chat overlay frame to X, Y." (modify-frame-parameters w/chat-overlay-frame (list (cons 'top y) (cons 'left x)))) -(defun w/display-chat-overlay (user &optional x y) +(defun w/chat-display-overlay (user &optional x y) "Display the chat overlay buffer for USER. Optionally display the window at X, Y" (unless w/chat-overlay-frame - (w/create-chat-overlay-frame)) + (w/chat-create-overlay-frame)) (let ((window (frame-selected-window w/chat-overlay-frame))) (if (and x y) - (w/move-chat-overlay-frame x y) - (w/move-chat-overlay-frame -1 -1)) + (w/chat-move-overlay-frame x y) + (w/chat-move-overlay-frame -1 -1)) (w/chat-overlay-render user) (setq w/chat-overlay-cur user) - (set-window-buffer window (w/get-chat-overlay-buffer user)) - (w/show-chat-overlay-frame t))) -(defun w/update-chat-overlay (user pos) + (set-window-buffer window (w/chat-get-overlay-buffer user)) + (w/chat-show-overlay-frame t))) +(defun w/chat-update-overlay (user pos) "Update the chat overlay frame for USER based on POS." (if (and user pos) (progn (unless (equal (cons user pos) w/chat-overlay-cur) - (w/display-chat-overlay user (car pos) (cdr pos))) + (w/chat-display-overlay user (car pos) (cdr pos))) ) - (w/show-chat-overlay-frame nil))) -(defun w/handle-chat-overlay () + (w/chat-show-overlay-frame nil))) +(defun w/chat-handle-overlay () "Handle point movement for chat overlay popup." - (with-current-buffer (w/get-chat-buffer) - (w/update-chat-overlay + (with-current-buffer (w/chat-get-buffer) + (w/chat-update-overlay (get-text-property (point) 'wasp-user) (window-absolute-pixel-position (point))))) (define-derived-mode w/chat-mode special-mode "Chat" "Major mode for displaying chat." :group 'wasp - (add-hook 'post-command-hook #'w/handle-chat-overlay nil t) + (add-hook 'post-command-hook #'w/chat-handle-overlay nil t) (advice-add 'handle-switch-frame :before-while #'w/prevent-focus-frame) (setq-local window-point-insertion-type t) (setq-local cursor-type nil) (cond (t (setq-local header-line-format '(:eval w/chat-header-line))))) -(defun w/get-chat-buffer (&optional nm) +(defun w/chat-get-buffer (&optional nm) "Return the chat buffer. Optionally, return the buffer NM in chat mode." (let ((bufnm (or nm w/chat-buffer))) @@ -210,7 +210,7 @@ Optionally, return the buffer NM in chat mode." "Major mode for displaying chat." :group 'wasp) -(defun w/get-chat-event-buffer () +(defun w/chat-get-event-buffer () "Return the chat event buffer." (let ((bufnm w/chat-event-buffer)) (unless (get-buffer bufnm) @@ -218,27 +218,30 @@ Optionally, return the buffer NM in chat mode." (w/chat-event-mode))) (get-buffer bufnm))) -(defun w/clear-chat () +(defun w/chat-clear () "Clear the chat buffer." (interactive) - (with-current-buffer (w/get-chat-buffer) + (with-current-buffer (w/chat-get-buffer) (let ((inhibit-read-only t)) (erase-buffer)))) (defvar-keymap w/chat-mode-map :suppress t - "C-l" #'w/clear-chat) + "C-l" #'w/chat-clear) (evil-define-key 'motion w/chat-mode-map (kbd "<return>") #'w/open-link) -(defun w/write-chat-event (ev) +(defun w/chat-write-event (ev) "Write the string EV to the chat buffer as an event (italicized)." (let ((inhibit-read-only t)) - ;; (with-current-buffer (w/get-chat-event-buffer) - (with-current-buffer (w/get-chat-buffer) + (with-current-buffer (w/chat-get-buffer) (goto-char (point-max)) (insert (propertize ev 'face 'italic)) (insert "\n")) - (w/gizmo-upload (w/get-chat-event-buffer)))) + (with-current-buffer (w/chat-get-event-buffer) + (goto-char (point-max)) + (insert (propertize ev 'face 'italic)) + (insert "\n")) + (w/gizmo-upload (w/chat-get-event-buffer)))) (w/defstruct w/chat-message @@ -277,11 +280,11 @@ Optionally, return the buffer NM in chat mode." ("hunter2" . "*******") ("*******" . "hunter2"))) -(defun w/write-chat-message (msg &optional buf) +(defun w/chat-write-message (msg &optional buf) "Write MSG to BUF as USER with USERID and COLOR." (w/daily-log (format "%s: %s" (w/. user msg) (w/. text msg))) (let ((inhibit-read-only t)) - (with-current-buffer (w/get-chat-buffer buf) + (with-current-buffer (w/chat-get-buffer buf) (setq-local cursor-type nil) (goto-char (point-max)) (insert-text-button @@ -313,9 +316,7 @@ Optionally, return the buffer NM in chat mode." ;; (bible-button-text (format "[pollicality %.2f]" (w/. biblicality msg))) (msgwidth (line-beginning-position)) (lines (+ 1 (/ msgwidth wwidth)))) - (w/overlay-chat msg) - (insert (propertize " " 'display @@ -329,7 +330,7 @@ Optionally, return the buffer NM in chat mode." bible-button-text 'face '(:foreground "#bbbbbb"))))) (insert "\n")) - (when-let* ((win (get-buffer-window (w/get-chat-buffer)))) + (when-let* ((win (get-buffer-window (w/chat-get-buffer)))) (with-selected-window win (goto-char (point-max)))))) diff --git a/src/wasp-db.el b/src/wasp-db.el index fda53b85..420bdf84 100644 --- a/src/wasp-db.el +++ b/src/wasp-db.el @@ -80,7 +80,7 @@ If not, return nil." (condition-case err (while (w/db-parse-response)) (error - (w/write-chat-event (format "Database crashed, error: %s" err)) + (w/chat-write-event (format "Database crashed, error: %s" err)) (w/db-disconnect)))))) (defun w/db-encode (x) diff --git a/src/wasp-event-handlers-binary.el b/src/wasp-event-handlers-binary.el index b7df863d..acdc2616 100644 --- a/src/wasp-event-handlers-binary.el +++ b/src/wasp-event-handlers-binary.el @@ -13,27 +13,26 @@ (setf w/bus-binary-event-handlers (list - (cons "monitor twitch chat incoming" + (cons "fig monitor twitch chat incoming" (lambda (d) - (message "incoming: %s" d) (-let [(user stags msg) (s-split-up-to " " (w/utf8 d) 2)] (w/twitch-handle-incoming-chat user (--map (s-split "\t" it) (s-split "\n" stags)) msg)))) - (cons "monitor twitch redeem incoming" + (cons "fig monitor twitch redeem incoming" (lambda (d) - (-let [(user redeem input) (s-split-up-to " " (w/utf8 d) 2)] + (-let [(user redeem input) (s-split-up-to "\t" (w/utf8 d) 2)] (w/twitch-handle-redeem-helper user redeem input)))) - (cons "frontend redeem incoming" + (cons "fig web redeem incoming" (lambda (d) (-let [(user redeem input) (s-split-up-to "\t" (w/utf8 d) 2)] (w/twitch-handle-redeem-helper user redeem input 1000)))) - (cons "monitor twitch raid" + (cons "fig monitor twitch raid" (lambda (d) (let ((user (w/utf8 d))) (soundboard//play-clip "rampage.mp3") - (w/write-chat-event (format "%s just raided!" user)) + (w/chat-write-event (format "%s just raided!" user)) (w/friend-respond (format "%s just came to visit" user)) (run-with-timer 15 nil @@ -46,50 +45,50 @@ (if clips (w/model-region-video "hair" (car clips)) (w/model-region-user-avatar "hair" user))))))))) - (cons "monitor twitch follow" + (cons "fig monitor twitch follow" (lambda (d) (let ((user (w/utf8 d))) (soundboard//play-clip "firstblood.mp3") (w/model-region-word "skin" (format "welcome_%s_" user)) (w/friend-respond (format "%s just followed the stream" user)) - (w/write-chat-event (format "New follower: %s" user))))) - (cons "monitor twitch subscribe" + (w/chat-write-event (format "New follower: %s" user))))) + (cons "fig monitor twitch subscribe" (lambda (d) (let ((user (w/utf8 d))) (w/thank-sub user) (w/model-region-word "skin" (format "thanks_%s_" user)) (w/friend-respond (format "%s just subscribed to the stream" user)) - (w/write-chat-event (format "New subscriber: %s" user))))) - (cons "monitor twitch gift" + (w/chat-write-event (format "New subscriber: %s" user))))) + (cons "fig monitor twitch gift" (lambda (d) (-let [(user subs) (s-split-up-to " " (w/utf8 d) 2)] (unless (s-equals? user "lcolonq") (w/model-region-word "skin" (format "thanks_%s_" user)) (w/friend-respond (format "%s just gifted subscriptions" user)) - (w/write-chat-event (format "%s gifted %d subs" user subs)) + (w/chat-write-event (format "%s gifted %d subs" user subs)) (soundboard//play-monsterkill subs))))) - (cons "monitor twitch poll begin" + (cons "fig monitor twitch poll begin" (lambda (_) - (w/write-chat-event "Poll started") + (w/chat-write-event "Poll started") (w/friend-respond "The chatters are doing a poll"))) - (cons "monitor twitch poll end" + (cons "fig monitor twitch poll end" (lambda (d) (let* - ( (sp (s-split " " (w/utf8 d))) - (choices (--map (s-split "," it) (cdr sp))) - (winner (car (-max-by (-on #'> #'cadr) choices)))) - (w/write-chat-event (format "Poll finished, winner is: %s" winner)) + ( (sp (s-split "\n" (w/utf8 d))) + (choices (--map (-let [(o v) (s-split "\t" it)] (cons o (string-to-number v))) (cdr sp))) + (winner (car (-max-by (-on #'> #'cdr) choices)))) + (w/chat-write-event (format "Poll finished, winner is: %s" winner)) (when w/twitch-current-poll-callback (funcall w/twitch-current-poll-callback winner)) (setq w/twitch-current-poll-callback nil)))) - (cons "monitor twitch prediction begin" + (cons "fig monitor twitch prediction begin" (lambda (d) - (w/write-chat-event "Gamble started") + (w/chat-write-event "Gamble started") (w/friend-respond "The chatters are gambling") (setq w/twitch-current-prediction-ids (w/utf8 d)))) - (cons "monitor twitch prediction end" + (cons "fig monitor twitch prediction end" (lambda (_) - (w/write-chat-event "Gamble finished") + (w/chat-write-event "Gamble finished") (setq w/twitch-current-prediction-ids nil))) )) diff --git a/src/wasp-event-handlers.el b/src/wasp-event-handlers.el index d45debaf..3aee77b5 100644 --- a/src/wasp-event-handlers.el +++ b/src/wasp-event-handlers.el @@ -15,11 +15,11 @@ (cons '(monitor lamulana test) (lambda (data) - (w/write-chat-event (format "LA-MULANA says hi: %s" data)))) + (w/chat-write-event (format "LA-MULANA says hi: %s" data)))) (cons '(monitor nethack test) (lambda (data) - (w/write-chat-event (format "Nethack says hi: %s" data)))) + (w/chat-write-event (format "Nethack says hi: %s" data)))) (cons '(monitor nethack monster) (lambda (data) @@ -29,15 +29,15 @@ (cons '(overlay barrage started) (lambda (_) - (w/write-chat-event "It begins...") + (w/chat-write-event "It begins...") (setf w/overlay-barrage-active t) (w/overlay-update-cursor))) (cons '(overlay barrage ended) (lambda (msg) (cond - ((s-equals? (car msg) "won") (w/write-chat-event "Fufufu... I win...")) - (t (w/write-chat-event "that it's over"))) + ((s-equals? (car msg) "won") (w/chat-write-event "Fufufu... I win...")) + (t (w/chat-write-event "that it's over"))) (setf w/overlay-barrage-active nil))) (cons '(monitor twitch chat incoming) #'w/twitch-handle-incoming-chat-sexp) (cons '(monitor twitch redeem incoming) #'w/twitch-handle-redeem) @@ -51,7 +51,7 @@ (lambda (msg) (let ((user (car msg))) (soundboard//play-clip "rampage.mp3") - (w/write-chat-event (format "%s just raided!" user)) + (w/chat-write-event (format "%s just raided!" user)) (w/friend-respond (format "%s just came to visit" user)) (run-with-timer 15 nil @@ -71,7 +71,7 @@ (soundboard//play-clip "firstblood.mp3") (w/model-region-word "skin" (format "welcome_%s_" user)) (w/friend-respond (format "%s just followed the stream" user)) - (w/write-chat-event (format "New follower: %s" user))))) + (w/chat-write-event (format "New follower: %s" user))))) (cons '(monitor twitch subscribe) (lambda (msg) @@ -79,7 +79,7 @@ (w/thank-sub user) (w/model-region-word "skin" (format "thanks_%s_" user)) (w/friend-respond (format "%s just subscribed to the stream" user)) - (w/write-chat-event (format "New subscriber: %s" user))))) + (w/chat-write-event (format "New subscriber: %s" user))))) (cons '(monitor twitch gift) (lambda (msg) @@ -88,38 +88,38 @@ (unless (s-equals? user "lcolonq") (w/model-region-word "skin" (format "thanks_%s_" user)) (w/friend-respond (format "%s just gifted subscriptions" user)) - (w/write-chat-event (format "%s gifted %d subs" user subs)) + (w/chat-write-event (format "%s gifted %d subs" user subs)) (soundboard//play-monsterkill subs))))) (cons '(monitor twitch poll begin) (lambda (_) - (w/write-chat-event "Poll started") + (w/chat-write-event "Poll started") (w/friend-respond "The chatters are doing a poll"))) (cons '(monitor twitch poll end) (lambda (msg) (let ((winner (car (-max-by (-on #'> #'cadr) (cadr msg))))) - (w/write-chat-event (format "Poll finished, winner is: %s" winner)) + (w/chat-write-event (format "Poll finished, winner is: %s" winner)) (when w/twitch-current-poll-callback (funcall w/twitch-current-poll-callback winner)) (setq w/twitch-current-poll-callback nil)))) (cons '(monitor twitch prediction begin) (lambda (msg) - (w/write-chat-event "Gamble started") + (w/chat-write-event "Gamble started") (w/friend-respond "The chatters are gambling") (setq w/twitch-current-prediction-ids msg))) (cons '(monitor twitch prediction end) (lambda (_) - (w/write-chat-event "Gamble finished") + (w/chat-write-event "Gamble finished") (setq w/twitch-current-prediction-ids nil))) ;; (cons ;; '(monitor discord chat incoming) ;; (lambda (data) ;; (let ((user (w/decode-string (cadr data))) ;; (msg (w/decode-string (cadddr data)))) - ;; (w/write-chat-event (format "discord from %s: %s" user msg))))) + ;; (w/chat-write-event (format "discord from %s: %s" user msg))))) )) (provide 'wasp-event-handlers) diff --git a/src/gizmo/wasp-cyclone.el b/src/wasp-gizmo.el index 6ad7a4f8..677b2fb7 100644 --- a/src/gizmo/wasp-cyclone.el +++ b/src/wasp-gizmo.el @@ -1,4 +1,4 @@ -;;; wasp-cyclone --- Gizmocycling -*- lexical-binding: t; -*- +;;; wasp-gizmo --- Gizmo helper functions -*- lexical-binding: t; -*- ;;; Commentary: ;;; Code: @@ -22,6 +22,7 @@ )) (defvar w/gizmo-windows (list)) +(defvar w/gizmo-update-hook nil) (defun w/gizmo-tag-window () "Tag the current window as containing a gizmo." @@ -52,15 +53,24 @@ (set-window-buffer (car w/gizmo-windows) buf)))) (defvar w/gizmo-cycle-timer nil) -(defun w/run-gizmo-cycle-timer () +(defun w/gizmo-run-cycle-timer () "Run the gizmo cycle timer." (when w/gizmo-cycle-timer (cancel-timer w/gizmo-cycle-timer)) (w/gizmo-cycle) (setq w/gizmo-cycle-timer - (run-with-timer 300 nil #'w/run-gizmo-cycle-timer))) -(w/run-gizmo-cycle-timer) + (run-with-timer 300 nil #'w/gizmo-run-cycle-timer))) + +(defvar w/gizmo-update-timer nil) +(defun w/gizmo-run-update-timer () + "Run the gizmo update timer." + (when w/gizmo-update-timer + (cancel-timer w/gizmo-update-timer)) + (run-hooks 'w/gizmo-update-hook) + (setq + w/gizmo-update-timer + (run-with-timer 10 nil #'w/gizmo-run-update-timer))) (require 'htmlize) (defvar w/gizmo-html-cache (ht-create)) @@ -85,5 +95,5 @@ (lambda (_) (w/pub '(gizmo buffer update) (list nm))))))) -(provide 'wasp-cyclone) -;;; wasp-cyclone.el ends here +(provide 'wasp-gizmo) +;;; wasp-gizmo.el ends here diff --git a/src/wasp-model.el b/src/wasp-model.el index 80bf03b5..183eeb87 100644 --- a/src/wasp-model.el +++ b/src/wasp-model.el @@ -32,21 +32,6 @@ )) (w/pub '(avatar frame) (list (base64-encode-string data t))))) -(defun w/color-value-to-html-code (cval) - "Convert color value CVAL to an HTML color code." - (and - cval - (format - "#%02x%02x%02x" - (truncate (* 255 (/ (car cval) 65535.0))) - (truncate (* 255 (/ (cadr cval) 65535.0))) - (truncate (* 255 (/ (caddr cval) 65535.0))) - ))) - -(defun w/color-to-html-code (cname) - "Convert color name CNAME to an HTML color code." - (w/color-value-to-html-code (color-values cname))) - (defvar w/model-palette-counter nil "Time to display model changes.") (defun w/model-record-change () @@ -58,6 +43,11 @@ (interactive) (w/pub '(avatar reset)) ;; (w/model-region-video "hair" "https://www.youtube.com/watch?v=PruiY9BJi84") + (w/model-region-word "eyes" "EYES") + (w/model-region-word "hair" "hair") + (w/model-region-word "highlight" "highlight") + ;; (w/model-region-color "hat" (color-values "#FF7518")) + (w/model-region-word "hat" "ISPUMPKIN") (w/irish-reset) (w/model-get-default-backgrounds (lambda (bgs) @@ -88,20 +78,11 @@ (w/pub '(avatar text) (list encoded))))) (w/defstruct - w/color-source + w/model-color-source type ;; 'color or 'twitch-emote or '7tv-emote or 'video-url value) -(defconst w/allowed-video-sites - '("www.youtube.com" "youtube.com" "youtu.be" "www.twitch.tv" "twitch.tv" "clips.twitch.tv" "tiktok.com" "www.tiktok.com")) - -(defun w/allowed-video-url (url) - "Return non-nil if URL is a permissible video URL." - (-contains? - w/allowed-video-sites - (url-host (url-generic-parse-url url)))) - -(defun w/string-to-color-source (s k) +(defun w/model-string-to-color-source (s k) "Convert S to a color source and pass it to K." (w/twitch-get-emote s @@ -112,10 +93,10 @@ (funcall k (cond - (url (w/make-color-source :type 'video-url :value s)) - (emote (w/make-color-source :type 'twitch-emote :value emote)) - (7tv-emote (w/make-color-source :type '7tv-emote :value 7tv-emote)) - (color (w/make-color-source :type 'color :value color)) + (url (w/make-model-color-source :type 'video-url :value s)) + (emote (w/make-model-color-source :type 'twitch-emote :value emote)) + (7tv-emote (w/make-model-color-source :type '7tv-emote :value 7tv-emote)) + (color (w/make-model-color-source :type 'color :value color)) (t nil))))))) (defun w/model-region-word (type msg) @@ -160,46 +141,46 @@ (defun w/model-region-color-source (type cs) "Change the model region TYPE to CS." - (cl-case (w/color-source-type cs) + (cl-case (w/model-color-source-type cs) (color (w/model-region-color type - (w/color-source-value cs))) + (w/model-color-source-value cs))) (twitch-emote (w/model-region-image type - (w/twitch-emote-path (w/color-source-value cs)))) + (w/twitch-emote-path (w/model-color-source-value cs)))) (7tv-emote (w/model-region-image type - (w/twitch-7tv-emote-path (w/color-source-value cs)))) + (w/twitch-7tv-emote-path (w/model-color-source-value cs)))) (video-url (w/model-region-video type - (w/color-source-value cs))) + (w/model-color-source-value cs))) (t nil))) -(defun w/handle-redeem-region-swap (type) +(defun w/model-handle-redeem-region-swap (type) "Return a redeem callback for region swap of TYPE. If the color is unspecified, use DEFCOLOR." (lambda (user inp) (let ((splinp (s-split-up-to " " (s-trim inp) 1)) (auth (w/user-authorized))) - (w/string-to-color-source + (w/model-string-to-color-source (car splinp) (lambda (cs) (let ((text (if cs (cadr splinp) (s-join " " splinp)))) - (w/write-chat-event (format "%s changes my %s to %s" user type inp)) + (w/chat-write-event (format "%s changes my %s to %s" user type inp)) (when cs (if (or auth - (not (eq 'video-url (w/color-source-type cs)))) + (not (eq 'video-url (w/model-color-source-type cs)))) (w/model-region-color-source type cs) - (w/write-chat-event (format "%s is not authorized to play video, boost harder" user)))) + (w/chat-write-event (format "%s is not authorized to play video, boost harder" user)))) (when text (w/model-region-word type text)))))))) (defvar w/model-timer nil) -(defun w/run-model-timer () +(defun w/model-run-timer () "Run the model timer." (when w/model-timer (cancel-timer w/model-timer)) @@ -211,7 +192,7 @@ If the color is unspecified, use DEFCOLOR." )) (setq w/model-timer - (run-with-timer 1 nil #'w/run-model-timer))) + (run-with-timer 1 nil #'w/model-run-timer))) (defun w/test-length-prefixed (s) (let ((bytes (seq-into s 'list))) diff --git a/src/wasp-obs.el b/src/wasp-obs.el index 35ead18d..4737bc5c 100644 --- a/src/wasp-obs.el +++ b/src/wasp-obs.el @@ -138,14 +138,14 @@ Optionally, change text to MSG." )) (defvar w/obs-timer nil) -(defun w/run-obs-timer () +(defun w/obs-run-timer () "Run the obs timer." (when w/obs-timer (cancel-timer w/obs-timer)) (w/obs-handle-toggles) (setq w/obs-timer - (run-with-timer 1 nil #'w/run-obs-timer))) + (run-with-timer 1 nil #'w/obs-run-timer))) (provide 'wasp-obs) ;;; wasp-obs.el ends here diff --git a/src/wasp-setup.el b/src/wasp-setup.el index 53c99765..90745d6a 100644 --- a/src/wasp-setup.el +++ b/src/wasp-setup.el @@ -8,7 +8,10 @@ (require 'wasp-bus-binary) (require 'wasp-db) (require 'wasp-chat) +(require 'wasp-model) +(require 'wasp-obs) (require 'wasp-twitch) +(require 'wasp-gizmo) (defun w/setup-stream-layout () "Configure windows for streaming without buffers." @@ -34,26 +37,25 @@ (w/connect) (w/bus-binary-connect) (w/db-connect) - (w/create-chat-overlay-frame) - (w/show-chat-overlay-frame nil) + (w/chat-create-overlay-frame) + (w/chat-show-overlay-frame nil) + (w/twitch-get-vip-list) (w/twitch-7tv-update-emotes) (w/twitch-update-title) - (w/populate-bible-table) - ;; (w/user-cache-populate) + (w/bible-table-populate) + (w/user-cache-populate) ;; timers (w/twitch-run-shoutout-timer) (w/twitch-run-emote-frame-timer) - (w/run-model-timer) - (w/run-obs-timer) - (w/run-audio-record-end-timer) - (w/run-banner-ad-timer) - (w/run-telemetry-timer) - (w/run-heartrate-timer) - (w/run-alert-message-timer) + (w/model-run-timer) + (w/obs-run-timer) + (w/gizmo-run-cycle-timer) + (w/gizmo-run-update-timer) (w/start-audio-record) - (w/start-chatsummary) - (w/start-fake-chatters) + (w/run-audio-record-end-timer) + (w/chatsummary-start) + (w/fake-chatters-start) (w/friend-start) ;; layout diff --git a/src/wasp-soundboard.el b/src/wasp-soundboard.el index a6db32e5..641c7206 100644 --- a/src/wasp-soundboard.el +++ b/src/wasp-soundboard.el @@ -15,6 +15,7 @@ "Find soundboard paths matching PAT." (let ((base (w/asset "soundboard"))) (cond + ((s-contains? ".." pat) nil) ((f-dir? (f-join base pat)) (f-entries (f-join base pat) #'f-file? t)) (t (f-glob (s-concat pat "*") base))))) diff --git a/src/wasp-twitch-chat-commands.el b/src/wasp-twitch-chat-commands.el index b8ffc388..f815bd6c 100644 --- a/src/wasp-twitch-chat-commands.el +++ b/src/wasp-twitch-chat-commands.el @@ -106,7 +106,7 @@ (cons "!throne" (lambda (_ _) (w/twitch-say "xdding"))) (cons "!vim" (lambda (_ _) (w/twitch-say "vi is the best text editor, emacs is the best operating system"))) (cons "!emacs" (lambda (_ _) (w/twitch-say "i've tried everything else emacs is best girl"))) - (cons "!bells" (lambda (_ _) (w/twitch-say "https://pub.colonq.computer/~bezelea/bells/ and https://pub.colonq.computer/~prod/toy/dbkai/"))) + (cons "!bells" (lambda (_ _) (w/twitch-say "https://pub.colonq.computer/~the0x539/bells.html and https://pub.colonq.computer/~bezelea/bells/ and https://pub.colonq.computer/~prod/toy/dbkai/"))) (cons "!shader" (lambda (_ _) (w/twitch-say "https://secure.colonq.computer/throwshade"))) (cons "!help" (lambda (_ _) (w/twitch-say "https://pub.colonq.computer/~prod/toy/glossary/"))) (cons @@ -177,13 +177,13 @@ (lambda (user inp) (let ((trimmed (s-trim (s-replace "!resolution" "" inp)))) (if (string-empty-p trimmed) - (w/write-chat-event "You gotta put what your resolution is.") - (w/write-chat-event (format "%s RESOLVES: %s" (s-upcase user) trimmed)) + (w/chat-write-event "You gotta put what your resolution is.") + (w/chat-write-event (format "%s RESOLVES: %s" (s-upcase user) trimmed)) (setf (alist-get :resolution2025 w/user-current) trimmed))))) ;; (cons "!addbookrec" ;; (lambda (user inp) ;; (let ((trimmed (s-trim (s-replace "!addbookrec" "" inp)))) - ;; (fig//write-chat-event (format "%s recommends: %s" user trimmed)) + ;; (fig//chat-write-event (format "%s recommends: %s" user trimmed)) ;; (fig//add-recommended-book user trimmed)))) ;; (cons "!quote" ;; (lambda (_ _) @@ -192,7 +192,7 @@ ;; (cons "!addquote" ;; (lambda (user inp) ;; (let ((trimmed (s-trim (s-replace "!addquote" "" inp)))) - ;; (fig//write-chat-event (format "%s saves quote: %s" user trimmed)) + ;; (fig//chat-write-event (format "%s saves quote: %s" user trimmed)) ;; (fig//add-quote user trimmed)))) ;; (cons "!twitter" ;; (lambda (_ _) diff --git a/src/wasp-twitch-redeems.el b/src/wasp-twitch-redeems.el index 26deedaf..9cd2c15d 100644 --- a/src/wasp-twitch-redeems.el +++ b/src/wasp-twitch-redeems.el @@ -14,7 +14,7 @@ (require 'wasp-dna) (require 'wasp-fakechat) (require 'wasp-overlay) -(require 'wasp-cyclone) +(require 'wasp-gizmo) (require 'wasp-bless) (require 'wasp-flymake) (require 'wasp-irish) @@ -33,29 +33,29 @@ (list "throw shade" 1 (lambda (user shader) - (w/write-chat-event (format "%s threw shade" user)) + (w/chat-write-event (format "%s threw shade" user)) (w/db-set "shader" shader) (w/model-record-change) (w/overlay-shader user shader))) (list "spawn" 1 (lambda (user pattern) - (w/write-chat-event (format "%s created life" user)) + (w/chat-write-event (format "%s created life" user)) (w/model-record-change) (w/overlay-automata user pattern (alist-get :color w/user-current)))) - (list - "sound board" 1 - (lambda (user cmd) - (w/write-chat-event (format "%s played sound: %s" user cmd)) - (w/sfx cmd))) + ;; (list + ;; "sound board" 1 + ;; (lambda (user cmd) + ;; (w/chat-write-event (format "%s played sound: %s" user cmd)) + ;; (w/sfx cmd))) (list "lurker check in" 1 (lambda (user _) - (w/write-chat-event (format "%s is lurking" user)))) + (w/chat-write-event (format "%s is lurking" user)))) (list "mental clarity" 1 (lambda (user _) - (w/write-chat-event (format "%s established mental clarity" user)) + (w/chat-write-event (format "%s established mental clarity" user)) (w/stop-all-audio) (w/model-reset))) (list @@ -64,7 +64,7 @@ (unless (-contains? w/twitch-boosters user) (add-to-list 'w/twitch-boosters user) (soundboard//play-clip "yougotboostpower.ogg") - (w/write-chat-event (s-concat user " boosted their boost number")) + (w/chat-write-event (s-concat user " boosted their boost number")) (cl-incf (alist-get :boost w/user-current 0))))) (list "TSOOB" 1 @@ -72,27 +72,27 @@ (unless (-contains? w/twitch-tsoobers user) (add-to-list 'w/twitch-tsoobers user) (soundboard//play-clip "rewoptsoobtoguoy.ogg" 140) - (w/write-chat-event (s-reverse (s-concat user " boosted their boost number"))) + (w/chat-write-event (s-reverse (s-concat user " boosted their boost number"))) (cl-decf (alist-get :boost w/user-current 0))))) (list "submit headline" 1 (lambda (user inp) - (w/write-chat-event (format "%s submitted a headline: %s" user inp)) + (w/chat-write-event (format "%s submitted a headline: %s" user inp)) (w/glossary-record inp) (w/friend-journalism user inp))) (list "cycle gizmos" 1 (lambda (user _) - (w/write-chat-event (format "%s cycled the gizmos" user)) + (w/chat-write-event (format "%s cycled the gizmos" user)) (w/gizmo-cycle))) (list "allow streamer to drink" 1 (lambda (user _) - (w/write-chat-event (format "%s allowed the streamer to \"drink\"" user)))) + (w/chat-write-event (format "%s allowed the streamer to \"drink\"" user)))) (list "deslug" 1 (lambda (user _) - (w/write-chat-event (format "%s inverted slug" user)))) + (w/chat-write-event (format "%s inverted slug" user)))) (list "talk to clone" 2 (lambda (user inp) @@ -100,7 +100,7 @@ (let ((w/twitch-chat-history (list (cons user inp))) (w/last-stream-transcription "") (ping (w/message-ping inp))) - (w/write-chat-event (s-concat user " asks clone: " inp)) + (w/chat-write-event (s-concat user " asks clone: " inp)) (w/fake-chatter-run (w/pick-random (or @@ -110,48 +110,48 @@ (list "spinne" 3 (lambda (user _) - (w/write-chat-event (s-concat user " activates the spinne cyclle")) + (w/chat-write-event (s-concat user " activates the spinne cyclle")) (w/model-toggle "spin"))) (list "forsen" 3 (lambda (user _) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user " loudly exclaims forsenE")) + (w/chat-write-event (s-concat user " loudly exclaims forsenE")) (soundboard//play-clip "cave3.ogg" 75) (w/model-toggle "forsen") (setq w/twitch-redeem-sound-last cur))))) (list "SEASICKNESS GENERATOR" 3 (lambda (user _) - (w/write-chat-event (s-concat user " is a salty sea dog")) + (w/chat-write-event (s-concat user " is a salty sea dog")) (w/model-toggle "zoom_wave"))) (list "The Pharaoh's Curse" 3 (lambda (user _) - (w/write-chat-event (format "%s drew the ire of the Pharaoh upon me" user)) + (w/chat-write-event (format "%s drew the ire of the Pharaoh upon me" user)) (w/obs-activate-toggle 'pharaohs-curse) )) (list "pursue idol dream" 3 (lambda (user _) - (w/write-chat-event (format "Helping %s pursue their idol dream~" user)) + (w/chat-write-event (format "Helping %s pursue their idol dream~" user)) (w/obs-activate-toggle 'chase-dreams) (w/model-region-user-avatar "hair" user))) (list "INTJ stare" 3 (lambda (user _) - (w/write-chat-event (format "%s suggested a little more sodium chloride next time" user)) + (w/chat-write-event (format "%s suggested a little more sodium chloride next time" user)) (w/obs-activate-toggle 'intj-stare))) (list "Live LCOLONQ Reaction" 3 (lambda (user _) - (w/write-chat-event (format "%s demanded extremely \"hype\" reactions, &c." user)) + (w/chat-write-event (format "%s demanded extremely \"hype\" reactions, &c." user)) (w/obs-activate-toggle 'live-reaction))) (list "Live friend Reaction" 3 (lambda (user _) - (w/write-chat-event (format "%s demanded extremely \"hype\" reactions, &c. but from \"friend\"!?" user)) + (w/chat-write-event (format "%s demanded extremely \"hype\" reactions, &c. but from \"friend\"!?" user)) (w/obs-activate-toggle 'live-friend-reaction))) (list "bells of bezelea" 4 @@ -161,14 +161,14 @@ (lambda (song) (if song (progn - (w/write-chat-event (format "%s played a song: %s (sponsored by Bezelea)" user msg)) + (w/chat-write-event (format "%s played a song: %s (sponsored by Bezelea)" user msg)) (w/audio-muzak-enqueue user song)) - (w/write-chat-event (format "%s played the bells (sponsored by Bezelea)" user)) + (w/chat-write-event (format "%s played the bells (sponsored by Bezelea)" user)) (w/audio-muzak-enqueue user msg)))))) (list "activate spell card" 4 (lambda (user msg) - (w/write-chat-event + (w/chat-write-event (format "%s Sign: \"%s\"" (s-titleize user) @@ -177,32 +177,32 @@ msg (lambda (data) (w/overlay-start-barrage data))))) - (list "palette swap (hair)" 5 (w/handle-redeem-region-swap "hair")) - (list "palette swap (highlight)" 5 (w/handle-redeem-region-swap "highlight")) - (list "palette swap (eyes)" 5 (w/handle-redeem-region-swap "eyes")) - (list "palette swap (hat)" 5 (w/handle-redeem-region-swap "hat")) - (list "palette swap (hands)" 5 (w/handle-redeem-region-swap "hands")) + (list "palette swap (hair)" 5 (w/model-handle-redeem-region-swap "hair")) + (list "palette swap (highlight)" 5 (w/model-handle-redeem-region-swap "highlight")) + (list "palette swap (eyes)" 5 (w/model-handle-redeem-region-swap "eyes")) + (list "palette swap (pumpkin)" 5 (w/model-handle-redeem-region-swap "hat")) + (list "palette swap (hands)" 5 (w/model-handle-redeem-region-swap "hands")) (list "background swap (drawing)" 5 (lambda (user inp) (if (w/user-authorized) (progn - (w/write-chat-event (s-concat user " changes the drawing background: " inp)) + (w/chat-write-event (s-concat user " changes the drawing background: " inp)) (if (w/allowed-video-url inp) (w/binary-pub "background url" inp) - (w/write-chat-event (format "%s is not a recognized video site" inp)))) - (w/write-chat-event (format "%s is not authorized to change video" user))))) + (w/chat-write-event (format "%s is not a recognized video site" inp)))) + (w/chat-write-event (format "%s is not authorized to change video" user))))) (list "run program" 6 (lambda (user inp) (if (w/user-authorized) (progn - (w/write-chat-event (s-concat user " runs program: " inp)) + (w/chat-write-event (s-concat user " runs program: " inp)) (w/bless inp 50)) - (w/write-chat-event (format "%s is not authorized to run code" user))))) + (w/chat-write-event (format "%s is not authorized to run code" user))))) (list "encoded clarity" 7 (lambda (user msg) - (w/write-chat-event (format "%s demands greater program clarity: %s" user msg)) + (w/chat-write-event (format "%s demands greater program clarity: %s" user msg)) (with-current-buffer (window-buffer) (w/flymake-error user msg)))) (list @@ -210,7 +210,7 @@ (lambda (user inp) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user " feeds \"friend\" " inp)) + (w/chat-write-event (s-concat user " feeds \"friend\" " inp)) (w/friend-feed user inp) (setq w/twitch-redeem-sound-last cur))))) (list @@ -218,7 +218,7 @@ (lambda (user inp) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user " talks to \"friend\": " inp)) + (w/chat-write-event (s-concat user " talks to \"friend\": " inp)) (w/friend-respond (format "%s says: %s" user inp)) (setq w/twitch-redeem-sound-last cur))))) (list @@ -226,7 +226,7 @@ (lambda (user inp) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user " asks \"friend\" to compose a song about: " inp)) + (w/chat-write-event (s-concat user " asks \"friend\" to compose a song about: " inp)) (w/friend-compose-song inp) (setq w/twitch-redeem-sound-last cur))))) (list @@ -234,70 +234,70 @@ (lambda (user inp) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user " shows \"friend\" a Wikipedia page: " inp)) + (w/chat-write-event (s-concat user " shows \"friend\" a Wikipedia page: " inp)) (w/friend-react-wikipedia user inp) (setq w/twitch-redeem-sound-last cur))))) (list "theme: maris-dark" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: maris-dark" user)) + (w/chat-write-event (format "%s changed the theme: maris-dark" user)) (w/change-theme 'ef-maris-dark))) (list "theme: autumn" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: autumn" user)) + (w/chat-write-event (format "%s changed the theme: autumn" user)) (w/change-theme 'ef-autumn))) (list "theme: tritanopia-dark" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: tritanopia-dark" user)) + (w/chat-write-event (format "%s changed the theme: tritanopia-dark" user)) (w/change-theme 'ef-tritanopia-dark))) (list "theme: duo-dark" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: duo-dark" user)) + (w/chat-write-event (format "%s changed the theme: duo-dark" user)) (w/change-theme 'ef-duo-dark))) (list "theme: bio" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: bio" user)) + (w/chat-write-event (format "%s changed the theme: bio" user)) (w/change-theme 'ef-bio))) (list "theme: rosa" 50 (lambda (user _) - (w/write-chat-event (format "%s changed the theme: rosa" user)) + (w/chat-write-event (format "%s changed the theme: rosa" user)) (w/change-theme 'ef-rosa))) (list "gamer" 500 (lambda (user _) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event (s-concat user "'s Gamer Sacrifice summoned an entity")) + (w/chat-write-event (s-concat user "'s Gamer Sacrifice summoned an entity")) (soundboard//play-clip "videogame.ogg") (w/obs-activate-toggle 'thug-life) (setq w/twitch-redeem-sound-last cur))))) (list "arrow" 500 (lambda (user msg) - (w/write-chat-event (format "%s points and says %S" user msg)) + (w/chat-write-event (format "%s points and says %S" user msg)) (w/obs-activate-toggle 'clickbait msg))) (list - "antipiracy" 500 + "antipiracy" 25 (lambda (user _) - (w/write-chat-event (format "%s does not condone any form of copyright infringement whatsoever." user)) + (w/chat-write-event (format "%s does not condone any form of copyright infringement whatsoever." user)) (w/obs-activate-toggle 'activate-nixos))) (list "super idol" 500 (lambda (_ _) (let ((cur (float-time))) (when (> (- cur w/twitch-redeem-sound-last) 2) - (w/write-chat-event "SuperIdoldexiaorongdoumeinidetianbayuezhengwudeyangguangdoumeiniyaoyanreai105Cdenididiqingchundezhen") + (w/chat-write-event "SuperIdoldexiaorongdoumeinidetianbayuezhengwudeyangguangdoumeiniyaoyanreai105Cdenididiqingchundezhen") (soundboard//play-clip "superidololdshortstyle.ogg" 0.5) (setq w/twitch-redeem-sound-last cur))))) (list "enable ad block" 500 (lambda (user _) - (w/write-chat-event (format "%s turned on UltraBlock HYPER: Community Edition" user)) + (w/chat-write-event (format "%s turned on UltraBlock HYPER: Community Edition" user)) (w/banner-ad-block))) (list "hex" 500 @@ -307,21 +307,21 @@ (target (cadr sp))) (if (and spell target (stringp spell) (stringp target)) (progn - (w/write-chat-event (s-concat user " hexed " target " with: " spell)) + (w/chat-write-event (s-concat user " hexed " target " with: " spell)) (when-let ((type (alist-get spell w/hex-types nil nil #'s-equals?))) (w/hex target user type))) - (w/write-chat-event (s-concat user "'s hex fizzled out with a puff of smoke!")))))) + (w/chat-write-event (s-concat user "'s hex fizzled out with a puff of smoke!")))))) (list - "VIPPER" 1000 + "VIPPER" 35 (lambda (user inp) (soundboard//play-clip "aeiou.ogg") - (w/write-chat-event (s-concat user " gave VIP to " inp)) + (w/chat-write-event (s-concat user " gave VIP to " inp)) (w/twitch-add-vip (s-chop-prefix "@" inp)))) (list - "deVIPPER" 1000 + "deVIPPER" 35 (lambda (user inp) (soundboard//play-clip "uoiea.ogg") - (w/write-chat-event (s-concat user " removed VIP from " inp)) + (w/chat-write-event (s-concat user " removed VIP from " inp)) (w/twitch-remove-vip (s-chop-prefix "@" inp)))) (list "spatiotemporal clarity" 2000 @@ -330,7 +330,7 @@ (run-with-timer 1 nil (lambda () (soundboard//play-clip "chinesebiblemozartfade.ogg"))) - (w/write-chat-event (s-concat user " established spatiotemporal clarity")) + (w/chat-write-event (s-concat user " established spatiotemporal clarity")) (w/obs-activate-toggle 'spatiotemporal-clarity))) (list "total clarity" 5000 @@ -339,17 +339,17 @@ (run-with-timer 1 nil (lambda () (soundboard//play-clip "gong.ogg"))) - (w/write-chat-event (s-concat user " established total clarity")) + (w/chat-write-event (s-concat user " established total clarity")) (w/obs-activate-toggle 'total-clarity))) (list "canonize me" 20000 (lambda (user _) - (w/write-chat-event (s-concat user " was canonized!")) + (w/chat-write-event (s-concat user " was canonized!")) (w/bible-canonize user))) (list "cloning facility" 50000 (lambda (user _) - (w/write-chat-event (format "%s entered the cloning facility" user)))) + (w/chat-write-event (format "%s entered the cloning facility" user)))) )) (provide 'wasp-twitch-redeems) diff --git a/src/wasp-twitch.el b/src/wasp-twitch.el index 87977cbd..d182dddf 100644 --- a/src/wasp-twitch.el +++ b/src/wasp-twitch.el @@ -8,6 +8,7 @@ (require 'evil) (require 'wasp-utils) (require 'wasp-bus) +(require 'wasp-bus-binary) (require 'wasp-chat) (require 'wasp-user) (require 'wasp-hexamedia) @@ -249,24 +250,29 @@ K is called when the download is finished." (defun w/twitch-add-vip (user) "Give VIP status to USER." - (w/pub '(monitor twitch vip add) (list user)) + (w/binary-pub "fig monitor twitch vip add" user) (when (> (length w/twitch-vip-list) w/twitch-vip-max) (w/twitch-remove-random-vip))) (defun w/twitch-remove-vip (user) "Remove VIP status from USER." - (w/pub '(monitor twitch vip remove) (list user)) + (w/binary-pub "fig monitor twitch vip remove" user) (w/twitch-get-vip-list)) (defun w/twitch-remove-random-vip () "Remove VIP status from a random user." - (let ((user (w/pick-random w/twitch-vip-list))) - (w/write-chat-event (format "Randomly removed VIP from %s - autofloor" user)) + (let + ((user + (w/pick-random + (-difference + w/twitch-vip-list + '("a_tension_span" "fighting_annelids"))))) + (w/chat-write-event (format "Randomly removed VIP from %s - autofloor" user)) (w/twitch-remove-vip user))) (defun w/twitch-shoutout (user) "Shoutout USER." - (w/pub '(monitor twitch shoutout) (list user))) + (w/binary-pub "monitor twitch shoutout" user)) (defvar w/twitch-shoutout-queue nil) (defun w/twitch-enqueue-shoutout (user) "Queue up a shoutout for USER." @@ -293,33 +299,43 @@ K is called when the download is finished." CALLBACK will be passed the winner when the poll concludes." (unless w/twitch-current-poll-callback (setq w/twitch-current-poll-callback callback) - (w/pub - '(monitor twitch poll create) - (list (s-truncate 60 (s-trim title)) options)))) + (w/binary-pub + "fig monitor twitch poll create" + (s-concat + (s-truncate 60 (s-trim title)) + "\t" + (s-join "\n" options))))) (defun w/twitch-create-prediction (title options) "Create a prediction with TITLE and OPTIONS." (unless w/twitch-current-prediction-ids - (w/pub '(monitor twitch prediction create) (list title options)))) + (w/binary-pub + "fig monitor twitch prediction create" + (s-concat + (s-truncate 60 (s-trim title)) + "\t" + (s-join "\n" options))))) (defun w/twitch-finish-prediction (outcome) "Finish the current prediction with winning OUTCOME." (when w/twitch-current-prediction-ids - (w/pub - '(monitor twitch prediction finish) - (list (car w/twitch-current-prediction-ids) - (car (alist-get outcome (cadr w/twitch-current-prediction-ids) nil nil #'s-equals?)))))) + (w/binary-pub + "fig monitor twitch prediction finish" + (s-join "\t" + (list + (car w/twitch-current-prediction-ids) + (car (alist-get outcome (cadr w/twitch-current-prediction-ids) nil nil #'s-equals?))))))) (defun w/twitch-say (msg) "Write MSG to Twitch chat." (let ((trimmed (s-trim msg))) - (w/write-chat-message + (w/chat-write-message (w/make-chat-message :user "LCOLONQ" :id "866686220" :text trimmed :user-color "#616161")) - (w/pub '(monitor twitch chat outgoing) (list trimmed)))) + (w/binary-pub "fig monitor twitch chat outgoing" trimmed))) (defun w/twitch-add-image-over (image msg start end) "Add IMAGE to MSG between START and END." @@ -457,7 +473,7 @@ CALLBACK will be passed the winner when the poll concludes." "Advance all animated emotes in the (visible) chat buffer by 1 frame." (cl-incf w/twitch-emote-frame-counter) (save-excursion - (with-current-buffer (w/get-chat-buffer) + (with-current-buffer (w/chat-get-buffer) (goto-char (point-max)) (forward-line -10) (goto-char (line-beginning-position)) @@ -537,8 +553,8 @@ CALLBACK will be passed the winner when the poll concludes." ;; ((s-equals? name "h_ingles") "") ;; ((s-equals? name "compilingjay") "") ;; ((s-equals? name "watchmakering") "") - ;; ((s-equals? name "the0x539") "") - ;; ((s-equals? name "colinahscopy_") "") + ((s-equals? name "the0x539") "︘") + ((s-equals? name "colinahscopy_") "⚜") ;; ((s-equals? name "eighteyedsixwingedseraph") "") ;; ((s-equals? name "a_tension_span") "") ;; ((s-equals? name "tomaterr") "") @@ -547,7 +563,7 @@ CALLBACK will be passed the winner when the poll concludes." ;; ((s-equals? name "cr4zyk1tty") "") ;; ((s-equals? name "devts_de") "") ;; ((s-equals? name "physbuzz") "") - ;; ((s-equals? name "sundemoniac") "") + ((s-equals? name "sundemoniac") "🌞") (t "EL."))) (when (-contains? badges "vip/1") "💎") (when (-contains? badges "subscriber/0") "💻") @@ -600,7 +616,7 @@ Process any commands included." (defun w/twitch-handle-redeem-helper (user redeem input &optional limit) "Handle the channel point redeem REDEEM from USER with INPUT. Optionally, only apply redeems with point costs less than LIMIT." - (unless (-contains? w/user-hell (s-downcase user)) + (unless (or (-contains? w/user-hell (s-downcase user)) (-contains? (w/hex-get user) 'silence)) (let ((handler (alist-get redeem w/twitch-redeems nil nil #'cl-equalp))) (if handler (if (or (not limit) (< (car handler) limit)) @@ -610,9 +626,9 @@ Optionally, only apply redeems with point costs less than LIMIT." (condition-case err (funcall (cadr handler) user input) (error - (w/write-chat-event (format "Error during redeem: %s" err)))))) - (w/write-chat-event (format "User %s attempted to activate overly expensive redeem \"%s\" via API" user redeem))) - (w/write-chat-event (format "Unknown channel point redeem: %S" redeem)))))) + (w/chat-write-event (format "Error during redeem: %s" err)))))) + (w/chat-write-event (format "User %s attempted to activate overly expensive redeem \"%s\" via API" user redeem))) + (w/chat-write-event (format "Unknown channel point redeem: %S" redeem)))))) (defun w/twitch-handle-redeem (r) "Handle the channel point redeem R." diff --git a/src/wasp-user-whitelist.el b/src/wasp-user-whitelist.el index 457243a1..1ca04f5d 100644 --- a/src/wasp-user-whitelist.el +++ b/src/wasp-user-whitelist.el @@ -269,11 +269,17 @@ "rpc2dot0" "thejj1001001" "zeroengl" + "combatprogrammerdoll" + "a_idiotguy" + "whomstve340" + "adamantris" + "bussy_smasher" ))) (setq w/user-hell '( ;; "machka6" + "goofyhornguy" )) (provide 'wasp-user-whitelist) diff --git a/src/wasp-utils.el b/src/wasp-utils.el index 7b3c02b4..58040a60 100644 --- a/src/wasp-utils.el +++ b/src/wasp-utils.el @@ -293,5 +293,39 @@ Return a list of the width, height, and pixels of the image." (when (= 0 (call-process-shell-command (format "png2ff <'%s' >'%s'" path tmp) nil "*udc-png-error*")) (w/load-image-ff tmp)))) +(defun w/color-value-to-html-code (cval) + "Convert color value CVAL to an HTML color code." + (and + cval + (format + "#%02x%02x%02x" + (truncate (* 255 (/ (car cval) 65535.0))) + (truncate (* 255 (/ (cadr cval) 65535.0))) + (truncate (* 255 (/ (caddr cval) 65535.0))) + ))) + +(defun w/color-to-html-code (cname) + "Convert color name CNAME to an HTML color code." + (w/color-value-to-html-code (color-values cname))) + +(defconst w/allowed-video-sites + '("www.youtube.com" "youtube.com" "youtu.be" "www.twitch.tv" "twitch.tv" "clips.twitch.tv" "tiktok.com" "www.tiktok.com")) + +(defun w/allowed-video-url (url) + "Return non-nil if URL is a permissible video URL." + (-contains? + w/allowed-video-sites + (url-host (url-generic-parse-url url)))) + +(defun w/cpu-load () + "Get the current CPU load." + (let ((res (shell-command-to-string "uptime"))) + (string-to-number (s-trim (car (s-split "," (cadr (s-split "load average:" res)))))))) + +(defun w/disk-usage (disk) + "Get the current usage percent for DISK." + (let ((res (shell-command-to-string (format "df %s" disk)))) + (string-to-number (s-chop-suffix "%" (nth 4 (s-split " " (cadr (s-lines res)) t)))))) + (provide 'wasp-utils) ;;; wasp-utils.el ends here |
