summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-11-07 00:20:02 -0500
committerLLLL Colonq <llll@colonq>2025-11-07 00:20:02 -0500
commitcf266a56f30daae8b9af7c9bc3267c61b1973192 (patch)
treef365939f712973840ff19d9265c552af820cd1ef /src
parent3d31c488fb06e9937964041f4d83d0cb1c9699ab (diff)
Update
Diffstat (limited to 'src')
-rw-r--r--src/gizmo/wasp-alert-message.el17
-rw-r--r--src/gizmo/wasp-animism.el2
-rw-r--r--src/gizmo/wasp-bannerads.el22
-rw-r--r--src/gizmo/wasp-biblicality.el2
-rw-r--r--src/gizmo/wasp-bless.el4
-rw-r--r--src/gizmo/wasp-chatsummary.el18
-rw-r--r--src/gizmo/wasp-fakechat.el17
-rw-r--r--src/gizmo/wasp-friend-journalism.el4
-rw-r--r--src/gizmo/wasp-friend-music.el2
-rw-r--r--src/gizmo/wasp-friend.el11
-rw-r--r--src/gizmo/wasp-gdq.el2
-rw-r--r--src/gizmo/wasp-heartrate.el39
-rw-r--r--src/gizmo/wasp-hex.el9
-rw-r--r--src/gizmo/wasp-irish.el2
-rw-r--r--src/gizmo/wasp-prod.el2
-rw-r--r--src/gizmo/wasp-tcg.el115
-rw-r--r--src/gizmo/wasp-wikipedia.el2
-rw-r--r--src/wasp-ai.el43
-rw-r--r--src/wasp-chat.el67
-rw-r--r--src/wasp-db.el2
-rw-r--r--src/wasp-event-handlers-binary.el47
-rw-r--r--src/wasp-event-handlers.el28
-rw-r--r--src/wasp-gizmo.el (renamed from src/gizmo/wasp-cyclone.el)22
-rw-r--r--src/wasp-model.el65
-rw-r--r--src/wasp-obs.el4
-rw-r--r--src/wasp-setup.el28
-rw-r--r--src/wasp-soundboard.el1
-rw-r--r--src/wasp-twitch-chat-commands.el10
-rw-r--r--src/wasp-twitch-redeems.el130
-rw-r--r--src/wasp-twitch.el62
-rw-r--r--src/wasp-user-whitelist.el6
-rw-r--r--src/wasp-utils.el34
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