diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gizmo/wasp-tcg.el | 28 | ||||
| -rw-r--r-- | src/wasp-bus-binary.el | 7 | ||||
| -rw-r--r-- | src/wasp-db.el | 8 | ||||
| -rw-r--r-- | src/wasp-model.el | 5 | ||||
| -rw-r--r-- | src/wasp-overlay.el | 11 | ||||
| -rw-r--r-- | src/wasp-setup.el | 1 | ||||
| -rw-r--r-- | src/wasp-twitch-redeems.el | 6 | ||||
| -rw-r--r-- | src/wasp-user-badges.el | 1 | ||||
| -rw-r--r-- | src/wasp-utils.el | 32 |
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 |
