most-box 0.2.6 → 0.2.8

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.
Files changed (116) hide show
  1. package/README.md +15 -1
  2. package/electron/main.js +30 -420
  3. package/electron/preload.js +1 -16
  4. package/electron/updateChecker.js +12 -30
  5. package/electron/updateChecker.test.js +14 -55
  6. package/out/admin/index.html +0 -0
  7. package/out/app/index.html +0 -0
  8. package/out/assets/{FilePreviewOverlay-DqH7uKb7.js → FilePreviewOverlay-D8H61qbp.js} +1 -1
  9. package/out/assets/LanguageToggle-CSQtRZ3A.js +1 -0
  10. package/out/assets/MarketingHeader-CrYsQsQ5.js +1 -0
  11. package/out/assets/MarketingLayout-CQurMOSD.js +1 -0
  12. package/out/assets/{MarketingThemeToggle-BLuQ_uE-.js → MarketingThemeToggle-CIKP8x9W.js} +1 -1
  13. package/out/assets/{MilkdownEditor-f2vRIY21.js → MilkdownEditor-DrsyaR4h.js} +1 -1
  14. package/out/assets/{OpenSidebarButton-BKX4B_yG.js → OpenSidebarButton-DnEgqP0S.js} +1 -1
  15. package/out/assets/{SidebarAccount-D6wj_ijc.js → SidebarAccount-B4OAl0as.js} +1 -1
  16. package/out/assets/SidebarHomeLink-BdsUM4Kt.js +1 -0
  17. package/out/assets/arrow-right-BU9c_SL4.js +1 -0
  18. package/out/assets/{circle-alert-Dyc-4wje.js → circle-alert-iuHzciph.js} +1 -1
  19. package/out/assets/{copy-D8HSH5Ki.js → copy-DEzFUzeX.js} +1 -1
  20. package/out/assets/{download-Q6jKMPIG.js → download-jEPn2njL.js} +1 -1
  21. package/out/assets/{downloadValidation-B-w8D_0W.js → downloadValidation-DbVOwdmC.js} +1 -1
  22. package/out/assets/{external-link-GQcZwDTT.js → external-link-BFaoZeK0.js} +1 -1
  23. package/out/assets/{file-text-CVl5SZPJ.js → file-text-DPA1riJ_.js} +1 -1
  24. package/out/assets/{folder-BtIdk-YN.js → folder-Cfgc70_F.js} +1 -1
  25. package/out/assets/{hard-drive-Cew_LD0N.js → hard-drive-Dar_AZEq.js} +1 -1
  26. package/out/assets/i18n-NjvOSuV6.js +1 -0
  27. package/out/assets/index-BZ-f0CZd.js +31 -0
  28. package/out/assets/index-Cde4g_dk.css +1 -0
  29. package/out/assets/index.lazy-B7AbDiMU.js +3 -0
  30. package/out/assets/{index.lazy-DujygWms.js → index.lazy-BsciBHf_.js} +1 -1
  31. package/out/assets/index.lazy-BxoGfWEW.js +1 -0
  32. package/out/assets/index.lazy-CKbrHko5.js +1 -0
  33. package/out/assets/index.lazy-CgKPe02l.js +1 -0
  34. package/out/assets/index.lazy-Citucq1G.js +1 -0
  35. package/out/assets/index.lazy-CvKEcWlH.js +2 -0
  36. package/out/assets/{index.lazy-WXDn5r_l.js → index.lazy-DB9Ht9LJ.js} +1 -1
  37. package/out/assets/index.lazy-DVeqmqaA.js +1 -0
  38. package/out/assets/index.lazy-hF807bh0.js +1 -0
  39. package/out/assets/index.lazy-oFaoa4qT.js +1 -0
  40. package/out/assets/index.lazy-rfgjFZNH.js +1 -0
  41. package/out/assets/index.lazy-zpQXhgmn.js +2 -0
  42. package/out/assets/{key-round-D1zfZzvP.js → key-round-DNcpSuMw.js} +1 -1
  43. package/out/assets/{loader-BSclU8WE.js → loader-BXQtdens.js} +1 -1
  44. package/out/assets/{lock-C9VP0ezG.js → lock-CLIE8cct.js} +1 -1
  45. package/out/assets/{message-square-Dg3YjjmO.js → message-square-Dp09WY1I.js} +1 -1
  46. package/out/assets/{mp-FQvFEcYM.js → mp-B6kdA94c.js} +1 -1
  47. package/out/assets/{music-BeCPak70.js → music-B19Tg557.js} +1 -1
  48. package/out/assets/{notebook-pen-DO1CJiqn.js → notebook-pen-C8TlK5sB.js} +1 -1
  49. package/out/assets/play-B-BjsTZz.js +1 -0
  50. package/out/assets/plus-4hygj-1Z.js +1 -0
  51. package/out/assets/{save-BVeMjaW1.js → save-BjrbPwhJ.js} +1 -1
  52. package/out/assets/search-DSkiWdvX.js +1 -0
  53. package/out/assets/{send-C1J-eGNs.js → send-BL4d5iOt.js} +1 -1
  54. package/out/assets/{shield-check-CZYDVJoh.js → shield-check-DzDuWO8r.js} +1 -1
  55. package/out/assets/smartphone-tRRFFO0a.js +1 -0
  56. package/out/assets/{trash-2-C_LtCiNh.js → trash-2-V12tJ8lI.js} +1 -1
  57. package/out/assets/triangle-alert-DGWc8ZHu.js +1 -0
  58. package/out/assets/{ui-PnUvY9zL.js → ui-BpDGD3IR.js} +2 -2
  59. package/out/assets/{upload-DgxxldtV.js → upload-CoCptKya.js} +1 -1
  60. package/out/assets/{useChannelMessages-CZHmH5n-.js → useChannelMessages-B6RMaNDH.js} +1 -1
  61. package/out/assets/useGameRoom-CRJL0kcm.js +1 -0
  62. package/out/assets/userProfile-DBkH4s29.js +1 -0
  63. package/out/assets/{wallet-DBTWBi6K.js → wallet-T7ONZ3Kg.js} +1 -1
  64. package/out/assets/{wifi-pP6SJLcu.js → wifi-Bgo8eHY0.js} +1 -1
  65. package/out/chat/index.html +0 -0
  66. package/out/chat/join/index.html +0 -0
  67. package/out/download/index.html +2 -2
  68. package/out/game/gandengyan/index.html +0 -0
  69. package/out/game/index.html +0 -0
  70. package/out/game/zhajinhua/index.html +0 -0
  71. package/out/index.html +2 -2
  72. package/out/note/index.html +0 -0
  73. package/out/ping/index.html +2 -2
  74. package/out/profile/index.html +0 -0
  75. package/out/web3/index.html +0 -0
  76. package/package.json +5 -8
  77. package/server/src/core/channelIdentity.js +3 -5
  78. package/server/src/core/gameRoom.js +18 -43
  79. package/server/src/core/ownerMetadata.js +3 -4
  80. package/server/src/core/releaseManifest.js +91 -0
  81. package/server/src/core/shared.js +50 -0
  82. package/server/src/core/zhajinhua.js +12 -33
  83. package/server/src/games/gandengyan.js +7 -14
  84. package/server/src/http/nodeStatus.js +0 -6
  85. package/server/src/http/routes/channelRoutes.js +1 -13
  86. package/server/src/http/routes/nodeRoutes.js +1 -1
  87. package/server/src/index.js +44 -298
  88. package/server/src/utils/api.js +47 -0
  89. package/server/src/utils/auth.js +2 -5
  90. package/server/src/utils/dateTime.js +1 -3
  91. package/out/assets/LanguageToggle-BoBNesNU.js +0 -1
  92. package/out/assets/MarketingHeader-Derv67Vs.js +0 -1
  93. package/out/assets/MarketingLayout-fc2mymJm.js +0 -1
  94. package/out/assets/SidebarHomeLink-ByOHwlH8.js +0 -1
  95. package/out/assets/arrow-right-BCi9KXDX.js +0 -1
  96. package/out/assets/cloud-DfaFxhLj.js +0 -1
  97. package/out/assets/i18n--maTEG0d.js +0 -1
  98. package/out/assets/index-B2-kpfu5.css +0 -1
  99. package/out/assets/index-Cg4kEvx8.js +0 -31
  100. package/out/assets/index.lazy-BAq__8ON.js +0 -2
  101. package/out/assets/index.lazy-BPh8D_H9.js +0 -1
  102. package/out/assets/index.lazy-Bn4kDToA.js +0 -1
  103. package/out/assets/index.lazy-BqHgW5fE.js +0 -1
  104. package/out/assets/index.lazy-CLYRM_kh.js +0 -1
  105. package/out/assets/index.lazy-CMSCQucz.js +0 -1
  106. package/out/assets/index.lazy-Cut4XkPH.js +0 -1
  107. package/out/assets/index.lazy-DKOSJyaQ.js +0 -2
  108. package/out/assets/index.lazy-DjPbRI_L.js +0 -1
  109. package/out/assets/index.lazy-DxAGUwlf.js +0 -3
  110. package/out/assets/index.lazy-ghLI7p1x.js +0 -1
  111. package/out/assets/play-CnhsLC5C.js +0 -1
  112. package/out/assets/plus-BpjwXzbO.js +0 -1
  113. package/out/assets/search-CsAnnJyH.js +0 -1
  114. package/out/assets/triangle-alert-DOwc-41Y.js +0 -1
  115. package/out/assets/useGameRoom-B8Ds_PKe.js +0 -1
  116. package/out/assets/userProfile-CRGZ8PUF.js +0 -1
