@shaunlwm/pickle.ts 1.9.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -8
- package/dist/index.d.ts +476 -89
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var b=class{socket=null;normalizeUser(e){throw new Error("Not implemented: normalizeUser")}normalizePlayer(e){throw new Error("Not implemented: normalizePlayer")}extractAppearance(e){return{color:e.color??0,head:e.head??0,face:e.face??0,neck:e.neck??0,body:e.body??0,hand:e.hand??0,feet:e.feet??0,flag:e.flag??0,photo:e.photo??0}}sendMessage(e){throw new Error("Not implemented: sendMessage")}sendEmote(e){throw new Error("Not implemented: sendEmote")}sendSafe(e){throw new Error("Not implemented: sendSafe")}walk(e,r){throw new Error("Not implemented: walk")}sendFrame(e,r){throw new Error("Not implemented: sendFrame")}snowball(e,r){throw new Error("Not implemented: snowball")}joinRoom(e,r,o){throw new Error("Not implemented: joinRoom")}addItem(e){throw new Error("Not implemented: addItem")}equipColor(e){throw new Error("Not implemented: equipColor")}equipHead(e){throw new Error("Not implemented: equipHead")}equipFace(e){throw new Error("Not implemented: equipFace")}equipNeck(e){throw new Error("Not implemented: equipNeck")}equipBody(e){throw new Error("Not implemented: equipBody")}equipHand(e){throw new Error("Not implemented: equipHand")}equipFeet(e){throw new Error("Not implemented: equipFeet")}equipFlag(e){throw new Error("Not implemented: equipFlag")}equipPhoto(e){throw new Error("Not implemented: equipPhoto")}buddyRequest(e){throw new Error("Not implemented: buddyRequest")}buddyAccept(e){throw new Error("Not implemented: buddyAccept")}buddyReject(e){throw new Error("Not implemented: buddyReject")}buddyRequestSeen(e){throw new Error("Not implemented: buddyRequestSeen")}getBuddy(e,r){throw new Error("Not implemented: getBuddy")}removeBuddy(e){throw new Error("Not implemented: removeBuddy")}addIgnore(e){throw new Error("Not implemented: addIgnore")}removeIgnore(e){throw new Error("Not implemented: removeIgnore")}getPlayer(e){throw new Error("Not implemented: getPlayer")}getAllSlots(){throw new Error("Not implemented: getAllSlots")}getMascots(){throw new Error("Not implemented: getMascots")}sendPostcard(e,r){throw new Error("Not implemented: sendPostcard")}getStamps(e){throw new Error("Not implemented: getStamps")}getPostcards(){throw new Error("Not implemented: getPostcards")}getIglooOpen(e){throw new Error("Not implemented: getIglooOpen")}getIgloos(){throw new Error("Not implemented: getIgloos")}getPuffles(e){throw new Error("Not implemented: getPuffles")}adoptPuffle(e,r){throw new Error("Not implemented: adoptPuffle")}getIglooLikes(){throw new Error("Not implemented: getIglooLikes")}checkPuffleSprite(e){throw new Error("Not implemented: checkPuffleSprite")}joinIgloo(e,r,o){throw new Error("Not implemented: joinIgloo")}gameOver(e){throw new Error("Not implemented: gameOver")}collectStamp(e){throw new Error("Not implemented: collectStamp")}getNinja(){throw new Error("Not implemented: getNinja")}getMats(){throw new Error("Not implemented: getMats")}joinMatchmaking(){throw new Error("Not implemented: joinMatchmaking")}leaveMatchmaking(){throw new Error("Not implemented: leaveMatchmaking")}startGame(){throw new Error("Not implemented: startGame")}selectCard(e){throw new Error("Not implemented: selectCard")}loadAnimation(e){throw new Error("Not implemented: loadAnimation")}joinMat(e){throw new Error("Not implemented: joinMat")}};import{EventEmitter as ve}from"events";import{io as K}from"socket.io-client";import D from"socket.io-msgpack-parser";var H="wss://play.cpjourney.net",G="skip",P=class extends b{id="CPJourney";async login(e){let r=this.createSocket("/world/login/");return await new Promise((s,t)=>{let n=setTimeout(()=>{r.disconnect(),t(new Error("Login timed out"))},1e4);r.on("connect",()=>{let i=e.secret??G,a="token"in e?{username:e.username,token:e.token,secret:i}:{username:e.username,password:e.password,secret:i};r.emit("message",{action:"login",args:a})}),r.on("message",i=>{if(i.action!=="login")return;clearTimeout(n),r.disconnect();let a=i.args;if(!a.success){t(new Error("Login failed"));return}let u=Object.entries(a.populations).map(([m,l])=>({name:m,population:l}));s({servers:u,key:a.key,username:a.username,moderator:a.moderator,buddyWorlds:a.buddyWorlds??[]})}),r.on("connect_error",i=>{clearTimeout(n),r.disconnect(),t(new Error(`Login connection failed: ${i.message}`))})})}async connect(e,r,o){await this.queueForServer(e,o);let s=this.createSocket(`/world/${e.toLowerCase()}/`);return this.socket=s,await new Promise((t,n)=>{let i=!1;s.on("connect",()=>{s.emit("message",{action:"game_auth",args:{username:r.username,key:r.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,token:""}})}),s.on("message",a=>{switch(a.action){case"wait_queue_update":{o?.onQueueUpdate?.(a.args);break}case"game_auth":{if(i)break;if(i=!0,!a.args.success){s.disconnect(),n(new Error("Game auth failed"));return}s.emit("message",{action:"join_server",args:{}}),t();break}}}),s.on("connect_error",a=>{s.disconnect(),n(new Error(`Game connection failed: ${a.message}`))})}),s}async queueForServer(e,r){let o=this.createSocket("/world/login/");await new Promise((s,t)=>{let n=setTimeout(()=>{o.disconnect(),t(new Error("Queue timed out"))},6e4);o.on("connect",()=>{o.emit("message",{action:"queue_server_join",args:{server:e}})}),o.on("message",i=>{switch(i.action){case"wait_queue_update":r?.onQueueUpdate?.(i.args);break;case"queue_server_join":clearTimeout(n),o.disconnect(),s();break}}),o.once("disconnect",()=>{clearTimeout(n),s()}),o.on("connect_error",i=>{clearTimeout(n),o.disconnect(),t(new Error(`Queue connection failed: ${i.message}`))})})}send(e,r){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:r})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){let{id:r,username:o,displayName:s,joinTime:t,x:n,y:i,frame:a,walking:u,color:m,head:l,face:h,neck:p,body:f,hand:E,feet:v,flag:w,photo:_,...O}=e;return{...this.extractAppearance(e),id:r,username:o,displayName:s,joinTime:t,x:n??0,y:i??0,frame:a??0,walking:u,meta:O,_raw:e}}normalizePlayer(e){let r=e.user,o=this.normalizeUser(r),{user:s,coins:t,rank:n,inventory:i,furniture:a,flooring:u,buddies:m,buddyRequests:l,ignores:h,igloos:p,...f}=e;return{...o,_raw:e,coins:t??0,rank:n??0,inventory:i??[],furniture:a??[],flooring:u??[],buddies:r.buddies??[],buddyRequests:r.buddyRequests??[],ignores:r.ignores??[],igloos:p??[],meta:{...o.meta,...f}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,r){this.send("send_position",{x:e,y:r})}sendFrame(e,r){this.send("send_frame",{frame:e,set:r})}snowball(e,r){this.send("snowball",{x:e,y:r})}joinRoom(e,r,o){this.send("join_room",{room:e,x:r??0,y:o??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}buddyRequestSeen(e){this.send("buddy_request_seen",{id:e})}getBuddy(e,r){this.send("get_buddy",{id:e,type:r})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getAllSlots(){this.send("get_all_slots",{})}getMascots(){this.send("get_mascots",{})}sendPostcard(e,r){this.send("send_postcard",{userId:e,cardId:r})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}getIgloos(){this.send("get_igloos",{})}getPuffles(e){this.send("get_puffles",{userId:e})}adoptPuffle(e,r){this.send("adopt_puffle",{type:e,name:r})}getIglooLikes(){this.send("get_igloo_likes",{})}checkPuffleSprite(e){this.send("check_puffle_sprite",{puffleSprite:e})}joinIgloo(e,r,o){this.send("join_igloo",{igloo:e,x:r??0,y:o??0})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}getNinja(){this.send("get_ninja",{})}getMats(){this.send("get_waddles",{})}joinMatchmaking(){this.send("join_matchmaking",{})}leaveMatchmaking(){this.send("leave_matchmaking",{})}startGame(){this.send("start_game",{})}selectCard(e){this.send("select_card",{slot:e})}loadAnimation(e){this.send("load_animation",{animation:e})}joinMat(e){this.send("join_waddle",{waddle:e})}createSocket(e){return K(H,{path:e,parser:D,transports:["polling","websocket"],reconnection:!1})}};import{io as W}from"socket.io-client";import z from"socket.io-msgpack-parser";var Q="https://api.cplegacy.com/login",J="https://api.cplegacy.com/token_login";function X(c){let e=c.on.bind(c);return c.on=((r,o)=>r==="message"?e(r,(s,t)=>{o({action:s,args:t??{}})}):e(r,o)),c}var N=class extends b{id="CPLegacy";version="";async login(e){let r="token"in e?J:Q,o="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},s=await this.postLogin(r,o);if(!s.success&&s.wantedVersion&&(this.version=s.wantedVersion,o.version=this.version,s=await this.postLogin(r,o)),!s.success)throw new Error(`Login failed: ${s.message??"unknown error"}`);return{servers:Object.entries(s.populations??{}).map(([n,i])=>({name:n,population:i})),key:s.key,username:s.username,moderator:!1,buddyWorlds:[]}}async connect(e,r,o){let s=`wss://${e.toLowerCase()}.server.cplegacy.com`,t=W(s,{path:"/socket.io/",parser:z,transports:["websocket"],reconnection:!1});return this.socket=t,await new Promise((n,i)=>{let a=setTimeout(()=>{t.disconnect(),i(new Error("Game connection timed out"))},15e3);t.on("connect",()=>{t.emit("message","game_auth",{username:r.username,key:r.key,createToken:!1,token:""})}),t.on("message",(u,m)=>{switch(u){case"wait_queue_update":{o?.onQueueUpdate?.(m);break}case"game_auth":{if(!m.success){clearTimeout(a),t.disconnect(),i(new Error("Game auth failed"));return}t.emit("message","load_player",{}),t.emit("message","join_server",{}),clearTimeout(a),n();break}}}),t.on("connect_error",u=>{clearTimeout(a),t.disconnect(),i(new Error(`Game connection failed: ${u.message}`))})}),X(t)}send(e,r){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",e,r)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.realUsername??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,walking:e.walking??void 0,meta:{internalUsername:e.username,approved:e.approved,emailVerified:e.emailVerified,safeChat:e.safeChat,tutorial:e.tutorial,loginStreak:e.loginStreak,walkingColor:e.walkingColor,stampbookColor:e.stampbookColor,stampbookClasp:e.stampbookClasp,stampbookPattern:e.stampbookPattern,ninjaPoints:e.ninjaPoints,highestNinjaRank:e.highestNinjaRank,character:e.character,transformed:e.transformed},_raw:e}}normalizePlayer(e){let r=e.user;return{...this.normalizeUser(r),_raw:e,coins:r.coins??0,rank:r.rank??0,inventory:e.inventory??[],furniture:e.furniture,buddies:[],buddyRequests:e.pending?.map(o=>o.id)??[],ignores:[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,r){this.send("send_position",{x:e,y:r})}sendFrame(e,r){this.send("send_frame",{frame:e,set:r})}snowball(e,r){this.send("snowball",{x:e,y:r})}joinRoom(e,r,o){this.send("join_room",{room:e,x:r??0,y:o??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}joinIgloo(e,r,o){this.send("join_igloo",{igloo:e,x:r??0,y:o??0})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}async postLogin(e,r){return(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(r)})).json()}};import{createHash as V}from"crypto";import{EventEmitter as Y}from"events";import A from"ws";var Z="wss://server.cpzero.net/login",ee="wss://server.cpzero.net/sub_zero",F="253",$="w1",y="\0",g={ID:0,USERNAME:1,COLOR:3,HEAD:4,FACE:5,NECK:6,BODY:7,HAND:8,BACK:9,BODY2:10,HAND2:11,BEAK:12,HAIR:13,FEET:14,MOUNT:15,FLAG:16,PHOTO:17,X:18,Y:19,FRAME:20,RANK:22};function re(c){return V("md5").update(c).digest("hex")}function oe(c){let e=re(c);return e.substring(16,32)+e.substring(0,16)}function d(c){let e=Number(c);return Number.isNaN(e)?0:e}function q(c){let e=c.split("|");return{id:d(e[g.ID]),username:e[g.USERNAME]??"",color:d(e[g.COLOR]),head:d(e[g.HEAD]),face:d(e[g.FACE]),neck:d(e[g.NECK]),body:d(e[g.BODY]),hand:d(e[g.HAND]),back:d(e[g.BACK]),body2:d(e[g.BODY2]),hand2:d(e[g.HAND2]),beak:d(e[g.BEAK]),hair:d(e[g.HAIR]),feet:d(e[g.FEET]),mount:d(e[g.MOUNT]),flag:d(e[g.FLAG]),photo:d(e[g.PHOTO]),x:d(e[g.X]),y:d(e[g.Y]),frame:d(e[g.FRAME]),rank:d(e[g.RANK])}}var T=class extends Y{ws;_closed=!1;_buffering=!0;_buffer=[];constructor(e){super(),this.ws=e,e.on("close",()=>{this._closed=!0,this.emit("disconnect")}),e.on("error",r=>{this.emit("connect_error",r)})}dispatchMessage(e,r){this._buffering&&this._buffer.push({action:e,args:r}),this.emit("message",{action:e,args:r})}flush(){this._buffering=!1;let e=this._buffer;this._buffer=[],setTimeout(()=>{for(let r of e)this.emit("message",r)},0)}send(e){this._closed||this.ws.send(e+y)}disconnect(){this._closed||(this._closed=!0,this.ws.close())}get connected(){return!this._closed&&this.ws.readyState===A.OPEN}};function ne(c,e){switch(c){case"lp":{let r=q(e[0]??""),o=d(e[1]),s=r.rank;return{action:"load_player",args:{user:r,coins:o,rank:s}}}case"jr":{let r=d(e[0]),o=e.slice(1).filter(Boolean).map(q);return{action:"join_room",args:{room:r,users:o}}}case"ap":return{action:"add_player",args:{user:q(e[0]??"")}};case"rp":return{action:"remove_player",args:{user:d(e[0])}};case"sp":return{action:"send_position",args:{id:d(e[0]),x:d(e[1]),y:d(e[2])}};case"sf":return{action:"send_frame",args:{id:d(e[0]),frame:d(e[1])}};case"sm":return{action:"send_message",args:{id:d(e[0]),message:e[1]??""}};case"se":return{action:"send_emote",args:{id:d(e[0]),emote:d(e[1])}};case"sa":return{action:"send_safe",args:{id:d(e[0]),safe:d(e[1])}};case"sb":return{action:"snowball",args:{id:d(e[0]),x:d(e[1]),y:d(e[2])}};case"gp":return{action:"get_player",args:{user:q(e[0]??"")}};case"upc":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"color"}};case"uph":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"head"}};case"upf":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"face"}};case"upn":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"neck"}};case"upb":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"body"}};case"upa":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"hand"}};case"upe":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"feet"}};case"upl":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"flag"}};case"upp":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"photo"}};case"upba":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"back"}};case"upm":return{action:"update_player",args:{id:d(e[0]),item:d(e[1]),slot:"mount"}};case"ai":return{action:"add_item",args:{item:d(e[0]),coins:d(e[1])}};case"jg":return{action:"join_game_room",args:{game:d(e[0])}};case"e":return{action:"error",args:{error:e[0]??"unknown"}};default:return null}}var x=class extends b{id="CPZero";sfs=null;async login(e){if("token"in e)throw new Error("CPZero does not support token login");let r=e.secret;if(!r)throw new Error("CPZero requires a pre-computed login hash in options.secret");let o=new A(Z);return await new Promise((t,n)=>{let i=setTimeout(()=>{o.close(),n(new Error("Login timed out"))},15e3),a="";o.on("open",()=>{o.send(k("verChk","0",`<ver v='${F}' />`)+y)}),o.on("message",u=>{let m=u.toString("utf-8").split(y).filter(Boolean);for(let l of m){if(l.includes('action="apiOK"')||l.includes("action='apiOK'")){o.send(k("rndK","-1","")+y);continue}let h=l.match(/<k>(.*?)<\/k>/);if(h){a=h[1];let p=se(e.username,r);o.send(p+y);continue}if(l.startsWith("%xt%l%")){let p=l.split("%").filter(Boolean),f=p[3]??"",E=p[4]??"",v=f.split("|");clearTimeout(i),o.close();let w=d(v[0]),_=v[2]??e.username;t({servers:[{name:"Sub Zero",population:0}],key:`${w}|${f}|${E}`,username:_,moderator:!1,buddyWorlds:[]});return}if(l.startsWith("%xt%e%")){clearTimeout(i),o.close();let p=l.split("%").filter(Boolean);n(new Error(`Login failed: error ${p[3]??"unknown"}`));return}}}),o.on("error",u=>{clearTimeout(i),o.close(),n(new Error(`Login WS error: ${u.message}`))}),o.on("close",()=>{clearTimeout(i)})})}async connect(e,r,o){let s=r.key.split("|"),t=s[0]??"",n=s.slice(1,-1).join("|"),i=s[s.length-1]??"",a=n.split("|")[3]??"",u=new A(ee),m=new T(u);return this.sfs=m,this.socket=m,await new Promise((l,h)=>{let p=setTimeout(()=>{u.close(),h(new Error("Game connection timed out"))},15e3);u.on("open",()=>{m.send(k("verChk","0",`<ver v='${F}' />`))}),u.on("message",f=>{let E=f.toString("utf-8").split(y).filter(Boolean);for(let v of E){if(v.includes('action="apiOK"')||v.includes("action='apiOK'")){m.send(k("rndK","-1",""));continue}let w=v.match(/<k>(.*?)<\/k>/);if(w){let _=w[1],O=`${oe(a+_)}${a}#${i}`;m.send(te(n,O));continue}if(v.startsWith("%xt%")&&(this.processXtBatch(v,m),v.includes("%xt%l%")&&m.send(`%xt%s%j#js%-1%${t}%${a}%en%`),v.includes("%xt%jr%")&&(clearTimeout(p),l())),v.includes("%xt%e%")){clearTimeout(p),u.close();let _=v.split("%").filter(Boolean);h(new Error(`Game auth failed: error ${_[3]??"unknown"}`));return}}}),u.on("error",f=>{clearTimeout(p),h(new Error(`Game WS error: ${f.message}`))})}),u.on("message",l=>{let h=l.toString("utf-8").split(y).filter(Boolean);for(let p of h)p.startsWith("%xt%")&&this.processXtBatch(p,m)}),m.flush(),m}send(e,r){if(!this.sfs)throw new Error("Not connected");let o=ie(e,r);o&&this.sfs.send(o)}disconnect(){this.sfs?.disconnect(),this.sfs=null,this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{back:e.back,body2:e.body2,hand2:e.hand2,beak:e.beak,hair:e.hair,mount:e.mount,rank:e.rank},_raw:e}}normalizePlayer(e){let r=e.user;return{...this.normalizeUser(r),_raw:e,coins:e.coins??0,rank:r.rank??0,inventory:[],buddies:[],ignores:[]}}sendMessage(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%m#sm%-1%0%${e}%`)}sendEmote(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#se%-1%${e}%`)}sendSafe(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#sa%-1%${e}%`)}walk(e,r){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#sp%-1%${e}%${r}%`)}sendFrame(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#sf%-1%${e}%`)}snowball(e,r){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#sb%-1%${e}%${r}%`)}joinRoom(e,r,o){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%j#jr%-1%${e}%${r??0}%${o??0}%`)}addItem(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%i#ai%-1%${e}%`)}equipColor(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upc%-1%${e}%`)}equipHead(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#uph%-1%${e}%`)}equipFace(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upf%-1%${e}%`)}equipNeck(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upn%-1%${e}%`)}equipBody(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upb%-1%${e}%`)}equipHand(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upa%-1%${e}%`)}equipFeet(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upe%-1%${e}%`)}equipFlag(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upl%-1%${e}%`)}equipPhoto(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%s#upp%-1%${e}%`)}getPlayer(e){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%u#gp%-1%${e}%`)}joinIgloo(e,r,o){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%j#jp%-1%${e}%igloo%`)}processXtBatch(e,r){let o=e.split(/(?=%xt%)/).map(s=>s.trim()).filter(Boolean);for(let s of o){let t=s.split("%").filter(Boolean);if(t[0]!=="xt"||t.length<3)continue;let n=t[1],i=t.slice(3),a=ne(n,i);a&&r.dispatchMessage(a.action,a.args)}}};function k(c,e,r){return`<msg t='sys'><body action='${c}' r='${e}'>${r}</body></msg>`}function se(c,e){return k("login","0",`<login z='${$}'><nick><![CDATA[${c}]]></nick><pword><![CDATA[${e}]]></pword></login>`)}function te(c,e){return k("login","0",`<login z='${$}'><nick><![CDATA[${c}]]></nick><pword><![CDATA[${e}]]></pword></login>`)}function ie(c,e){switch(c){case"send_position":return`%xt%s%u#sp%-1%${e.x}%${e.y}%`;case"send_frame":return`%xt%s%u#sf%-1%${e.frame}%`;case"send_message":return`%xt%s%m#sm%-1%0%${e.message}%`;case"send_emote":return`%xt%s%u#se%-1%${e.emote}%`;case"send_safe":return`%xt%s%u#sa%-1%${e.safe}%`;case"snowball":return`%xt%s%u#sb%-1%${e.x}%${e.y}%`;case"join_room":return`%xt%s%j#jr%-1%${e.room}%${e.x??0}%${e.y??0}%`;case"add_item":return`%xt%s%i#ai%-1%${e.item}%`;case"get_player":return`%xt%s%u#gp%-1%${e.id}%`;default:return null}}import{createCipheriv as ae,createDecipheriv as de,randomBytes as ue}from"crypto";import{io as ce}from"socket.io-client";import j from"tweetnacl";var me="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",S=class{aesKey=null;keypair=j.box.keyPair();get publicKey(){return Buffer.from(this.keypair.publicKey).toString("base64")}get encrypted(){return this.aesKey!==null}acquireKey(e,r){let o=Buffer.from(e,"base64"),s=Buffer.from(r,"base64"),t=o.subarray(0,j.box.nonceLength),n=o.subarray(j.box.nonceLength),i=j.box.open(new Uint8Array(n),new Uint8Array(t),new Uint8Array(s),this.keypair.secretKey);return i?new TextDecoder().decode(i):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let r=ue(16),o=ae("aes-256-cbc",this.aesKey,r),s=Buffer.concat([o.update(e,"utf-8"),o.final()]);return Buffer.concat([r,s]).toString("base64")}decrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let r=Buffer.from(e,"base64"),o=r.subarray(0,16),s=r.subarray(16),t=de("aes-256-cbc",this.aesKey,o);return Buffer.concat([t.update(s),t.final()]).toString("utf-8")}encode(e){return this.encrypted?this.encrypt(JSON.stringify(e)):JSON.stringify(e)}decode(e){return this.encrypted&&typeof e=="string"?JSON.parse(this.decrypt(e)):typeof e=="string"?JSON.parse(e):e}};function U(c,e){return new Promise((r,o)=>{let s=setTimeout(()=>{o(new Error("Handshake timed out"))},1e4);c.once("handshake",(t,n)=>{clearTimeout(s);let i=e.acquireKey(t,n);if(!i){o(new Error("Failed to decrypt handshake key"));return}let a=JSON.parse(i);if(a.time&&typeof a.time=="number"&&Math.abs(Date.now()-a.time)>3e5){o(new Error("Server time desync"));return}e.setKey(a.key),r()}),c.emit("handshake",e.publicKey)})}function le(c,e){let r=c.on.bind(c);return c.on=((o,s)=>o==="message"?r(o,t=>{try{let n=e.decode(t);s({action:n.action,args:n.args??{}})}catch{}}):r(o,s)),c}var M=class extends b{id="NewCP";encryptor=new S;worlds=null;async login(e){this.worlds||await this.loadWorlds();let r=Object.values(this.worlds??{}).find(t=>t.login);if(!r)throw new Error("Login world not found in crumbs");let o=this.createSocket(r.host,r.path);return this.encryptor=new S,await new Promise((t,n)=>{let i=setTimeout(()=>{o.disconnect(),n(new Error("Login timed out"))},15e3);o.on("connect",async()=>{try{await U(o,this.encryptor);let a="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},u=this.encryptor.encode({action:"login",args:a});o.emit("message",u)}catch(a){clearTimeout(i),o.disconnect(),n(a)}}),o.on("message",a=>{try{let u=this.encryptor.decode(a);if(u.action!=="login")return;clearTimeout(i),o.disconnect();let m=u.args;if(!m.success){n(new Error("Login failed"));return}let l=Object.entries(m.populations??{}).map(([h,p])=>({name:h,population:p}));t({servers:l,key:m.key,username:m.username,moderator:m.moderator??!1,buddyWorlds:m.buddyWorlds??[]})}catch(u){clearTimeout(i),o.disconnect(),n(u)}}),o.on("connect_error",a=>{clearTimeout(i),o.disconnect(),n(new Error(`Login connection failed: ${a.message}`))})})}async connect(e,r,o){this.worlds||await this.loadWorlds();let s=this.worlds?.[e];if(!s)throw new Error(`World config not found for: ${e}`);this.encryptor=new S;let t=this.createSocket(s.host,s.path);return this.socket=t,await new Promise((n,i)=>{let a=setTimeout(()=>{t.disconnect(),i(new Error("Game connection timed out"))},15e3);t.on("connect",async()=>{try{await U(t,this.encryptor);let u=this.encryptor.encode({action:"game_auth",args:{username:r.username,key:r.key,createToken:!1}});t.emit("message",u)}catch(u){clearTimeout(a),t.disconnect(),i(u)}}),t.on("message",u=>{try{let m=this.encryptor.decode(u);switch(m.action){case"wait_queue_update":{o?.onQueueUpdate?.(m.args);break}case"game_auth":{if(!m.args.success){clearTimeout(a),t.disconnect(),i(new Error("Game auth failed"));return}let h=this.encryptor.encode({action:"join_server",args:{}});t.emit("message",h),clearTimeout(a),n();break}}}catch{}}),t.on("connect_error",u=>{clearTimeout(a),t.disconnect(),i(new Error(`Game connection failed: ${u.message}`))})}),le(t,this.encryptor)}send(e,r){if(!this.socket)throw new Error("Not connected");let o=this.encryptor.encode({action:e,args:r});this.socket.emit("message",o)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{nickname:e.nickname,registrationDate:e.registrationDate,customNameColor:e.customNameColor,customBubbleColor:e.customBubbleColor,customBubbleTextColor:e.customBubbleTextColor,wallHacks:e.wallHacks,moderator:e.moderator,character:e.character,approved:e.approved,walking:e.walking},_raw:e}}normalizePlayer(e){let r=e.user;return{...this.normalizeUser(r),_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],buddies:e.buddies??[],ignores:e.ignores??[],furniture:e.furniture,flooring:e.floorings??[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,r){this.send("send_position",{x:e,y:r})}sendFrame(e,r){this.send("send_frame",{frame:e,set:r})}snowball(e,r){this.send("snowball",{x:e,y:r})}joinRoom(e,r,o){this.send("join_room",{room:e,x:r??0,y:o??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}joinIgloo(e,r,o){this.send("join_igloo",{igloo:e,x:r??0,y:o??0})}createSocket(e,r){return ce(e,{path:r,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(){let e=await fetch(me);if(!e.ok)throw new Error(`Failed to fetch crumbs: ${e.status}`);let r=await e.json();this.worlds=r.worlds}};import{io as pe}from"socket.io-client";var ge="https://play.penguinorigins.online",L=class extends b{id="PenguinOrigins";async login(e){let r=this.createSocket("/world/login/");return await new Promise((s,t)=>{let n=setTimeout(()=>{r.disconnect(),t(new Error("Login timed out"))},1e4);r.on("connect",()=>{let i="token"in e?"token_login":"login",a="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};r.emit("message",{action:i,args:a})}),r.on("message",i=>{if(i.action!=="login")return;clearTimeout(n),r.disconnect();let a=i.args;if(!a.success){t(new Error("Login failed"));return}let u=Object.entries(a.populations).map(([m,l])=>({name:m,population:l}));s({servers:u,key:a.key,username:a.username,moderator:!1,buddyWorlds:[]})}),r.on("connect_error",i=>{clearTimeout(n),r.disconnect(),t(new Error(`Login connection failed: ${i.message}`))})})}async connect(e,r,o){let s=this.createSocket(`/world/${e.toLowerCase()}/`);return this.socket=s,await new Promise((t,n)=>{let i=!1;s.on("connect",()=>{s.emit("message",{action:"game_auth",args:{username:r.username,key:r.key,createToken:!0,token:""}})}),s.on("message",a=>{switch(a.action){case"wait_queue_update":{o?.onQueueUpdate?.(a.args);break}case"game_auth":{if(i)break;if(i=!0,!a.args.success){s.disconnect(),n(new Error("Game auth failed"));return}s.emit("message",{action:"join_server",args:{}}),t();break}}}),s.on("connect_error",a=>{s.disconnect(),n(new Error(`Game connection failed: ${a.message}`))})}),s}send(e,r){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:r})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy},_raw:e}}normalizePlayer(e){let r=e.user,o=this.normalizeUser(r);return{...o,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...o.meta,postcards:e.postcards,mascots:e.mascots,pets:e.pets}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,r){this.send("send_position",{x:e,y:r})}sendFrame(e,r){this.send("send_frame",{frame:e,set:r??!1})}snowball(e,r){this.send("snowball",{x:e,y:r})}joinRoom(e,r,o){this.send("join_room",{room:e,x:r??0,y:o??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_player",{item:e})}equipHead(e){this.send("update_player",{item:e})}equipFace(e){this.send("update_player",{item:e})}equipNeck(e){this.send("update_player",{item:e})}equipBody(e){this.send("update_player",{item:e})}equipHand(e){this.send("update_player",{item:e})}equipFeet(e){this.send("update_player",{item:e})}equipFlag(e){this.send("update_player",{item:e})}equipPhoto(e){this.send("update_player",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,r,o){this.send("join_igloo",{igloo:e,x:r??0,y:o??0})}gameOver(e){this.send("game_over",{coins:e})}createSocket(e){return pe(ge,{path:e,transports:["polling","websocket"],reconnection:!1})}};var he={CPJourney:P,CPLegacy:N,CPZero:x,NewCP:M,PenguinOrigins:L};function B(c){return new he[c]}var R=class{constructor(e,r){this.adapter=e;this.waitFor=r}adapter;waitFor;getNinja(){return this.adapter.getNinja(),this.waitFor("get_ninja")}getMats(){return this.adapter.getMats(),this.waitFor("get_waddles")}joinMat(e){this.adapter.joinMat(e)}joinMatchmaking(){return this.adapter.joinMatchmaking(),this.waitFor("join_matchmaking")}leaveMatchmaking(){this.adapter.leaveMatchmaking()}startGame(){return this.adapter.startGame(),this.waitFor("start_game")}selectCard(e){return this.adapter.selectCard(e),this.waitFor("move_my_card")}loadAnimation(e){this.adapter.loadAnimation(e)}};var be=new Set(["load_player","join_room","add_player","remove_player","send_position","send_frame","update_player","kick","close_with_error","send_message","send_emote","cpj_ping","open_sprite","close_sprite","set_weather","server_error","error","stamp_earned","game_over","join_game_room","get_ninja","get_waddles","update_waddle","join_matchmaking","tick_matchmaking","start_game","set_cards","add_enemy_cards","start_round","enable_cards","remove_card","move_my_card","card_effect","round_over","play_animation","game_won","get_player","buddy_request","buddy_accept","buddy_reject","buddy_request_seen","get_buddy","send_postcard","stamps_result","ignore_add","ignore_remove","add_item","get_postcards","get_igloo_open","get_igloos","get_igloo_likes","join_igloo","get_puffles","get_mascots","wait_queue_update","slot","snowball","send_safe","stop_walking","update_table","transform_player","adopt_puffle","info","queue_server_join","disconnect","unknown_packet"]);function I(c){return typeof c=="object"&&c!==null&&"action"in c&&"args"in c}var C=class extends ve{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;get cardJitsu(){return this._cardJitsu||(this._cardJitsu=new R(this.adapter,this.waitFor.bind(this))),this._cardJitsu}constructor(e,r){super(),this.adapter=B(e),r?.debug&&(this.log=typeof r.debug=="function"?r.debug:console.log.bind(console))}async login(e){return this.log?.("[login] logging in as",e.username),this.loginResult=await this.adapter.login(e),this.log?.("[login] success \u2014",this.loginResult.servers.length,"servers"),this.loginResult.servers}async connect(e,r){if(!this.loginResult)throw new Error("Must call login() first");this.log?.("[connect] joining",e);let o={...r,onQueueUpdate:t=>{this.log?.("[queue]",`#${t.position}/${t.queueLength}`),this.emit("wait_queue_update",t),r?.onQueueUpdate?.(t)}},s=await this.adapter.connect(e,this.loginResult,o);s.on("message",t=>{I(t)&&this.handleMessage(t)}),s.on("disconnect",()=>{this.log?.("[disconnect] connection lost"),this.cleanup(),this.emit("disconnect")}),await new Promise((t,n)=>{let i=setTimeout(()=>{n(new Error("Waiting for load_player timed out"))},1e4),a=!1,u=!1,m=()=>{a&&u&&(clearTimeout(i),this.connected=!0,t())},l=p=>{if(I(p))switch(p.action){case"load_player":a=!0,m();break;case"join_room":u=!0,m();break;case"kick":clearTimeout(i),s.off("message",l),n(new Error(`Kicked: ${p.args.reason??"unknown"}`));break;case"close_with_error":clearTimeout(i),s.off("message",l),n(new Error(`Kicked: ${p.args.error??"unknown"}`));break;case"error":clearTimeout(i),s.off("message",l),n(new Error(`Server error: ${p.args.error??"unknown"}`));break}},h=()=>{(!a||!u)&&(clearTimeout(i),n(new Error("Disconnected before fully loaded")))};s.on("message",l),s.once("disconnect",h)})}on(e,r){return super.on(e,r)}off(e,r){return super.off(e,r)}once(e,r){return super.once(e,r)}emit(e,...r){return super.emit(e,...r)}waitFor(e,r){return new Promise((o,s)=>{let t,n=()=>{t&&clearTimeout(t),this.off(e,i),this.off("disconnect",a)},i=(u=>{n(),o(u)}),a=()=>{n(),s(new Error(`Disconnected while waiting for ${String(e)}`))};r!==void 0&&(t=setTimeout(()=>{n(),s(new Error(`Timed out waiting for ${String(e)}`))},r)),this.once(e,i),this.once("disconnect",a)})}sendMessage(e){this.adapter.sendMessage(e)}sendEmote(e){this.adapter.sendEmote(e)}sendSafe(e){this.adapter.sendSafe(e)}walk(e,r){this.adapter.walk(e,r)}sendFrame(e,r){this.adapter.sendFrame(e,r)}snowball(e,r){this.adapter.snowball(e,r)}joinRoom(e,r,o){return this.adapter.joinRoom(e,r,o),this.waitFor("join_room")}addItem(e){return this.adapter.addItem(e),this.waitFor("add_item")}equipColor(e){this.adapter.equipColor(e)}equipHead(e){this.adapter.equipHead(e)}equipFace(e){this.adapter.equipFace(e)}equipNeck(e){this.adapter.equipNeck(e)}equipBody(e){this.adapter.equipBody(e)}equipHand(e){this.adapter.equipHand(e)}equipFeet(e){this.adapter.equipFeet(e)}equipFlag(e){this.adapter.equipFlag(e)}equipPhoto(e){this.adapter.equipPhoto(e)}buddyRequest(e){this.adapter.buddyRequest(e)}buddyAccept(e){return this.adapter.buddyAccept(e),this.waitFor("buddy_accept")}buddyReject(e){return this.adapter.buddyReject(e),this.waitFor("buddy_reject")}buddyRequestSeen(e){return this.adapter.buddyRequestSeen(e),this.waitFor("buddy_request_seen")}getBuddy(e,r){return this.adapter.getBuddy(e,r),this.waitFor("get_buddy")}removeBuddy(e){this.adapter.removeBuddy(e)}addIgnore(e){return this.adapter.addIgnore(e),this.waitFor("ignore_add")}removeIgnore(e){return this.adapter.removeIgnore(e),this.waitFor("ignore_remove")}getPlayer(e){return this.adapter.getPlayer(e),this.waitFor("get_player")}getAllSlots(){return this.adapter.getAllSlots(),this.waitFor("slot")}getMascots(){return this.adapter.getMascots(),this.waitFor("get_mascots")}sendPostcard(e,r){return this.adapter.sendPostcard(e,r),this.waitFor("send_postcard")}getStamps(e){return this.adapter.getStamps(e),this.waitFor("stamps_result")}getPostcards(){return this.adapter.getPostcards(),this.waitFor("get_postcards")}getIglooOpen(e){return this.adapter.getIglooOpen(e),this.waitFor("get_igloo_open")}getIgloos(){return this.adapter.getIgloos(),this.waitFor("get_igloos")}getPuffles(e){return this.adapter.getPuffles(e),this.waitFor("get_puffles")}adoptPuffle(e,r){return this.adapter.adoptPuffle(e,r),this.waitFor("adopt_puffle")}getIglooLikes(){return this.adapter.getIglooLikes(),this.waitFor("get_igloo_likes")}checkPuffleSprite(e){this.adapter.checkPuffleSprite(e)}joinIgloo(e,r,o){return this.adapter.joinIgloo(e,r,o),this.waitFor("join_igloo")}gameOver(e){return this.adapter.gameOver(e),this.waitFor("game_over")}collectStamp(e){return this.adapter.collectStamp(e),this.waitFor("stamp_earned")}sleep(e){return new Promise(r=>setTimeout(r,e))}disconnect(){this.log?.("[disconnect] closing connection"),this.adapter.disconnect(),this.cleanup()}cleanup(){this.connected=!1,this.player=null,this.room=null,this.users.clear()}handleMessage(e){let{action:r,args:o}=e,s=o;switch(r){case"load_player":{let n=this.adapter.normalizePlayer(o);this.player=n,s={user:n},this.log?.("[load_player]",n.username,`id=${n.id}`,`coins=${n.coins}`,`inventory=${n.inventory.length}`);break}case"join_room":{let n=o.room,i=o.users;this.room=n,this.users.clear();let a=[];for(let u of i){let m=this.adapter.normalizeUser(u);this.users.set(m.id,m),a.push(m)}s={room:n,users:a},this.log?.("[join_room]",`room=${n}`,`users=${a.length}`);break}case"add_player":{let n=this.adapter.normalizeUser(o.user);this.users.set(n.id,n),s={user:n},this.log?.("[add_player]",n.username,`id=${n.id}`);break}case"remove_player":{let n=o.user;this.users.delete(n),this.log?.("[remove_player]",`id=${n}`);break}case"send_position":{let n=o.id,i=this.users.get(n);i&&(i.x=o.x,i.y=o.y);break}case"send_frame":{let n=o.id,i=this.users.get(n);i&&(i.frame=o.frame);break}case"join_igloo":{let n=o.igloo,i=o.users;this.room=n,this.users.clear();let a=[];for(let u of i){let m=this.adapter.normalizeUser(u);this.users.set(m.id,m),a.push(m)}s={...o,users:a},this.log?.("[join_igloo]",`igloo=${n}`,`users=${a.length}`);break}case"update_player":{let n=o.id,i=o.slot,a=o.item,u=this.users.get(n);u&&i in u&&(u[i]=a);break}case"kick":{let n=o.reason??"unknown";this.log?.("[kick]",n),this.cleanup();break}case"close_with_error":{let n=o.error??"unknown";this.log?.("[kick]",n),this.cleanup();break}default:{be.has(r)||(this.log?.("[unknown_packet]",r,JSON.stringify(o)),this.emit("unknown_packet",{action:r,args:o}));break}}let t=r==="error"?"server_error":r;this.emit(t,s)}};export{b as BaseAdapter,R as CardJitsu,C as Client};
|
|
1
|
+
var J="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",V="en-US,en;q=0.9",X=new Set(["connection","content-length","host","transfer-encoding","upgrade"]);function R(m="chrome"){return typeof m=="string"?{preset:m,headers:{}}:{preset:m.preset??"chrome",userAgent:m.userAgent,acceptLanguage:m.acceptLanguage,origin:m.origin,referer:m.referer,headers:m.headers??{}}}function Y(m){let e=m.match(/^[a-z][a-z0-9+.-]*:\/\//i)?m:`https://${m}`;try{let t=new URL(e);return`${t.protocol==="wss:"?"https:":t.protocol==="ws:"?"http:":t.protocol}//${t.host}`}catch{return m.replace(/\/+$/,"")}}function D(m,e){if(m.origin)return m.origin;if(m.preset!=="node")return Y(e)}function B(m,e){let t={},n=D(m,e.defaultOrigin),r=m.referer??(m.preset==="node"||!n?void 0:`${n}/`);return m.preset!=="node"&&(t["User-Agent"]=m.userAgent??J,t["Accept-Language"]=m.acceptLanguage??V),n&&(t.Origin=n),r&&(t.Referer=r),Z({...t,...m.headers,...e.headers})}function Z(m){let e={};for(let[t,n]of Object.entries(m))n!=null&&(ee(t)||(e[t]=String(n)));return e}function ee(m){let e=m.toLowerCase();return X.has(e)||e.startsWith("sec-websocket-")}var te=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(["']?\s*[:=]\s*)(["'])([^"']*)\3/gi,ne=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(\s*[:=]\s*)([^\s&,;]+)/gi,re=/\b([a-z][a-z\d+.-]*:\/\/)([^\s/@]+)@/gi;function $(m){return m.replace(re,"$1[REDACTED]@").replace(te,"$1$2$3[REDACTED]$3").replace(ne,"$1$2[REDACTED]").slice(0,500)}var a=class extends Error{category;phase;retryable;constructor(e){super($(e.message),{cause:e.cause}),this.name="ClientOperationError",this.category=e.category,this.phase=e.phase,this.retryable=e.retryable}};var M={loginMs:2e4,transportMs:2e4,queueMs:3e5,authenticationMs:2e4,initialStateMs:15e3,requestMs:15e3};var q=class{constructor(e=R()){this.connectionProfile=e}connectionProfile;socket=null;loginMessage=null;loginStatus="active";connectionTimeouts(e){return{...M,...e?.timeouts}}reportLifecycle(e,t,n){e?.onLifecycleUpdate?.({phase:t,occurredAt:Date.now(),...n?{queue:n}:{}})}resetLoginState(){this.loginMessage=null,this.loginStatus="active"}unsupportedOperation(e){return new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.id} does not support ${e}`})}socketIoOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e),r={};return Object.keys(t).length>0&&(r.extraHeaders=t),n&&(r.origin=n),(this.connectionProfile.preset!=="node"||n)&&(r.withCredentials=!0),r}webSocketOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e);return{...Object.keys(t).length>0?{headers:t}:{},...n?{origin:n}:{}}}connectionHeaders(e,t){return B(this.connectionProfile,{defaultOrigin:e,headers:t})}connectionOrigin(e){return D(this.connectionProfile,e)}normalizeUser(e){throw this.unsupportedOperation("normalizeUser")}normalizePlayer(e){throw this.unsupportedOperation("normalizePlayer")}extractAppearance(e){return{color:e.color??0,head:e.head??0,face:e.face??0,neck:e.neck??0,body:e.body??0,hand:e.hand??0,feet:e.feet??0,flag:e.flag??0,photo:e.photo??0}}sendMessage(e){throw this.unsupportedOperation("sendMessage")}sendEmote(e){throw this.unsupportedOperation("sendEmote")}sendSafe(e){throw this.unsupportedOperation("sendSafe")}walk(e,t){throw this.unsupportedOperation("walk")}sendFrame(e,t){throw this.unsupportedOperation("sendFrame")}snowball(e,t){throw this.unsupportedOperation("snowball")}joinRoom(e,t,n){throw this.unsupportedOperation("joinRoom")}addItem(e){throw this.unsupportedOperation("addItem")}equipColor(e){throw this.unsupportedOperation("equipColor")}equipHead(e){throw this.unsupportedOperation("equipHead")}equipFace(e){throw this.unsupportedOperation("equipFace")}equipNeck(e){throw this.unsupportedOperation("equipNeck")}equipBody(e){throw this.unsupportedOperation("equipBody")}equipHand(e){throw this.unsupportedOperation("equipHand")}equipFeet(e){throw this.unsupportedOperation("equipFeet")}equipFlag(e){throw this.unsupportedOperation("equipFlag")}equipPhoto(e){throw this.unsupportedOperation("equipPhoto")}buddyRequest(e){throw this.unsupportedOperation("buddyRequest")}buddyAccept(e){throw this.unsupportedOperation("buddyAccept")}buddyReject(e){throw this.unsupportedOperation("buddyReject")}buddyRequestSeen(e){throw this.unsupportedOperation("buddyRequestSeen")}getBuddy(e,t){throw this.unsupportedOperation("getBuddy")}findBuddy(e){throw this.unsupportedOperation("findBuddy")}removeBuddy(e){throw this.unsupportedOperation("removeBuddy")}addIgnore(e){throw this.unsupportedOperation("addIgnore")}removeIgnore(e){throw this.unsupportedOperation("removeIgnore")}getPlayer(e){throw this.unsupportedOperation("getPlayer")}getAllSlots(){throw this.unsupportedOperation("getAllSlots")}getMascots(){throw this.unsupportedOperation("getMascots")}sendPostcard(e,t){throw this.unsupportedOperation("sendPostcard")}getStamps(e){throw this.unsupportedOperation("getStamps")}getPostcards(){throw this.unsupportedOperation("getPostcards")}getIglooOpen(e){throw this.unsupportedOperation("getIglooOpen")}getIgloos(){throw this.unsupportedOperation("getIgloos")}getPuffles(e,t){throw this.unsupportedOperation("getPuffles")}getAllPuffles(){throw this.unsupportedOperation("getAllPuffles")}getPuffleWellbeing(e){throw this.unsupportedOperation("getPuffleWellbeing")}playPuffle(e){throw this.unsupportedOperation("playPuffle")}restPuffle(e){throw this.unsupportedOperation("restPuffle")}buyPuffleItem(e,t){throw this.unsupportedOperation("buyPuffleItem")}walkPuffle(e){throw this.unsupportedOperation("walkPuffle")}initializePuffleTower(){throw this.unsupportedOperation("initializePuffleTower")}getBackyardSupplies(){throw this.unsupportedOperation("getBackyardSupplies")}adoptPuffle(e,t){throw this.unsupportedOperation("adoptPuffle")}getIglooLikes(){throw this.unsupportedOperation("getIglooLikes")}checkPuffleSprite(e){throw this.unsupportedOperation("checkPuffleSprite")}joinIgloo(e,t,n){throw this.unsupportedOperation("joinIgloo")}getStoreMusic(){throw this.unsupportedOperation("getStoreMusic")}buyMusic(e){throw this.unsupportedOperation("buyMusic")}getIglooStoreItems(){throw this.unsupportedOperation("getIglooStoreItems")}buyFurniture(e,t){throw this.unsupportedOperation("buyFurniture")}updateIglooMusic(e){throw this.unsupportedOperation("updateIglooMusic")}updateIglooFurniture(e){throw this.unsupportedOperation("updateIglooFurniture")}autoUpdateIglooFurniture(e){throw this.unsupportedOperation("autoUpdateIglooFurniture")}updateIglooType(e){throw this.unsupportedOperation("updateIglooType")}openIgloo(){throw this.unsupportedOperation("openIgloo")}closeIglooBounds(){throw this.unsupportedOperation("closeIglooBounds")}likeIgloo(){throw this.unsupportedOperation("likeIgloo")}openIglooEditor(){throw this.unsupportedOperation("openIglooEditor")}closeIglooEditor(){throw this.unsupportedOperation("closeIglooEditor")}gameOver(e){throw this.unsupportedOperation("gameOver")}collectStamp(e){throw this.unsupportedOperation("collectStamp")}getNinja(){throw this.unsupportedOperation("getNinja")}getMats(){throw this.unsupportedOperation("getMats")}joinMatchmaking(){throw this.unsupportedOperation("joinMatchmaking")}leaveMatchmaking(){throw this.unsupportedOperation("leaveMatchmaking")}startGame(){throw this.unsupportedOperation("startGame")}selectCard(e){throw this.unsupportedOperation("selectCard")}loadAnimation(e){throw this.unsupportedOperation("loadAnimation")}joinMat(e){throw this.unsupportedOperation("joinMat")}};import{EventEmitter as _e}from"events";import{io as oe}from"socket.io-client";import se from"socket.io-msgpack-parser";var K="wss://play.cpjourney.net",ie="skip",ae=new Set(["Penguin not found. Try Again?","Incorrect password. NOTE: Passwords are CaSe SeNsiTIVE"]),T=class extends q{id="CPJourney";gameToken;async login(e,t){this.resetLoginState(),this.gameToken="token"in e?e.token:void 0;let n=this.createSocket("/world/login/");return await new Promise((s,o)=>{let i=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??M.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",v),n.off("connect_error",b),n.off("disconnect",C),t?.signal?.removeEventListener("abort",f)},c=p=>{i||(i=!0,u(),n.disconnect(),o(p))},l=p=>{i||(i=!0,u(),n.disconnect(),s(p))},g=()=>{let p=e.secret??ie,_="token"in e?{username:e.username,token:e.token,secret:p}:{username:e.username,password:e.password,secret:p};n.emit("message",{action:"login",args:_})},v=p=>{if(p.action!=="login")return;let _=p.args;if(!_.success){this.loginMessage=_.message??null;let y=_.message??"Login failed";_.message?.startsWith("Banned:")&&(this.loginStatus="banned");let O=ae.has(y);c(new a({category:this.loginStatus==="banned"?"account_banned":O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:y}));return}let w=Object.entries(_.populations).map(([y,O])=>({name:y,population:O}));l({servers:w,key:_.key,username:_.username,moderator:_.moderator,buddyWorlds:_.buddyWorlds??[]})},b=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},f=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){f();return}n.on("connect",g),n.on("message",v),n.on("connect_error",b),n.on("disconnect",C),t?.signal?.addEventListener("abort",f,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting"),await this.queueForServer(e,n),this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let s=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},i=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",i),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",v=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",_),r.off("connect_error",w),r.off("disconnect",y),n?.signal?.removeEventListener("abort",O)},b=h=>{c||(c=!0,v(),r.off("message",o),r.off("disconnect",i),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,v(),d())},f=(h,S,k,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{b(new a({category:S,phase:k,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),f(s.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");let h={username:t.username,key:t.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,token:this.gameToken??""};r.emit("message",{action:"game_auth",args:h})},_=h=>{switch(h.action){case"wait_queue_update":{let S=h.args;g="queueing",this.reportLifecycle(n,"queueing",S),n?.onQueueUpdate?.(S),f(s.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){b(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},w=h=>{b(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},y=h=>{b(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before joining the game${h?`: ${h}`:""}`}))},O=()=>{b(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",_),r.on("connect_error",w),r.on("disconnect",y),n?.signal?.addEventListener("abort",O,{once:!0}),f(s.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}async queueForServer(e,t){let n=this.createSocket("/world/login/"),r=this.connectionTimeouts(t);this.reportLifecycle(t,"queueing"),await new Promise((s,o)=>{let i=!1,d=!1,u,c=()=>{u!==void 0&&clearTimeout(u),u=setTimeout(()=>{g(new a({category:"queue_timeout",phase:"queueing",retryable:!0,message:"Server queue stopped responding"}))},r.queueMs)},l=()=>{u!==void 0&&clearTimeout(u),n.off("connect",b),n.off("message",C),n.off("disconnect",f),n.off("connect_error",p),t?.signal?.removeEventListener("abort",_)},g=w=>{i||(i=!0,l(),n.disconnect(),o(w))},v=()=>{i||(i=!0,d=!0,l(),n.disconnect(),s())},b=()=>{n.emit("message",{action:"queue_server_join",args:{server:e}})},C=w=>{switch(w.action){case"wait_queue_update":{let y=w.args;this.reportLifecycle(t,"queueing",y),t?.onQueueUpdate?.(y),c();break}case"queue_server_join":{v();break}}},f=w=>{d||g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection closed unexpectedly${w?`: ${w}`:""}`}))},p=w=>{g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection failed: ${w.message}`,cause:w}))},_=()=>{g(new a({category:"aborted",phase:"queueing",retryable:!0,message:"Queue wait cancelled"}))};if(t?.signal?.aborted){_();return}n.on("connect",b),n.on("message",C),n.on("disconnect",f),n.on("connect_error",p),t?.signal?.addEventListener("abort",_,{once:!0}),c()})}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){let{id:t,username:n,displayName:r,joinTime:s,x:o,y:i,frame:d,walking:u,color:c,head:l,face:g,neck:v,body:b,hand:C,feet:f,flag:p,photo:_,...w}=e;return{...this.extractAppearance(e),id:t,username:n,displayName:r,joinTime:s,x:o??0,y:i??0,frame:d??0,walking:u,meta:w,_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t),{user:r,coins:s,rank:o,inventory:i,furniture:d,flooring:u,buddies:c,buddyRequests:l,ignores:g,igloos:v,...b}=e;return{...n,_raw:e,coins:s??0,rank:o??0,inventory:i??[],furniture:d??[],flooring:u??[],buddies:t.buddies??[],buddyRequests:t.buddyRequests??[],ignores:t.ignores??[],igloos:v??[],meta:{...n.meta,...b}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}buddyRequestSeen(e){this.send("buddy_request_seen",{id:e})}getBuddy(e,t){this.send("get_buddy",{id:e,type:t})}findBuddy(e){this.send("buddy_find",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getAllSlots(){this.send("get_all_slots",{})}getMascots(){this.send("get_mascots",{})}sendPostcard(e,t){this.send("send_postcard",{userId:e,cardId:t})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}getIgloos(){this.send("get_igloos",{})}getPuffles(e,t){this.send("get_puffles",{userId:e,...t!==void 0?{isBackyard:t}:{}})}getAllPuffles(){this.send("get_all_puffles",{})}getPuffleWellbeing(e){this.send("get_wellbeing",{puffle:e})}playPuffle(e){this.send("puffle_play",{puffle:e})}restPuffle(e){this.send("update_puffle_rest",{puffle:e})}buyPuffleItem(e,t){this.send("puffle_buy_item",{puffleId:e,item:t})}walkPuffle(e){this.send("walk_puffle",{puffle:e})}initializePuffleTower(){this.send("tower_init",{})}getBackyardSupplies(){this.send("backyard_supplies",{})}adoptPuffle(e,t){this.send("adopt_puffle",{type:e,name:t})}getIglooLikes(){this.send("get_igloo_likes",{})}checkPuffleSprite(e){this.send("check_puffle_sprite",{puffleSprite:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}getStoreMusic(){this.send("get_store_music",{})}buyMusic(e){this.send("add_music",{music:e})}getIglooStoreItems(){this.send("get_igloostore_items",{})}buyFurniture(e,t){this.send("add_furniture",{furniture:e,amount:t})}updateIglooMusic(e){this.send("update_music",{music:e})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}autoUpdateIglooFurniture(e){this.send("update_furniture_auto",{furniture:e})}updateIglooType(e){this.send("update_igloo",{type:e})}openIgloo(){this.send("open_igloo",{})}closeIglooBounds(){this.send("close_igloo_bounds",{})}likeIgloo(){this.send("like_igloo",{})}openIglooEditor(){this.send("igloo_editor_open",{})}closeIglooEditor(){this.send("igloo_editor_closed",{})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}getNinja(){this.send("get_ninja",{})}getMats(){this.send("get_waddles",{})}joinMatchmaking(){this.send("join_matchmaking",{})}leaveMatchmaking(){this.send("leave_matchmaking",{})}startGame(){this.send("start_game",{})}selectCard(e){this.send("select_card",{slot:e})}loadAnimation(e){this.send("load_animation",{animation:e})}joinMat(e){this.send("join_waddle",{waddle:e})}createSocket(e){return oe(K,{...this.socketIoOptions(K),path:e,parser:se,transports:["polling","websocket"],reconnection:!1})}};import{io as de}from"socket.io-client";import ue from"socket.io-msgpack-parser";var ce="https://api.cplegacy.com/login",le="https://api.cplegacy.com/token_login",H="https://play.cplegacy.com";function pe(m){let e=m.on.bind(m);return m.on=((t,n)=>t==="message"?e(t,(r,s)=>{n({action:r,args:s??{}})}):e(t,n)),m}var j=class extends q{id="CPLegacy";version="";async login(e,t){this.resetLoginState();let n="token"in e?le:ce,r="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},s=new AbortController,o=!1,i=()=>s.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",i,{once:!0});let d=setTimeout(()=>{o=!0,s.abort()},t?.timeoutMs??M.loginMs),u;try{u=await this.postLogin(n,r,s.signal),!u.success&&u.wantedVersion&&(this.version=u.wantedVersion,r.version=this.version,u=await this.postLogin(n,r,s.signal))}catch(l){throw s.signal.aborted?new a({category:o?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:o?"Login timed out":"Login cancelled",cause:l}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:l instanceof Error?`Login connection failed: ${l.message}`:"Login connection failed",cause:l})}finally{clearTimeout(d),t?.signal?.removeEventListener("abort",i)}if(!u.success){this.loginMessage=u.message??null;let l=u.message??"unknown error",g=/password|credential|incorrect|invalid login/i.test(l);throw new a({category:g?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:`Login failed: ${l}`})}return{servers:Object.entries(u.populations??{}).map(([l,g])=>({name:l,population:g})),key:u.key,username:u.username,moderator:!1,buddyWorlds:[]}}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(e);this.socket=r;let s=this.connectionTimeouts(n),o=(d,u)=>{d==="game_auth"||d==="wait_queue_update"||n?.onMessage?.({action:d,args:u??{}})},i=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",i),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",v=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",_),r.off("connect_error",w),r.off("disconnect",y),n?.signal?.removeEventListener("abort",O)},b=h=>{c||(c=!0,v(),r.off("message",o),r.off("disconnect",i),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,v(),d())},f=(h,S,k,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{b(new a({category:S,phase:k,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),f(s.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message","game_auth",{username:t.username,key:t.key,createToken:!1,token:""})},_=(h,S)=>{switch(h){case"wait_queue_update":{let k=S;g="queueing",this.reportLifecycle(n,"queueing",k),n?.onQueueUpdate?.(k),f(s.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!S.success){b(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message","load_player",{}),r.emit("message","join_server",{}),C();break}}},w=h=>{b(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},y=h=>{b(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{b(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",_),r.on("connect_error",w),r.on("disconnect",y),n?.signal?.addEventListener("abort",O,{once:!0}),f(s.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),pe(r)}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",e,t)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.realUsername??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,walking:e.walking??void 0,meta:{internalUsername:e.username,approved:e.approved,emailVerified:e.emailVerified,safeChat:e.safeChat,tutorial:e.tutorial,loginStreak:e.loginStreak,walkingColor:e.walkingColor,stampbookColor:e.stampbookColor,stampbookClasp:e.stampbookClasp,stampbookPattern:e.stampbookPattern,ninjaPoints:e.ninjaPoints,highestNinjaRank:e.highestNinjaRank,character:e.character,transformed:e.transformed},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:t.coins??0,rank:t.rank??0,inventory:e.inventory??[],furniture:e.furniture,buddies:[],buddyRequests:e.pending?.map(n=>n.id)??[],ignores:[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}async postLogin(e,t,n){return(await fetch(e,{method:"POST",headers:this.connectionHeaders(H,{"Content-Type":"application/json",Accept:"application/json"}),body:JSON.stringify(t),signal:n})).json()}createSocket(e){let t=`wss://${e.toLowerCase()}.server.cplegacy.com`;return de(t,{...this.socketIoOptions(H),path:"/socket.io/",parser:ue,transports:["websocket"],reconnection:!1})}};import{createCipheriv as ge,createDecipheriv as me,randomBytes as he}from"crypto";import{io as fe}from"socket.io-client";import A from"tweetnacl";var G="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",E=class{aesKey=null;keypair=A.box.keyPair();get publicKey(){return Buffer.from(this.keypair.publicKey).toString("base64")}get encrypted(){return this.aesKey!==null}acquireKey(e,t){let n=Buffer.from(e,"base64"),r=Buffer.from(t,"base64"),s=n.subarray(0,A.box.nonceLength),o=n.subarray(A.box.nonceLength),i=A.box.open(new Uint8Array(o),new Uint8Array(s),new Uint8Array(r),this.keypair.secretKey);return i?new TextDecoder().decode(i):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=he(16),n=ge("aes-256-cbc",this.aesKey,t),r=Buffer.concat([n.update(e,"utf-8"),n.final()]);return Buffer.concat([t,r]).toString("base64")}decrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=Buffer.from(e,"base64"),n=t.subarray(0,16),r=t.subarray(16),s=me("aes-256-cbc",this.aesKey,n);return Buffer.concat([s.update(r),s.final()]).toString("utf-8")}encode(e){return this.encrypted?this.encrypt(JSON.stringify(e)):JSON.stringify(e)}decode(e){return this.encrypted&&typeof e=="string"?JSON.parse(this.decrypt(e)):typeof e=="string"?JSON.parse(e):e}};function z(m,e,t){return new Promise((n,r)=>{let s=!1,o=()=>{m.off("handshake",u),t.removeEventListener("abort",d)},i=c=>{s||(s=!0,o(),r(c))},d=()=>{i(new Error("Handshake cancelled"))},u=(c,l)=>{try{let g=e.acquireKey(c,l);if(!g){i(new Error("Failed to decrypt handshake key"));return}let v=JSON.parse(g);if(v.time&&typeof v.time=="number"&&Math.abs(Date.now()-v.time)>3e5){i(new Error("Server time desync"));return}if(e.setKey(v.key),s)return;s=!0,o(),n()}catch(g){i(g instanceof Error?g:new Error("Handshake failed"))}};if(t.aborted){d();return}m.on("handshake",u),t.addEventListener("abort",d,{once:!0}),m.emit("handshake",e.publicKey)})}function ve(m,e){let t=m.on.bind(m);return m.on=((n,r)=>n==="message"?t(n,s=>{try{let o=e.decode(s);r({action:o.action,args:o.args??{}})}catch{}}):t(n,r)),m}var x=class extends q{id="NewCP";encryptor=new E;worlds=null;async login(e,t){this.resetLoginState();let n=new AbortController,r=!1,s=()=>n.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",s,{once:!0});let o=setTimeout(()=>{r=!0,n.abort()},t?.timeoutMs??M.loginMs),i=null;try{this.worlds||await this.loadWorlds(n.signal);let d=Object.values(this.worlds??{}).find(u=>u.login);if(!d)throw new a({category:"login_rejected",phase:"transport_connecting",retryable:!1,message:"Login world not found in crumbs"});return i=this.createSocket(d.host,d.path),this.encryptor=new E,await new Promise((u,c)=>{let l=!1,g=()=>{i?.off("connect",C),i?.off("message",f),i?.off("connect_error",p),i?.off("disconnect",_),n.signal.removeEventListener("abort",w)},v=y=>{l||(l=!0,g(),i?.disconnect(),c(y))},b=y=>{l||(l=!0,g(),i?.disconnect(),u(y))},C=async()=>{try{if(!i)return;await z(i,this.encryptor,n.signal);let y="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},O=this.encryptor.encode({action:"login",args:y});i.emit("message",O)}catch(y){if(l)return;v(new a({category:n.signal.aborted?r?"login_timeout":"aborted":"transport_error",phase:"transport_connecting",retryable:!0,message:n.signal.aborted?r?"Login timed out":"Login cancelled":y instanceof Error?`Login handshake failed: ${y.message}`:"Login handshake failed",cause:y}))}},f=y=>{try{let O=this.encryptor.decode(y);if(O.action!=="login")return;let h=O.args;if(!h.success){this.loginMessage=h.message??null;let k=h.message??"Login failed",P=/password|credential|incorrect|invalid login/i.test(k);v(new a({category:P?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:k}));return}let S=Object.entries(h.populations??{}).map(([k,P])=>({name:k,population:P}));b({servers:S,key:h.key,username:h.username,moderator:h.moderator??!1,buddyWorlds:h.buddyWorlds??[]})}catch(O){v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:"Invalid login response",cause:O}))}},p=y=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${y.message}`,cause:y}))},_=y=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${y?`: ${y}`:""}`}))},w=()=>{v(new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled"}))};i?.on("connect",C),i?.on("message",f),i?.on("connect_error",p),i?.on("disconnect",_),n.signal.addEventListener("abort",w,{once:!0})})}catch(d){throw d instanceof a?d:n.signal.aborted?new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled",cause:d}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:d instanceof Error?d.message:"Login failed",cause:d})}finally{clearTimeout(o),t?.signal?.removeEventListener("abort",s)}}async connect(e,t,n){this.worlds||await this.loadWorlds(n?.signal);let r=this.worlds?.[e];if(!r)throw new Error(`World config not found for: ${e}`);this.encryptor=new E,this.reportLifecycle(n,"transport_connecting");let s=this.createSocket(r.host,r.path);this.socket=s;let o=this.connectionTimeouts(n),i=new AbortController,d=c=>{try{let l=this.encryptor.decode(c),g=l.action;if(typeof g!="string"||g==="game_auth"||g==="wait_queue_update")return;n?.onMessage?.({action:g,args:l.args??{}})}catch{}},u=c=>{n?.onDisconnect?.(c??null)};return s.on("message",d),s.on("disconnect",u),await new Promise((c,l)=>{let g=!1,v,b="transport_connecting",C=()=>{v!==void 0&&clearTimeout(v),s.off("connect",w),s.off("message",y),s.off("connect_error",O),s.off("disconnect",h),n?.signal?.removeEventListener("abort",S)},f=k=>{g||(g=!0,C(),i.abort(),s.off("message",d),s.off("disconnect",u),s.disconnect(),this.socket=null,l(k))},p=()=>{g||(g=!0,C(),c())},_=(k,P,L,N)=>{v!==void 0&&clearTimeout(v),v=setTimeout(()=>{f(new a({category:P,phase:L,retryable:!0,message:N}))},k)},w=async()=>{b="authenticating",this.reportLifecycle(n,"authenticating"),_(o.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");try{if(await z(s,this.encryptor,i.signal),g)return;let k=this.encryptor.encode({action:"game_auth",args:{username:t.username,key:t.key,createToken:!1}});s.emit("message",k)}catch(k){if(g)return;f(new a({category:"transport_error",phase:"authenticating",retryable:!0,message:k instanceof Error?`Game handshake failed: ${k.message}`:"Game handshake failed",cause:k}))}},y=k=>{try{let P=this.encryptor.decode(k);switch(P.action){case"wait_queue_update":{let L=P.args;b="queueing",this.reportLifecycle(n,"queueing",L),n?.onQueueUpdate?.(L),_(o.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!P.args.success){f(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session");let N=this.encryptor.encode({action:"join_server",args:{}});s.emit("message",N),p();break}}}catch{}},O=k=>{f(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${k.message}`,cause:k}))},h=k=>{f(new a({category:"transport_error",phase:b,retryable:!0,message:`Disconnected before game authentication${k?`: ${k}`:""}`}))},S=()=>{f(new a({category:"aborted",phase:b,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}s.on("connect",w),s.on("message",y),s.on("connect_error",O),s.on("disconnect",h),n?.signal?.addEventListener("abort",S,{once:!0}),_(o.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),ve(s,this.encryptor)}send(e,t){if(!this.socket)throw new Error("Not connected");let n=this.encryptor.encode({action:e,args:t});this.socket.emit("message",n)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{nickname:e.nickname,registrationDate:e.registrationDate,customNameColor:e.customNameColor,customBubbleColor:e.customBubbleColor,customBubbleTextColor:e.customBubbleTextColor,wallHacks:e.wallHacks,moderator:e.moderator,character:e.character,approved:e.approved,walking:e.walking},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],buddies:e.buddies??[],ignores:e.ignores??[],furniture:e.furniture,flooring:e.floorings??[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}createSocket(e,t){return fe(e,{...this.socketIoOptions(e),path:t,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(e){let t=await fetch(G,{headers:this.connectionHeaders(G),signal:e});if(!t.ok)throw new Error(`Failed to fetch crumbs: ${t.status}`);let n=await t.json();this.worlds=n.worlds}};import{io as be}from"socket.io-client";var W="https://play.penguinorigins.online",U=class extends q{id="PenguinOrigins";async login(e,t){this.resetLoginState();let n=this.createSocket("/world/login/");return await new Promise((s,o)=>{let i=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??M.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",v),n.off("connect_error",b),n.off("disconnect",C),t?.signal?.removeEventListener("abort",f)},c=p=>{i||(i=!0,u(),n.disconnect(),o(p))},l=p=>{i||(i=!0,u(),n.disconnect(),s(p))},g=()=>{let p="token"in e?"token_login":"login",_="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:p,args:_})},v=p=>{if(p.action!=="login")return;let _=p.args;if(!_.success){this.loginMessage=_.message??null;let y=_.message??"Login failed",O=/password|credential|incorrect|invalid login/i.test(y);c(new a({category:O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:y}));return}let w=Object.entries(_.populations).map(([y,O])=>({name:y,population:O}));l({servers:w,key:_.key,username:_.username,moderator:!1,buddyWorlds:[]})},b=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},f=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){f();return}n.on("connect",g),n.on("message",v),n.on("connect_error",b),n.on("disconnect",C),t?.signal?.addEventListener("abort",f,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let s=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},i=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",i),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",v=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",_),r.off("connect_error",w),r.off("disconnect",y),n?.signal?.removeEventListener("abort",O)},b=h=>{c||(c=!0,v(),r.off("message",o),r.off("disconnect",i),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,v(),d())},f=(h,S,k,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{b(new a({category:S,phase:k,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),f(s.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,token:""}})},_=h=>{switch(h.action){case"wait_queue_update":{let S=h.args;g="queueing",this.reportLifecycle(n,"queueing",S),n?.onQueueUpdate?.(S),f(s.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){b(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},w=h=>{b(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},y=h=>{b(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{b(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",_),r.on("connect_error",w),r.on("disconnect",y),n?.signal?.addEventListener("abort",O,{once:!0}),f(s.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy},_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t);return{...n,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...n.meta,postcards:e.postcards,mascots:e.mascots,pets:e.pets}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t??!1})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_player",{item:e})}equipHead(e){this.send("update_player",{item:e})}equipFace(e){this.send("update_player",{item:e})}equipNeck(e){this.send("update_player",{item:e})}equipBody(e){this.send("update_player",{item:e})}equipHand(e){this.send("update_player",{item:e})}equipFeet(e){this.send("update_player",{item:e})}equipFlag(e){this.send("update_player",{item:e})}equipPhoto(e){this.send("update_player",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}createSocket(e){return be(W,{...this.socketIoOptions(W),path:e,transports:["polling","websocket"],reconnection:!1})}};var ye={CPJourney:T,CPLegacy:j,NewCP:x,PenguinOrigins:U};function Q(m,e){return new ye[m](R(e))}var I=class{constructor(e,t){this.adapter=e;this.request=t}adapter;request;getNinja(e){return this.request("get_ninja",()=>this.adapter.getNinja(),e)}getMats(e){return this.request("get_waddles",()=>this.adapter.getMats(),e)}joinMat(e){this.adapter.joinMat(e)}joinMatchmaking(e){return this.request("join_matchmaking",()=>this.adapter.joinMatchmaking(),e)}leaveMatchmaking(){this.adapter.leaveMatchmaking()}startGame(e){return this.request("start_game",()=>this.adapter.startGame(),e)}selectCard(e,t){return this.request("move_my_card",()=>this.adapter.selectCard(e),t,n=>n.slot===e)}loadAnimation(e){this.adapter.loadAnimation(e)}};var ke=new Set(["load_player","join_room","add_player","remove_player","send_position","send_frame","update_player","kick","close_with_error","send_message","send_emote","cpj_ping","open_sprite","close_sprite","set_weather","server_error","error","stamp_earned","game_over","join_game_room","get_ninja","get_waddles","update_waddle","join_matchmaking","tick_matchmaking","start_game","set_cards","add_enemy_cards","start_round","enable_cards","remove_card","move_my_card","card_effect","round_over","play_animation","game_won","get_player","buddy_request","buddy_accept","buddy_reject","buddy_request_seen","get_buddy","buddy_find","send_postcard","stamps_result","ignore_add","ignore_remove","add_item","get_postcards","get_igloo_open","get_igloos","get_igloo_likes","join_igloo","get_puffles","get_all_puffles","get_wellbeing","get_walking_puffle","update_wellbeing","puffle_levelup","puffle_popup","buy_puffle_item","walk_puffle","backyard_supplies","receive_postcard","get_store_music","add_music","get_igloostore_items","add_furniture","update_music","igloo_open_status","igloo_bounds_status","igloo_liked","get_mascots","wait_queue_update","slot","snowball","send_safe","stop_walking","update_table","transform_player","adopt_puffle","info","queue_server_join","disconnect","unknown_packet"]),F=class extends _e{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;intentionalDisconnect=!1;disconnectNotified=!1;connectionFailure=null;lifecycleReporter;requestTails=new Map;disconnectEpoch=0;lastDisconnectInfo=null;get loginMessage(){return this.adapter.loginMessage}get loginStatus(){return this.adapter.loginStatus}get cardJitsu(){return this._cardJitsu||(this._cardJitsu=new I(this.adapter,this.request.bind(this))),this._cardJitsu}constructor(e,t){super(),this.adapter=Q(e,t?.connectionProfile),t?.debug&&(this.log=typeof t.debug=="function"?t.debug:console.log.bind(console))}async login(e,t){this.log?.("[login] logging in as",e.username),this.loginResult=null;let n=await this.adapter.login(e,t);return this.loginResult=n,this.log?.("[login] success \u2014",n.servers.length,"servers"),n.servers}async connect(e,t){if(!this.loginResult)throw new Error("Must call login() first");this.log?.("[connect] joining",e),this.intentionalDisconnect=!1,this.disconnectNotified=!1,this.connectionFailure=null,this.lastDisconnectInfo=null,this.lifecycleReporter=t?.onLifecycleUpdate;let n={...t,onQueueUpdate:r=>{this.log?.("[queue]",`#${r.position}/${r.queueLength}`),this.emit("wait_queue_update",r),t?.onQueueUpdate?.(r)},onMessage:r=>{this.handleMessage(r)},onDisconnect:r=>{this.handleAdapterDisconnect(r)}};try{await this.adapter.connect(e,this.loginResult,n),this.reportLifecycle("awaiting_initial_state"),await this.waitForInitialState(n),this.connected=!0,this.connectionFailure=null,this.reportLifecycle("ready")}catch(r){let s=r instanceof a?r:new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:r instanceof Error?r.message:"Connection failed",cause:r});throw this.intentionalDisconnect=!1,this.adapter.disconnect(),this.cleanup(),this.disconnectNotified||(this.disconnectNotified=!0,this.disconnectEpoch+=1,this.lastDisconnectInfo={intentional:!1,reason:s.message,occurredAt:Date.now()},this.reportLifecycle("disconnected")),s}}waitForInitialState(e){let t=e.timeouts?.initialStateMs??M.initialStateMs;return new Promise((n,r)=>{let s=!1,o,i=()=>{o!==void 0&&clearTimeout(o),this.off("load_player",l),this.off("join_room",l),this.off("kick",g),this.off("close_with_error",v),this.off("server_error",b),this.off("disconnect",C),e.signal?.removeEventListener("abort",f)},d=()=>{s||(s=!0,i(),n())},u=p=>{s||(s=!0,i(),r(p))},c=()=>{if(this.connectionFailure){u(this.connectionFailure);return}this.player!==null&&this.room!==null&&d()},l=()=>c(),g=({reason:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${p??"unknown"}`}))},v=({error:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${p??"unknown"}`}))},b=({error:p})=>{u(new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(p)}`}))},C=p=>{u(new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!p.intentional,message:`Disconnected before initial state${p.reason?`: ${p.reason}`:""}`}))},f=()=>{u(new a({category:"aborted",phase:"awaiting_initial_state",retryable:!0,message:"Initial state wait cancelled"}))};if(this.on("load_player",l),this.on("join_room",l),this.on("kick",g),this.on("close_with_error",v),this.on("server_error",b),this.on("disconnect",C),e.signal?.addEventListener("abort",f,{once:!0}),e.signal?.aborted){f();return}c(),!s&&(o=setTimeout(()=>{u(new a({category:"initial_state_timeout",phase:"awaiting_initial_state",retryable:!0,message:"Waiting for initial player and room state timed out"}))},t))})}on(e,t){return super.on(e,t)}off(e,t){return super.off(e,t)}once(e,t){return super.once(e,t)}emit(e,...t){return super.emit(e,...t)}waitFor(e,t){return this.waitForEvent(e,t)}waitForEvent(e,t,n,r){let s=typeof t=="number"?{timeoutMs:t}:t,o=s?.timeoutMs??M.requestMs;return new Promise((i,d)=>{let u=!1,c,l=()=>{c!==void 0&&clearTimeout(c),this.off(e,g),this.off("disconnect",b),s?.signal?.removeEventListener("abort",C)},g=(f=>{u||r&&!r(f)||(u=!0,l(),i(f))}),v=f=>{u||(u=!0,l(),d(f))},b=f=>{v(new a({category:"disconnected",phase:"ready",retryable:!f?.intentional,message:`Disconnected while waiting for ${String(e)}${f?.reason?`: ${f.reason}`:""}`}))},C=()=>{v(new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled while waiting for ${String(e)}`}))};if(s?.signal?.aborted){C();return}if(Number.isFinite(o)&&(c=setTimeout(()=>{v(new a({category:"operation_timeout",phase:"ready",retryable:!0,message:`Timed out waiting for ${String(e)}`}))},o)),this.on(e,g),this.once("disconnect",b),s?.signal?.addEventListener("abort",C,{once:!0}),n)try{n()}catch(f){if(f instanceof a){v(f);return}v(new a({category:"transport_error",phase:"ready",retryable:!0,message:`Failed to send request for ${String(e)}`,cause:f}))}})}request(e,t,n,r){let s=this.requestTails.get(e),o=this.disconnectEpoch,i=()=>{},d=new Promise(l=>{i=l}),u=s?s.then(()=>d):d;return this.requestTails.set(e,u),(s?this.waitForRequestTurn(e,s,o,n?.signal).then(()=>this.waitForEvent(e,n,t,r)):this.waitForEvent(e,n,t,r)).finally(()=>{i(),u.finally(()=>{this.requestTails.get(e)===u&&this.requestTails.delete(e)})})}waitForRequestTurn(e,t,n,r){let s=()=>new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled before sending request for ${String(e)}`});return r?.aborted?Promise.reject(s()):new Promise((o,i)=>{let d=!1,u=()=>{r?.removeEventListener("abort",c)},c=()=>{d||(d=!0,u(),i(s()))};r?.addEventListener("abort",c,{once:!0}),t.then(()=>{if(!d){if(d=!0,u(),this.disconnectEpoch!==n){let l=this.lastDisconnectInfo;i(new a({category:"disconnected",phase:"ready",retryable:!l?.intentional,message:`Disconnected before sending request for ${String(e)}${l?.reason?`: ${l.reason}`:""}`}));return}o()}})})}sendMessage(e){this.adapter.sendMessage(e)}sendEmote(e){this.adapter.sendEmote(e)}sendSafe(e){this.adapter.sendSafe(e)}walk(e,t){this.adapter.walk(e,t)}sendFrame(e,t){this.adapter.sendFrame(e,t)}snowball(e,t){this.adapter.snowball(e,t)}joinRoom(e,t,n,r){return this.request("join_room",()=>this.adapter.joinRoom(e,t,n),r,s=>s.room===e)}addItem(e,t){return this.request("add_item",()=>this.adapter.addItem(e),t,n=>n.item===e)}equipColor(e){this.adapter.equipColor(e)}equipHead(e){this.adapter.equipHead(e)}equipFace(e){this.adapter.equipFace(e)}equipNeck(e){this.adapter.equipNeck(e)}equipBody(e){this.adapter.equipBody(e)}equipHand(e){this.adapter.equipHand(e)}equipFeet(e){this.adapter.equipFeet(e)}equipFlag(e){this.adapter.equipFlag(e)}equipPhoto(e){this.adapter.equipPhoto(e)}buddyRequest(e){this.adapter.buddyRequest(e)}buddyAccept(e,t){return this.request("buddy_accept",()=>this.adapter.buddyAccept(e),t,n=>n.id===e)}buddyReject(e,t){return this.request("buddy_reject",()=>this.adapter.buddyReject(e),t,n=>n.id===e)}buddyRequestSeen(e,t){return this.request("buddy_request_seen",()=>this.adapter.buddyRequestSeen(e),t,n=>n.id===e)}getBuddy(e,t,n){return this.request("get_buddy",()=>this.adapter.getBuddy(e,t),n,r=>r.id===e&&r.type===t)}findBuddy(e,t){return this.request("buddy_find",()=>this.adapter.findBuddy(e),t)}removeBuddy(e){this.adapter.removeBuddy(e)}addIgnore(e,t){return this.request("ignore_add",()=>this.adapter.addIgnore(e),t,n=>n.id===e)}removeIgnore(e,t){return this.request("ignore_remove",()=>this.adapter.removeIgnore(e),t,n=>n.id===e)}getPlayer(e,t){return this.request("get_player",()=>this.adapter.getPlayer(e),t,n=>n.user.id===e)}getAllSlots(e){return this.request("slot",()=>this.adapter.getAllSlots(),e)}getMascots(e){return this.request("get_mascots",()=>this.adapter.getMascots(),e)}sendPostcard(e,t,n){return this.request("send_postcard",()=>this.adapter.sendPostcard(e,t),n)}getStamps(e,t){return this.request("stamps_result",()=>this.adapter.getStamps(e),t)}getPostcards(e){return this.request("get_postcards",()=>this.adapter.getPostcards(),e)}getIglooOpen(e,t){return this.request("get_igloo_open",()=>this.adapter.getIglooOpen(e),t)}getIgloos(e){return this.request("get_igloos",()=>this.adapter.getIgloos(),e)}getPuffles(e,t){return this.request("get_puffles",()=>this.adapter.getPuffles(e,t?.isBackyard),t,n=>n.userId===e)}getAllPuffles(e){return this.request("get_all_puffles",()=>this.adapter.getAllPuffles(),e)}getPuffleWellbeing(e,t){return this.request("get_wellbeing",()=>this.adapter.getPuffleWellbeing(e),t,n=>n.puffleId===e)}playPuffle(e){this.adapter.playPuffle(e)}restPuffle(e){this.adapter.restPuffle(e)}buyPuffleItem(e,t,n){return this.request("buy_puffle_item",()=>this.adapter.buyPuffleItem(e,t),n,r=>r.puffleId===e&&r.item===t)}walkPuffle(e,t){return this.request("get_walking_puffle",()=>this.adapter.walkPuffle(e),t,n=>n.puffle.id===e)}initializePuffleTower(){this.adapter.initializePuffleTower()}getBackyardSupplies(e){return this.request("backyard_supplies",()=>this.adapter.getBackyardSupplies(),e)}adoptPuffle(e,t,n){return this.request("adopt_puffle",()=>this.adapter.adoptPuffle(e,t),n)}getIglooLikes(e){return this.request("get_igloo_likes",()=>this.adapter.getIglooLikes(),e)}checkPuffleSprite(e){this.adapter.checkPuffleSprite(e)}joinIgloo(e,t,n,r){return this.request("join_igloo",()=>this.adapter.joinIgloo(e,t,n),r,s=>s.igloo===e)}getStoreMusic(e){return this.request("get_store_music",()=>this.adapter.getStoreMusic(),e)}buyMusic(e,t){return this.request("add_music",()=>this.adapter.buyMusic(e),t,n=>n.music===e)}getIglooStoreItems(e){return this.request("get_igloostore_items",()=>this.adapter.getIglooStoreItems(),e)}buyFurniture(e,t=1,n){return this.request("add_furniture",()=>this.adapter.buyFurniture(e,t),n,r=>r.furniture===e&&r.amount===t)}updateIglooMusic(e,t){return this.request("update_music",()=>this.adapter.updateIglooMusic(e),t,n=>n.music===e)}updateIglooFurniture(e){this.adapter.updateIglooFurniture(e)}autoUpdateIglooFurniture(e){this.adapter.autoUpdateIglooFurniture(e)}updateIglooType(e){this.adapter.updateIglooType(e)}openIgloo(e){return this.request("igloo_open_status",()=>this.adapter.openIgloo(),e)}closeIglooBounds(e){return this.request("igloo_bounds_status",()=>this.adapter.closeIglooBounds(),e)}likeIgloo(e){return this.request("igloo_liked",()=>this.adapter.likeIgloo(),e)}openIglooEditor(){this.adapter.openIglooEditor()}closeIglooEditor(){this.adapter.closeIglooEditor()}gameOver(e,t){return this.request("game_over",()=>this.adapter.gameOver(e),t)}collectStamp(e,t){return this.request("stamp_earned",()=>this.adapter.collectStamp(e),t)}sleep(e){return new Promise(t=>setTimeout(t,e))}disconnect(){this.log?.("[disconnect] closing connection"),this.intentionalDisconnect=!0,this.reportLifecycle("disconnecting"),this.adapter.disconnect(),this.handleAdapterDisconnect("client disconnect")}reportLifecycle(e){this.lifecycleReporter?.({phase:e,occurredAt:Date.now()})}handleAdapterDisconnect(e){if(this.disconnectNotified)return;this.disconnectNotified=!0;let t={intentional:this.intentionalDisconnect,reason:e,occurredAt:Date.now()};this.disconnectEpoch+=1,this.lastDisconnectInfo=t,!t.intentional&&!this.connected&&(this.connectionFailure=new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!0,message:`Disconnected before initial state${e?`: ${e}`:""}`})),this.log?.("[disconnect]",t.intentional?"connection closed":"connection lost",e??""),this.cleanup(),this.reportLifecycle("disconnected"),this.emit("disconnect",t)}cleanup(){this.connected=!1,this.player=null,this.room=null,this.users.clear()}handleMessage(e){let{action:t,args:n}=e,r=n;switch(t){case"load_player":{let o=this.adapter.normalizePlayer(n);this.player=o,r={user:o},this.log?.("[load_player]",o.username,`id=${o.id}`,`coins=${o.coins}`,`inventory=${o.inventory.length}`);break}case"join_room":{let o=n.room,i=n.users;this.room=o,this.users.clear();let d=[];for(let u of i){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={room:o,users:d},this.log?.("[join_room]",`room=${o}`,`users=${d.length}`);break}case"add_player":{let o=this.adapter.normalizeUser(n.user);this.users.set(o.id,o),r={user:o},this.log?.("[add_player]",o.username,`id=${o.id}`);break}case"remove_player":{let o=n.user;this.users.delete(o),this.log?.("[remove_player]",`id=${o}`);break}case"send_position":{let o=n.id,i=this.users.get(o);i&&(i.x=n.x,i.y=n.y);break}case"send_frame":{let o=n.id,i=this.users.get(o);i&&(i.frame=n.frame);break}case"join_igloo":{let o=n.igloo,i=n.users;this.room=o,this.users.clear();let d=[];for(let u of i){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={...n,users:d},this.log?.("[join_igloo]",`igloo=${o}`,`users=${d.length}`);break}case"update_player":{let o=n.id,i=n.slot,d=n.item,u=this.users.get(o);u&&i in u&&(u[i]=d);break}case"walk_puffle":{let o=n.user,i=this.users.get(o);i&&(i.walking=n.puffle,i.meta.walkingPuffleType=n.type);break}case"stop_walking":{let o=n.user,i=this.users.get(o);i&&(i.walking=0,i.meta.walkingPuffleType=void 0);break}case"igloo_open_status":{let o=n.status;if(this.player){this.player.meta.iglooOpen=o;let i=this.users.get(this.player.id);i&&(i.meta.iglooOpen=o)}break}case"add_item":case"add_furniture":case"add_music":case"adopt_puffle":case"buy_puffle_item":case"game_over":{if(this.adapter.id!=="CPJourney")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o),t==="add_item"&&this.player&&typeof n.item=="number"&&!this.player.inventory.includes(n.item)&&this.player.inventory.push(n.item);break}case"kick":{let o=n.reason??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${o}`})),this.cleanup();break}case"close_with_error":{let o=n.error??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${o}`})),this.cleanup();break}case"error":{let o=n.error??"unknown";this.connected||(this.connectionFailure=new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(o)}`}));break}default:{ke.has(t)||(this.log?.("[unknown_packet]",t,JSON.stringify(n)),this.emit("unknown_packet",{action:t,args:n}));break}}let s=t==="error"?"server_error":t;this.emit(s,r)}};export{q as BaseAdapter,I as CardJitsu,F as Client,a as ClientOperationError,M as DEFAULT_CLIENT_CONNECTION_TIMEOUTS,$ as sanitizeClientErrorMessage};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|