@shaunlwm/pickle.ts 1.10.0 → 1.12.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/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var Z="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",ee="en-US,en;q=0.9",re=new Set(["connection","content-length","host","transfer-encoding","upgrade"]);function N(a="chrome"){return typeof a=="string"?{preset:a,headers:{}}:{preset:a.preset??"chrome",userAgent:a.userAgent,acceptLanguage:a.acceptLanguage,origin:a.origin,referer:a.referer,headers:a.headers??{}}}function ne(a){let e=a.match(/^[a-z][a-z0-9+.-]*:\/\//i)?a:`https://${a}`;try{let r=new URL(e);return`${r.protocol==="wss:"?"https:":r.protocol==="ws:"?"http:":r.protocol}//${r.host}`}catch{return a.replace(/\/+$/,"")}}function A(a,e){if(a.origin)return a.origin;if(a.preset!=="node")return ne(e)}function F(a,e){let r={},n=A(a,e.defaultOrigin),o=a.referer??(a.preset==="node"||!n?void 0:`${n}/`);return a.preset!=="node"&&(r["User-Agent"]=a.userAgent??Z,r["Accept-Language"]=a.acceptLanguage??ee),n&&(r.Origin=n),o&&(r.Referer=o),oe({...r,...a.headers,...e.headers})}function oe(a){let e={};for(let[r,n]of Object.entries(a))n!=null&&(te(r)||(e[r]=String(n)));return e}function te(a){let e=a.toLowerCase();return re.has(e)||e.startsWith("sec-websocket-")}var v=class{constructor(e=N()){this.connectionProfile=e}connectionProfile;socket=null;loginMessage=null;loginStatus="active";socketIoOptions(e){let r=this.connectionHeaders(e),n=this.connectionOrigin(e),o={};return Object.keys(r).length>0&&(o.extraHeaders=r),n&&(o.origin=n),(this.connectionProfile.preset!=="node"||n)&&(o.withCredentials=!0),o}webSocketOptions(e){let r=this.connectionHeaders(e),n=this.connectionOrigin(e);return{...Object.keys(r).length>0?{headers:r}:{},...n?{origin:n}:{}}}connectionHeaders(e,r){return F(this.connectionProfile,{defaultOrigin:e,headers:r})}connectionOrigin(e){return A(this.connectionProfile,e)}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,n){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,n){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 Ce}from"events";import{io as se}from"socket.io-client";import ie from"socket.io-msgpack-parser";var B="wss://play.cpjourney.net",ae="skip",x=class extends v{id="CPJourney";async login(e){let r=this.createSocket("/world/login/");return await new Promise((o,i)=>{let t=setTimeout(()=>{r.disconnect(),i(new Error("Login timed out"))},1e4);r.on("connect",()=>{let d=e.secret??ae,s="token"in e?{username:e.username,token:e.token,secret:d}:{username:e.username,password:e.password,secret:d};r.emit("message",{action:"login",args:s})}),r.on("message",d=>{if(d.action!=="login")return;clearTimeout(t),r.disconnect();let s=d.args;if(!s.success){this.loginMessage=s.message??null,s.message?.startsWith("Banned:")&&(this.loginStatus="banned"),i(new Error(s.message??"Login failed"));return}let c=Object.entries(s.populations).map(([m,l])=>({name:m,population:l}));o({servers:c,key:s.key,username:s.username,moderator:s.moderator,buddyWorlds:s.buddyWorlds??[]})}),r.on("connect_error",d=>{clearTimeout(t),r.disconnect(),i(new Error(`Login connection failed: ${d.message}`))})})}async connect(e,r,n){await this.queueForServer(e,n);let o=this.createSocket(`/world/${e.toLowerCase()}/`);return this.socket=o,await new Promise((i,t)=>{let d=!1;o.on("connect",()=>{o.emit("message",{action:"game_auth",args:{username:r.username,key:r.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,token:""}})}),o.on("message",s=>{switch(s.action){case"wait_queue_update":{n?.onQueueUpdate?.(s.args);break}case"game_auth":{if(d)break;if(d=!0,!s.args.success){o.disconnect(),t(new Error("Game auth failed"));return}o.emit("message",{action:"join_server",args:{}}),i();break}}}),o.on("connect_error",s=>{o.disconnect(),t(new Error(`Game connection failed: ${s.message}`))})}),o}async queueForServer(e,r){let n=this.createSocket("/world/login/");await new Promise((o,i)=>{let t=setTimeout(()=>{n.disconnect(),i(new Error("Queue timed out"))},6e4);n.on("connect",()=>{n.emit("message",{action:"queue_server_join",args:{server:e}})}),n.on("message",d=>{switch(d.action){case"wait_queue_update":r?.onQueueUpdate?.(d.args);break;case"queue_server_join":clearTimeout(t),n.disconnect(),o();break}}),n.once("disconnect",()=>{clearTimeout(t),o()}),n.on("connect_error",d=>{clearTimeout(t),n.disconnect(),i(new Error(`Queue connection failed: ${d.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:n,displayName:o,joinTime:i,x:t,y:d,frame:s,walking:c,color:m,head:l,face:h,neck:g,body:b,hand:E,feet:f,flag:_,photo:k,...S}=e;return{...this.extractAppearance(e),id:r,username:n,displayName:o,joinTime:i,x:t??0,y:d??0,frame:s??0,walking:c,meta:S,_raw:e}}normalizePlayer(e){let r=e.user,n=this.normalizeUser(r),{user:o,coins:i,rank:t,inventory:d,furniture:s,flooring:c,buddies:m,buddyRequests:l,ignores:h,igloos:g,...b}=e;return{...n,_raw:e,coins:i??0,rank:t??0,inventory:d??[],furniture:s??[],flooring:c??[],buddies:r.buddies??[],buddyRequests:r.buddyRequests??[],ignores:r.ignores??[],igloos:g??[],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,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,n){this.send("join_room",{room:e,x:r??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,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,n){this.send("join_igloo",{igloo:e,x:r??0,y:n??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 se(B,{...this.socketIoOptions(B),path:e,parser:ie,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",me="https://api.cplegacy.com/token_login",U="https://play.cplegacy.com";function le(a){let e=a.on.bind(a);return a.on=((r,n)=>r==="message"?e(r,(o,i)=>{n({action:o,args:i??{}})}):e(r,n)),a}var M=class extends v{id="CPLegacy";version="";async login(e){let r="token"in e?me:ce,n="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},o=await this.postLogin(r,n);if(!o.success&&o.wantedVersion&&(this.version=o.wantedVersion,n.version=this.version,o=await this.postLogin(r,n)),!o.success)throw this.loginMessage=o.message??null,new Error(`Login failed: ${o.message??"unknown error"}`);return{servers:Object.entries(o.populations??{}).map(([t,d])=>({name:t,population:d})),key:o.key,username:o.username,moderator:!1,buddyWorlds:[]}}async connect(e,r,n){let o=`wss://${e.toLowerCase()}.server.cplegacy.com`,i=de(o,{...this.socketIoOptions(U),path:"/socket.io/",parser:ue,transports:["websocket"],reconnection:!1});return this.socket=i,await new Promise((t,d)=>{let s=setTimeout(()=>{i.disconnect(),d(new Error("Game connection timed out"))},15e3);i.on("connect",()=>{i.emit("message","game_auth",{username:r.username,key:r.key,createToken:!1,token:""})}),i.on("message",(c,m)=>{switch(c){case"wait_queue_update":{n?.onQueueUpdate?.(m);break}case"game_auth":{if(!m.success){clearTimeout(s),i.disconnect(),d(new Error("Game auth failed"));return}i.emit("message","load_player",{}),i.emit("message","join_server",{}),clearTimeout(s),t();break}}}),i.on("connect_error",c=>{clearTimeout(s),i.disconnect(),d(new Error(`Game connection failed: ${c.message}`))})}),le(i)}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(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,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,n){this.send("join_room",{room:e,x:r??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,r,n){this.send("join_igloo",{igloo:e,x:r??0,y:n??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:this.connectionHeaders(U,{"Content-Type":"application/json",Accept:"application/json"}),body:JSON.stringify(r)})).json()}};import{createHash as ge}from"crypto";import{EventEmitter as pe}from"events";import T from"ws";var H="wss://server.cpzero.net/login",K="wss://server.cpzero.net/sub_zero",he="https://play.cpzero.net/servers.xml",D="253",z="w1",y="\0",p={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 ve(a){return ge("md5").update(a).digest("hex")}function fe(a){let e=ve(a);return e.substring(16,32)+e.substring(0,16)}function u(a){let e=Number(a);return Number.isNaN(e)?0:e}function q(a){let e=a.split("|");return{id:u(e[p.ID]),username:e[p.USERNAME]??"",color:u(e[p.COLOR]),head:u(e[p.HEAD]),face:u(e[p.FACE]),neck:u(e[p.NECK]),body:u(e[p.BODY]),hand:u(e[p.HAND]),back:u(e[p.BACK]),body2:u(e[p.BODY2]),hand2:u(e[p.HAND2]),beak:u(e[p.BEAK]),hair:u(e[p.HAIR]),feet:u(e[p.FEET]),mount:u(e[p.MOUNT]),flag:u(e[p.FLAG]),photo:u(e[p.PHOTO]),x:u(e[p.X]),y:u(e[p.Y]),frame:u(e[p.FRAME]),rank:u(e[p.RANK])}}var I=class extends pe{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===T.OPEN}};function be(a,e){switch(a){case"lp":{let r=q(e[0]??""),n=u(e[1]),o=r.rank;return{action:"load_player",args:{user:r,coins:n,rank:o}}}case"jr":{let r=u(e[0]),n=e.slice(1).filter(Boolean).map(q);return{action:"join_room",args:{room:r,users:n}}}case"ap":return{action:"add_player",args:{user:q(e[0]??"")}};case"rp":return{action:"remove_player",args:{user:u(e[0])}};case"sp":return{action:"send_position",args:{id:u(e[0]),x:u(e[1]),y:u(e[2])}};case"sf":return{action:"send_frame",args:{id:u(e[0]),frame:u(e[1])}};case"sm":return{action:"send_message",args:{id:u(e[0]),message:e[1]??""}};case"se":return{action:"send_emote",args:{id:u(e[0]),emote:u(e[1])}};case"sa":return{action:"send_safe",args:{id:u(e[0]),safe:u(e[1])}};case"sb":return{action:"snowball",args:{id:u(e[0]),x:u(e[1]),y:u(e[2])}};case"gp":return{action:"get_player",args:{user:q(e[0]??"")}};case"upc":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"color"}};case"uph":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"head"}};case"upf":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"face"}};case"upn":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"neck"}};case"upb":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"body"}};case"upa":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"hand"}};case"upe":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"feet"}};case"upl":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"flag"}};case"upp":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"photo"}};case"upba":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"back"}};case"upm":return{action:"update_player",args:{id:u(e[0]),item:u(e[1]),slot:"mount"}};case"ai":return{action:"add_item",args:{item:u(e[0]),coins:u(e[1])}};case"jg":return{action:"join_game_room",args:{game:u(e[0])}};case"e":return{action:"error",args:{error:e[0]??"unknown"}};default:return null}}var C=class extends v{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 n=we(),o=new T(H,this.webSocketOptions(H));return await new Promise((t,d)=>{let s=setTimeout(()=>{o.close(),d(new Error("Login timed out"))},15e3);o.on("open",()=>{o.send(w("verChk","0",`<ver v='${D}' />`)+y)}),o.on("message",async c=>{let m=c.toString("utf-8").split(y).filter(Boolean);for(let l of m){if(l.includes('action="apiOK"')||l.includes("action='apiOK'")){o.send(w("rndK","-1","")+y);continue}if(l.match(/<k>(.*?)<\/k>/)){let g=ye(e.username,r);o.send(g+y);continue}if(l.startsWith("%xt%l%")){let g=l.split("%"),b=g[4]??"",E=g[5]??"",f=g[7]??"",_=b.split("|");clearTimeout(s),o.close();let k=await n,S=Se(f,k),X=u(_[0]),Y=_[2]??e.username;t({servers:S,key:`${X}|${b}|${E}`,username:Y,moderator:!1,buddyWorlds:[]});return}if(l.startsWith("%xt%e%")){clearTimeout(s),o.close();let g=l.split("%").filter(Boolean);d(new Error(`Login failed: error ${g[3]??"unknown"}`));return}}}),o.on("error",c=>{clearTimeout(s),o.close(),d(new Error(`Login WS error: ${c.message}`))}),o.on("close",()=>{clearTimeout(s)})})}async connect(e,r,n){let o=r.key.split("|"),i=o[0]??"",t=o.slice(1,-1).join("|"),d=o[o.length-1]??"",s=t.split("|")[3]??"",c=new T(K,this.webSocketOptions(K)),m=new I(c);return this.sfs=m,this.socket=m,await new Promise((l,h)=>{let g=setTimeout(()=>{c.close(),h(new Error("Game connection timed out"))},15e3);c.on("open",()=>{m.send(w("verChk","0",`<ver v='${D}' />`))}),c.on("message",b=>{let E=b.toString("utf-8").split(y).filter(Boolean);for(let f of E){if(f.includes('action="apiOK"')||f.includes("action='apiOK'")){m.send(w("rndK","-1",""));continue}let _=f.match(/<k>(.*?)<\/k>/);if(_){let k=_[1],S=`${fe(s+k)}${s}#${d}`;m.send(_e(t,S));continue}if(f.startsWith("%xt%")&&(this.processXtBatch(f,m),f.includes("%xt%l%")&&m.send(`%xt%s%j#js%-1%${i}%${s}%en%`),f.includes("%xt%jr%")&&(clearTimeout(g),l())),f.includes("%xt%e%")){clearTimeout(g),c.close();let k=f.split("%").filter(Boolean);h(new Error(`Game auth failed: error ${k[3]??"unknown"}`));return}}}),c.on("error",b=>{clearTimeout(g),h(new Error(`Game WS error: ${b.message}`))})}),c.on("message",l=>{let h=l.toString("utf-8").split(y).filter(Boolean);for(let g of h)g.startsWith("%xt%")&&this.processXtBatch(g,m)}),m.flush(),m}send(e,r){if(!this.sfs)throw new Error("Not connected");let n=ke(e,r);n&&this.sfs.send(n)}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,n){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%j#jr%-1%${e}%${r??0}%${n??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,n){if(!this.sfs)throw new Error("Not connected");this.sfs.send(`%xt%s%j#jp%-1%${e}%igloo%`)}processXtBatch(e,r){let n=e.split(/(?=%xt%)/).map(o=>o.trim()).filter(Boolean);for(let o of n){let i=o.split("%").filter(Boolean);if(i[0]!=="xt"||i.length<3)continue;let t=i[1],d=i.slice(3),s=be(t,d);s&&r.dispatchMessage(s.action,s.args)}}};function w(a,e,r){return`<msg t='sys'><body action='${a}' r='${e}'>${r}</body></msg>`}function ye(a,e){return w("login","0",`<login z='${z}'><nick><![CDATA[${a}]]></nick><pword><![CDATA[${e}]]></pword></login>`)}function _e(a,e){return w("login","0",`<login z='${z}'><nick><![CDATA[${a}]]></nick><pword><![CDATA[${e}]]></pword></login>`)}function ke(a,e){switch(a){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}}async function we(){let a=new Map;try{let e=await fetch(he);if(!e.ok)return a;let n=(await e.text()).match(/<language\s+locale="en">([\s\S]*?)<\/language>/)?.[1];if(!n)return a;for(let o of n.matchAll(/<server\s([^>]+)>/g)){let i=o[1],t=i.match(/id="(\d+)"/)?.[1],d=i.match(/name="([^"]+)"/)?.[1];t&&d&&a.set(t,d)}}catch{}return a}function Se(a,e){return a?a.split("|").filter(Boolean).map(r=>{let[n,o]=r.split(",");return{name:e.get(n)??`Server ${n}`,population:u(o)}}):[]}import{createCipheriv as Pe,createDecipheriv as Re,randomBytes as Ee}from"crypto";import{io as Ne}from"socket.io-client";import L from"tweetnacl";var G="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",P=class{aesKey=null;keypair=L.box.keyPair();get publicKey(){return Buffer.from(this.keypair.publicKey).toString("base64")}get encrypted(){return this.aesKey!==null}acquireKey(e,r){let n=Buffer.from(e,"base64"),o=Buffer.from(r,"base64"),i=n.subarray(0,L.box.nonceLength),t=n.subarray(L.box.nonceLength),d=L.box.open(new Uint8Array(t),new Uint8Array(i),new Uint8Array(o),this.keypair.secretKey);return d?new TextDecoder().decode(d):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let r=Ee(16),n=Pe("aes-256-cbc",this.aesKey,r),o=Buffer.concat([n.update(e,"utf-8"),n.final()]);return Buffer.concat([r,o]).toString("base64")}decrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let r=Buffer.from(e,"base64"),n=r.subarray(0,16),o=r.subarray(16),i=Re("aes-256-cbc",this.aesKey,n);return Buffer.concat([i.update(o),i.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 W(a,e){return new Promise((r,n)=>{let o=setTimeout(()=>{n(new Error("Handshake timed out"))},1e4);a.once("handshake",(i,t)=>{clearTimeout(o);let d=e.acquireKey(i,t);if(!d){n(new Error("Failed to decrypt handshake key"));return}let s=JSON.parse(d);if(s.time&&typeof s.time=="number"&&Math.abs(Date.now()-s.time)>3e5){n(new Error("Server time desync"));return}e.setKey(s.key),r()}),a.emit("handshake",e.publicKey)})}function xe(a,e){let r=a.on.bind(a);return a.on=((n,o)=>n==="message"?r(n,i=>{try{let t=e.decode(i);o({action:t.action,args:t.args??{}})}catch{}}):r(n,o)),a}var O=class extends v{id="NewCP";encryptor=new P;worlds=null;async login(e){this.worlds||await this.loadWorlds();let r=Object.values(this.worlds??{}).find(i=>i.login);if(!r)throw new Error("Login world not found in crumbs");let n=this.createSocket(r.host,r.path);return this.encryptor=new P,await new Promise((i,t)=>{let d=setTimeout(()=>{n.disconnect(),t(new Error("Login timed out"))},15e3);n.on("connect",async()=>{try{await W(n,this.encryptor);let s="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},c=this.encryptor.encode({action:"login",args:s});n.emit("message",c)}catch(s){clearTimeout(d),n.disconnect(),t(s)}}),n.on("message",s=>{try{let c=this.encryptor.decode(s);if(c.action!=="login")return;clearTimeout(d),n.disconnect();let m=c.args;if(!m.success){this.loginMessage=m.message??null,t(new Error(m.message??"Login failed"));return}let l=Object.entries(m.populations??{}).map(([h,g])=>({name:h,population:g}));i({servers:l,key:m.key,username:m.username,moderator:m.moderator??!1,buddyWorlds:m.buddyWorlds??[]})}catch(c){clearTimeout(d),n.disconnect(),t(c)}}),n.on("connect_error",s=>{clearTimeout(d),n.disconnect(),t(new Error(`Login connection failed: ${s.message}`))})})}async connect(e,r,n){this.worlds||await this.loadWorlds();let o=this.worlds?.[e];if(!o)throw new Error(`World config not found for: ${e}`);this.encryptor=new P;let i=this.createSocket(o.host,o.path);return this.socket=i,await new Promise((t,d)=>{let s=setTimeout(()=>{i.disconnect(),d(new Error("Game connection timed out"))},15e3);i.on("connect",async()=>{try{await W(i,this.encryptor);let c=this.encryptor.encode({action:"game_auth",args:{username:r.username,key:r.key,createToken:!1}});i.emit("message",c)}catch(c){clearTimeout(s),i.disconnect(),d(c)}}),i.on("message",c=>{try{let m=this.encryptor.decode(c);switch(m.action){case"wait_queue_update":{n?.onQueueUpdate?.(m.args);break}case"game_auth":{if(!m.args.success){clearTimeout(s),i.disconnect(),d(new Error("Game auth failed"));return}let h=this.encryptor.encode({action:"join_server",args:{}});i.emit("message",h),clearTimeout(s),t();break}}}catch{}}),i.on("connect_error",c=>{clearTimeout(s),i.disconnect(),d(new Error(`Game connection failed: ${c.message}`))})}),xe(i,this.encryptor)}send(e,r){if(!this.socket)throw new Error("Not connected");let n=this.encryptor.encode({action:e,args:r});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 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,n){this.send("join_room",{room:e,x:r??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,r,n){this.send("join_igloo",{igloo:e,x:r??0,y:n??0})}createSocket(e,r){return Ne(e,{...this.socketIoOptions(e),path:r,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(){let e=await fetch(G,{headers:this.connectionHeaders(G)});if(!e.ok)throw new Error(`Failed to fetch crumbs: ${e.status}`);let r=await e.json();this.worlds=r.worlds}};import{io as Me}from"socket.io-client";var Q="https://play.penguinorigins.online",j=class extends v{id="PenguinOrigins";async login(e){let r=this.createSocket("/world/login/");return await new Promise((o,i)=>{let t=setTimeout(()=>{r.disconnect(),i(new Error("Login timed out"))},1e4);r.on("connect",()=>{let d="token"in e?"token_login":"login",s="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};r.emit("message",{action:d,args:s})}),r.on("message",d=>{if(d.action!=="login")return;clearTimeout(t),r.disconnect();let s=d.args;if(!s.success){this.loginMessage=s.message??null,i(new Error(s.message??"Login failed"));return}let c=Object.entries(s.populations).map(([m,l])=>({name:m,population:l}));o({servers:c,key:s.key,username:s.username,moderator:!1,buddyWorlds:[]})}),r.on("connect_error",d=>{clearTimeout(t),r.disconnect(),i(new Error(`Login connection failed: ${d.message}`))})})}async connect(e,r,n){let o=this.createSocket(`/world/${e.toLowerCase()}/`);return this.socket=o,await new Promise((i,t)=>{let d=!1;o.on("connect",()=>{o.emit("message",{action:"game_auth",args:{username:r.username,key:r.key,createToken:!0,token:""}})}),o.on("message",s=>{switch(s.action){case"wait_queue_update":{n?.onQueueUpdate?.(s.args);break}case"game_auth":{if(d)break;if(d=!0,!s.args.success){o.disconnect(),t(new Error("Game auth failed"));return}o.emit("message",{action:"join_server",args:{}}),i();break}}}),o.on("connect_error",s=>{o.disconnect(),t(new Error(`Game connection failed: ${s.message}`))})}),o}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,n=this.normalizeUser(r);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,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,n){this.send("join_room",{room:e,x:r??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,r,n){this.send("join_igloo",{igloo:e,x:r??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}createSocket(e){return Me(Q,{...this.socketIoOptions(Q),path:e,transports:["polling","websocket"],reconnection:!1})}};var qe={CPJourney:x,CPLegacy:M,CPZero:C,NewCP:O,PenguinOrigins:j};function J(a,e){return new qe[a](N(e))}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 Le=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 V(a){return typeof a=="object"&&a!==null&&"action"in a&&"args"in a}var $=class extends Ce{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;get loginMessage(){return this.adapter.loginMessage}get loginStatus(){return this.adapter.loginStatus}get cardJitsu(){return this._cardJitsu||(this._cardJitsu=new R(this.adapter,this.waitFor.bind(this))),this._cardJitsu}constructor(e,r){super(),this.adapter=J(e,r?.connectionProfile),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 n={...r,onQueueUpdate:i=>{this.log?.("[queue]",`#${i.position}/${i.queueLength}`),this.emit("wait_queue_update",i),r?.onQueueUpdate?.(i)}},o=await this.adapter.connect(e,this.loginResult,n);o.on("message",i=>{V(i)&&this.handleMessage(i)}),o.on("disconnect",()=>{this.log?.("[disconnect] connection lost"),this.cleanup(),this.emit("disconnect")}),await new Promise((i,t)=>{let d=setTimeout(()=>{t(new Error("Waiting for load_player timed out"))},1e4),s=!1,c=!1,m=()=>{s&&c&&(clearTimeout(d),this.connected=!0,i())},l=g=>{if(V(g))switch(g.action){case"load_player":s=!0,m();break;case"join_room":c=!0,m();break;case"kick":clearTimeout(d),o.off("message",l),t(new Error(`Kicked: ${g.args.reason??"unknown"}`));break;case"close_with_error":clearTimeout(d),o.off("message",l),t(new Error(`Kicked: ${g.args.error??"unknown"}`));break;case"error":clearTimeout(d),o.off("message",l),t(new Error(`Server error: ${g.args.error??"unknown"}`));break}},h=()=>{(!s||!c)&&(clearTimeout(d),t(new Error("Disconnected before fully loaded")))};o.on("message",l),o.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((n,o)=>{let i,t=()=>{i&&clearTimeout(i),this.off(e,d),this.off("disconnect",s)},d=(c=>{t(),n(c)}),s=()=>{t(),o(new Error(`Disconnected while waiting for ${String(e)}`))};r!==void 0&&(i=setTimeout(()=>{t(),o(new Error(`Timed out waiting for ${String(e)}`))},r)),this.once(e,d),this.once("disconnect",s)})}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,n){return this.adapter.joinRoom(e,r,n),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,n){return this.adapter.joinIgloo(e,r,n),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:n}=e,o=n;switch(r){case"load_player":{let t=this.adapter.normalizePlayer(n);this.player=t,o={user:t},this.log?.("[load_player]",t.username,`id=${t.id}`,`coins=${t.coins}`,`inventory=${t.inventory.length}`);break}case"join_room":{let t=n.room,d=n.users;this.room=t,this.users.clear();let s=[];for(let c of d){let m=this.adapter.normalizeUser(c);this.users.set(m.id,m),s.push(m)}o={room:t,users:s},this.log?.("[join_room]",`room=${t}`,`users=${s.length}`);break}case"add_player":{let t=this.adapter.normalizeUser(n.user);this.users.set(t.id,t),o={user:t},this.log?.("[add_player]",t.username,`id=${t.id}`);break}case"remove_player":{let t=n.user;this.users.delete(t),this.log?.("[remove_player]",`id=${t}`);break}case"send_position":{let t=n.id,d=this.users.get(t);d&&(d.x=n.x,d.y=n.y);break}case"send_frame":{let t=n.id,d=this.users.get(t);d&&(d.frame=n.frame);break}case"join_igloo":{let t=n.igloo,d=n.users;this.room=t,this.users.clear();let s=[];for(let c of d){let m=this.adapter.normalizeUser(c);this.users.set(m.id,m),s.push(m)}o={...n,users:s},this.log?.("[join_igloo]",`igloo=${t}`,`users=${s.length}`);break}case"update_player":{let t=n.id,d=n.slot,s=n.item,c=this.users.get(t);c&&d in c&&(c[d]=s);break}case"kick":{let t=n.reason??"unknown";this.log?.("[kick]",t),this.cleanup();break}case"close_with_error":{let t=n.error??"unknown";this.log?.("[kick]",t),this.cleanup();break}default:{Le.has(r)||(this.log?.("[unknown_packet]",r,JSON.stringify(n)),this.emit("unknown_packet",{action:r,args:n}));break}}let i=r==="error"?"server_error":r;this.emit(i,o)}};export{v as BaseAdapter,R as CardJitsu,$ as Client};
1
+ var ee="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",te="en-US,en;q=0.9",ne=new Set(["connection","content-length","host","transfer-encoding","upgrade"]);function j(h="chrome"){return typeof h=="string"?{preset:h,headers:{}}:{preset:h.preset??"chrome",userAgent:h.userAgent,acceptLanguage:h.acceptLanguage,origin:h.origin,referer:h.referer,headers:h.headers??{}}}function re(h){let e=h.match(/^[a-z][a-z0-9+.-]*:\/\//i)?h:`https://${h}`;try{let t=new URL(e);return`${t.protocol==="wss:"?"https:":t.protocol==="ws:"?"http:":t.protocol}//${t.host}`}catch{return h.replace(/\/+$/,"")}}function B(h,e){if(h.origin)return h.origin;if(h.preset!=="node")return re(e)}function H(h,e){let t={},n=B(h,e.defaultOrigin),r=h.referer??(h.preset==="node"||!n?void 0:`${n}/`);return h.preset!=="node"&&(t["User-Agent"]=h.userAgent??ee,t["Accept-Language"]=h.acceptLanguage??te),n&&(t.Origin=n),r&&(t.Referer=r),oe({...t,...h.headers,...e.headers})}function oe(h){let e={};for(let[t,n]of Object.entries(h))n!=null&&(se(t)||(e[t]=String(n)));return e}function se(h){let e=h.toLowerCase();return ne.has(e)||e.startsWith("sec-websocket-")}var ie=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(["']?\s*[:=]\s*)(["'])([^"']*)\3/gi,ae=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(\s*[:=]\s*)([^\s&,;]+)/gi,de=/\b([a-z][a-z\d+.-]*:\/\/)([^\s/@]+)@/gi;function z(h){return h.replace(de,"$1[REDACTED]@").replace(ie,"$1$2$3[REDACTED]$3").replace(ae,"$1$2[REDACTED]").slice(0,500)}var a=class extends Error{category;phase;retryable;constructor(e){super(z(e.message),{cause:e.cause}),this.name="ClientOperationError",this.category=e.category,this.phase=e.phase,this.retryable=e.retryable}};var L={loginMs:2e4,transportMs:2e4,queueMs:3e5,authenticationMs:2e4,initialStateMs:15e3,requestMs:15e3};var M=class{constructor(e=j()){this.connectionProfile=e}connectionProfile;socket=null;loginMessage=null;loginStatus="active";connectionTimeouts(e){return{...L,...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 H(this.connectionProfile,{defaultOrigin:e,headers:t})}connectionOrigin(e){return B(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 Le}from"events";import{io as ue}from"socket.io-client";import ce from"socket.io-msgpack-parser";var W="wss://play.cpjourney.net",le="skip",pe=new Set(["Penguin not found. Try Again?","Incorrect password. NOTE: Passwords are CaSe SeNsiTIVE"]),A=class extends M{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((i,o)=>{let s=!1,d=setTimeout(()=>{l(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",f),n.off("message",v),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",g)},l=p=>{s||(s=!0,u(),n.disconnect(),o(p))},c=p=>{s||(s=!0,u(),n.disconnect(),i(p))},f=()=>{let p=e.secret??le,_="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 b=_.message??"Login failed";_.message?.startsWith("Banned:")&&(this.loginStatus="banned");let S=pe.has(b);l(new a({category:this.loginStatus==="banned"?"account_banned":S?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(_.populations).map(([b,S])=>({name:b,population:S}));c({servers:k,key:_.key,username:_.username,moderator:_.moderator,buddyWorlds:_.buddyWorlds??[]})},y=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},g=()=>{l(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){g();return}n.on("connect",f),n.on("message",v),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",g,{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 i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");let m={username:t.username,key:t.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,token:this.gameToken??""};r.emit("message",{action:"game_auth",args:m})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!m.args.success){y(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}}},k=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before joining the game${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(i.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((i,o)=>{let s=!1,d=!1,u,l=()=>{u!==void 0&&clearTimeout(u),u=setTimeout(()=>{f(new a({category:"queue_timeout",phase:"queueing",retryable:!0,message:"Server queue stopped responding"}))},r.queueMs)},c=()=>{u!==void 0&&clearTimeout(u),n.off("connect",y),n.off("message",C),n.off("disconnect",g),n.off("connect_error",p),t?.signal?.removeEventListener("abort",_)},f=k=>{s||(s=!0,c(),n.disconnect(),o(k))},v=()=>{s||(s=!0,d=!0,c(),n.disconnect(),i())},y=()=>{n.emit("message",{action:"queue_server_join",args:{server:e}})},C=k=>{switch(k.action){case"wait_queue_update":{let b=k.args;this.reportLifecycle(t,"queueing",b),t?.onQueueUpdate?.(b),l();break}case"queue_server_join":{v();break}}},g=k=>{d||f(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection closed unexpectedly${k?`: ${k}`:""}`}))},p=k=>{f(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection failed: ${k.message}`,cause:k}))},_=()=>{f(new a({category:"aborted",phase:"queueing",retryable:!0,message:"Queue wait cancelled"}))};if(t?.signal?.aborted){_();return}n.on("connect",y),n.on("message",C),n.on("disconnect",g),n.on("connect_error",p),t?.signal?.addEventListener("abort",_,{once:!0}),l()})}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:i,x:o,y:s,frame:d,walking:u,color:l,head:c,face:f,neck:v,body:y,hand:C,feet:g,flag:p,photo:_,...k}=e;return{...this.extractAppearance(e),id:t,username:n,displayName:r,joinTime:i,x:o??0,y:s??0,frame:d??0,walking:u,meta:k,_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t),{user:r,coins:i,rank:o,inventory:s,furniture:d,flooring:u,buddies:l,buddyRequests:c,ignores:f,igloos:v,...y}=e;return{...n,_raw:e,coins:i??0,rank:o??0,inventory:s??[],furniture:d??[],flooring:u??[],buddies:t.buddies??[],buddyRequests:t.buddyRequests??[],ignores:t.ignores??[],igloos:v??[],meta:{...n.meta,...y}}}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 ue(W,{...this.socketIoOptions(W),path:e,parser:ce,transports:["polling","websocket"],reconnection:!1})}};import{io as ge}from"socket.io-client";import me from"socket.io-msgpack-parser";var he="https://api.cplegacy.com/login",fe="https://api.cplegacy.com/token_login",Q="https://play.cplegacy.com";function ve(h){let e=h.on.bind(h);return h.on=((t,n)=>t==="message"?e(t,(r,i)=>{n({action:r,args:i??{}})}):e(t,n)),h}var x=class extends M{id="CPLegacy";version="";async login(e,t){this.resetLoginState();let n="token"in e?fe:he,r="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},i=new AbortController,o=!1,s=()=>i.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 d=setTimeout(()=>{o=!0,i.abort()},t?.timeoutMs??L.loginMs),u;try{u=await this.postLogin(n,r,i.signal),!u.success&&u.wantedVersion&&(this.version=u.wantedVersion,r.version=this.version,u=await this.postLogin(n,r,i.signal))}catch(c){throw i.signal.aborted?new a({category:o?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:o?"Login timed out":"Login cancelled",cause:c}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:c instanceof Error?`Login connection failed: ${c.message}`:"Login connection failed",cause:c})}finally{clearTimeout(d),t?.signal?.removeEventListener("abort",s)}if(!u.success){this.loginMessage=u.message??null;let c=u.message??"unknown error",f=/password|credential|incorrect|invalid login/i.test(c);throw new a({category:f?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:`Login failed: ${c}`})}return{servers:Object.entries(u.populations??{}).map(([c,f])=>({name:c,population:f})),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 i=this.connectionTimeouts(n),o=(d,u)=>{d==="game_auth"||d==="wait_queue_update"||n?.onMessage?.({action:d,args:u??{}})},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message","game_auth",{username:t.username,key:t.key,createToken:!1,token:""})},_=(m,O)=>{switch(m){case"wait_queue_update":{let w=O;f="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!O.success){y(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}}},k=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),ve(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(Q,{"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 ge(t,{...this.socketIoOptions(Q),path:"/socket.io/",parser:me,transports:["websocket"],reconnection:!1})}};import{io as be}from"socket.io-client";import{createHmac as ye}from"crypto";function K(h){if(h===null||typeof h!="object")return JSON.stringify(h)??"null";if(Array.isArray(h))return`[${h.map(K).join(",")}]`;let e=h;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}var N=class{constructor(e,t,n=Date.now){this.now=n;if(!/^(?:[0-9a-fA-F]{2})+$/.test(e))throw new Error("CPPS.lol returned an invalid packet key");if(!Number.isFinite(t))throw new Error("CPPS.lol returned an invalid server time");this.key=Buffer.from(e,"hex"),this.clockOffsetMs=t-this.now()}now;sequence=0;clockOffsetMs;key;sign(e,t){let n=++this.sequence,r=this.now()+this.clockOffsetMs,i=`${n}.${r}.${e}.${K(t)}`,o=ye("sha256",this.key).update(i).digest("hex");return{action:e,args:t,seq:n,ts:r,mac:o}}};var J="https://play.cpps.lol",q=class extends M{id="CPPS.lol";signer=null;sessionToken="";async login(e,t){this.resetLoginState(),this.sessionToken="";let n=this.createSocket("/world/login/");return new Promise((r,i)=>{let o=!1,s=setTimeout(()=>{u(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),d=()=>{clearTimeout(s),n.off("connect",c),n.off("message",f),n.off("connect_error",v),n.off("disconnect",y),t?.signal?.removeEventListener("abort",C)},u=g=>{o||(o=!0,this.sessionToken="",d(),n.disconnect(),i(g))},l=g=>{o||(o=!0,d(),n.disconnect(),r(g))},c=()=>{let g="token"in e?"token_login":"login",p="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:g,args:p})},f=g=>{if(g.action!=="login")return;let p=g.args;if(!p.success){this.loginMessage=p.message??null;let k=p.message??"Login failed",b=/password|credential|incorrect|invalid login/i.test(k);u(new a({category:b?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:k}));return}let _=Object.entries(p.populations).map(([k,b])=>typeof b=="number"?{name:k,population:b}:{name:k,population:b.bars,users:b.users});this.sessionToken="token"in e?e.token:"",l({servers:_,key:p.key,username:p.username,moderator:!1,buddyWorlds:[]})},v=g=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${g.message}`,cause:g}))},y=g=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${g?`: ${g}`:""}`}))},C=()=>{u(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){C();return}n.on("connect",c),n.on("message",f),n.on("connect_error",v),n.on("disconnect",y),t?.signal?.addEventListener("abort",C,{once:!0})})}async connect(e,t,n){this.signer=null,this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{this.signer=null,this.sessionToken="",n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),this.signer=null,this.sessionToken="",r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,token:this.sessionToken}})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{let O=m.args;if(!O.success||!O.packetKey||typeof O.serverTime!="number"){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}try{this.signer=new N(O.packetKey,O.serverTime),this.sessionToken=O.token??this.sessionToken}catch(w){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication returned invalid signing data",cause:w}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket||!this.signer)throw new Error("Not connected or authenticated");this.socket.emit("message",this.signer.sign(e,t))}disconnect(){this.signer=null,this.sessionToken="",this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.displayName??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy,headLayer:e.headLayer,headColor:e.headColor,headLayerColor:e.headLayerColor,faceLayer:e.faceLayer,faceColor:e.faceColor,faceLayerColor:e.faceLayerColor,neckLayer:e.neckLayer,neckColor:e.neckColor,neckLayerColor:e.neckLayerColor,bodyLayer:e.bodyLayer,bodyColor:e.bodyColor,bodyLayerColor:e.bodyLayerColor,handLayer:e.handLayer,handColor:e.handColor,handLayerColor:e.handLayerColor,feetLayer:e.feetLayer,feetColor:e.feetColor,feetLayerColor:e.feetLayerColor,flagLayer:e.flagLayer,flagColor:e.flagColor,flagLayerColor:e.flagLayerColor,photoLayer:e.photoLayer,photoColor:e.photoColor,photoLayerColor:e.photoLayerColor,flags:e.flags,isMascot:e.isMascot,invisible:e.invisible,isAfk:e.isAfk,connectionUnstable:e.connectionUnstable,transform:e.transform,playercardMusic:e.playercardMusic,outfits:e.outfits,relationships:e.relationships,likes:e.likes,features:e.features},_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,snowflakes:e.snowflakes,postcards:e.postcards,mascots:e.mascots,pets:e.pets,locations:e.locations}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.sendPackedEmote(1,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",{set:t??!0,frame:e})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.leaveWaddle(),this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:String(e)})}updatePlayer(e){this.send("update_player",{item:e})}equipColor(e){this.updatePlayer(e)}equipHead(e){this.updatePlayer(e)}equipFace(e){this.updatePlayer(e)}equipNeck(e){this.updatePlayer(e)}equipBody(e){this.updatePlayer(e)}equipHand(e){this.updatePlayer(e)}equipFeet(e){this.updatePlayer(e)}equipFlag(e){this.updatePlayer(e)}equipPhoto(e){this.updatePlayer(e)}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.leaveWaddle(),this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}openIglooRaw(){this.send("open_igloo",{})}sendPackedEmote(e,t){this.send("send_emote",{pack:e,emote:t})}updateLayeredPlayer(e){this.send("update_player",{item:e,layer:!0})}acceptMature(){this.send("accept_mature",{})}removeInventory(e){this.send("remove_inventory",{item:e})}getSnowflakeState(){this.send("get_snowflake_state",{})}getPets(e){this.send("get_pets",{userId:e})}getIglooContest(){this.send("get_igloo_contest",{})}getIglooLikesFor(e){this.send("get_igloo_likes",{iglooId:e})}likeIglooById(e){this.send("like_igloo",{iglooId:e})}sendMail(e,t){this.send("send_mail",{recipient:e,postcardId:t})}marryRequest(e){this.send("marry_request",{id:e})}leaveWaddle(){this.send("leave_waddle",{})}createSocket(e){return be(J,{...this.socketIoOptions(J),path:e,transports:["polling","websocket"],reconnection:!1})}};import{createCipheriv as _e,createDecipheriv as ke,randomBytes as we}from"crypto";import{io as Ce}from"socket.io-client";import U from"tweetnacl";var V="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",I=class{aesKey=null;keypair=U.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"),i=n.subarray(0,U.box.nonceLength),o=n.subarray(U.box.nonceLength),s=U.box.open(new Uint8Array(o),new Uint8Array(i),new Uint8Array(r),this.keypair.secretKey);return s?new TextDecoder().decode(s):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=we(16),n=_e("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),i=ke("aes-256-cbc",this.aesKey,n);return Buffer.concat([i.update(r),i.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 X(h,e,t){return new Promise((n,r)=>{let i=!1,o=()=>{h.off("handshake",u),t.removeEventListener("abort",d)},s=l=>{i||(i=!0,o(),r(l))},d=()=>{s(new Error("Handshake cancelled"))},u=(l,c)=>{try{let f=e.acquireKey(l,c);if(!f){s(new Error("Failed to decrypt handshake key"));return}let v=JSON.parse(f);if(v.time&&typeof v.time=="number"&&Math.abs(Date.now()-v.time)>3e5){s(new Error("Server time desync"));return}if(e.setKey(v.key),i)return;i=!0,o(),n()}catch(f){s(f instanceof Error?f:new Error("Handshake failed"))}};if(t.aborted){d();return}h.on("handshake",u),t.addEventListener("abort",d,{once:!0}),h.emit("handshake",e.publicKey)})}function Oe(h,e){let t=h.on.bind(h);return h.on=((n,r)=>n==="message"?t(n,i=>{try{let o=e.decode(i);r({action:o.action,args:o.args??{}})}catch{}}):t(n,r)),h}var F=class extends M{id="NewCP";encryptor=new I;worlds=null;async login(e,t){this.resetLoginState();let n=new AbortController,r=!1,i=()=>n.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 o=setTimeout(()=>{r=!0,n.abort()},t?.timeoutMs??L.loginMs),s=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 s=this.createSocket(d.host,d.path),this.encryptor=new I,await new Promise((u,l)=>{let c=!1,f=()=>{s?.off("connect",C),s?.off("message",g),s?.off("connect_error",p),s?.off("disconnect",_),n.signal.removeEventListener("abort",k)},v=b=>{c||(c=!0,f(),s?.disconnect(),l(b))},y=b=>{c||(c=!0,f(),s?.disconnect(),u(b))},C=async()=>{try{if(!s)return;await X(s,this.encryptor,n.signal);let b="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},S=this.encryptor.encode({action:"login",args:b});s.emit("message",S)}catch(b){if(c)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":b instanceof Error?`Login handshake failed: ${b.message}`:"Login handshake failed",cause:b}))}},g=b=>{try{let S=this.encryptor.decode(b);if(S.action!=="login")return;let m=S.args;if(!m.success){this.loginMessage=m.message??null;let w=m.message??"Login failed",P=/password|credential|incorrect|invalid login/i.test(w);v(new a({category:P?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:w}));return}let O=Object.entries(m.populations??{}).map(([w,P])=>({name:w,population:P}));y({servers:O,key:m.key,username:m.username,moderator:m.moderator??!1,buddyWorlds:m.buddyWorlds??[]})}catch(S){v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:"Invalid login response",cause:S}))}},p=b=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${b.message}`,cause:b}))},_=b=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${b?`: ${b}`:""}`}))},k=()=>{v(new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled"}))};s?.on("connect",C),s?.on("message",g),s?.on("connect_error",p),s?.on("disconnect",_),n.signal.addEventListener("abort",k,{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",i)}}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 I,this.reportLifecycle(n,"transport_connecting");let i=this.createSocket(r.host,r.path);this.socket=i;let o=this.connectionTimeouts(n),s=new AbortController,d=l=>{try{let c=this.encryptor.decode(l),f=c.action;if(typeof f!="string"||f==="game_auth"||f==="wait_queue_update")return;n?.onMessage?.({action:f,args:c.args??{}})}catch{}},u=l=>{n?.onDisconnect?.(l??null)};return i.on("message",d),i.on("disconnect",u),await new Promise((l,c)=>{let f=!1,v,y="transport_connecting",C=()=>{v!==void 0&&clearTimeout(v),i.off("connect",k),i.off("message",b),i.off("connect_error",S),i.off("disconnect",m),n?.signal?.removeEventListener("abort",O)},g=w=>{f||(f=!0,C(),s.abort(),i.off("message",d),i.off("disconnect",u),i.disconnect(),this.socket=null,c(w))},p=()=>{f||(f=!0,C(),l())},_=(w,P,E,$)=>{v!==void 0&&clearTimeout(v),v=setTimeout(()=>{g(new a({category:P,phase:E,retryable:!0,message:$}))},w)},k=async()=>{y="authenticating",this.reportLifecycle(n,"authenticating"),_(o.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");try{if(await X(i,this.encryptor,s.signal),f)return;let w=this.encryptor.encode({action:"game_auth",args:{username:t.username,key:t.key,createToken:!1}});i.emit("message",w)}catch(w){if(f)return;g(new a({category:"transport_error",phase:"authenticating",retryable:!0,message:w instanceof Error?`Game handshake failed: ${w.message}`:"Game handshake failed",cause:w}))}},b=w=>{try{let P=this.encryptor.decode(w);switch(P.action){case"wait_queue_update":{let E=P.args;y="queueing",this.reportLifecycle(n,"queueing",E),n?.onQueueUpdate?.(E),_(o.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!P.args.success){g(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session");let $=this.encryptor.encode({action:"join_server",args:{}});i.emit("message",$),p();break}}}catch{}},S=w=>{g(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${w.message}`,cause:w}))},m=w=>{g(new a({category:"transport_error",phase:y,retryable:!0,message:`Disconnected before game authentication${w?`: ${w}`:""}`}))},O=()=>{g(new a({category:"aborted",phase:y,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}i.on("connect",k),i.on("message",b),i.on("connect_error",S),i.on("disconnect",m),n?.signal?.addEventListener("abort",O,{once:!0}),_(o.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),Oe(i,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 Ce(e,{...this.socketIoOptions(e),path:t,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(e){let t=await fetch(V,{headers:this.connectionHeaders(V),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 Se}from"socket.io-client";var Y="https://play.penguinorigins.online",D=class extends M{id="PenguinOrigins";async login(e,t){this.resetLoginState();let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{l(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",f),n.off("message",v),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",g)},l=p=>{s||(s=!0,u(),n.disconnect(),o(p))},c=p=>{s||(s=!0,u(),n.disconnect(),i(p))},f=()=>{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 b=_.message??"Login failed",S=/password|credential|incorrect|invalid login/i.test(b);l(new a({category:S?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(_.populations).map(([b,S])=>({name:b,population:S}));c({servers:k,key:_.key,username:_.username,moderator:!1,buddyWorlds:[]})},y=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},g=()=>{l(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){g();return}n.on("connect",f),n.on("message",v),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",g,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,token:""}})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!m.args.success){y(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}}},k=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(i.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 Se(Y,{...this.socketIoOptions(Y),path:e,transports:["polling","websocket"],reconnection:!1})}};var Pe={CPPSlol:q,CPJourney:A,CPLegacy:x,NewCP:F,PenguinOrigins:D};function Z(h,e){return new Pe[h](j(e))}var R=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 T=class{constructor(e,t){this.baseAdapter=e;this.request=t}baseAdapter;request;get adapter(){if(this.baseAdapter instanceof q)return this.baseAdapter;throw new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.baseAdapter.id} does not support CPPS.lol actions`})}sendPackedEmote(e,t){this.adapter.sendPackedEmote(e,t)}updateLayeredPlayer(e){this.adapter.updateLayeredPlayer(e)}acceptMature(){this.adapter.acceptMature()}removeInventory(e,t){return this.request("remove_inventory",()=>this.adapter.removeInventory(e),t,n=>Number(n.id)===e)}getSnowflakeState(e){return this.request("snowflake_state",()=>this.adapter.getSnowflakeState(),e)}getPets(e,t){return this.request("get_pets",()=>this.adapter.getPets(e),t,n=>n.userId===void 0||n.userId===e)}getIglooContest(e){return this.request("igloo_contest",()=>this.adapter.getIglooContest(),e)}getIglooLikes(e,t){return this.request("igloo_likes",()=>this.adapter.getIglooLikesFor(e),t,n=>n.iglooId===e)}likeIgloo(e,t){return this.request("igloo_likes",()=>this.adapter.likeIglooById(e),t,n=>n.iglooId===e)}openIgloo(){this.adapter.openIglooRaw()}sendMail(e,t){this.adapter.sendMail(e,t)}marryRequest(e){this.adapter.marryRequest(e)}leaveWaddle(){this.adapter.leaveWaddle()}};var Me=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","remove_inventory","snowflake_state","get_pets","igloo_contest","igloo_likes","marry_request"]),G=class extends Le{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;_cppslol=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 R(this.adapter,this.request.bind(this))),this._cardJitsu}get cppslol(){return this._cppslol||(this._cppslol=new T(this.adapter,this.request.bind(this))),this._cppslol}constructor(e,t){super(),this.adapter=Z(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 i=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:i.message,occurredAt:Date.now()},this.reportLifecycle("disconnected")),i}}waitForInitialState(e){let t=e.timeouts?.initialStateMs??L.initialStateMs;return new Promise((n,r)=>{let i=!1,o,s=()=>{o!==void 0&&clearTimeout(o),this.off("load_player",c),this.off("join_room",c),this.off("kick",f),this.off("close_with_error",v),this.off("server_error",y),this.off("disconnect",C),e.signal?.removeEventListener("abort",g)},d=()=>{i||(i=!0,s(),n())},u=p=>{i||(i=!0,s(),r(p))},l=()=>{if(this.connectionFailure){u(this.connectionFailure);return}this.player!==null&&this.room!==null&&d()},c=()=>l(),f=({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"}`}))},y=({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}`:""}`}))},g=()=>{u(new a({category:"aborted",phase:"awaiting_initial_state",retryable:!0,message:"Initial state wait cancelled"}))};if(this.on("load_player",c),this.on("join_room",c),this.on("kick",f),this.on("close_with_error",v),this.on("server_error",y),this.on("disconnect",C),e.signal?.addEventListener("abort",g,{once:!0}),e.signal?.aborted){g();return}l(),!i&&(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 i=typeof t=="number"?{timeoutMs:t}:t,o=i?.timeoutMs??L.requestMs;return new Promise((s,d)=>{let u=!1,l,c=()=>{l!==void 0&&clearTimeout(l),this.off(e,f),this.off("disconnect",y),i?.signal?.removeEventListener("abort",C)},f=(g=>{u||r&&!r(g)||(u=!0,c(),s(g))}),v=g=>{u||(u=!0,c(),d(g))},y=g=>{v(new a({category:"disconnected",phase:"ready",retryable:!g?.intentional,message:`Disconnected while waiting for ${String(e)}${g?.reason?`: ${g.reason}`:""}`}))},C=()=>{v(new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled while waiting for ${String(e)}`}))};if(i?.signal?.aborted){C();return}if(Number.isFinite(o)&&(l=setTimeout(()=>{v(new a({category:"operation_timeout",phase:"ready",retryable:!0,message:`Timed out waiting for ${String(e)}`}))},o)),this.on(e,f),this.once("disconnect",y),i?.signal?.addEventListener("abort",C,{once:!0}),n)try{n()}catch(g){if(g instanceof a){v(g);return}v(new a({category:"transport_error",phase:"ready",retryable:!0,message:`Failed to send request for ${String(e)}`,cause:g}))}})}request(e,t,n,r){let i=this.requestTails.get(e),o=this.disconnectEpoch,s=()=>{},d=new Promise(c=>{s=c}),u=i?i.then(()=>d):d;return this.requestTails.set(e,u),(i?this.waitForRequestTurn(e,i,o,n?.signal).then(()=>this.waitForEvent(e,n,t,r)):this.waitForEvent(e,n,t,r)).finally(()=>{s(),u.finally(()=>{this.requestTails.get(e)===u&&this.requestTails.delete(e)})})}waitForRequestTurn(e,t,n,r){let i=()=>new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled before sending request for ${String(e)}`});return r?.aborted?Promise.reject(i()):new Promise((o,s)=>{let d=!1,u=()=>{r?.removeEventListener("abort",l)},l=()=>{d||(d=!0,u(),s(i()))};r?.addEventListener("abort",l,{once:!0}),t.then(()=>{if(!d){if(d=!0,u(),this.disconnectEpoch!==n){let c=this.lastDisconnectInfo;s(new a({category:"disconnected",phase:"ready",retryable:!c?.intentional,message:`Disconnected before sending request for ${String(e)}${c?.reason?`: ${c.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,i=>i.room===e)}addItem(e,t){return this.request("add_item",()=>this.adapter.addItem(e),t,n=>Number(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,i=>i.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,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let l=this.adapter.normalizeUser(u);this.users.set(l.id,l),d.push(l)}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,s=this.users.get(o);s&&(s.x=n.x,s.y=n.y);break}case"send_frame":{let o=n.id,s=this.users.get(o);s&&(s.frame=n.frame);break}case"join_igloo":{let o=n.igloo,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let l=this.adapter.normalizeUser(u);this.users.set(l.id,l),d.push(l)}r={...n,users:d},this.log?.("[join_igloo]",`igloo=${o}`,`users=${d.length}`);break}case"update_player":{let o=n.id,s=n.slot,d=Number(n.item),u=c=>{s in c?c[s]=d:(s in c.meta||this.adapter.id==="CPPS.lol")&&(c.meta[s]=d)},l=this.users.get(o);l&&u(l),this.player?.id===o&&this.player!==l&&u(this.player);break}case"walk_puffle":{let o=n.user,s=this.users.get(o);s&&(s.walking=n.puffle,s.meta.walkingPuffleType=n.type);break}case"stop_walking":{let o=n.user,s=this.users.get(o);s&&(s.walking=0,s.meta.walkingPuffleType=void 0);break}case"igloo_open_status":{let o=n.status;if(this.player){this.player.meta.iglooOpen=o;let s=this.users.get(this.player.id);s&&(s.meta.iglooOpen=o)}break}case"remove_inventory":{if(this.adapter.id!=="CPPS.lol"||!this.player)break;let o=Number(n.id);Number.isFinite(o)&&(this.player.inventory=this.player.inventory.filter(s=>s!==o));break}case"add_item":{if(this.adapter.id!=="CPJourney"&&this.adapter.id!=="CPPS.lol")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o);let s=Number(n.item);this.player&&Number.isFinite(s)&&!this.player.inventory.includes(s)&&this.player.inventory.push(s);break}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);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:{Me.has(t)||(this.log?.("[unknown_packet]",t,JSON.stringify(n)),this.emit("unknown_packet",{action:t,args:n}));break}}let i=t==="error"?"server_error":t;this.emit(i,r)}};export{M as BaseAdapter,R as CardJitsu,G as Client,a as ClientOperationError,T as Cppslol,L as DEFAULT_CLIENT_CONNECTION_TIMEOUTS,z as sanitizeClientErrorMessage};
2
2
  //# sourceMappingURL=index.js.map