@@ -1 +0,0 @@
1
- import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{E as r,c as i,w as a}from"./ui-PnUvY9zL.js";import{a as o}from"./i18n--maTEG0d.js";import{a as s,r as c}from"./LanguageToggle-BoBNesNU.js";import{t as ee}from"./copy-D8HSH5Ki.js";import{n as te}from"./SidebarHomeLink-ByOHwlH8.js";import{t as ne}from"./play-CnhsLC5C.js";import{t as re}from"./send-C1J-eGNs.js";import{i as ie,n as ae,r as oe,t as se}from"./useGameRoom-B8Ds_PKe.js";import{c as l,i as u}from"./index-Cg4kEvx8.js";var ce=a(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),d=t(e(),1),f=[`S`,`H`,`C`,`D`],p=[`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`J`,`Q`,`K`,`A`,`2`],m=p.filter(e=>e!==`2`),h=new Map(p.map((e,t)=>[e,t+3])),le=5,g=20,_=1e3;function ue({roomCode:e,ownerAddress:t,ownerName:n,players:r=[],random:i=Math.random}){let a=T(r);return a.some(e=>e.address===K(t))||a.unshift({address:K(t),name:q(n),avatar:``}),v({id:String(e||``).toUpperCase(),ownerAddress:K(t),status:`lobby`,seq:1,players:a.slice(0,6).map((e,t)=>({address:e.address,name:q(e.name),avatar:J(e.avatar),seat:t,hand:[],handCount:0,score:_,playedCards:0})),deck:[],discard:[],table:null,currentSeat:0,lastWinnerSeat:null,previousWinnerSeat:null,passSeats:[],baseScore:1,bombCount:0,diceRolls:[],roundResult:null,log:[`房间已创建`],winnerSeat:null,random:i})}function de(e,t=[]){let n=y(e);if(!n||n.status!==`lobby`)return n;let r=new Map(n.players.map(e=>[e.address,e.score]));return n.players=T(t).slice(0,6).map((e,t)=>({address:e.address,name:q(e.name),avatar:J(e.avatar),seat:t,hand:[],handCount:0,score:r.get(e.address)??_,playedCards:0})),n.seq+=1,v(n)}function fe(e,t=Math.random){let n=y(e);if(!n||n.players.length<2)throw Error(`至少需要 2 名玩家`);n.deck=M(j(),t),n.discard=[],n.table=null,n.passSeats=[],n.winnerSeat=null,n.roundResult=null,n.baseScore=1,n.bombCount=0,n.status=`playing`;for(let e of L(n))e.hand=N(n,le),e.handCount=e.hand.length,e.playedCards=0,P(e.hand);let r=O(n,t);return n.currentSeat=r.seat,n.lastWinnerSeat=null,n.log=[`新一局开始,${r.name} 先出牌`],n.diceRolls.length>0&&n.log.unshift(`骰子结果:${n.diceRolls.map(e=>`${e.name} ${e.value}`).join(`,`)}`),n.seq+=1,v(n)}function pe(e,t,n){let r=y(e),i=F(r),a=K(t);if(!i||i.address!==a)return{ok:!1,error:`还没轮到你`,state:v(r)};let o=n.map(e=>i.hand.find(t=>t.id===e));if(o.length===0||o.some(e=>!e))return{ok:!1,error:`手牌不存在`,state:v(r)};let s=ge(o);return s?w(s,r.table?.combo)?(o.sort(V),i.hand=i.hand.filter(e=>!n.includes(e.id)),i.handCount=i.hand.length,i.playedCards+=o.length,r.discard.push(...o),r.table={seat:i.seat,playerName:i.name,cards:o,combo:s},r.passSeats=[],r.lastWinnerSeat=i.seat,s.type===`bomb`&&(r.bombCount+=1,r.baseScore*=2),r.log.unshift(`${i.name} 出 ${s.label} ${o.map(G).join(` `)}${s.type===`bomb`?`,底分 ${r.baseScore}`:``}`),i.hand.length===0?k(r,i):R(r),r.seq+=1,{ok:!0,state:v(r)}):{ok:!1,error:`出的牌压不过上一手`,state:v(r)}:{ok:!1,error:`这个牌型不合法`,state:v(r)}}function me(e,t){let n=y(e),r=F(n),i=K(t);return!r||r.address!==i?{ok:!1,error:`还没轮到你`,state:v(n)}:n.table?(n.passSeats.includes(r.seat)||n.passSeats.push(r.seat),n.log.unshift(`${r.name} 不要`),I(n).map(e=>e.seat).filter(e=>e!==n.lastWinnerSeat).every(e=>n.passSeats.includes(e))?(A(n),n.currentSeat=n.lastWinnerSeat,n.table=null,n.passSeats=[],n.log.unshift(`本轮结束,所有玩家各补 1 张,重新领出`)):R(n),n.seq+=1,{ok:!0,state:v(n)}):{ok:!1,error:`领出时不能不要`,state:v(n)}}function he(e,t){let n=y(e);if(!n)return null;let r=K(t),i=n.players.findIndex(e=>e.address===r);if(i===-1)return v(n);let a=n.players[i],o=n.currentSeat===a.seat,s=n.lastWinnerSeat===a.seat;n.players.splice(i,1),n.passSeats=n.passSeats.filter(e=>e!==a.seat),n.log.unshift(`${a.name} 已退出房间`);let c=L(n);if(n.status===`playing`)if(c.length<=1)c.length===1?k(n,c[0]):(n.status=`finished`,n.log.unshift(`玩家不足,本局结束`));else{if(o){let e=I(n);if(e.length>0){let t=e.findIndex(e=>e.seat>a.seat);n.currentSeat=e[t>=0?t:0].seat}}s&&n.table&&(n.table=null,n.passSeats=[])}return n.seq+=1,v(n)}function v(e){return e?{id:e.id,ownerAddress:e.ownerAddress,status:e.status,seq:Number(e.seq||1),deck:Array.isArray(e.deck)?e.deck.map(W):[],deckCount:e.deck?.length||Number(e.deckCount||0),discard:Array.isArray(e.discard)?e.discard.map(W):[],discardCount:e.discard?.length||Number(e.discardCount||0),currentSeat:Number(e.currentSeat||0),lastWinnerSeat:e.lastWinnerSeat===null||e.lastWinnerSeat===void 0?null:Number(e.lastWinnerSeat),previousWinnerSeat:e.previousWinnerSeat===null||e.previousWinnerSeat===void 0?null:Number(e.previousWinnerSeat),baseScore:Number(e.baseScore||1),bombCount:Number(e.bombCount||0),diceRolls:Array.isArray(e.diceRolls)?e.diceRolls:[],roundResult:e.roundResult||null,table:e.table?{...e.table,cards:e.table.cards.map(W)}:null,passSeats:Array.isArray(e.passSeats)?e.passSeats:[],winnerSeat:e.winnerSeat===null||e.winnerSeat===void 0?null:Number(e.winnerSeat),log:Array.isArray(e.log)?e.log.slice(0,18):[],players:L(e).map(e=>({address:e.address,name:e.name,avatar:J(e.avatar),seat:e.seat,handCount:e.hand?.length??e.handCount??0,score:Number(e.score??_),playedCards:Number(e.playedCards||0),hand:Array.isArray(e.hand)?e.hand.map(W):[]}))}:null}function y(e){return!e||typeof e!=`object`?null:{id:String(e.id||``).toUpperCase(),ownerAddress:K(e.ownerAddress),status:e.status===`playing`||e.status===`finished`?e.status:`lobby`,seq:Number(e.seq||1),players:Array.isArray(e.players)?e.players.map(E).filter(Boolean):[],deck:Array.isArray(e.deck)?e.deck.map(ve).filter(Boolean):[],discard:Array.isArray(e.discard)?e.discard.map(D).filter(Boolean):[],table:e.table&&typeof e.table==`object`?{...e.table,cards:Array.isArray(e.table.cards)?e.table.cards.map(D).filter(Boolean):[]}:null,currentSeat:Number(e.currentSeat||0),lastWinnerSeat:e.lastWinnerSeat===null||e.lastWinnerSeat===void 0?null:Number(e.lastWinnerSeat),previousWinnerSeat:e.previousWinnerSeat===null||e.previousWinnerSeat===void 0?null:Number(e.previousWinnerSeat),passSeats:Array.isArray(e.passSeats)?e.passSeats.map(Number):[],baseScore:Number(e.baseScore||1),bombCount:Number(e.bombCount||0),diceRolls:Array.isArray(e.diceRolls)?e.diceRolls:[],roundResult:e.roundResult||null,log:Array.isArray(e.log)?e.log.map(String):[],winnerSeat:e.winnerSeat===null||e.winnerSeat===void 0?null:Number(e.winnerSeat)}}function ge(e){if(!e?.length)return null;e=[...e].sort(V);let t=e.filter(U).length,n=e.filter(e=>!U(e));if(n.length===0)return null;let r=b(e,n,t);if(r)return r;if(e.length===1&&t===0)return C(`single`,H(e[0]),1,[H(e[0])]);if(e.length===2&&z(n,t)){let e=B(n);return C(`pair`,e,2,[e,e])}return x(e)||S(e)}function b(e,t,n){if(e.length<3||!z(t,n))return null;let r=B(t);return C(`bomb`,r,e.length,Array(e.length).fill(r),n===0)}function x(e){if(e.length<3)return null;let t=e.filter(U).length,n=e.filter(e=>!U(e));for(let r=0;r<=m.length-e.length;r+=1){let i=m.slice(r,r+e.length).map(e=>h.get(e)),a=[...i],o=0;for(let e of n){let t=a.indexOf(H(e));t!==-1&&(a.splice(t,1),o+=1)}if(o+t===e.length&&a.length===t)return C(`straight`,i.at(-1),e.length,i)}return null}function S(e){if(e.length<4||e.length%2!=0)return null;let t=e.length/2,n=e.filter(U).length,r=e.filter(e=>!U(e));for(let i=0;i<=m.length-t;i+=1){let a=m.slice(i,i+t).map(e=>h.get(e)),o=a.flatMap(e=>[e,e]),s=0;for(let e of r){let t=o.indexOf(H(e));t!==-1&&(o.splice(t,1),s+=1)}if(s+n===e.length&&o.length===n){let t=a.flatMap(e=>[e,e]);return C(`pairStraight`,a.at(-1),e.length,t)}}return null}function C(e,t,n,r,i=!0){return{type:e,value:t,length:n,resolvedValues:r,pure:i,label:xe({type:e,value:t,length:n,resolvedValues:r,pure:i})}}function w(e,t){return e?!t||e.type===`bomb`&&t.type!==`bomb`?!0:e.type===t.type?e.type===`bomb`?e.length===t.length?e.value===t.value?e.pure&&!t.pure:e.value>t.value:e.length>t.length:e.length===t.length?e.type===`single`||e.type===`pair`?e.value===Ce(t.value)||e.value===h.get(`2`)&&t.value!==h.get(`2`):e.value===Ce(t.value):!1:!1:!1}function T(e){let t=new Set;return e.map(e=>({address:K(e.address),name:q(e.name),avatar:J(e.avatar),publicKey:String(e.publicKey||``)})).filter(e=>!e.address||t.has(e.address)?!1:(t.add(e.address),!0))}function E(e){let t=K(e.address);return t?{address:t,name:q(e.name),avatar:J(e.avatar),seat:Number(e.seat||0),hand:Array.isArray(e.hand)?e.hand.map(D).filter(Boolean):[],handCount:Number(e.handCount||0),score:Number(e.score??_),playedCards:Number(e.playedCards||0)}:null}function D(e){if(!e||typeof e!=`object`)return null;let t=String(e.rank||``),n=String(e.suit||``);return!h.has(t)&&t!==`SJ`&&t!==`BJ`||!f.includes(n)&&n!==`Joker`?null:{id:String(e.id||`${n}-${t}`),suit:n,rank:t,label:e.label||G({suit:n,rank:t}),color:e.color||be({suit:n,rank:t})}}function O(e,t){if(e.previousWinnerSeat!==null)return e.diceRolls=[],L(e).find(t=>t.seat===e.previousWinnerSeat)||L(e)[0];let n=L(e),r=[];for(;n.length>1;){r=n.map(e=>({seat:e.seat,name:e.name,value:we(t)}));let i=Math.max(...r.map(e=>e.value)),a=r.filter(e=>e.value===i);if(a.length===1)return e.diceRolls=r,n.find(e=>e.seat===a[0].seat);n=n.filter(e=>a.some(t=>t.seat===e.seat))}return e.diceRolls=r,n[0]}function k(e,t){e.status=`finished`,e.winnerSeat=t.seat,e.previousWinnerSeat=t.seat;let n=[],r=0;for(let i of L(e)){if(i.seat===t.seat)continue;let a=i.playedCards===0,o=a?g:i.hand.length*e.baseScore*.5;i.score-=o,r+=o,n.push({seat:i.seat,name:i.name,loss:o,sealed:a,cardsLeft:i.hand.length})}t.score+=r,e.roundResult={winnerSeat:t.seat,winnerName:t.name,winnerGain:r,baseScore:e.baseScore,bombCount:e.bombCount,losers:n},e.log.unshift(`${t.name} 获胜,赢 ${r} 分`)}function A(e){for(let t of I(e)){if(e.deck.length===0)break;t.hand.push(...N(e,1)),t.handCount=t.hand.length,P(t.hand)}}function j(){let e=[];for(let t of f)for(let n of p)e.push({id:`${t}-${n}`,suit:t,rank:n});return e.push({id:`SJ`,suit:`Joker`,rank:`SJ`}),e.push({id:`BJ`,suit:`Joker`,rank:`BJ`}),e.map(W)}function M(e,t){let n=[...e];for(let e=n.length-1;e>0;--e){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}function N(e,t){return e.deck.splice(0,t)}function P(e){e.sort(V)}function F(e){return e.players.find(t=>t.seat===e.currentSeat)}function I(e){return L(e).filter(e=>e.hand.length>0)}function L(e){return[...e?.players||[]].sort((e,t)=>e.seat-t.seat)}function R(e){let t=I(e).map(e=>e.seat);e.currentSeat=t[(t.indexOf(e.currentSeat)+1)%t.length]}function z(e,t=0){if(e.length===0)return!1;let n=e[0].rank;return e.every(e=>e.rank===n)&&e.length+t>=2}function B(e){return H(e[0])}function V(e,t){return H(e)-H(t)||_e(e.suit)-_e(t.suit)}function H(e){return h.get(e.rank)||99}function U(e){return e.rank===`SJ`||e.rank===`BJ`}function _e(e){return{D:0,C:1,H:2,S:3,Joker:4}[e]||0}function ve(e){if(typeof e==`string`){let[t,n]=e.split(`-`);return D({id:e,suit:t,rank:n})}return D(e)}function W(e){return{id:e.id,suit:e.suit,rank:e.rank,label:G(e),color:be(e)}}function G(e){return e.rank===`SJ`?`小王`:e.rank===`BJ`?`大王`:`${ye(e.suit)}${e.rank}`}function ye(e){return{S:`♠`,H:`♥`,C:`♣`,D:`♦`}[e]||``}function be(e){return e.suit===`H`||e.suit===`D`||e.rank===`BJ`?`red`:`black`}function xe(e){let t=e.resolvedValues?.length?`(${e.resolvedValues.map(Se).join(` `)})`:``;return`${{single:`单张`,pair:`对子`,straight:`顺子`,pairStraight:`连对`,bomb:e.pure?`纯炸弹`:`带王炸弹`}[e.type]}${t}`}function Se(e){return p.find(t=>h.get(t)===e)||String(e)}function Ce(e){let t=p.findIndex(t=>h.get(t)===e);return t===-1||t>=p.length-1?null:h.get(p[t+1])}function we(e){return Math.floor(e()*6)+1}function K(e){let t=String(e||``).trim();return/^0x[a-fA-F0-9]{40}$/.test(t)?t.toLowerCase():``}function q(e){return String(e||`玩家`).trim().slice(0,16)||`玩家`}function J(e){return String(e||``).trim().slice(0,4096)}var Y={page:`_page_p7qf6_1`,headerActions:`_headerActions_p7qf6_7`,entry:`_entry_p7qf6_13`,entryBrand:`_entryBrand_p7qf6_23`,cardMark:`_cardMark_p7qf6_29`,entryPanel:`_entryPanel_p7qf6_59`,panel:`_panel_p7qf6_60`,handPanel:`_handPanel_p7qf6_61`,accountLine:`_accountLine_p7qf6_74`,scoreMeta:`_scoreMeta_p7qf6_75`,roomBar:`_roomBar_p7qf6_76`,badges:`_badges_p7qf6_77`,actions:`_actions_p7qf6_78`,joinForm:`_joinForm_p7qf6_98`,status:`_status_p7qf6_119`,gameGrid:`_gameGrid_p7qf6_125`,tablePanel:`_tablePanel_p7qf6_136`,seats:`_seats_p7qf6_170`,player:`_player_p7qf6_176`,active:`_active_p7qf6_193`,winner:`_winner_p7qf6_197`,avatar:`_avatar_p7qf6_201`,centerTable:`_centerTable_p7qf6_235`,deckBox:`_deckBox_p7qf6_242`,playedBox:`_playedBox_p7qf6_243`,playedCards:`_playedCards_p7qf6_271`,notice:`_notice_p7qf6_279`,resultDetail:`_resultDetail_p7qf6_287`,sidePanel:`_sidePanel_p7qf6_298`,scoreRow:`_scoreRow_p7qf6_323`,logPanel:`_logPanel_p7qf6_331`,hand:`_hand_p7qf6_61`,cardButton:`_cardButton_p7qf6_358`,picked:`_picked_p7qf6_368`,card:`_card_p7qf6_29`,red:`_red_p7qf6_399`,black:`_black_p7qf6_403`,small:`_small_p7qf6_407`,preview:`_preview_p7qf6_425`,valid:`_valid_p7qf6_448`},X=n(),Z=`gandengyan`;function Q(...e){return e.filter(Boolean).join(` `)}function Te(e,t){return String(e||``).toLowerCase()===String(t||``).toLowerCase()}function Ee(e,t){if(typeof window>`u`||!(`speechSynthesis`in window)||!e)return;window.speechSynthesis.cancel();let n=new SpeechSynthesisUtterance(e);n.lang=t,n.rate=1.1,window.speechSynthesis.speak(n)}function De(){let{t:e,locale:t}=o(),n=l(e=>e.isDarkMode),r=l(e=>e.setIsDarkMode),a=l(e=>e.addToast),u=i(e=>e.initializeUser),[f,p]=(0,d.useState)(``),[m,h]=(0,d.useState)([]),[le,g]=(0,d.useState)(!1),_=(0,d.useRef)(``),v=(0,d.useRef)(!1),y=se({gameId:Z,onError:e=>a(e,`error`)});(0,d.useEffect)(()=>{u()},[u]),(0,d.useEffect)(()=>{let e=new URLSearchParams(window.location.search).get(`room`)?.toUpperCase();e&&(p(e),_.current=e)},[]),(0,d.useEffect)(()=>{let t=_.current;!t||v.current||!y.isBackendReady||!y.userIdentity||(v.current=!0,_.current=``,y.joinRoom(t).then(t=>{t&&a(e(`game.toast.joinedRoom`),`success`)}))},[y.isBackendReady,y.userIdentity,y.joinRoom,a,e]),(0,d.useEffect)(()=>{if(!y.roomCode)return;let e=`/game/gandengyan?room=${y.roomCode}`;`${window.location.pathname}${window.location.search}`!==e&&window.history.replaceState(null,``,e)},[y.roomCode]);let b=(0,d.useMemo)(()=>ae(y.messages,y.roomCode?{gameId:Z,roomCode:y.roomCode}:{gameId:Z}),[y.messages,y.roomCode]),x=(0,d.useMemo)(()=>oe(y.messages,{gameId:Z,roomCode:y.roomCode}),[y.messages,y.roomCode]),S=x?.payload?.state,C=S?.players.find(e=>Te(e.address,y.userIdentity?.address)),w=Te(S?.ownerAddress||b.hostAddress,y.userIdentity?.address),T=S?.status===`playing`&&S.currentSeat===C?.seat,E=(0,d.useMemo)(()=>m.map(e=>C?.hand.find(t=>t.id===e)).filter(Boolean),[m,C]),D=(0,d.useMemo)(()=>ge(E),[E]),O=y.roomCode&&typeof window<`u`?`${window.location.origin}/game/gandengyan?room=${y.roomCode}`:``,k=(0,d.useRef)(-1),A=(0,d.useRef)(!1);(0,d.useEffect)(()=>{h([])},[S?.seq]),(0,d.useEffect)(()=>{if(!S)return;let n=S.seq;if(k.current<0){k.current=n;return}if(n!==k.current&&(k.current=n,S.status!==`finished`&&(A.current=!1),S.status===`finished`&&S.winnerSeat!==null)){A.current||(A.current=!0,Ee(e(`game.gandengyan.speech.gameOver`),t));return}},[t,S?.seq,e]),(0,d.useEffect)(()=>{if(!w||!y.roomCode||!y.userIdentity||x||b.players.length===0)return;let e=ue({roomCode:y.roomCode,ownerAddress:y.userIdentity.address,ownerName:y.userIdentity.displayName||y.userIdentity.username,players:b.players});y.sendRoomEvent(`room:state`,{state:e,seq:e.seq})},[y,w,x,b.players]),(0,d.useEffect)(()=>{if(!S||!w||S.status!==`lobby`)return;let e=de(S,b.players);e&&e.players.length!==S.players.length&&y.sendRoomEvent(`room:state`,{state:e,seq:e.seq})},[y,w,b.players,S]);let j=(0,d.useRef)(0),M=(0,d.useMemo)(()=>y.roomEvents.filter(e=>e.event?.event===`player:leave`),[y.roomEvents]);(0,d.useEffect)(()=>{if(M.length<=j.current)return;let t=M.slice(j.current);j.current=M.length;for(let n of t)a(e(`game.toast.playerLeft`,{player:n.event?.payload?.player?.name||e(`game.player`)}),`info`)},[M,a,e]),(0,d.useEffect)(()=>{if(!S||!w||S.status!==`playing`)return;let e=new Set(b.players.map(e=>e.address.toLowerCase())),t=S.players.find(t=>!e.has(t.address.toLowerCase()));if(!t)return;let n=he(S,t.address);n&&I(n)},[y,w,b.players,S]);async function N(){await y.createRoom()&&a(e(`game.toast.roomCreated`),`success`)}async function P(t){t.preventDefault(),await y.joinRoom(f)&&a(e(`game.toast.joinedRoom`),`success`)}async function F(){O&&(await navigator.clipboard.writeText(O),g(!0),setTimeout(()=>g(!1),1400))}async function I(e){await y.sendRoomEvent(`room:state`,{state:e,seq:e.seq})}async function L(){if(!(!S||!w))try{await I(fe(S))}catch(t){a(t instanceof Error?t.message:e(`game.zhajinhua.error.startFailed`),`error`)}}async function R(){await L()}async function z(){if(!S||!y.userIdentity)return;let t=pe(S,y.userIdentity.address,m);if(!t.ok){a(t.error||e(`game.gandengyan.error.playFailed`),`error`);return}await I(t.state)}async function B(){if(!S||!y.userIdentity)return;let t=me(S,y.userIdentity.address);if(!t.ok){a(t.error||e(`game.gandengyan.error.actionFailed`),`error`);return}await I(t.state)}function V(e){h(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}return(0,X.jsx)(te,{sidebar:({closeSidebar:e})=>(0,X.jsx)(ie,{activeGame:`gandengyan`,closeSidebar:e}),headerTitle:(0,X.jsx)(`h2`,{className:`header-title`,children:e(`game.gandengyan.title`)}),headerRight:(0,X.jsxs)(`div`,{className:Y.headerActions,children:[S&&(0,X.jsxs)(`button`,{className:`btn btn-sm`,onClick:F,children:[(0,X.jsx)(ee,{size:14}),e(le?`common.copied`:`game.action.shareRoom`)]}),(0,X.jsx)(`button`,{className:`btn btn-icon`,onClick:()=>r(!n),title:e(`common.theme.toggle`),children:n?(0,X.jsx)(c,{size:16}):(0,X.jsx)(s,{size:16})})]}),children:(0,X.jsx)(`main`,{className:Y.page,children:S?(0,X.jsxs)(`section`,{className:Y.gameGrid,children:[(0,X.jsxs)(`div`,{className:Y.tablePanel,children:[(0,X.jsxs)(`div`,{className:Y.roomBar,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`strong`,{translate:`no`,children:e(`game.roomLabel`,{room:S.id})}),(0,X.jsx)(`span`,{children:S.status===`lobby`?e(`game.status.waitingStart`):S.status===`finished`?e(`game.status.finished`):e(`game.status.playing`)})]}),(0,X.jsx)(`div`,{className:Y.badges,children:(0,X.jsx)(`span`,{children:y.connected?e(`game.status.online`):e(`game.status.offline`)})})]}),(0,X.jsx)(`div`,{className:Y.seats,children:S.players.map(t=>(0,X.jsx)(Oe,{player:t,active:S.currentSeat===t.seat,winner:S.winnerSeat===t.seat,relation:ke(C,t,S.players.length,e)},t.seat))}),(0,X.jsxs)(`div`,{className:Y.centerTable,children:[(0,X.jsxs)(`div`,{className:Y.deckBox,children:[(0,X.jsx)(`span`,{children:e(`game.gandengyan.deck`)}),(0,X.jsx)(`strong`,{children:S.deckCount})]}),(0,X.jsx)(`div`,{className:Y.playedBox,children:S.table?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`strong`,{children:e(`game.gandengyan.tablePlay`,{player:S.table.playerName,combo:S.table.combo?.label||e(`game.card`)})}),(0,X.jsx)(`div`,{className:Y.playedCards,children:S.table.cards.map(e=>(0,X.jsx)($,{card:e,small:!0},e.id))})]}):(0,X.jsx)(`span`,{children:e(`game.gandengyan.waitingLead`)})}),(0,X.jsxs)(`div`,{className:Y.deckBox,children:[(0,X.jsx)(`span`,{children:e(`game.gandengyan.baseScore`)}),(0,X.jsx)(`strong`,{children:S.baseScore})]})]}),(0,X.jsx)(`div`,{className:Y.notice,children:S.status===`finished`?S.roundResult?(0,X.jsxs)(`div`,{className:Y.resultDetail,children:[(0,X.jsxs)(`p`,{children:[e(`game.gandengyan.result.winnerGain`,{player:S.roundResult.winnerName,score:S.roundResult.winnerGain}),S.roundResult.bombCount>0&&e(`game.gandengyan.result.bombCount`,{count:S.roundResult.bombCount})]}),S.roundResult.losers.map(t=>(0,X.jsx)(`p`,{children:t.sealed?e(`game.gandengyan.result.sealedLoss`,{player:t.name,loss:20}):e(`game.gandengyan.result.cardsLeftLoss`,{player:t.name,cards:t.cardsLeft,loss:t.loss})},t.seat))]}):e(`game.gandengyan.result.winner`,{player:S.players.find(e=>e.seat===S.winnerSeat)?.name||e(`game.player`)}):T?e(`game.gandengyan.status.yourTurn`):e(`game.zhajinhua.status.waitingPlayer`,{player:S.players.find(e=>e.seat===S.currentSeat)?.name||e(`game.player`)})})]}),(0,X.jsxs)(`aside`,{className:Y.sidePanel,children:[(0,X.jsxs)(`section`,{className:Y.panel,children:[(0,X.jsx)(`h3`,{children:e(`game.gandengyan.roundPanel`)}),w&&S.status===`lobby`&&(0,X.jsxs)(`button`,{className:`btn btn-primary`,disabled:S.players.length<2,onClick:L,children:[(0,X.jsx)(ne,{size:16}),e(`game.action.startRound`)]}),w&&S.status===`finished`&&(0,X.jsxs)(`button`,{className:`btn btn-primary`,onClick:R,children:[(0,X.jsx)(ce,{size:16}),e(`game.action.nextRound`)]}),!w&&(0,X.jsx)(`p`,{className:Y.status,children:e(`game.waitingHost`)})]}),(0,X.jsxs)(`section`,{className:Y.panel,children:[(0,X.jsx)(`h3`,{children:e(`game.gandengyan.score`)}),(0,X.jsxs)(`div`,{className:Y.scoreMeta,children:[(0,X.jsx)(`span`,{children:e(`game.gandengyan.bombCount`,{count:S.bombCount})}),(0,X.jsx)(`span`,{children:e(`game.gandengyan.discardCount`,{count:S.discardCount})})]}),S.players.map(e=>(0,X.jsxs)(`div`,{className:Y.scoreRow,children:[(0,X.jsx)(`span`,{translate:`no`,children:e.name}),(0,X.jsx)(`strong`,{children:e.score})]},e.seat))]}),(0,X.jsxs)(`section`,{className:Q(Y.panel,Y.logPanel),children:[(0,X.jsx)(`h3`,{children:e(`game.gandengyan.log`)}),S.log.map((e,t)=>(0,X.jsx)(`p`,{translate:`no`,children:e},`${e}-${t}`))]})]}),(0,X.jsxs)(`div`,{className:Y.handPanel,children:[(0,X.jsx)(Oe,{player:C,active:T,winner:S.winnerSeat===C?.seat}),(0,X.jsx)(`div`,{className:Y.hand,children:C?.hand.map(e=>(0,X.jsx)(`button`,{className:Q(Y.cardButton,m.includes(e.id)&&Y.picked),onClick:()=>V(e.id),children:(0,X.jsx)($,{card:e})},e.id))}),(0,X.jsxs)(`div`,{className:Y.actions,children:[(0,X.jsxs)(`div`,{className:Q(Y.preview,D&&Y.valid),children:[(0,X.jsx)(`strong`,{children:D?D.label:m.length?e(`game.gandengyan.invalidCombo`):e(`game.gandengyan.selectCards`)}),(0,X.jsx)(`span`,{children:E.map(e=>e.label).join(` `)||e(`game.gandengyan.jokerOrderHint`)})]}),(0,X.jsxs)(`button`,{className:`btn btn-primary`,disabled:!T||m.length===0||!D,onClick:z,children:[(0,X.jsx)(re,{size:16}),e(`game.gandengyan.action.play`)]}),(0,X.jsx)(`button`,{className:`btn`,disabled:!T||!S.table,onClick:B,children:e(`game.gandengyan.action.pass`)})]})]})]}):(0,X.jsxs)(`section`,{className:Y.entry,children:[(0,X.jsxs)(`div`,{className:Y.entryBrand,children:[(0,X.jsx)(`div`,{className:Y.cardMark,children:e(`game.gandengyan.mark`)}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h1`,{children:e(`game.gandengyan.hero.title`)}),(0,X.jsx)(`p`,{children:e(`game.hero.desc`)})]})]}),(0,X.jsxs)(`div`,{className:Y.entryPanel,children:[(0,X.jsxs)(`div`,{className:Y.accountLine,children:[(0,X.jsx)(`span`,{children:e(`game.currentAccount`)}),(0,X.jsx)(`strong`,{translate:`no`,children:y.userIdentity?.displayName||e(`web3.notSignedIn`)})]}),(0,X.jsxs)(`button`,{className:`btn btn-primary`,disabled:y.joining,onClick:N,children:[(0,X.jsx)(ne,{size:16}),e(`game.action.createRoom`)]}),(0,X.jsxs)(`form`,{onSubmit:P,className:Y.joinForm,children:[(0,X.jsxs)(`label`,{children:[e(`game.roomCode`),(0,X.jsx)(`input`,{value:f,maxLength:8,onChange:e=>p(e.target.value.toUpperCase()),placeholder:e(`game.roomCode.placeholder`)})]}),(0,X.jsx)(`button`,{className:`btn`,disabled:y.joining||!f,children:e(`game.action.joinRoom`)})]}),(0,X.jsx)(`p`,{className:Y.status,children:y.isBackendReady?e(`game.status.nodeConnected`):e(`game.status.nodeConnecting`)})]})]})})})}function Oe({player:e,active:t,winner:n,relation:r=``}){let{t:i}=o();return e?(0,X.jsxs)(`div`,{className:Q(Y.player,t&&Y.active,n&&Y.winner),children:[(0,X.jsx)(`div`,{className:Y.avatar,translate:`no`,children:(0,X.jsx)(`img`,{src:u(e.address,e.avatar),alt:``})}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`strong`,{translate:`no`,children:e.name}),(0,X.jsxs)(`span`,{children:[r,r?` · `:``,i(`game.gandengyan.handCount`,{count:e.handCount})]})]})]}):null}function $({card:e,small:t=!1}){return(0,X.jsxs)(`div`,{className:Q(Y.card,Y[e.color],t&&Y.small),children:[(0,X.jsx)(`span`,{children:e.label}),(0,X.jsx)(`i`,{children:e.suit===`Joker`?`*`:e.label.slice(0,1)})]})}function ke(e,t,n,r){if(!e)return r(`game.gandengyan.position.seat`,{seat:t.seat+1});let i=(t.seat-e.seat+n)%n;return i===0?r(`game.gandengyan.position.me`):n===2?r(`game.gandengyan.position.opponent`):n===3?r(i===1?`game.gandengyan.position.nextOpponent`:`game.gandengyan.position.prevOpponent`):n===4?r(i===1?`game.gandengyan.position.nextOpponent`:i===2?`game.gandengyan.position.partner`:`game.gandengyan.position.prevOpponent`):i%2==0?r(`game.gandengyan.position.seatPartner`,{seat:t.seat+1}):r(`game.gandengyan.position.seatOpponent`,{seat:t.seat+1})}var Ae=r(`/game/gandengyan/`)({component:De});export{Ae as Route};
@@ -1 +0,0 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]);export{t};
@@ -1 +0,0 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]);export{t};
@@ -1 +0,0 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]);export{t};
@@ -1 +0,0 @@
1
- import{w as e}from"./ui-PnUvY9zL.js";var t=e(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]);export{t};
@@ -1 +0,0 @@
1
- import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{O as r,c as i,w as a}from"./ui-PnUvY9zL.js";import{a as o}from"./i18n--maTEG0d.js";import{t as s}from"./SidebarHomeLink-ByOHwlH8.js";import{c,f as l}from"./index-Cg4kEvx8.js";import{t as u}from"./SidebarAccount-D6wj_ijc.js";import{i as d,n as f,r as p,t as m}from"./userProfile-CRGZ8PUF.js";import{t as h}from"./useChannelMessages-CZHmH5n-.js";var g=a(`spade`,[[`path`,{d:`M12 18v4`,key:`jadmvz`}],[`path`,{d:`M2 14.499a5.5 5.5 0 0 0 9.591 3.675.6.6 0 0 1 .818.001A5.5 5.5 0 0 0 22 14.5c0-2.29-1.5-4-3-5.5l-5.492-5.312a2 2 0 0 0-3-.02L5 8.999c-1.5 1.5-3 3.2-3 5.5`,key:`1aw2pz`}]]),_=a(`swords`,[[`polyline`,{points:`14.5 17.5 3 6 3 3 6 3 17.5 14.5`,key:`1hfsw2`}],[`line`,{x1:`13`,x2:`19`,y1:`19`,y2:`13`,key:`1vrmhu`}],[`line`,{x1:`16`,x2:`20`,y1:`16`,y2:`20`,key:`1bron3`}],[`line`,{x1:`19`,x2:`21`,y1:`21`,y2:`19`,key:`13pww6`}],[`polyline`,{points:`14.5 6.5 18 3 21 3 21 6 17.5 9.5`,key:`hbey2j`}],[`line`,{x1:`5`,x2:`9`,y1:`14`,y2:`18`,key:`1hf58s`}],[`line`,{x1:`7`,x2:`4`,y1:`17`,y2:`20`,key:`pidxm4`}],[`line`,{x1:`3`,x2:`5`,y1:`19`,y2:`21`,key:`1pehsh`}]]),v=n(),y=[{id:`gandengyan`,labelKey:`game.gandengyan.title`,href:`/game/gandengyan/`,icon:(0,v.jsx)(_,{size:16})},{id:`zhajinhua`,labelKey:`game.zhajinhua.title`,href:`/game/zhajinhua/`,icon:(0,v.jsx)(g,{size:16})}];function b({activeGame:e,closeSidebar:t}){let{t:n}=o();return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(s,{onNavigate:t}),(0,v.jsx)(`nav`,{className:`sidebar-nav`,children:y.map(i=>(0,v.jsxs)(r,{to:i.href,className:`sidebar-nav-btn ${e===i.id?`active`:``}`,onClick:t,children:[i.icon,(0,v.jsx)(`span`,{children:n(i.labelKey)})]},i.id))}),(0,v.jsx)(u,{})]})}var x=t(e(),1),S=`game`,C=`mostbox.game.event`,w=[`gandengyan`,`zhajinhua`],T=`ABCDEFGHJKLMNPQRSTUVWXYZ23456789`;function E(e){let t=String(e||``).trim().toLowerCase();return w.includes(t)?t:``}function D(e){return String(e||``).trim().toUpperCase().replace(/[^A-Z0-9]/g,``).slice(0,8)}function O(e){return/^[A-Z0-9]{4,8}$/.test(String(e||``))}function k(){let e=``;for(let t=0;t<6;t++)e+=T[B(32)];return e}function A(e,t){let n=E(e),r=D(t);return!n||!O(r)?``:`game.${n}.${r.toLowerCase()}`}function j({gameId:e,roomCode:t,event:n,payload:r}){let i=E(e);return{kind:C,version:1,gameId:i,roomCode:D(t),event:String(n||``),eventId:z(i||`game`),payload:r||{}}}function M(e,t={}){try{let n=JSON.parse(String(e||``));if(!n||n.kind!==`mostbox.game.event`||n.version!==1||typeof n.event!=`string`||typeof n.eventId!=`string`)return null;let r=E(n.gameId),i=D(n.roomCode);return!r||!O(i)||t.gameId&&r!==E(t.gameId)||t.roomCode&&i!==D(t.roomCode)?null:{...n,gameId:r,roomCode:i,payload:n.payload&&typeof n.payload==`object`?n.payload:{}}}catch{return null}}function N(e=[],t={}){let n=[],r=new Map,i=``;for(let a of R(e)){let e=M(a.content,t);if(e){if(e.event===`room:create`){let t=F(e.payload?.player,a);if(!t)continue;i||=t.address,L(n,r,t);continue}if(e.event===`player:join`){let t=F(e.payload?.player,a);t&&L(n,r,t);continue}if(e.event===`player:leave`){let t=I(e.payload?.player?.address||a.author);if(t){let e=n.findIndex(e=>e.address===t);e!==-1&&(n.splice(e,1),r.delete(t))}}}}return{gameId:E(t.gameId),roomCode:D(t.roomCode),hostAddress:i,players:n}}function P(e=[],t={}){let n=null;for(let r of R(e)){let e=M(r.content,t);if(!e||e.event!==`room:state`)continue;let i=Number(e.payload?.seq||0);(!n||i>=Number(n.payload?.seq||0))&&(n=e)}return n}function F(e,t){if(!e||typeof e!=`object`)return null;let n=t&&typeof t==`object`?t:{author:t},r=n.author,i=I(e.address||r);if(!i||I(r)!==i)return null;let a=String(n.authorName||e.name||``).trim().slice(0,50)||H(i),o=String(n.avatar||e.avatar||``).trim(),s={address:i,name:a,publicKey:String(e.publicKey||``).trim(),joinedAt:Number(e.joinedAt||Date.now())};return o&&(s.avatar=o.slice(0,4096)),s}function I(e){let t=String(e||``).trim();return/^0x[a-fA-F0-9]{40}$/.test(t)?t.toLowerCase():``}function L(e,t,n){let r=t.get(n.address);if(r){Object.assign(r,n);return}e.push(n),t.set(n.address,n)}function R(e){return[...e].sort((e,t)=>Number(e.timestamp||0)-Number(t.timestamp||0))}function z(e){return`${e}_${Date.now()}_${V(4)}`}function B(e){if(globalThis.crypto?.getRandomValues){let t=new Uint32Array(1);return globalThis.crypto.getRandomValues(t),t[0]%e}return Math.floor(Math.random()*e)}function V(e){let t=new Uint8Array(e);if(globalThis.crypto?.getRandomValues)globalThis.crypto.getRandomValues(t);else for(let e=0;e<t.length;e++)t[e]=Math.floor(Math.random()*256);return[...t].map(e=>e.toString(16).padStart(2,`0`)).join(``)}function H(e){return e?`${e.slice(0,6)}...${e.slice(-4)}`:``}function U({gameId:e,onError:t,getPlayerPayload:n}){let{t:r}=o(),a=c(e=>e.hasBackend),s=c(e=>e.checkBackend),u=c(e=>e.openConnectModal),f=i(e=>e.identity),p=i(e=>e.openLoginModal),[g,_]=(0,x.useState)(``),[v,y]=(0,x.useState)(``),[b,C]=(0,x.useState)(!1),w=a===!0,T=(0,x.useCallback)(async(e,n)=>{let r=await l(e,n);t&&t(r)},[t]),E=(0,x.useCallback)(t=>!!M(t.content,{gameId:e,roomCode:g}),[e,g]),O=(0,x.useCallback)(t=>{let n=M(t.content,{gameId:e,roomCode:g});return n?`${t.author}-${n.eventId}`:`${t.author}-${t.timestamp}-${t.content}`},[e,g]),{clearMessages:N,connected:P,messages:F,sendMessage:I,syncMessages:L}=h({isReady:w,enabled:!!f,channelName:v,limit:500,acceptMessage:E,getMessageKey:O,onSyncError:e=>T(e,r(`game.room.error.readLog`))}),R=(0,x.useMemo)(()=>F.map(t=>({message:t,event:M(t.content,{gameId:e,roomCode:g})})).filter(e=>e.event),[e,F,g]),z=(0,x.useCallback)(()=>f?w?!0:(u(),!1):(p(),!1),[w,u,p,f]);(0,x.useEffect)(()=>{a===null&&s()},[s,a]);let B=(0,x.useCallback)(async(i,a=!1)=>{if(!z()||!f)return!1;let o=a?k():D(i),s=A(e,o);if(!s)return t&&t(r(`game.room.error.invalidCode`)),!1;C(!0);try{let t=await d.createChannel(s,S,m(f)),r=t.channelKey||t.key||s;return await W(r,f,e,o,a?`room:create`:`player:join`,{player:K(f,n?.(f))}),_(o),y(r),N(),!0}catch(e){return await T(e,r(a?`game.room.error.createFailed`:`game.room.error.joinFailed`)),!1}finally{C(!1)}},[z,e,n,t,T,N,r,f]);return{channelName:v,connected:P,createRoom:(0,x.useCallback)(()=>B(``,!0),[B]),ensureReady:z,isBackendReady:w,joinRoom:(0,x.useCallback)(e=>B(e),[B]),joining:b,messages:F,roomCode:g,roomEvents:R,sendRoomEvent:(0,x.useCallback)(async(t,n={})=>{if(!z()||!f||!v||!g)return!1;let i=j({gameId:e,roomCode:g,event:t,payload:n}),a=JSON.stringify(i);try{return await I({channelName:v,content:a,optimisticId:`${f.address}-${i.eventId}`}),!0}catch(e){return await T(e,r(`game.room.error.sendEventFailed`)),!1}},[v,z,e,T,g,I,r,f]),setRoomCode:_,syncMessages:L,userIdentity:f}}async function W(e,t,n,r,i,a){let o=j({gameId:n,roomCode:r,event:i,payload:a});await d.sendChannelMessage({channelName:e,content:JSON.stringify(o),...p(t)})}function G(e){return{address:e.address,name:f(e),avatar:e.avatar||``,publicKey:``,joinedAt:Date.now()}}function K(e,t={}){let n=G(e),r={...n,...t};return Object.prototype.hasOwnProperty.call(t,`avatar`)||(r.avatar=n.avatar),r}export{g as a,b as i,N as n,P as r,U as t};
@@ -1 +0,0 @@
1
- import{h as e,l as t}from"./index-Cg4kEvx8.js";var n={getChannels(e={}){let n=new URLSearchParams;e.type&&n.set(`type`,e.type);let r=n.toString();return t.get(r?`/api/channels?${r}`:`/api/channels`).json()},createChannel(e,n=`personal`,r={}){return t.post(`/api/channels`,{json:{name:e,type:n,...r}}).json()},leaveChannel(e){return t.delete(`/api/channels`,{json:{channelKey:e}}).json()},getChannelMessages(e,n=100,r=0){return t.get(`/api/channels/${encodeURIComponent(e)}/messages?limit=${n}&offset=${r}`).json()},sendChannelMessage({channelName:e,content:n,author:r,authorName:i,avatar:a,attachment:o}){return t.post(`/api/channels/${encodeURIComponent(e)}/messages`,{json:o?{content:n,author:r,authorName:i,avatar:a,attachment:o}:{content:n,author:r,authorName:i,avatar:a}}).json()},getChannelMembers(e){return t.get(`/api/channels/${encodeURIComponent(e)}/members`).json()},getChannelPeers(e){return t.get(`/api/channels/${encodeURIComponent(e)}/peers`).json()},setChannelRemark(e,n){return t.put(`/api/channels/${encodeURIComponent(e)}/remark`,{json:{remark:n}}).json()},setChannelPinned(e,n){return t.put(`/api/channels/${encodeURIComponent(e)}/pin`,{json:{pinned:n}}).json()},getFileDownloadUrl(t){return e(`/api/files/${t}/download`)}};function r(e){return e.displayName||e.username}function i(e){return{displayName:r(e),avatar:e.avatar||``}}function a(e){return{author:e.address,authorName:r(e),avatar:e.avatar||``}}export{n as i,r as n,a as r,i as t};