summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gizmo/wasp-tcg.el28
-rw-r--r--src/wasp-bus-binary.el7
-rw-r--r--src/wasp-db.el8
-rw-r--r--src/wasp-model.el5
-rw-r--r--src/wasp-overlay.el11
-rw-r--r--src/wasp-setup.el1
-rw-r--r--src/wasp-twitch-redeems.el6
-rw-r--r--src/wasp-user-badges.el1
-rw-r--r--src/wasp-utils.el32
9 files changed, 95 insertions, 4 deletions
diff --git a/src/gizmo/wasp-tcg.el b/src/gizmo/wasp-tcg.el
index 081a777b..17ffc129 100644
--- a/src/gizmo/wasp-tcg.el
+++ b/src/gizmo/wasp-tcg.el
@@ -272,5 +272,33 @@
(let ((msg (format "%s" (w/tcg-encode-card user userid c))))
(w/binary-pub "overlay tcg generate" msg)))))
+;;;; Dueling
+(defun w/tcg-random-card-for (uid k)
+ "Retrieve a random card for UID and pass it to K."
+ (let ((inv (s-concat "tcg-inventory:" uid)))
+ (w/db-llen inv
+ (lambda (len)
+ (w/db-lindex inv (random len)
+ (lambda (uuid)
+ (request (format "https://api.colonq.computer/api/tcg/card/%s.png" uuid)
+ :method "GET"
+ :encoding 'no-conversion
+ :success
+ (cl-function
+ (lambda (&key data &allow-other-keys)
+ (funcall k (encode-coding-string data 'no-conversion)))))))))))
+
+(defun w/tcg-duel (user1 user2)
+ "Start a duel between USER1 and USER2."
+ (w/async-all
+ (w/user-id-from-name user1)
+ (w/user-id-from-name user2)
+ (lambda (uid1 uid2)
+ (w/async-all
+ (w/tcg-random-card-for uid1)
+ (w/tcg-random-card-for uid2)
+ (lambda (card1 card2)
+ (w/overlay-duel user1 user2 card1 card2))))))
+
(provide 'wasp-tcg)
;;; wasp-tcg.el ends here
diff --git a/src/wasp-bus-binary.el b/src/wasp-bus-binary.el
index 5b612e7b..6fbdea01 100644
--- a/src/wasp-bus-binary.el
+++ b/src/wasp-bus-binary.el
@@ -98,8 +98,11 @@ Return non-nil if a message was successfully parsed."
(defvar w/bus-binary-bad-string nil)
(defun w/bus-binary-build-length-prefixed (s)
"Turn S into a length-prefixed unibyte string."
- (let* ( (bs (string-bytes s))
- (ret (s-concat (w/bus-binary-build-int32le bs) (encode-coding-string s 'utf-8))))
+ (let*
+ ( (bs (string-bytes s))
+ (ret
+ (s-concat (w/bus-binary-build-int32le bs)
+ (encode-coding-string s 'no-conversion))))
(unless (= (+ bs 4) (string-bytes ret))
(setf w/bus-binary-bad-string s)
(error "Bad length when adding length prefix!"))
diff --git a/src/wasp-db.el b/src/wasp-db.el
index 0311860b..da4c5c05 100644
--- a/src/wasp-db.el
+++ b/src/wasp-db.el
@@ -185,6 +185,14 @@ Afterward call K."
(w/db-cmd `("LPUSH" ,key ,@vals) (lambda (_) nil))
(error "Redis key must be a string")))
+(defun w/db-llen (key k)
+ "Get the length of list KEY from Redis and pass to K."
+ (w/db-cmd `("LLEN" ,key) k))
+
+(defun w/db-lindex (key idx k)
+ "Get the value at IDX in list KEY from Redis and pass to K."
+ (w/db-cmd `("LINDEX" ,key ,(format "%s" idx)) k))
+
(defun w/db-sadd (key &rest vals)
"Add VALS to the set at KEY in Redis."
(if (stringp key)
diff --git a/src/wasp-model.el b/src/wasp-model.el
index faaff6ef..ad34dbcc 100644
--- a/src/wasp-model.el
+++ b/src/wasp-model.el
@@ -44,8 +44,9 @@
(w/binary-pub "overlay reset")
(w/pub '(avatar reset))
;; (w/model-region-color "hair" (color-values "lightblue"))
- ;; (w/model-region-word "hair" "icy")
- ;; (w/model-region-word "skin" "wind")
+ (w/model-region-word "hair" "DUEL")
+ (w/model-region-image "hair" (w/asset "blueeyes.png"))
+ (w/model-region-color "eyes" (color-values "lightblue"))
;; (w/irish-reset)
(w/model-get-default-backgrounds
(lambda (bgs)
diff --git a/src/wasp-overlay.el b/src/wasp-overlay.el
index cd0df601..0c480ca5 100644
--- a/src/wasp-overlay.el
+++ b/src/wasp-overlay.el
@@ -230,5 +230,16 @@ Optionally, make the cells be COLOR."
(w/overlay-display-asset type path)))))))
(add-to-list 'eldoc-display-functions #'w/overlay-asset-eldoc-display-function)
+;;;; Dueling
+(defun w/overlay-duel (user1 user2 card1 card2)
+ "Initiate a duel between USER1 and USER2.
+User1 holds CARD1, and USER2 holds CARD2."
+ (w/binary-pub "overlay tcg duel"
+ (s-concat
+ (w/bus-binary-build-length-prefixed user1)
+ (w/bus-binary-build-length-prefixed user2)
+ (w/bus-binary-build-length-prefixed card1)
+ (w/bus-binary-build-length-prefixed card2))))
+
(provide 'wasp-overlay)
;;; wasp-overlay.el ends here
diff --git a/src/wasp-setup.el b/src/wasp-setup.el
index 844f6f0f..14770d90 100644
--- a/src/wasp-setup.el
+++ b/src/wasp-setup.el
@@ -73,6 +73,7 @@
(w/chatsummary-start)
;; (w/fake-chatters-start)
(w/friend-start)
+ (w/overlay-clippy-frame-create)
(w/overlay-clippy-timer-run)
;; layout
diff --git a/src/wasp-twitch-redeems.el b/src/wasp-twitch-redeems.el
index c1e3b6c0..4a0c2f95 100644
--- a/src/wasp-twitch-redeems.el
+++ b/src/wasp-twitch-redeems.el
@@ -19,12 +19,18 @@
(require 'wasp-flymake)
(require 'wasp-irish)
(require 'wasp-soundboard)
+(require 'wasp-tcg)
(defvar w/twitch-redeem-sound-last 0)
(setf
w/twitch-redeems
(list
+ (list "openpack" 1 ;; SECRET
+ (lambda (_uid user _)
+ (w/tcg-random-user-card
+ (lambda (c)
+ (w/tcg-generate-card (s-downcase user) c)))))
(list
"throw shade" 1
(lambda (uid user shader)
diff --git a/src/wasp-user-badges.el b/src/wasp-user-badges.el
index 28a4ec51..664ddbd1 100644
--- a/src/wasp-user-badges.el
+++ b/src/wasp-user-badges.el
@@ -178,6 +178,7 @@
;; (w/badge-custom-equity-text "slowpvke" "Φ")
;; (w/badge-custom-equity-text "tzorake" "🍆")
;; (w/badge-custom-equity-icon "eyeresterday" (w/asset "eyer.png")) ;; INVESTIGATE
+;; (w/badge-custom-equity-text "pralkewe67" "🗿")
(provide 'wasp-user-badges)
;;; wasp-user-badges.el ends here
diff --git a/src/wasp-utils.el b/src/wasp-utils.el
index 9f29f6dc..f588d5f4 100644
--- a/src/wasp-utils.el
+++ b/src/wasp-utils.el
@@ -393,5 +393,37 @@ Otherwise make it invisible."
"Generate a UUID."
(s-trim (shell-command-to-string "uuidgen")))
+(defun w/async-all-helper (hs cb)
+ "Take N functions HS and a single callback with N arguments CB.
+Run all N functions and when they all finish pass all results to the callback.
+The callback is the last element of HANDLERS."
+ (let*
+ ( (len (length hs))
+ (finished 0)
+ (results (make-vector len nil)))
+ (--each-indexed hs
+ (funcall it
+ (lambda (res)
+ (setf (aref results it-index) res)
+ (incf finished)
+ (cond
+ ((> finished len) (error "Received more responses than expected in w/async-all!"))
+ ((= finished len)
+ (apply cb (seq-into results 'list)))))))))
+
+(defmacro w/async-all (&rest forms)
+ "Run the first FORMS in parallel and pass the results to the last form."
+ (let*
+ ( (cb (-last-item forms))
+ (len (- (length forms) 1))
+ (hs (-take len forms)))
+ `(w/async-all-helper
+ (list
+ ,@(--map
+ (let ((arg (gensym "w/async-all-arg")))
+ `(lambda (,arg) ,(-concat it (list arg))))
+ hs))
+ ,cb)))
+
(provide 'wasp-utils)
;;; wasp-utils.el ends here