@hieuzest/koishi-plugin-mahjongpub 0.3.10 → 0.3.12

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,7 +1,7 @@
1
- import{icons as Lt,send as R,receive as Ut}from"@koishijs/client";import{createElementBlock as _,openBlock as i,createCommentVNode as V,createElementVNode as c,defineComponent as G,warn as Ft,watch as ce,unref as T,inject as fe,ref as S,computed as P,isRef as Bt,getCurrentInstance as _e,provide as Kt,renderSlot as Ve,mergeProps as Ht,normalizeClass as Y,createVNode as s,Transition as ft,withCtx as o,withDirectives as Le,toDisplayString as N,normalizeStyle as vt,vShow as Ue,shallowReactive as Gt,onMounted as je,createBlock as j,resolveDynamicComponent as Zt,Fragment as q,withModifiers as Se,isVNode as yt,render as tt,resolveComponent as k,createTextVNode as C,renderList as ee,withKeys as De,reactive as Jt,onUnmounted as Yt,nextTick as qt}from"vue";import{isClient as Fe,useEventListener as Wt,useResizeObserver as Xt,useTimeoutFn as Qt}from"@vueuse/core";const ie=(e,n)=>{const t=e.__vccOpts||e;for(const[a,l]of n)t[a]=l;return t},en={},tn={class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function nn(e,n){return i(),_("svg",tn,[V(" Mahjong tile "),n[0]||(n[0]=c("rect",{x:"3",y:"1",width:"18",height:"22",rx:"2",ry:"2",fill:"none",stroke:"currentColor","stroke-width":"1.5"},null,-1)),n[1]||(n[1]=c("rect",{x:"5",y:"3",width:"14",height:"18",rx:"1",ry:"1",fill:"none",stroke:"currentColor","stroke-width":"0.8"},null,-1)),V(" 中 character simplified "),n[2]||(n[2]=c("rect",{x:"8",y:"7",width:"8",height:"10",rx:"0.5",fill:"none",stroke:"currentColor","stroke-width":"1.2"},null,-1)),n[3]||(n[3]=c("line",{x1:"12",y1:"7",x2:"12",y2:"17",stroke:"currentColor","stroke-width":"1.2"},null,-1)),n[4]||(n[4]=c("line",{x1:"8",y1:"12",x2:"16",y2:"12",stroke:"currentColor","stroke-width":"1.2"},null,-1))])}const an=ie(en,[["render",nn]]);Lt.register("mahjongpub:icon",an);/**
1
+ import{icons as Lt,send as R,receive as Ut}from"@koishijs/client";import{createElementBlock as _,openBlock as i,createCommentVNode as T,createElementVNode as c,defineComponent as G,warn as Ft,watch as ce,unref as V,inject as fe,ref as S,computed as P,isRef as Kt,getCurrentInstance as _e,provide as Ht,renderSlot as Te,mergeProps as Gt,normalizeClass as Y,createVNode as r,Transition as vt,withCtx as o,withDirectives as Be,toDisplayString as O,normalizeStyle as yt,vShow as Le,shallowReactive as Zt,onMounted as je,createBlock as N,resolveDynamicComponent as Jt,Fragment as q,withModifiers as Se,isVNode as gt,render as nt,resolveComponent as k,createTextVNode as C,renderList as ee,withKeys as De,reactive as Yt,onUnmounted as qt,nextTick as Wt}from"vue";import{isClient as Ue,useEventListener as Xt,useResizeObserver as Qt,useTimeoutFn as en}from"@vueuse/core";const ie=(e,n)=>{const t=e.__vccOpts||e;for(const[a,l]of n)t[a]=l;return t},tn={},nn={class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function ln(e,n){return i(),_("svg",nn,[T(" Mahjong tile "),n[0]||(n[0]=c("rect",{x:"3",y:"1",width:"18",height:"22",rx:"2",ry:"2",fill:"none",stroke:"currentColor","stroke-width":"1.5"},null,-1)),n[1]||(n[1]=c("rect",{x:"5",y:"3",width:"14",height:"18",rx:"1",ry:"1",fill:"none",stroke:"currentColor","stroke-width":"0.8"},null,-1)),T(" 中 character simplified "),n[2]||(n[2]=c("rect",{x:"8",y:"7",width:"8",height:"10",rx:"0.5",fill:"none",stroke:"currentColor","stroke-width":"1.2"},null,-1)),n[3]||(n[3]=c("line",{x1:"12",y1:"7",x2:"12",y2:"17",stroke:"currentColor","stroke-width":"1.2"},null,-1)),n[4]||(n[4]=c("line",{x1:"8",y1:"12",x2:"16",y2:"12",stroke:"currentColor","stroke-width":"1.2"},null,-1))])}const an=ie(tn,[["render",ln]]);Lt.register("mahjongpub:icon",an);/**
2
2
  * @vue/shared v3.5.26
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
- **/const ln=Object.prototype.hasOwnProperty,nt=(e,n)=>ln.call(e,n),Ie=e=>typeof e=="function",ze=e=>typeof e=="string",gt=e=>e!==null&&typeof e=="object";var on=typeof global=="object"&&global&&global.Object===Object&&global,sn=typeof self=="object"&&self&&self.Object===Object&&self,Be=on||sn||Function("return this")(),ve=Be.Symbol,ht=Object.prototype,rn=ht.hasOwnProperty,un=ht.toString,he=ve?ve.toStringTag:void 0;function dn(e){var n=rn.call(e,he),t=e[he];try{e[he]=void 0;var a=true}catch{}var l=un.call(e);return a&&(n?e[he]=t:delete e[he]),l}var cn=Object.prototype,pn=cn.toString;function mn(e){return pn.call(e)}var fn="[object Null]",vn="[object Undefined]",at=ve?ve.toStringTag:void 0;function _t(e){return e==null?e===void 0?vn:fn:at&&at in Object(e)?dn(e):mn(e)}function yn(e){return e!=null&&typeof e=="object"}var gn="[object Symbol]";function Ke(e){return typeof e=="symbol"||yn(e)&&_t(e)==gn}function hn(e,n){for(var t=-1,a=e==null?0:e.length,l=Array(a);++t<a;)l[t]=n(e[t],t,e);return l}var He=Array.isArray,lt=ve?ve.prototype:void 0,ot=lt?lt.toString:void 0;function bt(e){if(typeof e=="string")return e;if(He(e))return hn(e,bt)+"";if(Ke(e))return ot?ot.call(e):"";var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function wt(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var _n="[object AsyncFunction]",bn="[object Function]",wn="[object GeneratorFunction]",Cn="[object Proxy]";function xn(e){if(!wt(e))return false;var n=_t(e);return n==bn||n==wn||n==_n||n==Cn}var Me=Be["__core-js_shared__"],st=function(){var e=/[^.]+$/.exec(Me&&Me.keys&&Me.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function $n(e){return!!st&&st in e}var kn=Function.prototype,Sn=kn.toString;function In(e){if(e!=null){try{return Sn.call(e)}catch{}try{return e+""}catch{}}return""}var zn=/[\\^$.*+?()[\]{}|]/g,Tn=/^\[object .+?Constructor\]$/,Vn=Function.prototype,jn=Object.prototype,Pn=Vn.toString,Nn=jn.hasOwnProperty,On=RegExp("^"+Pn.call(Nn).replace(zn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function En(e){if(!wt(e)||$n(e))return false;var n=xn(e)?On:Tn;return n.test(In(e))}function Mn(e,n){return e==null?void 0:e[n]}function Ct(e,n){var t=Mn(e,n);return En(t)?t:void 0}function Dn(e,n){return e===n||e!==e&&n!==n}var Rn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,An=/^\w*$/;function Ln(e,n){if(He(e))return false;var t=typeof e;return t=="number"||t=="symbol"||t=="boolean"||e==null||Ke(e)?true:An.test(e)||!Rn.test(e)||n!=null&&e in Object(n)}var be=Ct(Object,"create");function Un(){this.__data__=be?be(null):{},this.size=0}function Fn(e){var n=this.has(e)&&delete this.__data__[e];return this.size-=n?1:0,n}var Bn="__lodash_hash_undefined__",Kn=Object.prototype,Hn=Kn.hasOwnProperty;function Gn(e){var n=this.__data__;if(be){var t=n[e];return t===Bn?void 0:t}return Hn.call(n,e)?n[e]:void 0}var Zn=Object.prototype,Jn=Zn.hasOwnProperty;function Yn(e){var n=this.__data__;return be?n[e]!==void 0:Jn.call(n,e)}var qn="__lodash_hash_undefined__";function Wn(e,n){var t=this.__data__;return this.size+=this.has(e)?0:1,t[e]=be&&n===void 0?qn:n,this}function pe(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}pe.prototype.clear=Un;pe.prototype.delete=Fn;pe.prototype.get=Gn;pe.prototype.has=Yn;pe.prototype.set=Wn;function Xn(){this.__data__=[],this.size=0}function Pe(e,n){for(var t=e.length;t--;)if(Dn(e[t][0],n))return t;return-1}var Qn=Array.prototype,ea=Qn.splice;function ta(e){var n=this.__data__,t=Pe(n,e);if(t<0)return false;var a=n.length-1;return t==a?n.pop():ea.call(n,t,1),--this.size,true}function na(e){var n=this.__data__,t=Pe(n,e);return t<0?void 0:n[t][1]}function aa(e){return Pe(this.__data__,e)>-1}function la(e,n){var t=this.__data__,a=Pe(t,e);return a<0?(++this.size,t.push([e,n])):t[a][1]=n,this}function ge(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}ge.prototype.clear=Xn;ge.prototype.delete=ta;ge.prototype.get=na;ge.prototype.has=aa;ge.prototype.set=la;var oa=Ct(Be,"Map");function sa(){this.size=0,this.__data__={hash:new pe,map:new(oa||ge),string:new pe}}function ra(e){var n=typeof e;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?e!=="__proto__":e===null}function Ne(e,n){var t=e.__data__;return ra(n)?t[typeof n=="string"?"string":"hash"]:t.map}function ia(e){var n=Ne(this,e).delete(e);return this.size-=n?1:0,n}function ua(e){return Ne(this,e).get(e)}function da(e){return Ne(this,e).has(e)}function ca(e,n){var t=Ne(this,e),a=t.size;return t.set(e,n),this.size+=t.size==a?0:1,this}function me(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}me.prototype.clear=sa;me.prototype.delete=ia;me.prototype.get=ua;me.prototype.has=da;me.prototype.set=ca;var pa="Expected a function";function Ge(e,n){if(typeof e!="function"||n!=null&&typeof n!="function")throw new TypeError(pa);var t=function(){var a=arguments,l=n?n.apply(this,a):a[0],u=t.cache;if(u.has(l))return u.get(l);var d=e.apply(this,a);return t.cache=u.set(l,d)||u,d};return t.cache=new(Ge.Cache||me),t}Ge.Cache=me;var ma=500;function fa(e){var n=Ge(e,function(a){return t.size===ma&&t.clear(),a}),t=n.cache;return n}var va=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ya=/\\(\\)?/g,ga=fa(function(e){var n=[];return e.charCodeAt(0)===46&&n.push(""),e.replace(va,function(t,a,l,u){n.push(l?u.replace(ya,"$1"):a||t)}),n});function ha(e){return e==null?"":bt(e)}function _a(e,n){return He(e)?e:Ln(e,n)?[e]:ga(ha(e))}function ba(e){if(typeof e=="string"||Ke(e))return e;var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function wa(e,n){n=_a(n,e);for(var t=0,a=n.length;e!=null&&t<a;)e=e[ba(n[t++])];return t&&t==a?e:void 0}function Ca(e,n,t){var a=e==null?void 0:wa(e,n);return a===void 0?t:a}function xa(e){for(var n=-1,t=e==null?0:e.length,a={};++n<t;){var l=e[n];a[l[0]]=l[1]}return a}const $a=e=>e===void 0,we=e=>typeof e=="number",ka=e=>typeof Element>"u"?false:e instanceof Element,Sa=e=>ze(e)?!Number.isNaN(Number(e)):false,rt=e=>Object.keys(e);function Re(e,n="px"){if(!e)return"";if(we(e)||Sa(e))return`${e}${n}`;if(ze(e))return e}/*! Element Plus Icons Vue v2.3.2 */var Ia=G({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),za=Ia,Ta=G({name:"Close",__name:"close",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),Va=Ta,ja=G({name:"InfoFilled",__name:"info-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),Pa=ja,Na=G({name:"SuccessFilled",__name:"success-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),Oa=Na,Ea=G({name:"WarningFilled",__name:"warning-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),Ma=Ea;const xt="__epPropKey",oe=e=>e,Da=e=>gt(e)&&!!e[xt],$t=(e,n)=>{if(!gt(e)||Da(e))return e;const{values:t,required:a,default:l,type:u,validator:d}=e,$={type:u,required:!!a,validator:t||d?I=>{let y=false,b=[];if(t&&(b=Array.from(t),nt(e,"default")&&b.push(l),y||(y=b.includes(I))),d&&(y||(y=d(I))),!y&&b.length>0){const h=[...new Set(b)].map(x=>JSON.stringify(x)).join(", ");Ft(`Invalid prop: validation failed${n?` for prop "${n}"`:""}. Expected one of [${h}], got value ${JSON.stringify(I)}.`)}return y}:void 0,[xt]:true};return nt(e,"default")&&($.default=l),$},Ce=e=>xa(Object.entries(e).map(([n,t])=>[n,$t(t,n)])),Ra=oe([String,Object,Function]),Aa={Close:Va},it={success:Oa,warning:Ma,error:za,info:Pa},kt=(e,n)=>(e.install=t=>{for(const a of[e,...Object.values({})])t.component(a.name,a)},e),La=(e,n)=>(e.install=t=>{e._context=t._context,t.config.globalProperties[n]=e},e),Ua={esc:"Escape"},Fa=["","default","small","large"],Ba=e=>e,ut=({from:e,replacement:n,scope:t,version:a,ref:l,type:u="API"},d)=>{ce(()=>T(d),m=>{},{immediate:true})};var Ka={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const Ha=e=>(n,t)=>Ga(n,t,T(e)),Ga=(e,n,t)=>Ca(t,e,e).replace(/\{(\w+)\}/g,(a,l)=>{var u;return`${(u=n==null?void 0:n[l])!=null?u:`{${l}}`}`}),Za=e=>{const n=P(()=>T(e).name),t=Bt(e)?e:S(e);return{lang:n,locale:t,t:Ha(e)}},St=Symbol("localeContextKey"),Ja=e=>{const n=e||fe(St,S());return Za(P(()=>n.value||Ka))},ke="el",Ya="is-",de=(e,n,t,a,l)=>{let u=`${e}-${n}`;return t&&(u+=`-${t}`),a&&(u+=`__${a}`),l&&(u+=`--${l}`),u},It=Symbol("namespaceContextKey"),qa=e=>{const n=e||(_e()?fe(It,S(ke)):S(ke));return P(()=>T(n)||ke)},Ze=(e,n)=>{const t=qa(n);return{namespace:t,b:(v="")=>de(t.value,e,v,"",""),e:v=>v?de(t.value,e,"",v,""):"",m:v=>v?de(t.value,e,"","",v):"",be:(v,w)=>v&&w?de(t.value,e,v,w,""):"",em:(v,w)=>v&&w?de(t.value,e,"",v,w):"",bm:(v,w)=>v&&w?de(t.value,e,v,"",w):"",bem:(v,w,p)=>v&&w&&p?de(t.value,e,v,w,p):"",is:(v,...w)=>{const p=w.length>=1?w[0]:true;return v&&p?`${Ya}${v}`:""},cssVar:v=>{const w={};for(const p in v)v[p]&&(w[`--${t.value}-${p}`]=v[p]);return w},cssVarName:v=>`--${t.value}-${v}`,cssVarBlock:v=>{const w={};for(const p in v)v[p]&&(w[`--${t.value}-${e}-${p}`]=v[p]);return w},cssVarBlockName:v=>`--${t.value}-${e}-${v}`}},dt={current:0},ct=S(0),zt=2e3,pt=Symbol("elZIndexContextKey"),Tt=Symbol("zIndexContextKey"),Wa=e=>{const n=_e()?fe(pt,dt):dt,t=e||(_e()?fe(Tt,void 0):void 0),a=P(()=>{const d=T(t);return we(d)?d:zt}),l=P(()=>a.value+ct.value),u=()=>(n.current++,ct.value=n.current,l.value);return!Fe&&fe(pt),{initialZIndex:a,currentZIndex:l,nextZIndex:u}},Xa=$t({type:String,values:Fa,required:false}),Qa=Symbol("size"),el=Symbol("emptyValuesContextKey"),tl=Ce({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>Ie(e)?!e():!e}}),Vt=Symbol(),Te=S();function jt(e,n=void 0){return _e()?fe(Vt,Te):Te}function nl(e,n){const t=jt(),a=Ze(e,P(()=>{var m;return((m=t.value)==null?void 0:m.namespace)||ke})),l=Ja(P(()=>{var m;return(m=t.value)==null?void 0:m.locale})),u=Wa(P(()=>{var m;return((m=t.value)==null?void 0:m.zIndex)||zt})),d=P(()=>{var m;return T(n)||((m=t.value)==null?void 0:m.size)||""});return Pt(P(()=>T(t)||{})),{ns:a,locale:l,zIndex:u,size:d}}const Pt=(e,n,t=false)=>{var a;const l=!!_e(),u=l?jt():void 0,d=(a=void 0)!=null?a:l?Kt:void 0;if(!d)return;const m=P(()=>{const $=T(e);return u!=null&&u.value?al(u.value,$):$});return d(Vt,m),d(St,P(()=>m.value.locale)),d(It,P(()=>m.value.namespace)),d(Tt,P(()=>m.value.zIndex)),d(Qa,{size:P(()=>m.value.size||"")}),d(el,P(()=>({emptyValues:m.value.emptyValues,valueOnClear:m.value.valueOnClear}))),(t||!Te.value)&&(Te.value=m.value),m},al=(e,n)=>{const t=[...new Set([...rt(e),...rt(n)])],a={};for(const l of t)a[l]=n[l]!==void 0?n[l]:e[l];return a},ll=Ce({a11y:{type:Boolean,default:true},locale:{type:oe(Object)},size:Xa,button:{type:oe(Object)},experimentalFeatures:{type:oe(Object)},keyboardNavigation:{type:Boolean,default:true},message:{type:oe(Object)},zIndex:Number,namespace:{type:String,default:"el"},...tl}),Ae={};G({name:"ElConfigProvider",props:ll,setup(e,{slots:n}){ce(()=>e.message,a=>{Object.assign(Ae,a??{})},{immediate:true,deep:true});const t=Pt(e);return()=>Ve(n,"default",{config:t==null?void 0:t.value})}});var Je=(e,n)=>{const t=e.__vccOpts||e;for(const[a,l]of n)t[a]=l;return t};const ol=Ce({size:{type:oe([Number,String])},color:{type:String}}),sl=G({name:"ElIcon",inheritAttrs:false}),rl=G({...sl,props:ol,setup(e){const n=e,t=Ze("icon"),a=P(()=>{const{size:l,color:u}=n;return!l&&!u?{}:{fontSize:$a(l)?void 0:Re(l),"--color":u}});return(l,u)=>(i(),_("i",Ht({class:T(t).b(),style:T(a)},l.$attrs),[Ve(l.$slots,"default")],16))}});var il=Je(rl,[["__file","icon.vue"]]);const mt=kt(il),ul=Ce({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:true},color:String,dotStyle:{type:oe([String,Object,Array])},badgeStyle:{type:oe([String,Object,Array])},offset:{type:oe(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),dl=["textContent"],cl=G({name:"ElBadge"}),pl=G({...cl,props:ul,setup(e,{expose:n}){const t=e,a=Ze("badge"),l=P(()=>t.isDot?"":we(t.value)&&we(t.max)?t.max<t.value?`${t.max}+`:t.value===0&&!t.showZero?"":`${t.value}`:`${t.value}`),u=P(()=>{var d,m,$,I,y,b;return[{backgroundColor:t.color,marginRight:Re(-((m=(d=t.offset)==null?void 0:d[0])!=null?m:0)),marginTop:Re((I=($=t.offset)==null?void 0:$[1])!=null?I:0)},(y=t.dotStyle)!=null?y:{},(b=t.badgeStyle)!=null?b:{}]});return ut({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},P(()=>!!t.dotStyle)),ut({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},P(()=>!!t.dotClass)),n({content:l}),(d,m)=>(i(),_("div",{class:Y(T(a).b())},[Ve(d.$slots,"default"),s(ft,{name:`${T(a).namespace.value}-zoom-in-center`,persisted:""},{default:o(()=>[Le(c("sup",{class:Y([T(a).e("content"),T(a).em("content",d.type),T(a).is("fixed",!!d.$slots.default),T(a).is("dot",d.isDot),d.dotClass,d.badgeClass]),style:vt(T(u)),textContent:N(T(l))},null,14,dl),[[Ue,!d.hidden&&(T(l)||d.isDot)]])]),_:1},8,["name"])],2))}});var ml=Je(pl,[["__file","badge.vue"]]);const fl=kt(ml),Nt=["success","info","warning","error"],Z=Ba({customClass:"",center:false,dangerouslyUseHTMLString:false,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:false,type:"info",plain:false,offset:16,zIndex:0,grouping:false,repeatNum:1,appendTo:Fe?document.body:void 0}),vl=Ce({customClass:{type:String,default:Z.customClass},center:{type:Boolean,default:Z.center},dangerouslyUseHTMLString:{type:Boolean,default:Z.dangerouslyUseHTMLString},duration:{type:Number,default:Z.duration},icon:{type:Ra,default:Z.icon},id:{type:String,default:Z.id},message:{type:oe([String,Object,Function]),default:Z.message},onClose:{type:oe(Function),default:Z.onClose},showClose:{type:Boolean,default:Z.showClose},type:{type:String,values:Nt,default:Z.type},plain:{type:Boolean,default:Z.plain},offset:{type:Number,default:Z.offset},zIndex:{type:Number,default:Z.zIndex},grouping:{type:Boolean,default:Z.grouping},repeatNum:{type:Number,default:Z.repeatNum}}),yl={destroy:()=>true},se=Gt([]),gl=e=>{const n=se.findIndex(l=>l.id===e),t=se[n];let a;return n>0&&(a=se[n-1]),{current:t,prev:a}},hl=e=>{const{prev:n}=gl(e);return n?n.vm.exposed.bottom.value:0},_l=(e,n)=>se.findIndex(a=>a.id===e)>0?16:n,bl=["id"],wl=["innerHTML"],Cl=G({name:"ElMessage"}),xl=G({...Cl,props:vl,emits:yl,setup(e,{expose:n}){const t=e,{Close:a}=Aa,{ns:l,zIndex:u}=nl("message"),{currentZIndex:d,nextZIndex:m}=u,$=S(),I=S(false),y=S(0);let b;const h=P(()=>t.type?t.type==="error"?"danger":t.type:"info"),x=P(()=>{const M=t.type;return{[l.bm("icon",M)]:M&&it[M]}}),O=P(()=>t.icon||it[t.type]||""),v=P(()=>hl(t.id)),w=P(()=>_l(t.id,t.offset)+v.value),p=P(()=>y.value+w.value),f=P(()=>({top:`${w.value}px`,zIndex:d.value}));function B(){t.duration!==0&&({stop:b}=Qt(()=>{A()},t.duration))}function U(){b==null||b()}function A(){I.value=false}function J({code:M}){M===Ua.esc&&A()}return je(()=>{B(),m(),I.value=true}),ce(()=>t.repeatNum,()=>{U(),B()}),Wt(document,"keydown",J),Xt($,()=>{y.value=$.value.getBoundingClientRect().height}),n({visible:I,bottom:p,close:A}),(M,K)=>(i(),j(ft,{name:T(l).b("fade"),onBeforeLeave:M.onClose,onAfterLeave:K[0]||(K[0]=z=>M.$emit("destroy")),persisted:""},{default:o(()=>[Le(c("div",{id:M.id,ref_key:"messageRef",ref:$,class:Y([T(l).b(),{[T(l).m(M.type)]:M.type},T(l).is("center",M.center),T(l).is("closable",M.showClose),T(l).is("plain",M.plain),M.customClass]),style:vt(T(f)),role:"alert",onMouseenter:U,onMouseleave:B},[M.repeatNum>1?(i(),j(T(fl),{key:0,value:M.repeatNum,type:T(h),class:Y(T(l).e("badge"))},null,8,["value","type","class"])):V("v-if",true),T(O)?(i(),j(T(mt),{key:1,class:Y([T(l).e("icon"),T(x)])},{default:o(()=>[(i(),j(Zt(T(O))))]),_:1},8,["class"])):V("v-if",true),Ve(M.$slots,"default",{},()=>[M.dangerouslyUseHTMLString?(i(),_(q,{key:1},[V(" Caution here, message could've been compromised, never use user's input as message "),c("p",{class:Y(T(l).e("content")),innerHTML:M.message},null,10,wl)],2112)):(i(),_("p",{key:0,class:Y(T(l).e("content"))},N(M.message),3))]),M.showClose?(i(),j(T(mt),{key:2,class:Y(T(l).e("closeBtn")),onClick:Se(A,["stop"])},{default:o(()=>[s(T(a))]),_:1},8,["class","onClick"])):V("v-if",true)],46,bl),[[Ue,I.value]])]),_:3},8,["name","onBeforeLeave"]))}});var $l=Je(xl,[["__file","message.vue"]]);let kl=1;const Ot=e=>{const n=!e||ze(e)||yt(e)||Ie(e)?{message:e}:e,t={...Z,...n};if(!t.appendTo)t.appendTo=document.body;else if(ze(t.appendTo)){let a=document.querySelector(t.appendTo);ka(a)||(a=document.body),t.appendTo=a}return t},Sl=e=>{const n=se.indexOf(e);if(n===-1)return;se.splice(n,1);const{handler:t}=e;t.close()},Il=({appendTo:e,...n},t)=>{const a=`message_${kl++}`,l=n.onClose,u=document.createElement("div"),d={...n,id:a,onClose:()=>{l==null||l(),Sl(y)},onDestroy:()=>{tt(null,u)}},m=s($l,d,Ie(d.message)||yt(d.message)?{default:Ie(d.message)?d.message:()=>d.message}:null);m.appContext=t||ye._context,tt(m,u),e.appendChild(u.firstElementChild);const $=m.component,y={id:a,vnode:m,vm:$,handler:{close:()=>{$.exposed.visible.value=false}},props:m.component.props};return y},ye=(e={},n)=>{if(!Fe)return{close:()=>{}};if(we(Ae.max)&&se.length>=Ae.max)return{close:()=>{}};const t=Ot(e);if(t.grouping&&se.length){const l=se.find(({vnode:u})=>{var d;return((d=u.props)==null?void 0:d.message)===t.message});if(l)return l.props.repeatNum+=1,l.props.type=t.type,l.handler}const a=Il(t,n);return se.push(a),a.handler};Nt.forEach(e=>{ye[e]=(n={},t)=>{const a=Ot(n);return ye({...a,type:e},t)}});function zl(e){for(const n of se)(!e||e===n.props.type)&&n.handler.close()}ye.closeAll=zl;ye._context=null;const F=La(ye,"$message"),Tl={class:"sidebar"},Vl={class:"sidebar-header"},jl={class:"contest-list"},Pl=["onClick","onContextmenu"],Nl={class:"contest-name"},Ol={class:"contest-cid"},El=G({__name:"sidebar",props:{contests:{},activeCid:{}},emits:["select","add","remove","update"],setup(e,{emit:n}){const t=n,a=S(false),l=S(null),u=S(""),d=S(null),m=S(false);async function $(){if(l.value){m.value=true;try{d.value=await R("mahjongpub/search-contests",l.value,u.value||void 0)}catch(w){F.error(`查询失败: ${w}`)}finally{m.value=false}}}async function I(){if(d.value){m.value=true;try{const w={cid:d.value.cid,name:d.value.name,adminPassword:u.value||void 0};await R("mahjongpub/add-managed",w),t("add",w),a.value=false,l.value=null,d.value=null,u.value=""}catch(w){F.error(`添加失败: ${w}`)}finally{m.value=false}}}const y=S(false),b=S(null),h=S("");function x(w,p){b.value=p,h.value=p.adminPassword??"",y.value=true}async function O(){if(b.value)try{await R("mahjongpub/update-managed",b.value.cid,{adminPassword:h.value||void 0}),t("update",b.value.cid,{adminPassword:h.value||void 0}),y.value=false}catch(w){F.error(`保存失败: ${w}`)}}async function v(){if(b.value)try{await R("mahjongpub/remove-managed",b.value.cid),t("remove",b.value.cid),y.value=false}catch(w){F.error(`移除失败: ${w}`)}}return(w,p)=>{const f=k("el-button"),B=k("el-icon"),U=k("el-input"),A=k("el-form-item"),J=k("el-tag"),M=k("el-form"),K=k("el-dialog");return i(),_("div",Tl,[c("div",Vl,[p[9]||(p[9]=c("span",null,"比赛列表",-1)),s(f,{size:"small",type:"primary",onClick:p[0]||(p[0]=z=>a.value=true)},{default:o(()=>[...p[8]||(p[8]=[C("+ 添加",-1)])]),_:1})]),c("div",jl,[(i(true),_(q,null,ee(e.contests,z=>(i(),_("div",{key:z.cid,class:Y(["contest-item",{active:z.cid===e.activeCid}]),onClick:H=>w.$emit("select",z.cid),onContextmenu:Se(H=>x(H,z),["prevent"])},[c("div",Nl,N(z.name),1),c("div",Ol,"#"+N(z.cid),1),z.adminPassword?(i(),j(B,{key:0,class:"admin-badge",title:"已配置管理密码"},{default:o(()=>[...p[10]||(p[10]=[c("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor"},[c("path",{d:"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"})],-1)])]),_:1})):V("v-if",true)],42,Pl))),128))]),V(" Import Dialog "),s(K,{modelValue:a.value,"onUpdate:modelValue":p[4]||(p[4]=z=>a.value=z),title:"添加比赛",width:"420"},{footer:o(()=>[s(f,{onClick:p[3]||(p[3]=z=>a.value=false)},{default:o(()=>[...p[13]||(p[13]=[C("取消",-1)])]),_:1}),s(f,{loading:m.value,onClick:$},{default:o(()=>[...p[14]||(p[14]=[C("查询",-1)])]),_:1},8,["loading"]),s(f,{type:"primary",disabled:!d.value,onClick:I},{default:o(()=>[...p[15]||(p[15]=[C("添加",-1)])]),_:1},8,["disabled"])]),default:o(()=>[s(M,{"label-width":"80px",onSubmit:Se(I,["prevent"])},{default:o(()=>[s(A,{label:"比赛 ID"},{default:o(()=>[s(U,{modelValue:l.value,"onUpdate:modelValue":p[1]||(p[1]=z=>l.value=z),modelModifiers:{number:true},placeholder:"输入大凤林比赛 ID"},null,8,["modelValue"])]),_:1}),d.value?(i(),j(A,{key:0,label:"比赛名称"},{default:o(()=>[c("span",null,N(d.value.name),1)]),_:1})):V("v-if",true),d.value?(i(),j(A,{key:1,label:"当前轮次"},{default:o(()=>[c("span",null,N(d.value.round),1)]),_:1})):V("v-if",true),s(A,{label:"管理密码"},{default:o(()=>[s(U,{modelValue:u.value,"onUpdate:modelValue":p[2]||(p[2]=z=>u.value=z),placeholder:"可选,用于队伍管理","show-password":""},null,8,["modelValue"])]),_:1}),d.value&&u.value?(i(),j(A,{key:2,label:"密码验证"},{default:o(()=>[d.value.adminVerified?(i(),j(J,{key:0,type:"success",size:"small"},{default:o(()=>[...p[11]||(p[11]=[C("密码正确",-1)])]),_:1})):(i(),j(J,{key:1,type:"danger",size:"small"},{default:o(()=>[...p[12]||(p[12]=[C("密码错误",-1)])]),_:1}))]),_:1})):V("v-if",true)]),_:1})]),_:1},8,["modelValue"]),V(" Context Menu (password edit) "),s(K,{modelValue:y.value,"onUpdate:modelValue":p[7]||(p[7]=z=>y.value=z),title:"编辑比赛",width:"400"},{footer:o(()=>[s(f,{type:"danger",onClick:v},{default:o(()=>[...p[16]||(p[16]=[C("移除比赛",-1)])]),_:1}),s(f,{onClick:p[6]||(p[6]=z=>y.value=false)},{default:o(()=>[...p[17]||(p[17]=[C("取消",-1)])]),_:1}),s(f,{type:"primary",onClick:O},{default:o(()=>[...p[18]||(p[18]=[C("保存",-1)])]),_:1})]),default:o(()=>[b.value?(i(),j(M,{key:0,"label-width":"80px"},{default:o(()=>[s(A,{label:"比赛名称"},{default:o(()=>[c("span",null,N(b.value.name)+" (#"+N(b.value.cid)+")",1)]),_:1}),s(A,{label:"管理密码"},{default:o(()=>[s(U,{modelValue:h.value,"onUpdate:modelValue":p[5]||(p[5]=z=>h.value=z),placeholder:"留空则无队伍管理权限","show-password":""},null,8,["modelValue"])]),_:1})]),_:1})):V("v-if",true)]),_:1},8,["modelValue"])])}}}),Ml=ie(El,[["__scopeId","data-v-8b51a7a2"]]),Dl={class:"cls-header"},Rl={class:"cls-title"},Al={key:0,class:"error-msg"},Ll={class:"player-list"},Ul={class:"player-info"},Fl={class:"player-name"},Bl={class:"swap-popover"},Kl={key:0,class:"swap-section"},Hl=["onClick"],Gl={class:"swap-manual"},Zl={class:"swap-mode-actions"},Jl={class:"player-right"},Yl=["onClick"],ql={key:1,class:"point-edit"},Wl={key:0,class:"no-players"},Xl={class:"cls-actions"},Ql=G({__name:"cls-card",props:{cls:{},status:{},externalCheckResult:{},hasAdmin:{type:Boolean}},emits:["start","stop","check","swap","edit-point"],setup(e,{emit:n}){const t=e,a=n,l=P(()=>t.status.next??t.status.last??[]),u=P(()=>t.status.status==="pending"||t.status.status==="suspended"),d=S(false),m=S(null),$=P(()=>m.value??t.externalCheckResult??null),I=S(""),y=S({});function b(p,f){y.value[p]=f}function h(p){const f=y.value[p];f!==void 0&&a("edit-point",p,f),y.value[p]=void 0}function x(){d.value=true,m.value=null,a("check",p=>{m.value=p,d.value=false})}function O(p,f,B){f!=null&&f.trim()&&(a("swap",p,f.trim(),B),I.value="")}const v=P(()=>{switch(t.status.status){case"pending":return"info";case"running":return"success";case"finished":return"";case"suspended":return"warning";case"error":return"danger"}}),w=P(()=>{switch(t.status.status){case"pending":return"等待中";case"running":return"进行中";case"finished":return"已结束";case"suspended":return"已停止";case"error":return"错误"}});return(p,f)=>{const B=k("el-tag"),U=k("el-button"),A=k("el-divider"),J=k("el-input"),M=k("el-popover"),K=k("el-card");return i(),j(K,{class:Y(["cls-card",`status-${e.status.status}`]),shadow:"hover"},{header:o(()=>[c("div",Dl,[c("span",Rl,N(e.cls)+"组 - "+N(e.status.rowi+1),1),s(B,{type:v.value,size:"small",effect:"dark"},{default:o(()=>[C(N(w.value),1)]),_:1},8,["type"])])]),default:o(()=>[e.status.status==="error"&&e.status.msg?(i(),_("div",Al,N(e.status.msg),1)):V("v-if",true),c("div",Ll,[(i(true),_(q,null,ee(l.value,(z,H)=>{var xe;return i(),_("div",{key:H,class:"player-row"},[c("div",Ul,[$.value?(i(),_("span",{key:0,class:Y(["online-dot",(xe=$.value[H])!=null&&xe.online?"online":"offline"])},null,2)):V("v-if",true),c("span",Fl,N(z.player),1),u.value?(i(),j(M,{key:1,trigger:"click",width:220,placement:"right","popper-class":"swap-popover-container"},{reference:o(()=>[s(U,{size:"small",text:"",class:"swap-btn",title:"换人"},{default:o(()=>[...f[3]||(f[3]=[C("✎",-1)])]),_:1})]),default:o(()=>{var te;return[c("div",Bl,[(te=z.teammates)!=null&&te.length?(i(),_("div",Kl,[f[4]||(f[4]=c("div",{class:"swap-title"},"从队伍名单选择",-1)),(i(true),_(q,null,ee(z.teammates,(re,Oe)=>(i(),_("div",{key:Oe,class:Y(["swap-option",{active:re===z.player}]),onClick:Ye=>O(H,re,false)},N(re),11,Hl))),128))])):V("v-if",true),s(A,{style:{margin:"8px 0"}}),f[7]||(f[7]=c("div",{class:"swap-title"},"手动输入",-1)),c("div",Gl,[s(J,{modelValue:I.value,"onUpdate:modelValue":f[0]||(f[0]=re=>I.value=re),size:"small",placeholder:"选手名"},null,8,["modelValue"])]),c("div",Zl,[s(U,{size:"small",onClick:re=>O(H,I.value,false)},{default:o(()=>[...f[5]||(f[5]=[C("临时替换",-1)])]),_:1},8,["onClick"]),e.hasAdmin?(i(),j(U,{key:0,size:"small",type:"primary",onClick:re=>O(H,I.value,true)},{default:o(()=>[...f[6]||(f[6]=[C("修改名单",-1)])]),_:1},8,["onClick"])):V("v-if",true)])])]}),_:2},1024)):V("v-if",true)]),c("div",Jl,[y.value[H]?(i(),_("div",ql,[s(J,{modelValue:y.value[H],"onUpdate:modelValue":te=>y.value[H]=te,modelModifiers:{number:true},size:"small",style:{width:"70px"},onKeyup:[De(te=>h(H),["enter"]),De(te=>y.value[H]=void 0,["escape"])]},null,8,["modelValue","onUpdate:modelValue","onKeyup"]),s(U,{size:"small",text:"",type:"primary",class:"point-edit-btn",onClick:te=>h(H)},{default:o(()=>[...f[8]||(f[8]=[C("✓",-1)])]),_:1},8,["onClick"]),s(U,{size:"small",text:"",class:"point-edit-btn",onClick:te=>y.value[H]=void 0},{default:o(()=>[...f[9]||(f[9]=[C("✕",-1)])]),_:1},8,["onClick"])])):(i(),_("span",{key:0,class:Y(["player-point",{editable:u.value}]),onClick:te=>u.value&&b(H,z.point)},N(z.point),11,Yl))])])}),128)),l.value.length?V("v-if",true):(i(),_("div",Wl,"-"))]),c("div",Xl,[e.status.status==="pending"||e.status.status==="suspended"?(i(),j(U,{key:0,type:"success",size:"small",onClick:f[1]||(f[1]=z=>p.$emit("start"))},{default:o(()=>[...f[10]||(f[10]=[C(" 开赛 ",-1)])]),_:1})):V("v-if",true),e.status.status==="pending"||e.status.status==="running"?(i(),j(U,{key:1,type:"warning",size:"small",onClick:f[2]||(f[2]=z=>p.$emit("stop"))},{default:o(()=>[...f[11]||(f[11]=[C(" 停止 ",-1)])]),_:1})):V("v-if",true),u.value?(i(),j(U,{key:2,size:"small",loading:d.value,onClick:x},{default:o(()=>[...f[12]||(f[12]=[C(" 检查 ",-1)])]),_:1},8,["loading"])):V("v-if",true)])]),_:1},8,["class"])}}}),eo=ie(Ql,[["__scopeId","data-v-559ac705"]]),to={class:"match-manager"},no={class:"config-header"},ao={class:"schedule-section"},lo={class:"schedule-list"},oo={class:"config-actions"},so={class:"subscriber-list"},ro={key:0,class:"subscriber-empty"},io={class:"subscriber-add"},uo={class:"schedule-control-header"},co={class:"schedule-control-list"},po={class:"schedule-info"},mo={key:0,class:"schedule-time"},fo={key:2,class:"status-section"},vo={class:"status-header"},yo={class:"status-actions"},go={class:"cls-grid"},ho={key:3,class:"status-placeholder"},_o={class:"log-header"},bo={class:"log-time"},wo={class:"log-msg"},Co={key:0,class:"log-empty"},xo=G({__name:"match-manager",props:{cid:{},contestInfo:{}},emits:["refresh"],setup(e,{emit:n}){const t=e,a=n,l=S({type:"ssb",round:"",lobby:"",playerIndex:"",ver:"",maxRow:"",schedules:[]}),u=S([]),d=S([]),m=S(),$=S(false),I=S(false),y=Jt({}),b=S("");let h=null;function x(g){if(g===""||g===void 0||g===null)return;const r=Number(g);return isNaN(r)?void 0:r}ce(()=>{var g;return(g=t.contestInfo)==null?void 0:g.extra},g=>{g&&(l.value.type=g.type??"ssb",l.value.round=g.round??"",l.value.lobby=g.lobby??"",l.value.playerIndex=g.playerIndex??"",l.value.ver=g.ver||"",l.value.maxRow=g.maxRow??"",l.value.schedules=(g.schedules??[]).map(r=>({...r,_time:r.startAt?new Date(2e3,0,1,...r.startAt.split(":").map(Number)):void 0})))},{immediate:true});function O(){l.value.schedules.push({maxRow:10,_time:void 0})}function v(){l.value.schedules=[{maxRow:6,startAt:"14:00",_time:new Date(2e3,0,1,14,0)},{maxRow:10,startAt:"19:00",_time:new Date(2e3,0,1,19,0)}]}async function w(){const g=l.value.schedules.map(r=>({maxRow:r.maxRow,startAt:r._time?`${r._time.getHours().toString().padStart(2,"0")}:${r._time.getMinutes().toString().padStart(2,"0")}`:void 0}));await R("mahjongpub/init",t.cid,{type:l.value.type,round:x(l.value.round),lobby:l.value.lobby||void 0,playerIndex:x(l.value.playerIndex),ver:x(l.value.ver),maxRow:x(l.value.maxRow),schedules:g.length?g:void 0}),a("refresh"),await f()}async function p(){await R("mahjongpub/deinit",t.cid),u.value=[],a("refresh")}async function f(){var g;if(!(!((g=t.contestInfo)!=null&&g.extra)&&!u.value.length))try{u.value=await R("mahjongpub/cls-status",t.cid)}catch(r){console.error("Failed to refresh status:",r)}}async function B(g){await R("mahjongpub/start",t.cid,[g]),setTimeout(f,1e3)}async function U(g){await R("mahjongpub/stop",t.cid,[g]),setTimeout(f,500)}async function A(g,r){try{const L=await R("mahjongpub/check-players",t.cid,g);y[g]=L,r(L)}catch(L){F.error(`检查失败: ${L}`),r([])}}async function J(){I.value=true;const g=[];try{const r=u.value.filter(([,L])=>L.status==="pending"||L.status==="suspended").map(([L,ne])=>[L,ne]);for(const[L,ne]of r)try{const ae=await R("mahjongpub/check-players",t.cid,L);y[L]=ae}catch(ae){g.push(`${L}组: ${ae}`);const le=ne.next??ne.last??[];y[L]=le.map(W=>({player:W.player,online:false}))}g.length&&F.warning(`部分检查失败:
6
- ${g.join(`
7
- `)}`)}finally{I.value=false}}async function M(g,r,L,ne){try{if(ne){const ae=u.value.find(([W])=>W===g);if(!ae)return;const le=(ae[1].next??ae[1].last??[]).map(W=>W.player);le[r]=L,await R("mahjongpub/swap-cls-players",t.cid,g,le),F.success("名单已修改")}else await R("mahjongpub/override-player",t.cid,g,r,L),F.success("临时替换成功");await f()}catch(ae){F.error(`换人失败: ${ae}`)}}async function K(g,r,L){try{await R("mahjongpub/edit-point",t.cid,g,r,L),F.success("分数已修改"),await f()}catch(ne){F.error(`修改失败: ${ne}`)}}async function z(){const g=b.value.trim();if(g)try{await R("mahjongpub/add-subscriber",t.cid,g),b.value="",a("refresh")}catch(r){F.error(`添加失败: ${r}`)}}async function H(g){try{await R("mahjongpub/remove-subscriber",t.cid,g),a("refresh")}catch(r){F.error(`移除失败: ${r}`)}}async function xe(g){try{await R("mahjongpub/apply-schedule",t.cid,g),a("refresh"),setTimeout(f,1e3)}catch(r){F.error(`应用失败: ${r}`)}}async function te(g){try{await R("mahjongpub/toggle-schedule-pause",t.cid,g),a("refresh")}catch(r){F.error(`操作失败: ${r}`)}}async function re(){$.value=true;try{await R("mahjongpub/start",t.cid,[])}finally{$.value=false,setTimeout(f,1e3)}}async function Oe(){await R("mahjongpub/stop",t.cid,[]),setTimeout(f,500)}function Ye(g){const r=new Date,L=`${r.getHours().toString().padStart(2,"0")}:${r.getMinutes().toString().padStart(2,"0")}:${r.getSeconds().toString().padStart(2,"0")}`;d.value.push({time:L,message:g}),d.value.length>200&&d.value.splice(0,d.value.length-200),qt(()=>{m.value&&(m.value.scrollTop=m.value.scrollHeight)})}return Ut("mahjongpub/log",g=>{const[r,L]=g;r===t.cid&&Ye(L)}),je(()=>{var g;(g=t.contestInfo)!=null&&g.extra&&f(),h=setInterval(f,3e3)}),Yt(()=>{h&&clearInterval(h)}),(g,r)=>{var qe,We,Xe,Qe,et;const L=k("el-tag"),ne=k("el-option"),ae=k("el-select"),le=k("el-form-item"),W=k("el-input"),Et=k("el-form"),Mt=k("el-input-number"),Dt=k("el-time-picker"),X=k("el-button"),$e=k("el-card"),Rt=k("el-switch");return i(),_("div",to,[V(" Config Bar "),s($e,{class:"config-card",shadow:"never"},{header:o(()=>{var D,E;return[c("div",no,[c("span",null,N((D=e.contestInfo)==null?void 0:D.name)+" — 比赛配置",1),(E=e.contestInfo)!=null&&E.extra?(i(),j(L,{key:0,type:"success",size:"small"},{default:o(()=>[...r[9]||(r[9]=[C("已初始化",-1)])]),_:1})):(i(),j(L,{key:1,type:"info",size:"small"},{default:o(()=>[...r[10]||(r[10]=[C("未初始化",-1)])]),_:1}))])]}),default:o(()=>{var D;return[s(Et,{inline:true,size:"small","label-width":"70px"},{default:o(()=>[s(le,{label:"类型"},{default:o(()=>[s(ae,{modelValue:l.value.type,"onUpdate:modelValue":r[0]||(r[0]=E=>l.value.type=E),style:{width:"100px"}},{default:o(()=>[s(ne,{label:"掌心 (ti)",value:"ti"}),s(ne,{label:"雀魂 (ssb)",value:"ssb"})]),_:1},8,["modelValue"])]),_:1}),s(le,{label:"轮次"},{default:o(()=>[s(W,{modelValue:l.value.round,"onUpdate:modelValue":r[1]||(r[1]=E=>l.value.round=E),style:{width:"80px"},placeholder:"默认"},null,8,["modelValue"])]),_:1}),s(le,{label:"比赛场"},{default:o(()=>[s(W,{modelValue:l.value.lobby,"onUpdate:modelValue":r[2]||(r[2]=E=>l.value.lobby=E),style:{width:"120px"},placeholder:"lobby ID"},null,8,["modelValue"])]),_:1}),s(le,{label:"选手序号"},{default:o(()=>[s(W,{modelValue:l.value.playerIndex,"onUpdate:modelValue":r[3]||(r[3]=E=>l.value.playerIndex=E),style:{width:"60px"},placeholder:"自动"},null,8,["modelValue"])]),_:1}),s(le,{label:"版本"},{default:o(()=>[s(W,{modelValue:l.value.ver,"onUpdate:modelValue":r[4]||(r[4]=E=>l.value.ver=E),style:{width:"60px"},placeholder:"0"},null,8,["modelValue"])]),_:1}),s(le,{label:"最大行"},{default:o(()=>[s(W,{modelValue:l.value.maxRow,"onUpdate:modelValue":r[5]||(r[5]=E=>l.value.maxRow=E),style:{width:"60px"},placeholder:"默认"},null,8,["modelValue"])]),_:1})]),_:1}),c("div",ao,[r[14]||(r[14]=c("div",{class:"schedule-label"},"定时阶段",-1)),c("div",lo,[(i(true),_(q,null,ee(l.value.schedules,(E,ue)=>(i(),_("div",{key:ue,class:"schedule-row"},[s(Mt,{modelValue:E.maxRow,"onUpdate:modelValue":Q=>E.maxRow=Q,min:1,size:"small","controls-position":"right",style:{width:"80px"},placeholder:"maxRow"},null,8,["modelValue","onUpdate:modelValue"]),s(Dt,{modelValue:E._time,"onUpdate:modelValue":Q=>E._time=Q,size:"small",format:"HH:mm",style:{width:"120px"},placeholder:"开始时间",clearable:""},null,8,["modelValue","onUpdate:modelValue"]),s(X,{size:"small",type:"danger",text:"",onClick:Q=>l.value.schedules.splice(ue,1)},{default:o(()=>[...r[11]||(r[11]=[C("×",-1)])]),_:1},8,["onClick"])]))),128))]),s(X,{size:"small",onClick:O},{default:o(()=>[...r[12]||(r[12]=[C("+ 添加阶段",-1)])]),_:1}),l.value.type==="ti"?(i(),j(X,{key:0,size:"small",type:"info",onClick:v},{default:o(()=>[...r[13]||(r[13]=[C("先2副7 预设",-1)])]),_:1})):V("v-if",true)]),c("div",oo,[s(X,{type:"primary",size:"small",onClick:w},{default:o(()=>[...r[15]||(r[15]=[C("初始化",-1)])]),_:1}),s(X,{type:"danger",size:"small",disabled:!((D=e.contestInfo)!=null&&D.extra),onClick:p},{default:o(()=>[...r[16]||(r[16]=[C("反初始化",-1)])]),_:1},8,["disabled"])])]}),_:1}),V(" Subscribers "),(qe=e.contestInfo)!=null&&qe.extra?(i(),j($e,{key:0,class:"subscriber-card",shadow:"never"},{header:o(()=>[...r[17]||(r[17]=[c("div",{class:"subscriber-header"},[c("span",null,"消息订阅")],-1)])]),default:o(()=>{var D;return[c("div",so,[(i(true),_(q,null,ee(e.contestInfo.extra.subscribers,E=>(i(),j(L,{key:E,closable:"",size:"small",class:"subscriber-tag",onClose:ue=>H(E)},{default:o(()=>[C(N(E),1)]),_:2},1032,["onClose"]))),128)),(D=e.contestInfo.extra.subscribers)!=null&&D.length?V("v-if",true):(i(),_("span",ro,"暂无订阅"))]),c("div",io,[s(W,{modelValue:b.value,"onUpdate:modelValue":r[6]||(r[6]=E=>b.value=E),size:"small",placeholder:"platform:channelId",style:{width:"240px"},onKeyup:De(z,["enter"])},null,8,["modelValue"]),s(X,{size:"small",type:"primary",onClick:z},{default:o(()=>[...r[18]||(r[18]=[C("添加",-1)])]),_:1})])]}),_:1})):V("v-if",true),V(" Schedule Control (runtime) "),(Qe=(Xe=(We=e.contestInfo)==null?void 0:We.extra)==null?void 0:Xe.schedules)!=null&&Qe.length?(i(),j($e,{key:1,class:"schedule-control-card",shadow:"never"},{header:o(()=>[c("div",uo,[c("span",null,"定时控制 (当前 maxRow="+N(e.contestInfo.extra.maxRow??"默认")+")",1),s(Rt,{"model-value":!e.contestInfo.extra.schedulePaused,"active-text":"自动","inactive-text":"暂停",size:"small",onChange:r[7]||(r[7]=D=>te(!D))},null,8,["model-value"])])]),default:o(()=>[c("div",co,[(i(true),_(q,null,ee(e.contestInfo.extra.schedules,(D,E)=>(i(),_("div",{key:E,class:"schedule-control-row"},[c("span",po,[C(" 阶段 "+N(E+1)+":"+N(D.maxRow)+" 行 ",1),D.startAt?(i(),_("span",mo,"@ "+N(D.startAt),1)):V("v-if",true)]),e.contestInfo.extra.maxRow>=D.maxRow?(i(),j(L,{key:0,type:"success",size:"small"},{default:o(()=>[...r[19]||(r[19]=[C("已生效",-1)])]),_:1})):(i(),j(X,{key:1,size:"small",type:"primary",onClick:ue=>xe(D.maxRow)},{default:o(()=>[...r[20]||(r[20]=[C(" 立即生效 ",-1)])]),_:1},8,["onClick"]))]))),128))])]),_:1})):V("v-if",true),V(" Status Cards "),(et=e.contestInfo)!=null&&et.extra?(i(),_("div",fo,[c("div",vo,[c("span",null,"对局状态 — 第 "+N(e.contestInfo.extra.round??e.contestInfo.totalRounds)+" 轮",1),c("div",yo,[s(X,{type:"success",size:"small",loading:$.value,onClick:re},{default:o(()=>[...r[21]||(r[21]=[C("全部开赛",-1)])]),_:1},8,["loading"]),s(X,{type:"warning",size:"small",onClick:Oe},{default:o(()=>[...r[22]||(r[22]=[C("全部停止",-1)])]),_:1}),s(X,{size:"small",loading:I.value,onClick:J},{default:o(()=>[...r[23]||(r[23]=[C("全部检查",-1)])]),_:1},8,["loading"]),s(X,{size:"small",onClick:f},{default:o(()=>[...r[24]||(r[24]=[C("刷新",-1)])]),_:1})])]),c("div",go,[(i(true),_(q,null,ee(u.value,([D,E])=>{var ue;return i(),j(eo,{key:D,cls:D,status:E,"external-check-result":y[D],"has-admin":(ue=e.contestInfo)==null?void 0:ue.hasAdmin,onStart:Q=>B(D),onStop:Q=>U(D),onCheck:Q=>A(D,Q),onSwap:(Q,Ee,At)=>M(D,Q,Ee,At),onEditPoint:(Q,Ee)=>K(D,Q,Ee)},null,8,["cls","status","external-check-result","has-admin","onStart","onStop","onCheck","onSwap","onEditPoint"])}),128))])])):(i(),_("div",ho,[...r[25]||(r[25]=[c("p",null,"请先初始化比赛配置",-1)])])),V(" Log Panel "),s($e,{class:"log-card",shadow:"never"},{header:o(()=>[c("div",_o,[r[27]||(r[27]=c("span",null,"日志",-1)),s(X,{size:"small",text:"",onClick:r[8]||(r[8]=D=>d.value=[])},{default:o(()=>[...r[26]||(r[26]=[C("清空",-1)])]),_:1})])]),default:o(()=>[c("div",{ref_key:"logScrollRef",ref:m,class:"log-scroll"},[(i(true),_(q,null,ee(d.value,(D,E)=>(i(),_("div",{key:E,class:"log-line"},[c("span",bo,N(D.time),1),c("span",wo,N(D.message),1)]))),128)),d.value.length?V("v-if",true):(i(),_("div",Co,"暂无日志"))],512)]),_:1})])}}}),$o=ie(xo,[["__scopeId","data-v-cc43e8e6"]]),ko={class:"team-manager"},So={class:"team-header"},Io={class:"team-header-actions"},zo={key:0,class:"inline-edit"},To={class:"player-index"},Vo={class:"inline-edit-actions"},jo={key:1,class:"player-display"},Po={key:0,class:"no-players"},No=G({__name:"team-manager",props:{cid:{}},setup(e){const n=e,t=S([]),a=S(""),l=S(null),u=S([]),d=S(false),m=P(()=>{if(!a.value)return t.value;const h=a.value.toLowerCase();return t.value.filter(x=>x.name.toLowerCase().includes(h)||x.tid.toString().includes(h)||x.players.some(O=>O.toLowerCase().includes(h)))});async function $(){try{t.value=await R("mahjongpub/list-teams",n.cid)}catch(h){F.error(`加载队伍失败: ${h}`)}}function I(h){l.value=h.tid,u.value=[...h.players]}function y(){l.value=null,u.value=[]}async function b(h){d.value=true;try{const x=u.value.filter(v=>v.trim()),O=await R("mahjongpub/update-team-players",n.cid,h.tid,x);F.success(O||"保存成功"),l.value=null,u.value=[],await $()}catch(x){F.error(`保存失败: ${x}`)}finally{d.value=false}}return je($),(h,x)=>{const O=k("el-input"),v=k("el-button"),w=k("el-table-column"),p=k("el-tag"),f=k("el-table");return i(),_("div",ko,[c("div",So,[x[3]||(x[3]=c("span",null,"队伍管理",-1)),c("div",Io,[s(O,{modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=B=>a.value=B),size:"small",placeholder:"搜索队名/选手",clearable:"",style:{width:"200px"}},null,8,["modelValue"]),s(v,{size:"small",onClick:$},{default:o(()=>[...x[2]||(x[2]=[C("刷新",-1)])]),_:1})])]),s(f,{data:m.value,size:"small",border:"",class:"team-table","row-key":"tid"},{default:o(()=>[s(w,{prop:"tid",label:"ID",width:"60",sortable:""}),s(w,{prop:"name",label:"队名",width:"120",sortable:""}),s(w,{label:"选手名单","min-width":"400"},{default:o(({row:B})=>[l.value===B.tid?(i(),_("div",zo,[(i(true),_(q,null,ee(u.value,(U,A)=>(i(),_("div",{key:A,class:"inline-edit-row"},[c("span",To,N(A+1)+".",1),s(O,{modelValue:u.value[A],"onUpdate:modelValue":J=>u.value[A]=J,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),s(v,{size:"small",type:"danger",text:"",onClick:J=>u.value.splice(A,1)},{default:o(()=>[...x[4]||(x[4]=[C("×",-1)])]),_:1},8,["onClick"])]))),128)),c("div",Vo,[s(v,{size:"small",onClick:x[1]||(x[1]=U=>u.value.push(""))},{default:o(()=>[...x[5]||(x[5]=[C("+ 添加",-1)])]),_:1}),s(v,{size:"small",type:"primary",loading:d.value,onClick:U=>b(B)},{default:o(()=>[...x[6]||(x[6]=[C("保存",-1)])]),_:1},8,["loading","onClick"]),s(v,{size:"small",onClick:y},{default:o(()=>[...x[7]||(x[7]=[C("取消",-1)])]),_:1})])])):(i(),_("div",jo,[(i(true),_(q,null,ee(B.players,(U,A)=>(i(),j(p,{key:A,size:"small",class:"player-tag"},{default:o(()=>[C(N(U),1)]),_:2},1024))),128)),B.players.length?V("v-if",true):(i(),_("span",Po,"无选手"))]))]),_:1}),s(w,{label:"操作",width:"80",align:"center"},{default:o(({row:B})=>[l.value!==B.tid?(i(),j(v,{key:0,size:"small",text:"",onClick:U=>I(B)},{default:o(()=>[...x[8]||(x[8]=[C(" 编辑 ",-1)])]),_:1},8,["onClick"])):V("v-if",true)]),_:1})]),_:1},8,["data"])])}}}),Oo=ie(No,[["__scopeId","data-v-064b204b"]]),Eo={class:"lobby-panel"},Mo={class:"lobby-config"},Do={class:"section-header"},Ro={key:1,class:"empty-hint"},Ao={class:"section-header"},Lo={key:0,class:"game-list"},Uo={class:"game-header"},Fo=["title"],Bo={class:"game-actions"},Ko={class:"game-players"},Ho={key:1,class:"empty-hint"},Go=G({__name:"lobby-panel",props:{cid:{},initLobby:{},initType:{}},setup(e){const n=e,t=S(n.initLobby??""),a=S(n.initType??"ssb"),l=S([]),u=S([]),d=S(false);ce(()=>n.initLobby,b=>{b&&(t.value=b)}),ce(()=>n.initType,b=>{b&&(a.value=b)});async function m(){if(t.value){d.value=true;try{const[b,h]=await Promise.all([R("mahjongpub/lobby-players",+t.value,a.value),R("mahjongpub/lobby-games",+t.value,a.value)]);l.value=b,u.value=h}catch(b){F.error(`查询失败: ${b}`)}finally{d.value=false}}}async function $(b){try{await R("mahjongpub/lobby-pause",+t.value,a.value,b),F.success("已暂停")}catch(h){F.error(`暂停失败: ${h}`)}}async function I(b){try{await R("mahjongpub/lobby-resume",+t.value,a.value,b),F.success("已恢复")}catch(h){F.error(`恢复失败: ${h}`)}}async function y(b){try{await R("mahjongpub/lobby-stop",+t.value,a.value,b),F.success("已中止"),await m()}catch(h){F.error(`中止失败: ${h}`)}}return(b,h)=>{const x=k("el-input"),O=k("el-form-item"),v=k("el-option"),w=k("el-select"),p=k("el-button"),f=k("el-form"),B=k("el-table-column"),U=k("el-table"),A=k("el-card"),J=k("el-popconfirm"),M=k("el-tag");return i(),_("div",Eo,[c("div",Mo,[s(f,{inline:true,size:"small"},{default:o(()=>[s(O,{label:"比赛场 ID"},{default:o(()=>[s(x,{modelValue:t.value,"onUpdate:modelValue":h[0]||(h[0]=K=>t.value=K),placeholder:"lobby ID",style:{width:"140px"}},null,8,["modelValue"])]),_:1}),s(O,{label:"平台"},{default:o(()=>[s(w,{modelValue:a.value,"onUpdate:modelValue":h[1]||(h[1]=K=>a.value=K),style:{width:"120px"}},{default:o(()=>[s(v,{label:"掌心 (ti)",value:"ti"}),s(v,{label:"雀魂 (ssb)",value:"ssb"})]),_:1},8,["modelValue"])]),_:1}),s(O,null,{default:o(()=>[s(p,{size:"small",type:"primary",onClick:m},{default:o(()=>[...h[2]||(h[2]=[C("刷新",-1)])]),_:1})]),_:1})]),_:1})]),V(" Ready Players "),s(A,{shadow:"never",class:"section-card"},{header:o(()=>[c("div",Do,[c("span",null,"待机选手 ("+N(l.value.length)+")",1)])]),default:o(()=>[l.value.length?(i(),j(U,{key:0,data:l.value,size:"small",border:"","max-height":"300"},{default:o(()=>[s(B,{prop:"nickname",label:"昵称","min-width":"150"}),s(B,{prop:"accountId",label:"ID",width:"120"})]),_:1},8,["data"])):(i(),_("div",Ro,N(d.value?"加载中...":t.value?"暂无待机选手":"请输入比赛场 ID 后查询"),1))]),_:1}),V(" Running Games "),s(A,{shadow:"never",class:"section-card"},{header:o(()=>[c("div",Ao,[c("span",null,"进行中对局 ("+N(u.value.length)+")",1)])]),default:o(()=>[u.value.length?(i(),_("div",Lo,[(i(true),_(q,null,ee(u.value,K=>(i(),j(A,{key:K.id,shadow:"hover",class:"game-card"},{default:o(()=>[c("div",Uo,[c("span",{class:"game-id",title:K.id},N(K.id.slice(0,12))+"...",9,Fo),c("div",Bo,[s(p,{size:"small",type:"warning",onClick:z=>$(K.id)},{default:o(()=>[...h[3]||(h[3]=[C("暂停",-1)])]),_:1},8,["onClick"]),s(p,{size:"small",type:"primary",onClick:z=>I(K.id)},{default:o(()=>[...h[4]||(h[4]=[C("恢复",-1)])]),_:1},8,["onClick"]),s(J,{title:"确定中止该对局?",onConfirm:z=>y(K.id)},{reference:o(()=>[s(p,{size:"small",type:"danger"},{default:o(()=>[...h[5]||(h[5]=[C("中止",-1)])]),_:1})]),_:1},8,["onConfirm"])])]),c("div",Ko,[(i(true),_(q,null,ee(K.players,(z,H)=>(i(),j(M,{key:H,size:"small",class:"player-tag"},{default:o(()=>[C(N(z.nickname||`#${z.accountId}`),1)]),_:2},1024))),128))])]),_:2},1024))),128))])):(i(),_("div",Ho,N(d.value?"加载中...":t.value?"暂无进行中对局":"请输入比赛场 ID 后查询"),1))]),_:1})])}}}),Zo=ie(Go,[["__scopeId","data-v-a21c65dd"]]),Jo={key:0,class:"empty-state"},Yo={key:1,class:"empty-state"},qo={key:2,class:"contest-panel"},Wo={class:"first-tab-label"},Xo={key:1},Qo=G({__name:"contest-panel",props:{cid:{},managed:{},sidebarCollapsed:{type:Boolean}},emits:["toggle-sidebar"],setup(e,{emit:n}){const t=e,a=S("match"),l=S(false),u=S(null);async function d(){l.value=true;try{u.value=await R("mahjongpub/contest-info",t.cid)}catch(m){console.error("Failed to load contest info:",m)}finally{l.value=false}}return ce(()=>t.cid,()=>{a.value="match",d()},{immediate:true}),(m,$)=>{const I=k("el-button"),y=k("el-tab-pane"),b=k("el-tooltip"),h=k("el-tabs");return e.cid?l.value&&!u.value?(i(),_("div",Yo,[...$[3]||($[3]=[c("p",null,"加载中...",-1)])])):(i(),_("div",qo,[s(h,{modelValue:a.value,"onUpdate:modelValue":$[1]||($[1]=x=>a.value=x)},{default:o(()=>{var x;return[s(y,{name:"match"},{label:o(()=>[c("div",Wo,[s(I,{class:"sidebar-toggle-btn",size:"small",text:"",title:e.sidebarCollapsed?"展开侧边栏":"收起侧边栏",onClick:$[0]||($[0]=Se(O=>m.$emit("toggle-sidebar"),["stop"]))},{default:o(()=>[C(N(e.sidebarCollapsed?"▶":"◀"),1)]),_:1},8,["title"]),$[4]||($[4]=c("span",null,"比赛进程",-1))])]),default:o(()=>[s($o,{cid:e.cid,"contest-info":u.value,onRefresh:d},null,8,["cid","contest-info"])]),_:1}),s(y,{label:"队伍管理",name:"team",disabled:!((x=u.value)!=null&&x.hasAdmin)},{label:o(()=>{var O;return[(O=u.value)!=null&&O.hasAdmin?(i(),_("span",Xo,"队伍管理")):(i(),j(b,{key:0,content:"请先配置管理密码(右键侧边栏比赛项)",placement:"top"},{default:o(()=>[...$[5]||($[5]=[c("span",null,"队伍管理",-1)])]),_:1}))]}),default:o(()=>{var O;return[(O=u.value)!=null&&O.hasAdmin?(i(),j(Oo,{key:0,cid:e.cid},null,8,["cid"])):V("v-if",true)]}),_:1},8,["disabled"]),s(y,{label:"比赛场",name:"lobby"},{default:o(()=>{var O,v,w,p;return[s(Zo,{cid:e.cid,"init-lobby":(v=(O=u.value)==null?void 0:O.extra)==null?void 0:v.lobby,"init-type":(p=(w=u.value)==null?void 0:w.extra)==null?void 0:p.type},null,8,["cid","init-lobby","init-type"])]}),_:1})]}),_:1},8,["modelValue"])])):(i(),_("div",Jo,[...$[2]||($[2]=[c("p",null,"请选择比赛",-1)])]))}}}),es=ie(Qo,[["__scopeId","data-v-c9a9bbef"]]),ts={class:"main-layout"},ns={class:"content-wrapper"},as={key:1,class:"empty-state"},ls=G({__name:"layout",setup(e){const n=S([]),t=S(null),a=S(false),l=P(()=>n.value.find(I=>I.cid===t.value)??null);async function u(){n.value=await R("mahjongpub/list-managed")}async function d(I){await u(),t.value=I.cid}async function m(I){var y;await u(),t.value===I&&(t.value=((y=n.value[0])==null?void 0:y.cid)??null)}async function $(I,y){await u()}return je(u),(I,y)=>{const b=k("k-layout");return i(),j(b,null,{default:o(()=>[c("div",ts,[c("div",{class:Y(["sidebar-wrapper",{collapsed:a.value}])},[Le(s(Ml,{contests:n.value,"active-cid":t.value,onSelect:y[0]||(y[0]=h=>t.value=h),onAdd:d,onRemove:m,onUpdate:$},null,8,["contests","active-cid"]),[[Ue,!a.value]])],2),c("div",ns,[t.value?(i(),j(es,{key:t.value,cid:t.value,managed:l.value,"sidebar-collapsed":a.value,onToggleSidebar:y[1]||(y[1]=h=>a.value=!a.value)},null,8,["cid","managed","sidebar-collapsed"])):(i(),_("div",as,[...y[2]||(y[2]=[c("p",null,"请从左侧选择或添加比赛",-1)])]))])])]),_:1})}}}),os=ie(ls,[["__scopeId","data-v-592f974d"]]),us=e=>{e.page({name:"比赛管理",path:"/mahjongpub",icon:"mahjongpub:icon",component:os,authority:3})};export{us as default};
5
+ **/const on=Object.prototype.hasOwnProperty,lt=(e,n)=>on.call(e,n),Ie=e=>typeof e=="function",ze=e=>typeof e=="string",ht=e=>e!==null&&typeof e=="object";var sn=typeof global=="object"&&global&&global.Object===Object&&global,rn=typeof self=="object"&&self&&self.Object===Object&&self,Fe=sn||rn||Function("return this")(),ve=Fe.Symbol,_t=Object.prototype,un=_t.hasOwnProperty,dn=_t.toString,he=ve?ve.toStringTag:void 0;function cn(e){var n=un.call(e,he),t=e[he];try{e[he]=void 0;var a=true}catch{}var l=dn.call(e);return a&&(n?e[he]=t:delete e[he]),l}var pn=Object.prototype,mn=pn.toString;function fn(e){return mn.call(e)}var vn="[object Null]",yn="[object Undefined]",at=ve?ve.toStringTag:void 0;function bt(e){return e==null?e===void 0?yn:vn:at&&at in Object(e)?cn(e):fn(e)}function gn(e){return e!=null&&typeof e=="object"}var hn="[object Symbol]";function Ke(e){return typeof e=="symbol"||gn(e)&&bt(e)==hn}function _n(e,n){for(var t=-1,a=e==null?0:e.length,l=Array(a);++t<a;)l[t]=n(e[t],t,e);return l}var He=Array.isArray,ot=ve?ve.prototype:void 0,st=ot?ot.toString:void 0;function wt(e){if(typeof e=="string")return e;if(He(e))return _n(e,wt)+"";if(Ke(e))return st?st.call(e):"";var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function Ct(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var bn="[object AsyncFunction]",wn="[object Function]",Cn="[object GeneratorFunction]",xn="[object Proxy]";function $n(e){if(!Ct(e))return false;var n=bt(e);return n==wn||n==Cn||n==bn||n==xn}var Me=Fe["__core-js_shared__"],rt=function(){var e=/[^.]+$/.exec(Me&&Me.keys&&Me.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function kn(e){return!!rt&&rt in e}var Sn=Function.prototype,In=Sn.toString;function zn(e){if(e!=null){try{return In.call(e)}catch{}try{return e+""}catch{}}return""}var Vn=/[\\^$.*+?()[\]{}|]/g,Tn=/^\[object .+?Constructor\]$/,jn=Function.prototype,Nn=Object.prototype,Pn=jn.toString,On=Nn.hasOwnProperty,En=RegExp("^"+Pn.call(On).replace(Vn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Mn(e){if(!Ct(e)||kn(e))return false;var n=$n(e)?En:Tn;return n.test(zn(e))}function Dn(e,n){return e==null?void 0:e[n]}function xt(e,n){var t=Dn(e,n);return Mn(t)?t:void 0}function Rn(e,n){return e===n||e!==e&&n!==n}var An=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Bn=/^\w*$/;function Ln(e,n){if(He(e))return false;var t=typeof e;return t=="number"||t=="symbol"||t=="boolean"||e==null||Ke(e)?true:Bn.test(e)||!An.test(e)||n!=null&&e in Object(n)}var be=xt(Object,"create");function Un(){this.__data__=be?be(null):{},this.size=0}function Fn(e){var n=this.has(e)&&delete this.__data__[e];return this.size-=n?1:0,n}var Kn="__lodash_hash_undefined__",Hn=Object.prototype,Gn=Hn.hasOwnProperty;function Zn(e){var n=this.__data__;if(be){var t=n[e];return t===Kn?void 0:t}return Gn.call(n,e)?n[e]:void 0}var Jn=Object.prototype,Yn=Jn.hasOwnProperty;function qn(e){var n=this.__data__;return be?n[e]!==void 0:Yn.call(n,e)}var Wn="__lodash_hash_undefined__";function Xn(e,n){var t=this.__data__;return this.size+=this.has(e)?0:1,t[e]=be&&n===void 0?Wn:n,this}function pe(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}pe.prototype.clear=Un;pe.prototype.delete=Fn;pe.prototype.get=Zn;pe.prototype.has=qn;pe.prototype.set=Xn;function Qn(){this.__data__=[],this.size=0}function Ne(e,n){for(var t=e.length;t--;)if(Rn(e[t][0],n))return t;return-1}var el=Array.prototype,tl=el.splice;function nl(e){var n=this.__data__,t=Ne(n,e);if(t<0)return false;var a=n.length-1;return t==a?n.pop():tl.call(n,t,1),--this.size,true}function ll(e){var n=this.__data__,t=Ne(n,e);return t<0?void 0:n[t][1]}function al(e){return Ne(this.__data__,e)>-1}function ol(e,n){var t=this.__data__,a=Ne(t,e);return a<0?(++this.size,t.push([e,n])):t[a][1]=n,this}function ge(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}ge.prototype.clear=Qn;ge.prototype.delete=nl;ge.prototype.get=ll;ge.prototype.has=al;ge.prototype.set=ol;var sl=xt(Fe,"Map");function rl(){this.size=0,this.__data__={hash:new pe,map:new(sl||ge),string:new pe}}function il(e){var n=typeof e;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?e!=="__proto__":e===null}function Pe(e,n){var t=e.__data__;return il(n)?t[typeof n=="string"?"string":"hash"]:t.map}function ul(e){var n=Pe(this,e).delete(e);return this.size-=n?1:0,n}function dl(e){return Pe(this,e).get(e)}function cl(e){return Pe(this,e).has(e)}function pl(e,n){var t=Pe(this,e),a=t.size;return t.set(e,n),this.size+=t.size==a?0:1,this}function me(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var a=e[n];this.set(a[0],a[1])}}me.prototype.clear=rl;me.prototype.delete=ul;me.prototype.get=dl;me.prototype.has=cl;me.prototype.set=pl;var ml="Expected a function";function Ge(e,n){if(typeof e!="function"||n!=null&&typeof n!="function")throw new TypeError(ml);var t=function(){var a=arguments,l=n?n.apply(this,a):a[0],u=t.cache;if(u.has(l))return u.get(l);var d=e.apply(this,a);return t.cache=u.set(l,d)||u,d};return t.cache=new(Ge.Cache||me),t}Ge.Cache=me;var fl=500;function vl(e){var n=Ge(e,function(a){return t.size===fl&&t.clear(),a}),t=n.cache;return n}var yl=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,gl=/\\(\\)?/g,hl=vl(function(e){var n=[];return e.charCodeAt(0)===46&&n.push(""),e.replace(yl,function(t,a,l,u){n.push(l?u.replace(gl,"$1"):a||t)}),n});function _l(e){return e==null?"":wt(e)}function bl(e,n){return He(e)?e:Ln(e,n)?[e]:hl(_l(e))}function wl(e){if(typeof e=="string"||Ke(e))return e;var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function Cl(e,n){n=bl(n,e);for(var t=0,a=n.length;e!=null&&t<a;)e=e[wl(n[t++])];return t&&t==a?e:void 0}function xl(e,n,t){var a=e==null?void 0:Cl(e,n);return a===void 0?t:a}function $l(e){for(var n=-1,t=e==null?0:e.length,a={};++n<t;){var l=e[n];a[l[0]]=l[1]}return a}const kl=e=>e===void 0,we=e=>typeof e=="number",Sl=e=>typeof Element>"u"?false:e instanceof Element,Il=e=>ze(e)?!Number.isNaN(Number(e)):false,it=e=>Object.keys(e);function Re(e,n="px"){if(!e)return"";if(we(e)||Il(e))return`${e}${n}`;if(ze(e))return e}/*! Element Plus Icons Vue v2.3.2 */var zl=G({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),Vl=zl,Tl=G({name:"Close",__name:"close",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),jl=Tl,Nl=G({name:"InfoFilled",__name:"info-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),Pl=Nl,Ol=G({name:"SuccessFilled",__name:"success-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),El=Ol,Ml=G({name:"WarningFilled",__name:"warning-filled",setup(e){return(n,t)=>(i(),_("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[c("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),Dl=Ml;const $t="__epPropKey",oe=e=>e,Rl=e=>ht(e)&&!!e[$t],kt=(e,n)=>{if(!ht(e)||Rl(e))return e;const{values:t,required:a,default:l,type:u,validator:d}=e,$={type:u,required:!!a,validator:t||d?I=>{let g=false,b=[];if(t&&(b=Array.from(t),lt(e,"default")&&b.push(l),g||(g=b.includes(I))),d&&(g||(g=d(I))),!g&&b.length>0){const h=[...new Set(b)].map(x=>JSON.stringify(x)).join(", ");Ft(`Invalid prop: validation failed${n?` for prop "${n}"`:""}. Expected one of [${h}], got value ${JSON.stringify(I)}.`)}return g}:void 0,[$t]:true};return lt(e,"default")&&($.default=l),$},Ce=e=>$l(Object.entries(e).map(([n,t])=>[n,kt(t,n)])),Al=oe([String,Object,Function]),Bl={Close:jl},ut={success:El,warning:Dl,error:Vl,info:Pl},St=(e,n)=>(e.install=t=>{for(const a of[e,...Object.values({})])t.component(a.name,a)},e),Ll=(e,n)=>(e.install=t=>{e._context=t._context,t.config.globalProperties[n]=e},e),Ul={esc:"Escape"},Fl=["","default","small","large"],Kl=e=>e,dt=({from:e,replacement:n,scope:t,version:a,ref:l,type:u="API"},d)=>{ce(()=>V(d),m=>{},{immediate:true})};var Hl={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const Gl=e=>(n,t)=>Zl(n,t,V(e)),Zl=(e,n,t)=>xl(t,e,e).replace(/\{(\w+)\}/g,(a,l)=>{var u;return`${(u=n==null?void 0:n[l])!=null?u:`{${l}}`}`}),Jl=e=>{const n=P(()=>V(e).name),t=Kt(e)?e:S(e);return{lang:n,locale:t,t:Gl(e)}},It=Symbol("localeContextKey"),Yl=e=>{const n=e||fe(It,S());return Jl(P(()=>n.value||Hl))},ke="el",ql="is-",de=(e,n,t,a,l)=>{let u=`${e}-${n}`;return t&&(u+=`-${t}`),a&&(u+=`__${a}`),l&&(u+=`--${l}`),u},zt=Symbol("namespaceContextKey"),Wl=e=>{const n=e||(_e()?fe(zt,S(ke)):S(ke));return P(()=>V(n)||ke)},Ze=(e,n)=>{const t=Wl(n);return{namespace:t,b:(y="")=>de(t.value,e,y,"",""),e:y=>y?de(t.value,e,"",y,""):"",m:y=>y?de(t.value,e,"","",y):"",be:(y,w)=>y&&w?de(t.value,e,y,w,""):"",em:(y,w)=>y&&w?de(t.value,e,"",y,w):"",bm:(y,w)=>y&&w?de(t.value,e,y,"",w):"",bem:(y,w,p)=>y&&w&&p?de(t.value,e,y,w,p):"",is:(y,...w)=>{const p=w.length>=1?w[0]:true;return y&&p?`${ql}${y}`:""},cssVar:y=>{const w={};for(const p in y)y[p]&&(w[`--${t.value}-${p}`]=y[p]);return w},cssVarName:y=>`--${t.value}-${y}`,cssVarBlock:y=>{const w={};for(const p in y)y[p]&&(w[`--${t.value}-${e}-${p}`]=y[p]);return w},cssVarBlockName:y=>`--${t.value}-${e}-${y}`}},ct={current:0},pt=S(0),Vt=2e3,mt=Symbol("elZIndexContextKey"),Tt=Symbol("zIndexContextKey"),Xl=e=>{const n=_e()?fe(mt,ct):ct,t=e||(_e()?fe(Tt,void 0):void 0),a=P(()=>{const d=V(t);return we(d)?d:Vt}),l=P(()=>a.value+pt.value),u=()=>(n.current++,pt.value=n.current,l.value);return!Ue&&fe(mt),{initialZIndex:a,currentZIndex:l,nextZIndex:u}},Ql=kt({type:String,values:Fl,required:false}),ea=Symbol("size"),ta=Symbol("emptyValuesContextKey"),na=Ce({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>Ie(e)?!e():!e}}),jt=Symbol(),Ve=S();function Nt(e,n=void 0){return _e()?fe(jt,Ve):Ve}function la(e,n){const t=Nt(),a=Ze(e,P(()=>{var m;return((m=t.value)==null?void 0:m.namespace)||ke})),l=Yl(P(()=>{var m;return(m=t.value)==null?void 0:m.locale})),u=Xl(P(()=>{var m;return((m=t.value)==null?void 0:m.zIndex)||Vt})),d=P(()=>{var m;return V(n)||((m=t.value)==null?void 0:m.size)||""});return Pt(P(()=>V(t)||{})),{ns:a,locale:l,zIndex:u,size:d}}const Pt=(e,n,t=false)=>{var a;const l=!!_e(),u=l?Nt():void 0,d=(a=void 0)!=null?a:l?Ht:void 0;if(!d)return;const m=P(()=>{const $=V(e);return u!=null&&u.value?aa(u.value,$):$});return d(jt,m),d(It,P(()=>m.value.locale)),d(zt,P(()=>m.value.namespace)),d(Tt,P(()=>m.value.zIndex)),d(ea,{size:P(()=>m.value.size||"")}),d(ta,P(()=>({emptyValues:m.value.emptyValues,valueOnClear:m.value.valueOnClear}))),(t||!Ve.value)&&(Ve.value=m.value),m},aa=(e,n)=>{const t=[...new Set([...it(e),...it(n)])],a={};for(const l of t)a[l]=n[l]!==void 0?n[l]:e[l];return a},oa=Ce({a11y:{type:Boolean,default:true},locale:{type:oe(Object)},size:Ql,button:{type:oe(Object)},experimentalFeatures:{type:oe(Object)},keyboardNavigation:{type:Boolean,default:true},message:{type:oe(Object)},zIndex:Number,namespace:{type:String,default:"el"},...na}),Ae={};G({name:"ElConfigProvider",props:oa,setup(e,{slots:n}){ce(()=>e.message,a=>{Object.assign(Ae,a??{})},{immediate:true,deep:true});const t=Pt(e);return()=>Te(n,"default",{config:t==null?void 0:t.value})}});var Je=(e,n)=>{const t=e.__vccOpts||e;for(const[a,l]of n)t[a]=l;return t};const sa=Ce({size:{type:oe([Number,String])},color:{type:String}}),ra=G({name:"ElIcon",inheritAttrs:false}),ia=G({...ra,props:sa,setup(e){const n=e,t=Ze("icon"),a=P(()=>{const{size:l,color:u}=n;return!l&&!u?{}:{fontSize:kl(l)?void 0:Re(l),"--color":u}});return(l,u)=>(i(),_("i",Gt({class:V(t).b(),style:V(a)},l.$attrs),[Te(l.$slots,"default")],16))}});var ua=Je(ia,[["__file","icon.vue"]]);const ft=St(ua),da=Ce({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:true},color:String,dotStyle:{type:oe([String,Object,Array])},badgeStyle:{type:oe([String,Object,Array])},offset:{type:oe(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),ca=["textContent"],pa=G({name:"ElBadge"}),ma=G({...pa,props:da,setup(e,{expose:n}){const t=e,a=Ze("badge"),l=P(()=>t.isDot?"":we(t.value)&&we(t.max)?t.max<t.value?`${t.max}+`:t.value===0&&!t.showZero?"":`${t.value}`:`${t.value}`),u=P(()=>{var d,m,$,I,g,b;return[{backgroundColor:t.color,marginRight:Re(-((m=(d=t.offset)==null?void 0:d[0])!=null?m:0)),marginTop:Re((I=($=t.offset)==null?void 0:$[1])!=null?I:0)},(g=t.dotStyle)!=null?g:{},(b=t.badgeStyle)!=null?b:{}]});return dt({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},P(()=>!!t.dotStyle)),dt({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},P(()=>!!t.dotClass)),n({content:l}),(d,m)=>(i(),_("div",{class:Y(V(a).b())},[Te(d.$slots,"default"),r(vt,{name:`${V(a).namespace.value}-zoom-in-center`,persisted:""},{default:o(()=>[Be(c("sup",{class:Y([V(a).e("content"),V(a).em("content",d.type),V(a).is("fixed",!!d.$slots.default),V(a).is("dot",d.isDot),d.dotClass,d.badgeClass]),style:yt(V(u)),textContent:O(V(l))},null,14,ca),[[Le,!d.hidden&&(V(l)||d.isDot)]])]),_:1},8,["name"])],2))}});var fa=Je(ma,[["__file","badge.vue"]]);const va=St(fa),Ot=["success","info","warning","error"],Z=Kl({customClass:"",center:false,dangerouslyUseHTMLString:false,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:false,type:"info",plain:false,offset:16,zIndex:0,grouping:false,repeatNum:1,appendTo:Ue?document.body:void 0}),ya=Ce({customClass:{type:String,default:Z.customClass},center:{type:Boolean,default:Z.center},dangerouslyUseHTMLString:{type:Boolean,default:Z.dangerouslyUseHTMLString},duration:{type:Number,default:Z.duration},icon:{type:Al,default:Z.icon},id:{type:String,default:Z.id},message:{type:oe([String,Object,Function]),default:Z.message},onClose:{type:oe(Function),default:Z.onClose},showClose:{type:Boolean,default:Z.showClose},type:{type:String,values:Ot,default:Z.type},plain:{type:Boolean,default:Z.plain},offset:{type:Number,default:Z.offset},zIndex:{type:Number,default:Z.zIndex},grouping:{type:Boolean,default:Z.grouping},repeatNum:{type:Number,default:Z.repeatNum}}),ga={destroy:()=>true},se=Zt([]),ha=e=>{const n=se.findIndex(l=>l.id===e),t=se[n];let a;return n>0&&(a=se[n-1]),{current:t,prev:a}},_a=e=>{const{prev:n}=ha(e);return n?n.vm.exposed.bottom.value:0},ba=(e,n)=>se.findIndex(a=>a.id===e)>0?16:n,wa=["id"],Ca=["innerHTML"],xa=G({name:"ElMessage"}),$a=G({...xa,props:ya,emits:ga,setup(e,{expose:n}){const t=e,{Close:a}=Bl,{ns:l,zIndex:u}=la("message"),{currentZIndex:d,nextZIndex:m}=u,$=S(),I=S(false),g=S(0);let b;const h=P(()=>t.type?t.type==="error"?"danger":t.type:"info"),x=P(()=>{const M=t.type;return{[l.bm("icon",M)]:M&&ut[M]}}),E=P(()=>t.icon||ut[t.type]||""),y=P(()=>_a(t.id)),w=P(()=>ba(t.id,t.offset)+y.value),p=P(()=>g.value+w.value),f=P(()=>({top:`${w.value}px`,zIndex:d.value}));function F(){t.duration!==0&&({stop:b}=en(()=>{A()},t.duration))}function L(){b==null||b()}function A(){I.value=false}function J({code:M}){M===Ul.esc&&A()}return je(()=>{F(),m(),I.value=true}),ce(()=>t.repeatNum,()=>{L(),F()}),Xt(document,"keydown",J),Qt($,()=>{g.value=$.value.getBoundingClientRect().height}),n({visible:I,bottom:p,close:A}),(M,K)=>(i(),N(vt,{name:V(l).b("fade"),onBeforeLeave:M.onClose,onAfterLeave:K[0]||(K[0]=z=>M.$emit("destroy")),persisted:""},{default:o(()=>[Be(c("div",{id:M.id,ref_key:"messageRef",ref:$,class:Y([V(l).b(),{[V(l).m(M.type)]:M.type},V(l).is("center",M.center),V(l).is("closable",M.showClose),V(l).is("plain",M.plain),M.customClass]),style:yt(V(f)),role:"alert",onMouseenter:L,onMouseleave:F},[M.repeatNum>1?(i(),N(V(va),{key:0,value:M.repeatNum,type:V(h),class:Y(V(l).e("badge"))},null,8,["value","type","class"])):T("v-if",true),V(E)?(i(),N(V(ft),{key:1,class:Y([V(l).e("icon"),V(x)])},{default:o(()=>[(i(),N(Jt(V(E))))]),_:1},8,["class"])):T("v-if",true),Te(M.$slots,"default",{},()=>[M.dangerouslyUseHTMLString?(i(),_(q,{key:1},[T(" Caution here, message could've been compromised, never use user's input as message "),c("p",{class:Y(V(l).e("content")),innerHTML:M.message},null,10,Ca)],2112)):(i(),_("p",{key:0,class:Y(V(l).e("content"))},O(M.message),3))]),M.showClose?(i(),N(V(ft),{key:2,class:Y(V(l).e("closeBtn")),onClick:Se(A,["stop"])},{default:o(()=>[r(V(a))]),_:1},8,["class","onClick"])):T("v-if",true)],46,wa),[[Le,I.value]])]),_:3},8,["name","onBeforeLeave"]))}});var ka=Je($a,[["__file","message.vue"]]);let Sa=1;const Et=e=>{const n=!e||ze(e)||gt(e)||Ie(e)?{message:e}:e,t={...Z,...n};if(!t.appendTo)t.appendTo=document.body;else if(ze(t.appendTo)){let a=document.querySelector(t.appendTo);Sl(a)||(a=document.body),t.appendTo=a}return t},Ia=e=>{const n=se.indexOf(e);if(n===-1)return;se.splice(n,1);const{handler:t}=e;t.close()},za=({appendTo:e,...n},t)=>{const a=`message_${Sa++}`,l=n.onClose,u=document.createElement("div"),d={...n,id:a,onClose:()=>{l==null||l(),Ia(g)},onDestroy:()=>{nt(null,u)}},m=r(ka,d,Ie(d.message)||gt(d.message)?{default:Ie(d.message)?d.message:()=>d.message}:null);m.appContext=t||ye._context,nt(m,u),e.appendChild(u.firstElementChild);const $=m.component,g={id:a,vnode:m,vm:$,handler:{close:()=>{$.exposed.visible.value=false}},props:m.component.props};return g},ye=(e={},n)=>{if(!Ue)return{close:()=>{}};if(we(Ae.max)&&se.length>=Ae.max)return{close:()=>{}};const t=Et(e);if(t.grouping&&se.length){const l=se.find(({vnode:u})=>{var d;return((d=u.props)==null?void 0:d.message)===t.message});if(l)return l.props.repeatNum+=1,l.props.type=t.type,l.handler}const a=za(t,n);return se.push(a),a.handler};Ot.forEach(e=>{ye[e]=(n={},t)=>{const a=Et(n);return ye({...a,type:e},t)}});function Va(e){for(const n of se)(!e||e===n.props.type)&&n.handler.close()}ye.closeAll=Va;ye._context=null;const U=Ll(ye,"$message"),Ta={class:"sidebar"},ja={class:"sidebar-header"},Na={class:"contest-list"},Pa=["onClick","onContextmenu"],Oa={class:"contest-name"},Ea={class:"contest-cid"},Ma=G({__name:"sidebar",props:{contests:{},activeCid:{}},emits:["select","add","remove","update"],setup(e,{emit:n}){const t=n,a=S(false),l=S(null),u=S(""),d=S(null),m=S(false);async function $(){if(l.value){m.value=true;try{d.value=await R("mahjongpub/search-contests",l.value,u.value||void 0)}catch(w){U.error(`查询失败: ${w}`)}finally{m.value=false}}}async function I(){if(d.value){m.value=true;try{const w={cid:d.value.cid,name:d.value.name,adminPassword:u.value||void 0};await R("mahjongpub/add-managed",w),t("add",w),a.value=false,l.value=null,d.value=null,u.value=""}catch(w){U.error(`添加失败: ${w}`)}finally{m.value=false}}}const g=S(false),b=S(null),h=S("");function x(w,p){b.value=p,h.value=p.adminPassword??"",g.value=true}async function E(){if(b.value)try{await R("mahjongpub/update-managed",b.value.cid,{adminPassword:h.value||void 0}),t("update",b.value.cid,{adminPassword:h.value||void 0}),g.value=false}catch(w){U.error(`保存失败: ${w}`)}}async function y(){if(b.value)try{await R("mahjongpub/remove-managed",b.value.cid),t("remove",b.value.cid),g.value=false}catch(w){U.error(`移除失败: ${w}`)}}return(w,p)=>{const f=k("el-button"),F=k("el-icon"),L=k("el-input"),A=k("el-form-item"),J=k("el-tag"),M=k("el-form"),K=k("el-dialog");return i(),_("div",Ta,[c("div",ja,[p[9]||(p[9]=c("span",null,"比赛列表",-1)),r(f,{size:"small",type:"primary",onClick:p[0]||(p[0]=z=>a.value=true)},{default:o(()=>[...p[8]||(p[8]=[C("+ 添加",-1)])]),_:1})]),c("div",Na,[(i(true),_(q,null,ee(e.contests,z=>(i(),_("div",{key:z.cid,class:Y(["contest-item",{active:z.cid===e.activeCid}]),onClick:H=>w.$emit("select",z.cid),onContextmenu:Se(H=>x(H,z),["prevent"])},[c("div",Oa,O(z.name),1),c("div",Ea,"#"+O(z.cid),1),z.adminPassword?(i(),N(F,{key:0,class:"admin-badge",title:"已配置管理密码"},{default:o(()=>[...p[10]||(p[10]=[c("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor"},[c("path",{d:"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"})],-1)])]),_:1})):T("v-if",true)],42,Pa))),128))]),T(" Import Dialog "),r(K,{modelValue:a.value,"onUpdate:modelValue":p[4]||(p[4]=z=>a.value=z),title:"添加比赛",width:"420"},{footer:o(()=>[r(f,{onClick:p[3]||(p[3]=z=>a.value=false)},{default:o(()=>[...p[13]||(p[13]=[C("取消",-1)])]),_:1}),r(f,{loading:m.value,onClick:$},{default:o(()=>[...p[14]||(p[14]=[C("查询",-1)])]),_:1},8,["loading"]),r(f,{type:"primary",disabled:!d.value,onClick:I},{default:o(()=>[...p[15]||(p[15]=[C("添加",-1)])]),_:1},8,["disabled"])]),default:o(()=>[r(M,{"label-width":"80px",onSubmit:Se(I,["prevent"])},{default:o(()=>[r(A,{label:"比赛 ID"},{default:o(()=>[r(L,{modelValue:l.value,"onUpdate:modelValue":p[1]||(p[1]=z=>l.value=z),modelModifiers:{number:true},placeholder:"输入大凤林比赛 ID"},null,8,["modelValue"])]),_:1}),d.value?(i(),N(A,{key:0,label:"比赛名称"},{default:o(()=>[c("span",null,O(d.value.name),1)]),_:1})):T("v-if",true),d.value?(i(),N(A,{key:1,label:"当前轮次"},{default:o(()=>[c("span",null,O(d.value.round),1)]),_:1})):T("v-if",true),r(A,{label:"管理密码"},{default:o(()=>[r(L,{modelValue:u.value,"onUpdate:modelValue":p[2]||(p[2]=z=>u.value=z),placeholder:"可选,用于队伍管理","show-password":""},null,8,["modelValue"])]),_:1}),d.value&&u.value?(i(),N(A,{key:2,label:"密码验证"},{default:o(()=>[d.value.adminVerified?(i(),N(J,{key:0,type:"success",size:"small"},{default:o(()=>[...p[11]||(p[11]=[C("密码正确",-1)])]),_:1})):(i(),N(J,{key:1,type:"danger",size:"small"},{default:o(()=>[...p[12]||(p[12]=[C("密码错误",-1)])]),_:1}))]),_:1})):T("v-if",true)]),_:1})]),_:1},8,["modelValue"]),T(" Context Menu (password edit) "),r(K,{modelValue:g.value,"onUpdate:modelValue":p[7]||(p[7]=z=>g.value=z),title:"编辑比赛",width:"400"},{footer:o(()=>[r(f,{type:"danger",onClick:y},{default:o(()=>[...p[16]||(p[16]=[C("移除比赛",-1)])]),_:1}),r(f,{onClick:p[6]||(p[6]=z=>g.value=false)},{default:o(()=>[...p[17]||(p[17]=[C("取消",-1)])]),_:1}),r(f,{type:"primary",onClick:E},{default:o(()=>[...p[18]||(p[18]=[C("保存",-1)])]),_:1})]),default:o(()=>[b.value?(i(),N(M,{key:0,"label-width":"80px"},{default:o(()=>[r(A,{label:"比赛名称"},{default:o(()=>[c("span",null,O(b.value.name)+" (#"+O(b.value.cid)+")",1)]),_:1}),r(A,{label:"管理密码"},{default:o(()=>[r(L,{modelValue:h.value,"onUpdate:modelValue":p[5]||(p[5]=z=>h.value=z),placeholder:"留空则无队伍管理权限","show-password":""},null,8,["modelValue"])]),_:1})]),_:1})):T("v-if",true)]),_:1},8,["modelValue"])])}}}),Da=ie(Ma,[["__scopeId","data-v-8b51a7a2"]]),Ra={class:"cls-header"},Aa={class:"cls-title"},Ba={key:0,class:"error-msg"},La={class:"player-list"},Ua={class:"player-info"},Fa={class:"player-name"},Ka={class:"swap-popover"},Ha={key:0,class:"swap-section"},Ga=["onClick"],Za={class:"swap-manual"},Ja={class:"swap-mode-actions"},Ya={class:"player-right"},qa=["onClick"],Wa={key:1,class:"point-edit"},Xa={key:0,class:"no-players"},Qa={class:"cls-actions"},eo=G({__name:"cls-card",props:{cls:{},status:{},externalCheckResult:{},hasAdmin:{type:Boolean}},emits:["start","stop","check","swap","edit-point"],setup(e,{emit:n}){const t=e,a=n,l=P(()=>t.status.next??t.status.last??[]),u=P(()=>t.status.status==="pending"||t.status.status==="suspended"),d=S(false),m=S(null),$=P(()=>m.value??t.externalCheckResult??null),I=S(""),g=S({});function b(p,f){g.value[p]=f}function h(p){const f=g.value[p];f!==void 0&&a("edit-point",p,f),g.value[p]=void 0}function x(){d.value=true,m.value=null,a("check",p=>{m.value=p,d.value=false})}function E(p,f,F){f!=null&&f.trim()&&(a("swap",p,f.trim(),F),I.value="")}const y=P(()=>{switch(t.status.status){case"pending":return"info";case"running":return"success";case"finished":return"";case"suspended":return"warning";case"starting":return"warning";case"error":return"danger"}}),w=P(()=>{switch(t.status.status){case"pending":return"等待中";case"running":return"进行中";case"finished":return"已结束";case"suspended":return"已停止";case"starting":return"开赛中";case"error":return"错误"}});return(p,f)=>{const F=k("el-tag"),L=k("el-button"),A=k("el-divider"),J=k("el-input"),M=k("el-popover"),K=k("el-card");return i(),N(K,{class:Y(["cls-card",`status-${e.status.status}`]),shadow:"hover"},{header:o(()=>[c("div",Ra,[c("span",Aa,O(e.cls)+"组 - "+O(e.status.rowi+1),1),r(F,{type:y.value,size:"small",effect:"dark"},{default:o(()=>[C(O(w.value),1)]),_:1},8,["type"])])]),default:o(()=>[e.status.status==="error"&&e.status.msg?(i(),_("div",Ba,O(e.status.msg),1)):T("v-if",true),c("div",La,[(i(true),_(q,null,ee(l.value,(z,H)=>{var xe;return i(),_("div",{key:H,class:"player-row"},[c("div",Ua,[$.value?(i(),_("span",{key:0,class:Y(["online-dot",(xe=$.value[H])!=null&&xe.online?"online":"offline"])},null,2)):T("v-if",true),c("span",Fa,O(z.player),1),u.value?(i(),N(M,{key:1,trigger:"click",width:220,placement:"right","popper-class":"swap-popover-container"},{reference:o(()=>[r(L,{size:"small",text:"",class:"swap-btn",title:"换人"},{default:o(()=>[...f[3]||(f[3]=[C("✎",-1)])]),_:1})]),default:o(()=>{var te;return[c("div",Ka,[(te=z.teammates)!=null&&te.length?(i(),_("div",Ha,[f[4]||(f[4]=c("div",{class:"swap-title"},"从队伍名单选择",-1)),(i(true),_(q,null,ee(z.teammates,(re,Oe)=>(i(),_("div",{key:Oe,class:Y(["swap-option",{active:re===z.player}]),onClick:Ye=>E(H,re,false)},O(re),11,Ga))),128))])):T("v-if",true),r(A,{style:{margin:"8px 0"}}),f[7]||(f[7]=c("div",{class:"swap-title"},"手动输入",-1)),c("div",Za,[r(J,{modelValue:I.value,"onUpdate:modelValue":f[0]||(f[0]=re=>I.value=re),size:"small",placeholder:"选手名"},null,8,["modelValue"])]),c("div",Ja,[r(L,{size:"small",onClick:re=>E(H,I.value,false)},{default:o(()=>[...f[5]||(f[5]=[C("临时替换",-1)])]),_:1},8,["onClick"]),e.hasAdmin?(i(),N(L,{key:0,size:"small",type:"primary",onClick:re=>E(H,I.value,true)},{default:o(()=>[...f[6]||(f[6]=[C("修改名单",-1)])]),_:1},8,["onClick"])):T("v-if",true)])])]}),_:2},1024)):T("v-if",true)]),c("div",Ya,[g.value[H]?(i(),_("div",Wa,[r(J,{modelValue:g.value[H],"onUpdate:modelValue":te=>g.value[H]=te,modelModifiers:{number:true},size:"small",style:{width:"70px"},onKeyup:[De(te=>h(H),["enter"]),De(te=>g.value[H]=void 0,["escape"])]},null,8,["modelValue","onUpdate:modelValue","onKeyup"]),r(L,{size:"small",text:"",type:"primary",class:"point-edit-btn",onClick:te=>h(H)},{default:o(()=>[...f[8]||(f[8]=[C("✓",-1)])]),_:1},8,["onClick"]),r(L,{size:"small",text:"",class:"point-edit-btn",onClick:te=>g.value[H]=void 0},{default:o(()=>[...f[9]||(f[9]=[C("✕",-1)])]),_:1},8,["onClick"])])):(i(),_("span",{key:0,class:Y(["player-point",{editable:u.value}]),onClick:te=>u.value&&b(H,z.point)},O(z.point),11,qa))])])}),128)),l.value.length?T("v-if",true):(i(),_("div",Xa,"-"))]),c("div",Qa,[e.status.status==="pending"||e.status.status==="suspended"?(i(),N(L,{key:0,type:"success",size:"small",onClick:f[1]||(f[1]=z=>p.$emit("start"))},{default:o(()=>[...f[10]||(f[10]=[C(" 开赛 ",-1)])]),_:1})):T("v-if",true),e.status.status==="pending"||e.status.status==="running"||e.status.status==="starting"?(i(),N(L,{key:1,type:"warning",size:"small",onClick:f[2]||(f[2]=z=>p.$emit("stop"))},{default:o(()=>[...f[11]||(f[11]=[C(" 停止 ",-1)])]),_:1})):T("v-if",true),u.value?(i(),N(L,{key:2,size:"small",loading:d.value,onClick:x},{default:o(()=>[...f[12]||(f[12]=[C(" 检查 ",-1)])]),_:1},8,["loading"])):T("v-if",true)])]),_:1},8,["class"])}}}),to=ie(eo,[["__scopeId","data-v-d3fd7b1c"]]),no={class:"match-manager"},lo={class:"config-header"},ao={class:"schedule-section"},oo={class:"schedule-list"},so={class:"config-actions"},ro={class:"subscriber-list"},io={key:0,class:"subscriber-empty"},uo={class:"subscriber-add"},co={class:"schedule-control-header"},po={class:"schedule-control-list"},mo={class:"schedule-info"},fo={key:0,class:"schedule-time"},vo={key:2,class:"status-section"},yo={class:"status-header"},go={class:"status-actions"},ho={class:"cls-grid"},_o={key:3,class:"status-placeholder"},bo={class:"log-header"},wo={class:"log-time"},Co={class:"log-msg"},xo={key:0,class:"log-empty"},$o=G({__name:"match-manager",props:{cid:{},contestInfo:{}},emits:["refresh"],setup(e,{emit:n}){const t=e,a=n,l=S({type:"ssb",round:"",lobby:"",playerIndex:"",ver:"",maxRow:"",fillBots:false,allowNegativeScore:false,schedules:[]}),u=S([]),d=S([]),m=S(),$=S(false),I=S(false),g=Yt({}),b=S("");let h=null;function x(v){if(v===""||v===void 0||v===null)return;const s=Number(v);return isNaN(s)?void 0:s}ce(()=>{var v;return(v=t.contestInfo)==null?void 0:v.extra},v=>{v&&(l.value.type=v.type??"ssb",l.value.round=v.round??"",l.value.lobby=v.lobby??"",l.value.playerIndex=v.playerIndex??"",l.value.ver=v.ver||"",l.value.maxRow=v.maxRow??"",l.value.fillBots=v.fillBots??false,l.value.allowNegativeScore=v.allowNegativeScore??false,l.value.schedules=(v.schedules??[]).map(s=>({...s,_time:s.startAt?new Date(2e3,0,1,...s.startAt.split(":").map(Number)):void 0})))},{immediate:true});function E(){l.value.schedules.push({maxRow:10,_time:void 0})}function y(){l.value.schedules=[{maxRow:6,startAt:"14:00",_time:new Date(2e3,0,1,14,0)},{maxRow:10,startAt:"19:00",_time:new Date(2e3,0,1,19,0)}]}async function w(){const v=l.value.schedules.map(s=>({maxRow:s.maxRow,startAt:s._time?`${s._time.getHours().toString().padStart(2,"0")}:${s._time.getMinutes().toString().padStart(2,"0")}`:void 0}));await R("mahjongpub/init",t.cid,{type:l.value.type,round:x(l.value.round),lobby:l.value.lobby||void 0,playerIndex:x(l.value.playerIndex),ver:x(l.value.ver),maxRow:x(l.value.maxRow),schedules:v.length?v:void 0,fillBots:l.value.fillBots,allowNegativeScore:l.value.allowNegativeScore}),a("refresh"),await f()}async function p(){await R("mahjongpub/deinit",t.cid),u.value=[],a("refresh")}async function f(){var v;if(!(!((v=t.contestInfo)!=null&&v.extra)&&!u.value.length))try{u.value=await R("mahjongpub/cls-status",t.cid)}catch(s){console.error("Failed to refresh status:",s)}}async function F(v){await R("mahjongpub/start",t.cid,[v]),setTimeout(f,1e3)}async function L(v){await R("mahjongpub/stop",t.cid,[v]),setTimeout(f,500)}async function A(v,s){try{const B=await R("mahjongpub/check-players",t.cid,v);g[v]=B,s(B)}catch(B){U.error(`检查失败: ${B}`),s([])}}async function J(){I.value=true;const v=[];try{const s=u.value.filter(([,B])=>B.status==="pending"||B.status==="suspended").map(([B,ne])=>[B,ne]);for(const[B,ne]of s)try{const le=await R("mahjongpub/check-players",t.cid,B);g[B]=le}catch(le){v.push(`${B}组: ${le}`);const ae=ne.next??ne.last??[];g[B]=ae.map(W=>({player:W.player,online:false}))}v.length&&U.warning(`部分检查失败:
6
+ ${v.join(`
7
+ `)}`)}finally{I.value=false}}async function M(v,s,B,ne){try{if(ne){const le=u.value.find(([W])=>W===v);if(!le)return;const ae=(le[1].next??le[1].last??[]).map(W=>W.player);ae[s]=B,await R("mahjongpub/swap-cls-players",t.cid,v,ae),U.success("名单已修改")}else await R("mahjongpub/override-player",t.cid,v,s,B),U.success("临时替换成功");await f()}catch(le){U.error(`换人失败: ${le}`)}}async function K(v,s,B){try{await R("mahjongpub/edit-point",t.cid,v,s,B),U.success("分数已修改"),await f()}catch(ne){U.error(`修改失败: ${ne}`)}}async function z(){const v=b.value.trim();if(v)try{await R("mahjongpub/add-subscriber",t.cid,v),b.value="",a("refresh")}catch(s){U.error(`添加失败: ${s}`)}}async function H(v){try{await R("mahjongpub/remove-subscriber",t.cid,v),a("refresh")}catch(s){U.error(`移除失败: ${s}`)}}async function xe(v){try{await R("mahjongpub/apply-schedule",t.cid,v),a("refresh"),setTimeout(f,1e3)}catch(s){U.error(`应用失败: ${s}`)}}async function te(v){try{await R("mahjongpub/toggle-schedule-pause",t.cid,v),a("refresh")}catch(s){U.error(`操作失败: ${s}`)}}async function re(){$.value=true;try{await R("mahjongpub/start",t.cid,[])}finally{$.value=false,setTimeout(f,1e3)}}async function Oe(){await R("mahjongpub/stop",t.cid,[]),setTimeout(f,500)}function Ye(v){const s=new Date,B=`${s.getHours().toString().padStart(2,"0")}:${s.getMinutes().toString().padStart(2,"0")}:${s.getSeconds().toString().padStart(2,"0")}`;d.value.push({time:B,message:v}),d.value.length>200&&d.value.splice(0,d.value.length-200),Wt(()=>{m.value&&(m.value.scrollTop=m.value.scrollHeight)})}return Ut("mahjongpub/log",v=>{const[s,B]=v;s===t.cid&&Ye(B)}),je(()=>{var v;(v=t.contestInfo)!=null&&v.extra&&f(),h=setInterval(f,3e3)}),qt(()=>{h&&clearInterval(h)}),(v,s)=>{var We,Xe,Qe,et,tt;const B=k("el-tag"),ne=k("el-option"),le=k("el-select"),ae=k("el-form-item"),W=k("el-input"),Mt=k("el-form"),qe=k("el-checkbox"),Dt=k("el-input-number"),Rt=k("el-time-picker"),X=k("el-button"),$e=k("el-card"),At=k("el-switch");return i(),_("div",no,[T(" Config Bar "),r($e,{class:"config-card",shadow:"never"},{header:o(()=>{var D,j;return[c("div",lo,[c("span",null,O((D=e.contestInfo)==null?void 0:D.name)+" — 比赛配置",1),(j=e.contestInfo)!=null&&j.extra?(i(),N(B,{key:0,type:"success",size:"small"},{default:o(()=>[...s[11]||(s[11]=[C("已初始化",-1)])]),_:1})):(i(),N(B,{key:1,type:"info",size:"small"},{default:o(()=>[...s[12]||(s[12]=[C("未初始化",-1)])]),_:1}))])]}),default:o(()=>{var D;return[r(Mt,{inline:true,size:"small","label-width":"70px"},{default:o(()=>[r(ae,{label:"类型"},{default:o(()=>[r(le,{modelValue:l.value.type,"onUpdate:modelValue":s[0]||(s[0]=j=>l.value.type=j),style:{width:"100px"}},{default:o(()=>[r(ne,{label:"掌心 (ti)",value:"ti"}),r(ne,{label:"雀魂 (ssb)",value:"ssb"})]),_:1},8,["modelValue"])]),_:1}),r(ae,{label:"轮次"},{default:o(()=>[r(W,{modelValue:l.value.round,"onUpdate:modelValue":s[1]||(s[1]=j=>l.value.round=j),style:{width:"80px"},placeholder:"默认"},null,8,["modelValue"])]),_:1}),r(ae,{label:"比赛场"},{default:o(()=>[r(W,{modelValue:l.value.lobby,"onUpdate:modelValue":s[2]||(s[2]=j=>l.value.lobby=j),style:{width:"120px"},placeholder:"lobby ID"},null,8,["modelValue"])]),_:1}),r(ae,{label:"选手序号"},{default:o(()=>[r(W,{modelValue:l.value.playerIndex,"onUpdate:modelValue":s[3]||(s[3]=j=>l.value.playerIndex=j),style:{width:"60px"},placeholder:"自动"},null,8,["modelValue"])]),_:1}),r(ae,{label:"版本"},{default:o(()=>[r(W,{modelValue:l.value.ver,"onUpdate:modelValue":s[4]||(s[4]=j=>l.value.ver=j),style:{width:"60px"},placeholder:"0"},null,8,["modelValue"])]),_:1}),r(ae,{label:"最大行"},{default:o(()=>[r(W,{modelValue:l.value.maxRow,"onUpdate:modelValue":s[5]||(s[5]=j=>l.value.maxRow=j),style:{width:"60px"},placeholder:"默认"},null,8,["modelValue"])]),_:1})]),_:1}),r(qe,{modelValue:l.value.fillBots,"onUpdate:modelValue":s[6]||(s[6]=j=>l.value.fillBots=j),size:"small"},{default:o(()=>[...s[13]||(s[13]=[C("BOT 替补",-1)])]),_:1},8,["modelValue"]),r(qe,{modelValue:l.value.allowNegativeScore,"onUpdate:modelValue":s[7]||(s[7]=j=>l.value.allowNegativeScore=j),size:"small"},{default:o(()=>[...s[14]||(s[14]=[C("允许负分",-1)])]),_:1},8,["modelValue"]),c("div",ao,[s[18]||(s[18]=c("div",{class:"schedule-label"},"定时阶段",-1)),c("div",oo,[(i(true),_(q,null,ee(l.value.schedules,(j,ue)=>(i(),_("div",{key:ue,class:"schedule-row"},[r(Dt,{modelValue:j.maxRow,"onUpdate:modelValue":Q=>j.maxRow=Q,min:1,size:"small","controls-position":"right",style:{width:"80px"},placeholder:"maxRow"},null,8,["modelValue","onUpdate:modelValue"]),r(Rt,{modelValue:j._time,"onUpdate:modelValue":Q=>j._time=Q,size:"small",format:"HH:mm",style:{width:"120px"},placeholder:"开始时间",clearable:""},null,8,["modelValue","onUpdate:modelValue"]),r(X,{size:"small",type:"danger",text:"",onClick:Q=>l.value.schedules.splice(ue,1)},{default:o(()=>[...s[15]||(s[15]=[C("×",-1)])]),_:1},8,["onClick"])]))),128))]),r(X,{size:"small",onClick:E},{default:o(()=>[...s[16]||(s[16]=[C("+ 添加阶段",-1)])]),_:1}),l.value.type==="ti"?(i(),N(X,{key:0,size:"small",type:"info",onClick:y},{default:o(()=>[...s[17]||(s[17]=[C("先2副7 预设",-1)])]),_:1})):T("v-if",true)]),c("div",so,[r(X,{type:"primary",size:"small",onClick:w},{default:o(()=>[...s[19]||(s[19]=[C("初始化",-1)])]),_:1}),r(X,{type:"danger",size:"small",disabled:!((D=e.contestInfo)!=null&&D.extra),onClick:p},{default:o(()=>[...s[20]||(s[20]=[C("反初始化",-1)])]),_:1},8,["disabled"])])]}),_:1}),T(" Subscribers "),(We=e.contestInfo)!=null&&We.extra?(i(),N($e,{key:0,class:"subscriber-card",shadow:"never"},{header:o(()=>[...s[21]||(s[21]=[c("div",{class:"subscriber-header"},[c("span",null,"消息订阅")],-1)])]),default:o(()=>{var D;return[c("div",ro,[(i(true),_(q,null,ee(e.contestInfo.extra.subscribers,j=>(i(),N(B,{key:j,closable:"",size:"small",class:"subscriber-tag",onClose:ue=>H(j)},{default:o(()=>[C(O(j),1)]),_:2},1032,["onClose"]))),128)),(D=e.contestInfo.extra.subscribers)!=null&&D.length?T("v-if",true):(i(),_("span",io,"暂无订阅"))]),c("div",uo,[r(W,{modelValue:b.value,"onUpdate:modelValue":s[8]||(s[8]=j=>b.value=j),size:"small",placeholder:"platform:channelId",style:{width:"240px"},onKeyup:De(z,["enter"])},null,8,["modelValue"]),r(X,{size:"small",type:"primary",onClick:z},{default:o(()=>[...s[22]||(s[22]=[C("添加",-1)])]),_:1})])]}),_:1})):T("v-if",true),T(" Schedule Control (runtime) "),(et=(Qe=(Xe=e.contestInfo)==null?void 0:Xe.extra)==null?void 0:Qe.schedules)!=null&&et.length?(i(),N($e,{key:1,class:"schedule-control-card",shadow:"never"},{header:o(()=>[c("div",co,[c("span",null,"定时控制 (当前 maxRow="+O(e.contestInfo.extra.maxRow??"默认")+")",1),r(At,{"model-value":!e.contestInfo.extra.schedulePaused,"active-text":"自动","inactive-text":"暂停",size:"small",onChange:s[9]||(s[9]=D=>te(!D))},null,8,["model-value"])])]),default:o(()=>[c("div",po,[(i(true),_(q,null,ee(e.contestInfo.extra.schedules,(D,j)=>(i(),_("div",{key:j,class:"schedule-control-row"},[c("span",mo,[C(" 阶段 "+O(j+1)+":"+O(D.maxRow)+" 行 ",1),D.startAt?(i(),_("span",fo,"@ "+O(D.startAt),1)):T("v-if",true)]),e.contestInfo.extra.maxRow>=D.maxRow?(i(),N(B,{key:0,type:"success",size:"small"},{default:o(()=>[...s[23]||(s[23]=[C("已生效",-1)])]),_:1})):(i(),N(X,{key:1,size:"small",type:"primary",onClick:ue=>xe(D.maxRow)},{default:o(()=>[...s[24]||(s[24]=[C(" 立即生效 ",-1)])]),_:1},8,["onClick"]))]))),128))])]),_:1})):T("v-if",true),T(" Status Cards "),(tt=e.contestInfo)!=null&&tt.extra?(i(),_("div",vo,[c("div",yo,[c("span",null,"对局状态 — 第 "+O(e.contestInfo.extra.round??e.contestInfo.totalRounds)+" 轮",1),c("div",go,[r(X,{type:"success",size:"small",loading:$.value,onClick:re},{default:o(()=>[...s[25]||(s[25]=[C("全部开赛",-1)])]),_:1},8,["loading"]),r(X,{type:"warning",size:"small",onClick:Oe},{default:o(()=>[...s[26]||(s[26]=[C("全部停止",-1)])]),_:1}),r(X,{size:"small",loading:I.value,onClick:J},{default:o(()=>[...s[27]||(s[27]=[C("全部检查",-1)])]),_:1},8,["loading"]),r(X,{size:"small",onClick:f},{default:o(()=>[...s[28]||(s[28]=[C("刷新",-1)])]),_:1})])]),c("div",ho,[(i(true),_(q,null,ee(u.value,([D,j])=>{var ue;return i(),N(to,{key:D,cls:D,status:j,"external-check-result":g[D],"has-admin":(ue=e.contestInfo)==null?void 0:ue.hasAdmin,onStart:Q=>F(D),onStop:Q=>L(D),onCheck:Q=>A(D,Q),onSwap:(Q,Ee,Bt)=>M(D,Q,Ee,Bt),onEditPoint:(Q,Ee)=>K(D,Q,Ee)},null,8,["cls","status","external-check-result","has-admin","onStart","onStop","onCheck","onSwap","onEditPoint"])}),128))])])):(i(),_("div",_o,[...s[29]||(s[29]=[c("p",null,"请先初始化比赛配置",-1)])])),T(" Log Panel "),r($e,{class:"log-card",shadow:"never"},{header:o(()=>[c("div",bo,[s[31]||(s[31]=c("span",null,"日志",-1)),r(X,{size:"small",text:"",onClick:s[10]||(s[10]=D=>d.value=[])},{default:o(()=>[...s[30]||(s[30]=[C("清空",-1)])]),_:1})])]),default:o(()=>[c("div",{ref_key:"logScrollRef",ref:m,class:"log-scroll"},[(i(true),_(q,null,ee(d.value,(D,j)=>(i(),_("div",{key:j,class:"log-line"},[c("span",wo,O(D.time),1),c("span",Co,O(D.message),1)]))),128)),d.value.length?T("v-if",true):(i(),_("div",xo,"暂无日志"))],512)]),_:1})])}}}),ko=ie($o,[["__scopeId","data-v-07807463"]]),So={class:"team-manager"},Io={class:"team-header"},zo={class:"team-header-actions"},Vo={key:0,class:"inline-edit"},To={class:"player-index"},jo={class:"inline-edit-actions"},No={key:1,class:"player-display"},Po={key:0,class:"no-players"},Oo=G({__name:"team-manager",props:{cid:{}},setup(e){const n=e,t=S([]),a=S(""),l=S(null),u=S([]),d=S(false),m=P(()=>{if(!a.value)return t.value;const h=a.value.toLowerCase();return t.value.filter(x=>x.name.toLowerCase().includes(h)||x.tid.toString().includes(h)||x.players.some(E=>E.toLowerCase().includes(h)))});async function $(){try{t.value=await R("mahjongpub/list-teams",n.cid)}catch(h){U.error(`加载队伍失败: ${h}`)}}function I(h){l.value=h.tid,u.value=[...h.players]}function g(){l.value=null,u.value=[]}async function b(h){d.value=true;try{const x=u.value.filter(y=>y.trim()),E=await R("mahjongpub/update-team-players",n.cid,h.tid,x);U.success(E||"保存成功"),l.value=null,u.value=[],await $()}catch(x){U.error(`保存失败: ${x}`)}finally{d.value=false}}return je($),(h,x)=>{const E=k("el-input"),y=k("el-button"),w=k("el-table-column"),p=k("el-tag"),f=k("el-table");return i(),_("div",So,[c("div",Io,[x[3]||(x[3]=c("span",null,"队伍管理",-1)),c("div",zo,[r(E,{modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=F=>a.value=F),size:"small",placeholder:"搜索队名/选手",clearable:"",style:{width:"200px"}},null,8,["modelValue"]),r(y,{size:"small",onClick:$},{default:o(()=>[...x[2]||(x[2]=[C("刷新",-1)])]),_:1})])]),r(f,{data:m.value,size:"small",border:"",class:"team-table","row-key":"tid"},{default:o(()=>[r(w,{prop:"tid",label:"ID",width:"60",sortable:""}),r(w,{prop:"name",label:"队名",width:"120",sortable:""}),r(w,{label:"选手名单","min-width":"400"},{default:o(({row:F})=>[l.value===F.tid?(i(),_("div",Vo,[(i(true),_(q,null,ee(u.value,(L,A)=>(i(),_("div",{key:A,class:"inline-edit-row"},[c("span",To,O(A+1)+".",1),r(E,{modelValue:u.value[A],"onUpdate:modelValue":J=>u.value[A]=J,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),r(y,{size:"small",type:"danger",text:"",onClick:J=>u.value.splice(A,1)},{default:o(()=>[...x[4]||(x[4]=[C("×",-1)])]),_:1},8,["onClick"])]))),128)),c("div",jo,[r(y,{size:"small",onClick:x[1]||(x[1]=L=>u.value.push(""))},{default:o(()=>[...x[5]||(x[5]=[C("+ 添加",-1)])]),_:1}),r(y,{size:"small",type:"primary",loading:d.value,onClick:L=>b(F)},{default:o(()=>[...x[6]||(x[6]=[C("保存",-1)])]),_:1},8,["loading","onClick"]),r(y,{size:"small",onClick:g},{default:o(()=>[...x[7]||(x[7]=[C("取消",-1)])]),_:1})])])):(i(),_("div",No,[(i(true),_(q,null,ee(F.players,(L,A)=>(i(),N(p,{key:A,size:"small",class:"player-tag"},{default:o(()=>[C(O(L),1)]),_:2},1024))),128)),F.players.length?T("v-if",true):(i(),_("span",Po,"无选手"))]))]),_:1}),r(w,{label:"操作",width:"80",align:"center"},{default:o(({row:F})=>[l.value!==F.tid?(i(),N(y,{key:0,size:"small",text:"",onClick:L=>I(F)},{default:o(()=>[...x[8]||(x[8]=[C(" 编辑 ",-1)])]),_:1},8,["onClick"])):T("v-if",true)]),_:1})]),_:1},8,["data"])])}}}),Eo=ie(Oo,[["__scopeId","data-v-064b204b"]]),Mo={class:"lobby-panel"},Do={class:"lobby-config"},Ro={class:"section-header"},Ao={key:1,class:"empty-hint"},Bo={class:"section-header"},Lo={key:0,class:"game-list"},Uo={class:"game-header"},Fo=["title"],Ko={class:"game-actions"},Ho={class:"game-players"},Go={key:1,class:"empty-hint"},Zo=G({__name:"lobby-panel",props:{cid:{},initLobby:{},initType:{}},setup(e){const n=e,t=S(n.initLobby??""),a=S(n.initType??"ssb"),l=S([]),u=S([]),d=S(false);ce(()=>n.initLobby,b=>{b&&(t.value=b)}),ce(()=>n.initType,b=>{b&&(a.value=b)});async function m(){if(t.value){d.value=true;try{const[b,h]=await Promise.all([R("mahjongpub/lobby-players",+t.value,a.value),R("mahjongpub/lobby-games",+t.value,a.value)]);l.value=b,u.value=h}catch(b){U.error(`查询失败: ${b}`)}finally{d.value=false}}}async function $(b){try{await R("mahjongpub/lobby-pause",+t.value,a.value,b),U.success("已暂停")}catch(h){U.error(`暂停失败: ${h}`)}}async function I(b){try{await R("mahjongpub/lobby-resume",+t.value,a.value,b),U.success("已恢复")}catch(h){U.error(`恢复失败: ${h}`)}}async function g(b){try{await R("mahjongpub/lobby-stop",+t.value,a.value,b),U.success("已中止"),await m()}catch(h){U.error(`中止失败: ${h}`)}}return(b,h)=>{const x=k("el-input"),E=k("el-form-item"),y=k("el-option"),w=k("el-select"),p=k("el-button"),f=k("el-form"),F=k("el-table-column"),L=k("el-table"),A=k("el-card"),J=k("el-popconfirm"),M=k("el-tag");return i(),_("div",Mo,[c("div",Do,[r(f,{inline:true,size:"small"},{default:o(()=>[r(E,{label:"比赛场 ID"},{default:o(()=>[r(x,{modelValue:t.value,"onUpdate:modelValue":h[0]||(h[0]=K=>t.value=K),placeholder:"lobby ID",style:{width:"140px"}},null,8,["modelValue"])]),_:1}),r(E,{label:"平台"},{default:o(()=>[r(w,{modelValue:a.value,"onUpdate:modelValue":h[1]||(h[1]=K=>a.value=K),style:{width:"120px"}},{default:o(()=>[r(y,{label:"掌心 (ti)",value:"ti"}),r(y,{label:"雀魂 (ssb)",value:"ssb"})]),_:1},8,["modelValue"])]),_:1}),r(E,null,{default:o(()=>[r(p,{size:"small",type:"primary",onClick:m},{default:o(()=>[...h[2]||(h[2]=[C("刷新",-1)])]),_:1})]),_:1})]),_:1})]),T(" Ready Players "),r(A,{shadow:"never",class:"section-card"},{header:o(()=>[c("div",Ro,[c("span",null,"待机选手 ("+O(l.value.length)+")",1)])]),default:o(()=>[l.value.length?(i(),N(L,{key:0,data:l.value,size:"small",border:"","max-height":"300"},{default:o(()=>[r(F,{prop:"nickname",label:"昵称","min-width":"150"}),r(F,{prop:"accountId",label:"ID",width:"120"})]),_:1},8,["data"])):(i(),_("div",Ao,O(d.value?"加载中...":t.value?"暂无待机选手":"请输入比赛场 ID 后查询"),1))]),_:1}),T(" Running Games "),r(A,{shadow:"never",class:"section-card"},{header:o(()=>[c("div",Bo,[c("span",null,"进行中对局 ("+O(u.value.length)+")",1)])]),default:o(()=>[u.value.length?(i(),_("div",Lo,[(i(true),_(q,null,ee(u.value,K=>(i(),N(A,{key:K.id,shadow:"hover",class:"game-card"},{default:o(()=>[c("div",Uo,[c("span",{class:"game-id",title:K.id},O(K.id.slice(0,12))+"...",9,Fo),c("div",Ko,[r(p,{size:"small",type:"warning",onClick:z=>$(K.id)},{default:o(()=>[...h[3]||(h[3]=[C("暂停",-1)])]),_:1},8,["onClick"]),r(p,{size:"small",type:"primary",onClick:z=>I(K.id)},{default:o(()=>[...h[4]||(h[4]=[C("恢复",-1)])]),_:1},8,["onClick"]),r(J,{title:"确定中止该对局?",onConfirm:z=>g(K.id)},{reference:o(()=>[r(p,{size:"small",type:"danger"},{default:o(()=>[...h[5]||(h[5]=[C("中止",-1)])]),_:1})]),_:1},8,["onConfirm"])])]),c("div",Ho,[(i(true),_(q,null,ee(K.players,(z,H)=>(i(),N(M,{key:H,size:"small",class:"player-tag"},{default:o(()=>[C(O(z.nickname||`#${z.accountId}`),1)]),_:2},1024))),128))])]),_:2},1024))),128))])):(i(),_("div",Go,O(d.value?"加载中...":t.value?"暂无进行中对局":"请输入比赛场 ID 后查询"),1))]),_:1})])}}}),Jo=ie(Zo,[["__scopeId","data-v-a21c65dd"]]),Yo={key:0,class:"empty-state"},qo={key:1,class:"empty-state"},Wo={key:2,class:"contest-panel"},Xo={class:"first-tab-label"},Qo={key:1},es=G({__name:"contest-panel",props:{cid:{},managed:{},sidebarCollapsed:{type:Boolean}},emits:["toggle-sidebar"],setup(e,{emit:n}){const t=e,a=S("match"),l=S(false),u=S(null);async function d(){l.value=true;try{u.value=await R("mahjongpub/contest-info",t.cid)}catch(m){console.error("Failed to load contest info:",m)}finally{l.value=false}}return ce(()=>t.cid,()=>{a.value="match",d()},{immediate:true}),(m,$)=>{const I=k("el-button"),g=k("el-tab-pane"),b=k("el-tooltip"),h=k("el-tabs");return e.cid?l.value&&!u.value?(i(),_("div",qo,[...$[3]||($[3]=[c("p",null,"加载中...",-1)])])):(i(),_("div",Wo,[r(h,{modelValue:a.value,"onUpdate:modelValue":$[1]||($[1]=x=>a.value=x)},{default:o(()=>{var x;return[r(g,{name:"match"},{label:o(()=>[c("div",Xo,[r(I,{class:"sidebar-toggle-btn",size:"small",text:"",title:e.sidebarCollapsed?"展开侧边栏":"收起侧边栏",onClick:$[0]||($[0]=Se(E=>m.$emit("toggle-sidebar"),["stop"]))},{default:o(()=>[C(O(e.sidebarCollapsed?"▶":"◀"),1)]),_:1},8,["title"]),$[4]||($[4]=c("span",null,"比赛进程",-1))])]),default:o(()=>[r(ko,{cid:e.cid,"contest-info":u.value,onRefresh:d},null,8,["cid","contest-info"])]),_:1}),r(g,{label:"队伍管理",name:"team",disabled:!((x=u.value)!=null&&x.hasAdmin)},{label:o(()=>{var E;return[(E=u.value)!=null&&E.hasAdmin?(i(),_("span",Qo,"队伍管理")):(i(),N(b,{key:0,content:"请先配置管理密码(右键侧边栏比赛项)",placement:"top"},{default:o(()=>[...$[5]||($[5]=[c("span",null,"队伍管理",-1)])]),_:1}))]}),default:o(()=>{var E;return[(E=u.value)!=null&&E.hasAdmin?(i(),N(Eo,{key:0,cid:e.cid},null,8,["cid"])):T("v-if",true)]}),_:1},8,["disabled"]),r(g,{label:"比赛场",name:"lobby"},{default:o(()=>{var E,y,w,p;return[r(Jo,{cid:e.cid,"init-lobby":(y=(E=u.value)==null?void 0:E.extra)==null?void 0:y.lobby,"init-type":(p=(w=u.value)==null?void 0:w.extra)==null?void 0:p.type},null,8,["cid","init-lobby","init-type"])]}),_:1})]}),_:1},8,["modelValue"])])):(i(),_("div",Yo,[...$[2]||($[2]=[c("p",null,"请选择比赛",-1)])]))}}}),ts=ie(es,[["__scopeId","data-v-4c836566"]]),ns={class:"main-layout"},ls={class:"content-wrapper"},as={key:1,class:"empty-state"},os=G({__name:"layout",setup(e){const n=S([]),t=S(null),a=S(false),l=P(()=>n.value.find(I=>I.cid===t.value)??null);async function u(){n.value=await R("mahjongpub/list-managed")}async function d(I){await u(),t.value=I.cid}async function m(I){var g;await u(),t.value===I&&(t.value=((g=n.value[0])==null?void 0:g.cid)??null)}async function $(I,g){await u()}return je(u),(I,g)=>{const b=k("k-layout");return i(),N(b,null,{default:o(()=>[c("div",ns,[c("div",{class:Y(["sidebar-wrapper",{collapsed:a.value}])},[Be(r(Da,{contests:n.value,"active-cid":t.value,onSelect:g[0]||(g[0]=h=>t.value=h),onAdd:d,onRemove:m,onUpdate:$},null,8,["contests","active-cid"]),[[Le,!a.value]])],2),c("div",ls,[t.value?(i(),N(ts,{key:t.value,cid:t.value,managed:l.value,"sidebar-collapsed":a.value,onToggleSidebar:g[1]||(g[1]=h=>a.value=!a.value)},null,8,["cid","managed","sidebar-collapsed"])):(i(),_("div",as,[...g[2]||(g[2]=[c("p",null,"请从左侧选择或添加比赛",-1)])]))])])]),_:1})}}}),ss=ie(os,[["__scopeId","data-v-592f974d"]]),ds=e=>{e.page({name:"比赛管理",path:"/mahjongpub",icon:"mahjongpub:icon",component:ss,authority:3})};export{ds as default};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sidebar[data-v-8b51a7a2]{height:100%;display:flex;flex-direction:column}.sidebar-header[data-v-8b51a7a2]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--k-color-divider);font-weight:700}.contest-list[data-v-8b51a7a2]{flex:1;overflow-y:auto}.contest-item[data-v-8b51a7a2]{padding:10px 16px;cursor:pointer;border-bottom:1px solid var(--k-color-divider);position:relative;transition:background-color .2s}.contest-item[data-v-8b51a7a2]:hover{background:var(--k-hover-bg, var(--el-fill-color-light))}.contest-item.active[data-v-8b51a7a2]{background:var(--k-hover-bg, var(--el-color-primary-light-9));border-left:3px solid var(--el-color-primary)}.contest-name[data-v-8b51a7a2]{font-size:14px;font-weight:500}.contest-cid[data-v-8b51a7a2]{font-size:12px;color:var(--k-text-light)}.admin-badge[data-v-8b51a7a2]{position:absolute;top:10px;right:12px;color:var(--el-color-success)}.cls-card[data-v-559ac705]{border-left:3px solid transparent}.cls-card.status-pending[data-v-559ac705]{border-left-color:var(--el-color-info)}.cls-card.status-running[data-v-559ac705]{border-left-color:var(--el-color-success)}.cls-card.status-finished[data-v-559ac705]{border-left-color:var(--el-color-primary)}.cls-card.status-suspended[data-v-559ac705]{border-left-color:var(--el-color-warning)}.cls-card.status-error[data-v-559ac705]{border-left-color:var(--el-color-danger)}.cls-header[data-v-559ac705]{display:flex;justify-content:space-between;align-items:center}.cls-title[data-v-559ac705]{font-weight:700}.error-msg[data-v-559ac705]{color:var(--el-color-danger);font-size:12px;margin-bottom:8px}.player-list[data-v-559ac705]{display:flex;flex-direction:column;gap:4px}.player-row[data-v-559ac705]{display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:2px 4px;border-radius:2px}.player-row[data-v-559ac705]:nth-child(odd){background:var(--k-hover-bg, var(--el-fill-color))}.player-info[data-v-559ac705]{display:flex;align-items:center;gap:6px;flex:1;min-width:0;overflow:hidden}.online-dot[data-v-559ac705]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.online-dot.online[data-v-559ac705]{background:var(--el-color-success)}.online-dot.offline[data-v-559ac705]{background:var(--el-color-danger)}.player-name[data-v-559ac705]{font-weight:500;color:var(--k-text-normal, var(--el-text-color-primary))}.player-right[data-v-559ac705]{display:flex;align-items:center;gap:4px;flex-shrink:0}.player-point[data-v-559ac705]{color:var(--k-text-light, var(--el-text-color-secondary));font-family:monospace}.player-point.editable[data-v-559ac705]{cursor:pointer;border-bottom:1px dashed var(--el-border-color)}.player-point.editable[data-v-559ac705]:hover{color:var(--el-color-primary)}.point-edit[data-v-559ac705]{display:flex;align-items:center;gap:2px;margin-left:auto}.point-edit-btn[data-v-559ac705]{padding:0 4px;min-width:auto;font-size:13px;margin-left:0!important}.swap-btn[data-v-559ac705]{padding:2px;font-size:13px}.no-players[data-v-559ac705]{text-align:center;color:var(--k-text-light, var(--el-text-color-secondary))}.cls-actions[data-v-559ac705]{margin-top:8px;display:flex;gap:4px;flex-wrap:wrap}.swap-popover-container{padding:8px 4px 8px 12px!important}.swap-popover-container .swap-popover{max-height:240px;overflow-y:auto;padding-right:8px;scrollbar-width:thin;scrollbar-color:var(--el-border-color) transparent}.swap-popover-container .swap-popover::-webkit-scrollbar{width:4px}.swap-popover-container .swap-popover::-webkit-scrollbar-track{background:transparent}.swap-popover-container .swap-popover::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:2px}.swap-popover-container .swap-popover::-webkit-scrollbar-thumb:hover{background:var(--el-text-color-placeholder)}.swap-popover-container .swap-title{font-size:12px;color:var(--el-text-color-secondary);margin-bottom:4px}.swap-popover-container .swap-option{padding:4px 8px;cursor:pointer;border-radius:4px;font-size:13px}.swap-popover-container .swap-option:hover{background:var(--el-fill-color-light)}.swap-popover-container .swap-option.active{color:var(--el-color-primary);font-weight:500}.swap-popover-container .swap-manual{display:flex;gap:4px;margin-bottom:8px}.swap-popover-container .swap-mode-actions{display:flex;gap:4px;justify-content:flex-end}.swap-popover-container .swap-section{margin-bottom:4px}.match-manager[data-v-cc43e8e6]{display:flex;flex-direction:column;gap:16px;min-height:100%}.config-header[data-v-cc43e8e6]{display:flex;align-items:center;gap:8px}.config-card[data-v-cc43e8e6] .el-card__body{padding-top:12px;padding-bottom:12px}.config-actions[data-v-cc43e8e6]{margin-top:8px}.status-section[data-v-cc43e8e6]{display:flex;flex-direction:column;gap:12px}.status-header[data-v-cc43e8e6]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.status-actions[data-v-cc43e8e6]{display:flex;gap:8px}.cls-grid[data-v-cc43e8e6]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}.status-placeholder[data-v-cc43e8e6]{text-align:center;padding:40px;color:var(--k-text-light)}.log-card[data-v-cc43e8e6]{flex:1;display:flex;flex-direction:column;min-height:200px}.log-card[data-v-cc43e8e6] .el-card__body{padding:0;flex:1;display:flex;flex-direction:column;overflow:hidden}.log-header[data-v-cc43e8e6]{display:flex;justify-content:space-between;align-items:center}.log-scroll[data-v-cc43e8e6]{flex:1;overflow-y:auto;padding:8px 16px;font-family:monospace;font-size:12px;scrollbar-width:thin}.log-scroll[data-v-cc43e8e6]::-webkit-scrollbar{width:6px}.log-scroll[data-v-cc43e8e6]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:3px}.log-scroll[data-v-cc43e8e6]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker, var(--el-text-color-placeholder))}.log-line[data-v-cc43e8e6]{padding:2px 0;line-height:1.5}.log-time[data-v-cc43e8e6]{color:var(--k-text-light);margin-right:8px}.log-empty[data-v-cc43e8e6]{text-align:center;color:var(--k-text-light);padding:20px}.subscriber-card[data-v-cc43e8e6] .el-card__body{padding-top:12px;padding-bottom:12px}.subscriber-header[data-v-cc43e8e6]{font-weight:700}.subscriber-list[data-v-cc43e8e6]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.subscriber-tag[data-v-cc43e8e6]{font-family:monospace}.subscriber-empty[data-v-cc43e8e6]{color:var(--k-text-light, var(--el-text-color-secondary));font-size:13px}.subscriber-add[data-v-cc43e8e6]{display:flex;gap:8px;align-items:center}.schedule-section[data-v-cc43e8e6]{margin-top:12px;border-top:1px solid var(--k-color-divider, var(--el-border-color-lighter));padding-top:12px}.schedule-label[data-v-cc43e8e6]{font-size:13px;font-weight:500;margin-bottom:8px}.schedule-list[data-v-cc43e8e6]{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.schedule-row[data-v-cc43e8e6]{display:flex;gap:8px;align-items:center}.schedule-control-card[data-v-cc43e8e6] .el-card__body{padding-top:12px;padding-bottom:12px}.schedule-control-header[data-v-cc43e8e6]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.schedule-control-list[data-v-cc43e8e6]{display:flex;flex-direction:column;gap:8px}.schedule-control-row[data-v-cc43e8e6]{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border-radius:4px;background:var(--k-hover-bg, var(--el-fill-color))}.schedule-info[data-v-cc43e8e6]{font-size:13px}.schedule-time[data-v-cc43e8e6]{color:var(--k-text-light, var(--el-text-color-secondary));margin-left:4px}.team-manager[data-v-064b204b]{display:flex;flex-direction:column;gap:12px}.team-header[data-v-064b204b]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.team-header-actions[data-v-064b204b]{display:flex;gap:8px}.player-display[data-v-064b204b]{display:flex;flex-wrap:wrap;gap:4px}.player-tag[data-v-064b204b]{font-size:12px}.no-players[data-v-064b204b]{color:var(--k-text-light, var(--el-text-color-secondary));font-size:12px}.inline-edit[data-v-064b204b]{display:flex;flex-direction:column;gap:4px;padding:4px 0}.inline-edit-row[data-v-064b204b]{display:flex;align-items:center;gap:6px}.player-index[data-v-064b204b]{width:20px;text-align:right;color:var(--k-text-light, var(--el-text-color-secondary));font-size:12px;flex-shrink:0}.inline-edit-actions[data-v-064b204b]{display:flex;gap:6px;margin-top:4px}.lobby-panel[data-v-a21c65dd]{display:flex;flex-direction:column;gap:16px}.lobby-config[data-v-a21c65dd]{margin-bottom:4px}.section-card[data-v-a21c65dd] .el-card__header{padding:12px 16px}.section-header[data-v-a21c65dd]{font-weight:700}.empty-hint[data-v-a21c65dd]{text-align:center;padding:20px;color:var(--k-text-light);font-size:13px}.game-list[data-v-a21c65dd]{display:flex;flex-direction:column;gap:8px}.game-card[data-v-a21c65dd]{border-left:3px solid var(--el-color-success)}.game-card[data-v-a21c65dd] .el-card__body{padding:12px}.game-header[data-v-a21c65dd]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.game-id[data-v-a21c65dd]{font-family:monospace;font-size:12px;color:var(--k-text-light)}.game-actions[data-v-a21c65dd]{display:flex;gap:4px}.game-players[data-v-a21c65dd]{display:flex;gap:6px;flex-wrap:wrap}.player-tag[data-v-a21c65dd]{font-size:13px}.contest-panel[data-v-c9a9bbef]{height:100%;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.first-tab-label[data-v-c9a9bbef]{display:inline-flex;align-items:center;gap:4px}.sidebar-toggle-btn[data-v-c9a9bbef]{font-size:inherit;padding:0;min-width:auto;height:auto;line-height:inherit;color:var(--el-text-color-primary);font-weight:400}.sidebar-toggle-btn[data-v-c9a9bbef]:hover{color:var(--el-color-primary)}.contest-panel[data-v-c9a9bbef] .el-tabs{display:flex;flex-direction:column;flex:1;overflow:hidden}.contest-panel[data-v-c9a9bbef] .el-tabs__header{padding-left:8px}.contest-panel[data-v-c9a9bbef] .el-tabs__content{flex:1;overflow:hidden;display:flex;flex-direction:column}.contest-panel[data-v-c9a9bbef] .el-tab-pane{flex:1;overflow-y:auto;padding:12px 16px 16px}.empty-state[data-v-c9a9bbef]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--k-text-light)}.main-layout[data-v-592f974d]{display:flex;height:100%;overflow:hidden}.sidebar-wrapper[data-v-592f974d]{position:relative;width:240px;min-width:240px;border-right:1px solid var(--k-color-divider, var(--el-border-color-lighter));transition:width .2s,min-width .2s;display:flex;flex-direction:column}.sidebar-wrapper.collapsed[data-v-592f974d]{width:0;min-width:0;overflow:hidden}.content-wrapper[data-v-592f974d]{flex:1;overflow:hidden;min-width:0}.empty-state[data-v-592f974d]{display:flex;align-items:center;justify-content:center;height:100%;color:var(--k-text-light);font-size:16px}
1
+ .sidebar[data-v-8b51a7a2]{height:100%;display:flex;flex-direction:column}.sidebar-header[data-v-8b51a7a2]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--k-color-divider);font-weight:700}.contest-list[data-v-8b51a7a2]{flex:1;overflow-y:auto}.contest-item[data-v-8b51a7a2]{padding:10px 16px;cursor:pointer;border-bottom:1px solid var(--k-color-divider);position:relative;transition:background-color .2s}.contest-item[data-v-8b51a7a2]:hover{background:var(--k-hover-bg, var(--el-fill-color-light))}.contest-item.active[data-v-8b51a7a2]{background:var(--k-hover-bg, var(--el-color-primary-light-9));border-left:3px solid var(--el-color-primary)}.contest-name[data-v-8b51a7a2]{font-size:14px;font-weight:500}.contest-cid[data-v-8b51a7a2]{font-size:12px;color:var(--k-text-light)}.admin-badge[data-v-8b51a7a2]{position:absolute;top:10px;right:12px;color:var(--el-color-success)}.cls-card[data-v-d3fd7b1c]{border-left:3px solid transparent}.cls-card.status-pending[data-v-d3fd7b1c]{border-left-color:var(--el-color-info)}.cls-card.status-running[data-v-d3fd7b1c]{border-left-color:var(--el-color-success)}.cls-card.status-finished[data-v-d3fd7b1c]{border-left-color:var(--el-color-primary)}.cls-card.status-suspended[data-v-d3fd7b1c],.cls-card.status-starting[data-v-d3fd7b1c]{border-left-color:var(--el-color-warning)}.cls-card.status-error[data-v-d3fd7b1c]{border-left-color:var(--el-color-danger)}.cls-header[data-v-d3fd7b1c]{display:flex;justify-content:space-between;align-items:center}.cls-title[data-v-d3fd7b1c]{font-weight:700}.error-msg[data-v-d3fd7b1c]{color:var(--el-color-danger);font-size:12px;margin-bottom:8px}.player-list[data-v-d3fd7b1c]{display:flex;flex-direction:column;gap:4px}.player-row[data-v-d3fd7b1c]{display:flex;justify-content:space-between;align-items:center;font-size:13px;padding:2px 4px;border-radius:2px}.player-row[data-v-d3fd7b1c]:nth-child(odd){background:var(--k-hover-bg, var(--el-fill-color))}.player-info[data-v-d3fd7b1c]{display:flex;align-items:center;gap:6px;flex:1;min-width:0;overflow:hidden}.online-dot[data-v-d3fd7b1c]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.online-dot.online[data-v-d3fd7b1c]{background:var(--el-color-success)}.online-dot.offline[data-v-d3fd7b1c]{background:var(--el-color-danger)}.player-name[data-v-d3fd7b1c]{font-weight:500;color:var(--k-text-normal, var(--el-text-color-primary))}.player-right[data-v-d3fd7b1c]{display:flex;align-items:center;gap:4px;flex-shrink:0}.player-point[data-v-d3fd7b1c]{color:var(--k-text-light, var(--el-text-color-secondary));font-family:monospace}.player-point.editable[data-v-d3fd7b1c]{cursor:pointer;border-bottom:1px dashed var(--el-border-color)}.player-point.editable[data-v-d3fd7b1c]:hover{color:var(--el-color-primary)}.point-edit[data-v-d3fd7b1c]{display:flex;align-items:center;gap:2px;margin-left:auto}.point-edit-btn[data-v-d3fd7b1c]{padding:0 4px;min-width:auto;font-size:13px;margin-left:0!important}.swap-btn[data-v-d3fd7b1c]{padding:2px;font-size:13px}.no-players[data-v-d3fd7b1c]{text-align:center;color:var(--k-text-light, var(--el-text-color-secondary))}.cls-actions[data-v-d3fd7b1c]{margin-top:8px;display:flex;gap:4px;flex-wrap:wrap}.swap-popover-container{padding:8px 4px 8px 12px!important}.swap-popover-container .swap-popover{max-height:240px;overflow-y:auto;padding-right:8px;scrollbar-width:thin;scrollbar-color:var(--el-border-color) transparent}.swap-popover-container .swap-popover::-webkit-scrollbar{width:4px}.swap-popover-container .swap-popover::-webkit-scrollbar-track{background:transparent}.swap-popover-container .swap-popover::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:2px}.swap-popover-container .swap-popover::-webkit-scrollbar-thumb:hover{background:var(--el-text-color-placeholder)}.swap-popover-container .swap-title{font-size:12px;color:var(--el-text-color-secondary);margin-bottom:4px}.swap-popover-container .swap-option{padding:4px 8px;cursor:pointer;border-radius:4px;font-size:13px}.swap-popover-container .swap-option:hover{background:var(--el-fill-color-light)}.swap-popover-container .swap-option.active{color:var(--el-color-primary);font-weight:500}.swap-popover-container .swap-manual{display:flex;gap:4px;margin-bottom:8px}.swap-popover-container .swap-mode-actions{display:flex;gap:4px;justify-content:flex-end}.swap-popover-container .swap-section{margin-bottom:4px}.match-manager[data-v-07807463]{display:flex;flex-direction:column;gap:16px;min-height:100%}.config-header[data-v-07807463]{display:flex;align-items:center;gap:8px}.config-card[data-v-07807463] .el-card__body{padding-top:12px;padding-bottom:12px}.config-actions[data-v-07807463]{margin-top:8px}.status-section[data-v-07807463]{display:flex;flex-direction:column;gap:12px}.status-header[data-v-07807463]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.status-actions[data-v-07807463]{display:flex;gap:8px}.cls-grid[data-v-07807463]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}.status-placeholder[data-v-07807463]{text-align:center;padding:40px;color:var(--k-text-light)}.log-card[data-v-07807463]{flex:1;display:flex;flex-direction:column;min-height:200px;max-height:400px}.log-card[data-v-07807463] .el-card__body{padding:0;flex:1;display:flex;flex-direction:column;overflow:hidden}.log-header[data-v-07807463]{display:flex;justify-content:space-between;align-items:center}.log-scroll[data-v-07807463]{flex:1;overflow-y:auto;padding:8px 16px;font-family:monospace;font-size:12px;scrollbar-width:thin}.log-scroll[data-v-07807463]::-webkit-scrollbar{width:6px}.log-scroll[data-v-07807463]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:3px}.log-scroll[data-v-07807463]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker, var(--el-text-color-placeholder))}.log-line[data-v-07807463]{padding:2px 0;line-height:1.5}.log-time[data-v-07807463]{color:var(--k-text-light);margin-right:8px}.log-empty[data-v-07807463]{text-align:center;color:var(--k-text-light);padding:20px}.subscriber-card[data-v-07807463] .el-card__body{padding-top:12px;padding-bottom:12px}.subscriber-header[data-v-07807463]{font-weight:700}.subscriber-list[data-v-07807463]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.subscriber-tag[data-v-07807463]{font-family:monospace}.subscriber-empty[data-v-07807463]{color:var(--k-text-light, var(--el-text-color-secondary));font-size:13px}.subscriber-add[data-v-07807463]{display:flex;gap:8px;align-items:center}.schedule-section[data-v-07807463]{margin-top:12px;border-top:1px solid var(--k-color-divider, var(--el-border-color-lighter));padding-top:12px}.schedule-label[data-v-07807463]{font-size:13px;font-weight:500;margin-bottom:8px}.schedule-list[data-v-07807463]{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.schedule-row[data-v-07807463]{display:flex;gap:8px;align-items:center}.schedule-control-card[data-v-07807463] .el-card__body{padding-top:12px;padding-bottom:12px}.schedule-control-header[data-v-07807463]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.schedule-control-list[data-v-07807463]{display:flex;flex-direction:column;gap:8px}.schedule-control-row[data-v-07807463]{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border-radius:4px;background:var(--k-hover-bg, var(--el-fill-color))}.schedule-info[data-v-07807463]{font-size:13px}.schedule-time[data-v-07807463]{color:var(--k-text-light, var(--el-text-color-secondary));margin-left:4px}.team-manager[data-v-064b204b]{display:flex;flex-direction:column;gap:12px}.team-header[data-v-064b204b]{display:flex;justify-content:space-between;align-items:center;font-weight:700}.team-header-actions[data-v-064b204b]{display:flex;gap:8px}.player-display[data-v-064b204b]{display:flex;flex-wrap:wrap;gap:4px}.player-tag[data-v-064b204b]{font-size:12px}.no-players[data-v-064b204b]{color:var(--k-text-light, var(--el-text-color-secondary));font-size:12px}.inline-edit[data-v-064b204b]{display:flex;flex-direction:column;gap:4px;padding:4px 0}.inline-edit-row[data-v-064b204b]{display:flex;align-items:center;gap:6px}.player-index[data-v-064b204b]{width:20px;text-align:right;color:var(--k-text-light, var(--el-text-color-secondary));font-size:12px;flex-shrink:0}.inline-edit-actions[data-v-064b204b]{display:flex;gap:6px;margin-top:4px}.lobby-panel[data-v-a21c65dd]{display:flex;flex-direction:column;gap:16px}.lobby-config[data-v-a21c65dd]{margin-bottom:4px}.section-card[data-v-a21c65dd] .el-card__header{padding:12px 16px}.section-header[data-v-a21c65dd]{font-weight:700}.empty-hint[data-v-a21c65dd]{text-align:center;padding:20px;color:var(--k-text-light);font-size:13px}.game-list[data-v-a21c65dd]{display:flex;flex-direction:column;gap:8px}.game-card[data-v-a21c65dd]{border-left:3px solid var(--el-color-success)}.game-card[data-v-a21c65dd] .el-card__body{padding:12px}.game-header[data-v-a21c65dd]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.game-id[data-v-a21c65dd]{font-family:monospace;font-size:12px;color:var(--k-text-light)}.game-actions[data-v-a21c65dd]{display:flex;gap:4px}.game-players[data-v-a21c65dd]{display:flex;gap:6px;flex-wrap:wrap}.player-tag[data-v-a21c65dd]{font-size:13px}.contest-panel[data-v-4c836566]{height:100%;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.first-tab-label[data-v-4c836566]{display:inline-flex;align-items:center;gap:4px}.sidebar-toggle-btn[data-v-4c836566]{font-size:inherit;padding:0;min-width:auto;height:auto;line-height:inherit;color:var(--el-text-color-primary);font-weight:400}.sidebar-toggle-btn[data-v-4c836566]:hover{color:var(--el-color-primary)}.contest-panel[data-v-4c836566] .el-tabs{display:flex;flex-direction:column;flex:1;overflow:hidden}.contest-panel[data-v-4c836566] .el-tabs__header{padding-left:8px}.contest-panel[data-v-4c836566] .el-tabs__content{flex:1;overflow:hidden;display:flex;flex-direction:column}.contest-panel[data-v-4c836566] .el-tab-pane{flex:1;overflow-y:auto;padding:12px 16px 16px}.empty-state[data-v-4c836566]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--k-text-light)}.main-layout[data-v-592f974d]{display:flex;height:100%;overflow:hidden}.sidebar-wrapper[data-v-592f974d]{position:relative;width:240px;min-width:240px;border-right:1px solid var(--k-color-divider, var(--el-border-color-lighter));transition:width .2s,min-width .2s;display:flex;flex-direction:column}.sidebar-wrapper.collapsed[data-v-592f974d]{width:0;min-width:0;overflow:hidden}.content-wrapper[data-v-592f974d]{flex:1;overflow:hidden;min-width:0}.empty-state[data-v-592f974d]{display:flex;align-items:center;justify-content:center;height:100%;color:var(--k-text-light);font-size:16px}
package/lib/console.d.ts CHANGED
@@ -38,6 +38,7 @@ export declare class ConsoleExtension {
38
38
  protected ctx: Context;
39
39
  protected manager: ContestManager;
40
40
  protected config: ConsoleExtension.Config;
41
+ static inject: string[];
41
42
  private mahjongpub;
42
43
  constructor(ctx: Context, manager: ContestManager, config: ConsoleExtension.Config);
43
44
  }
@@ -79,6 +80,8 @@ export declare namespace ConsoleExtension {
79
80
  stopCls: number[];
80
81
  schedules?: import('./manager').Schedule[];
81
82
  schedulePaused?: boolean;
83
+ fillBots?: boolean;
84
+ allowNegativeScore?: boolean;
82
85
  subscribers: string[];
83
86
  } | null;
84
87
  hasAdmin: boolean;
@@ -91,6 +94,8 @@ export declare namespace ConsoleExtension {
91
94
  ver?: number;
92
95
  maxRow?: number;
93
96
  schedules?: import('./manager').Schedule[];
97
+ fillBots?: boolean;
98
+ allowNegativeScore?: boolean;
94
99
  }
95
100
  interface ContestConfig {
96
101
  cid: number;
@@ -102,6 +107,8 @@ export declare namespace ConsoleExtension {
102
107
  maxRow?: number;
103
108
  schedules?: import('./manager').Schedule[];
104
109
  schedulePaused?: boolean;
110
+ fillBots?: boolean;
111
+ allowNegativeScore?: boolean;
105
112
  subscribers?: string[];
106
113
  }
107
114
  interface TeamInfo {
package/lib/index.js CHANGED
@@ -459,6 +459,7 @@ var ContestExtra = class {
459
459
  this.ctx = ctx;
460
460
  this.subscribers = /* @__PURE__ */ Object.create(null);
461
461
  this.stopCls = /* @__PURE__ */ new Set();
462
+ this.startingCls = /* @__PURE__ */ new Set();
462
463
  }
463
464
  static {
464
465
  __name(this, "ContestExtra");
@@ -466,6 +467,8 @@ var ContestExtra = class {
466
467
  // subscribers: Set<string | ((message: string) => Promise<void>)>
467
468
  subscribers;
468
469
  stopCls;
470
+ /** Classes currently in startMatch flow (first attempt or retrying) */
471
+ startingCls;
469
472
  type;
470
473
  round;
471
474
  lobby;
@@ -474,6 +477,10 @@ var ContestExtra = class {
474
477
  maxRow;
475
478
  schedules;
476
479
  schedulePaused = false;
480
+ /** Fill absent players with bots ($0) when timeout exceeded */
481
+ fillBots = false;
482
+ /** Allow negative scores (ti mode: don't stop when player goes negative) */
483
+ allowNegativeScore = false;
477
484
  /** Per-cls point overrides for next start: { [cls]: number[] } */
478
485
  pointOverrides = /* @__PURE__ */ Object.create(null);
479
486
  /** Per-cls player name overrides for next start: { [cls]: string[] } */
@@ -637,13 +644,15 @@ var ContestManager2 = class extends import_koishi2.Service {
637
644
  await this.ctx.database.upsert("mahjongpub.contests", [{
638
645
  cid,
639
646
  type: cextra.type,
640
- round: cextra.round,
641
- lobby: cextra.lobby,
642
- playerIndex: cextra.playerIndex,
643
- ver: cextra.ver,
644
- maxRow: cextra.maxRow,
645
- schedules: cextra.schedules,
647
+ round: cextra.round ?? null,
648
+ lobby: cextra.lobby ?? null,
649
+ playerIndex: cextra.playerIndex ?? null,
650
+ ver: cextra.ver ?? 0,
651
+ maxRow: cextra.maxRow ?? null,
652
+ schedules: cextra.schedules ?? [],
646
653
  schedulePaused: cextra.schedulePaused,
654
+ fillBots: cextra.fillBots,
655
+ allowNegativeScore: cextra.allowNegativeScore,
647
656
  subscribers
648
657
  }]);
649
658
  }
@@ -678,7 +687,7 @@ var ContestManager2 = class extends import_koishi2.Service {
678
687
  }))
679
688
  };
680
689
  }
681
- if (cextra.type === "ti" && lastRecord && lastRecord.results?.some((x) => x.num < 0) && !this.config.allowNegativeScore) {
690
+ if (cextra.type === "ti" && lastRecord && lastRecord.results?.some((x) => x.num < 0) && !cextra.allowNegativeScore) {
682
691
  return {
683
692
  status: "finished",
684
693
  rowi: lastRecord.rowi,
@@ -700,6 +709,13 @@ var ContestManager2 = class extends import_koishi2.Service {
700
709
  };
701
710
  }
702
711
  const round = Object.values(rounds).find((x) => x.round === (cextra.round ?? contest.c_round) && x.t_class === cls);
712
+ if (!round) {
713
+ return {
714
+ status: "error",
715
+ rowi,
716
+ msg: `找不到对应的组别 (round=${cextra.round ?? contest.c_round}, cls=${cls})`
717
+ };
718
+ }
703
719
  const basePlayers = round.tids.map((tid) => getRowPlayer(contest, teams[tid], rowi, cextra.playerIndex));
704
720
  const players = basePlayers.map((x, i) => cextra.playerOverrides[cls]?.[i] ?? x);
705
721
  const hasEmptyPlayer = !players.every((x) => x);
@@ -707,7 +723,7 @@ var ContestManager2 = class extends import_koishi2.Service {
707
723
  const overrides = cextra.pointOverrides[cls];
708
724
  if (cextra.type === "ti") {
709
725
  return {
710
- status: cextra.stopCls.has(cls) ? "suspended" : hasEmptyPlayer ? "error" : "pending",
726
+ status: cextra.stopCls.has(cls) ? "suspended" : hasEmptyPlayer ? "error" : cextra.startingCls.has(cls) ? "starting" : "pending",
711
727
  rowi,
712
728
  msg: hasEmptyPlayer ? "名单未填写" : void 0,
713
729
  next: players.map((x, i) => ({
@@ -719,7 +735,7 @@ var ContestManager2 = class extends import_koishi2.Service {
719
735
  };
720
736
  } else if (cextra.type === "ssb") {
721
737
  return {
722
- status: cextra.stopCls.has(cls) ? "suspended" : hasEmptyPlayer ? "error" : "pending",
738
+ status: cextra.stopCls.has(cls) ? "suspended" : hasEmptyPlayer ? "error" : cextra.startingCls.has(cls) ? "starting" : "pending",
723
739
  rowi,
724
740
  msg: hasEmptyPlayer ? "名单未填写" : void 0,
725
741
  next: players.map((x, i) => ({
@@ -749,6 +765,7 @@ var ContestManager2 = class extends import_koishi2.Service {
749
765
  const tag = `${cls}组`;
750
766
  if (!cextra || cextra.stopCls.has(cls)) {
751
767
  this.ctx.logger.info(`try starting match ${cid}-${cls}, but stopped`);
768
+ cextra?.startingCls.delete(cls);
752
769
  return;
753
770
  }
754
771
  this.ctx.logger.info(`try starting match ${cid}-${cls}, timeout ${timeout}`);
@@ -770,7 +787,7 @@ var ContestManager2 = class extends import_koishi2.Service {
770
787
  return;
771
788
  }
772
789
  }
773
- if (cextra.type === "ti" && lastRecord && lastRecord.results?.some((x) => x.num < 0) && !this.config.allowNegativeScore) {
790
+ if (cextra.type === "ti" && lastRecord && lastRecord.results?.some((x) => x.num < 0) && !cextra.allowNegativeScore) {
774
791
  return;
775
792
  }
776
793
  const rowi = lastRecord ? lastRecord.rowi + 1 : 0;
@@ -779,6 +796,11 @@ var ContestManager2 = class extends import_koishi2.Service {
779
796
  return;
780
797
  }
781
798
  const round = Object.values(rounds).find((x) => x.round === (cextra.round ?? contest.c_round) && x.t_class === cls);
799
+ if (!round) {
800
+ cextra.broadcast(`[${tag}] 失败:找不到对应的组别`);
801
+ cextra.startingCls.delete(cls);
802
+ return;
803
+ }
782
804
  const basePlayers = round.tids.map((tid) => getRowPlayer(contest, teams[tid], rowi, cextra.playerIndex));
783
805
  const players = basePlayers.map((x, i) => cextra.playerOverrides[cls]?.[i] ?? x);
784
806
  if (!players.every((x) => x)) {
@@ -806,17 +828,24 @@ var ContestManager2 = class extends import_koishi2.Service {
806
828
  }
807
829
  delete cextra.pointOverrides[cls];
808
830
  delete cextra.playerOverrides[cls];
831
+ cextra.startingCls.delete(cls);
809
832
  cextra.broadcast(`[${tag}] 成功:` + players.join(", "));
810
833
  } catch (e) {
811
834
  if (e instanceof import_lobby.DHSError || e instanceof import_api2.ZhangxinmjError || e instanceof import_api.DHSError) {
812
835
  cextra.broadcast(`[${tag}] 失败:` + e.message + ` (timeout=${timeout / import_koishi2.Time.second}s)`);
813
836
  if (timeout < this.config.startMaxTimeout) {
814
837
  this.ctx.setTimeout(() => this.startMatch(cid, cls, timeout + this.config.startTimeoutInterval), this.config.startTimeoutInterval);
838
+ } else if (cextra.fillBots && (e instanceof import_api.PlayerNotFoundError || e instanceof import_lobby.PlayerNotFoundError) && e.players.length === 1) {
839
+ const absent = new Set(e.players);
840
+ cextra.playerOverrides[cls] = players.map((x) => absent.has(x) ? "$0" : x);
841
+ this.ctx.setTimeout(() => this.startMatch(cid, cls, this.config.startMaxTimeout), 0);
815
842
  } else {
843
+ cextra.startingCls.delete(cls);
816
844
  this.ctx.logger.warn(`start match ${cid}-${cls} exceed max retires`);
817
845
  cextra.broadcast(`[${tag}] 失败:超过最大重试时间 【${failPatterns}】`);
818
846
  }
819
847
  } else {
848
+ cextra.startingCls.delete(cls);
820
849
  this.ctx.logger.warn(`start match ${cid}-${cls} failed: ${e.message}`);
821
850
  cextra.broadcast(`[${tag}] 失败:` + e.message);
822
851
  }
@@ -824,13 +853,17 @@ var ContestManager2 = class extends import_koishi2.Service {
824
853
  }
825
854
  async startMatch(cid, cls, timeout = 0, force = false) {
826
855
  const tag = `${cls}组`;
856
+ const cextra = this.extra[cid];
857
+ if (cextra) cextra.startingCls.add(cls);
827
858
  try {
828
859
  return await this._startMatch(cid, cls, timeout, force);
829
860
  } catch (e) {
830
861
  this.ctx.logger.warn(`start match ${cid}-${cls} internal failed: `, e);
831
- this.extra[cid]?.broadcast(`[${tag}] 失败:内部错误`);
862
+ cextra?.broadcast(`[${tag}] 失败:内部错误`);
832
863
  if (timeout < this.config.startMaxTimeout) {
833
864
  this.ctx.setTimeout(() => this.startMatch(cid, cls, timeout + this.config.startTimeoutInterval, force), this.config.startTimeoutInterval);
865
+ } else {
866
+ cextra?.startingCls.delete(cls);
834
867
  }
835
868
  }
836
869
  }
@@ -850,8 +883,7 @@ var ContestManager2 = class extends import_koishi2.Service {
850
883
  startInterval: import_koishi2.Schema.number().default(import_koishi2.Time.second).description("比赛开始间隔"),
851
884
  startTimeoutInterval: import_koishi2.Schema.number().default(import_koishi2.Time.second * 30).description("比赛开始重试间隔"),
852
885
  startMaxTimeout: import_koishi2.Schema.number().default(import_koishi2.Time.second * 600).description("比赛开始最大重试间隔"),
853
- finishInterval: import_koishi2.Schema.number().default(import_koishi2.Time.second * 10).description("比赛结束间隔"),
854
- allowNegativeScore: import_koishi2.Schema.boolean().default(false).description("允许负分")
886
+ finishInterval: import_koishi2.Schema.number().default(import_koishi2.Time.second * 10).description("比赛结束间隔")
855
887
  });
856
888
  })(ContestManager2 || (ContestManager2 = {}));
857
889
 
@@ -896,6 +928,8 @@ var ConsoleExtension = class {
896
928
  if (!(0, import_koishi3.isNullable)(config2.maxRow)) cextra.maxRow = config2.maxRow;
897
929
  cextra.schedules = config2.schedules;
898
930
  cextra.schedulePaused = config2.schedulePaused ?? false;
931
+ cextra.fillBots = config2.fillBots ?? false;
932
+ cextra.allowNegativeScore = config2.allowNegativeScore ?? false;
899
933
  for (const channelId of config2.subscribers ?? []) {
900
934
  cextra.subscribers[channelId] = true;
901
935
  }
@@ -997,6 +1031,8 @@ var ConsoleExtension = class {
997
1031
  stopCls: [...cextra.stopCls],
998
1032
  schedules: cextra.schedules,
999
1033
  schedulePaused: cextra.schedulePaused,
1034
+ fillBots: cextra.fillBots,
1035
+ allowNegativeScore: cextra.allowNegativeScore,
1000
1036
  subscribers: Object.entries(cextra.subscribers).filter(([, v]) => v === true).map(([k]) => k)
1001
1037
  } : null,
1002
1038
  hasAdmin: !!managed?.adminPassword
@@ -1029,6 +1065,8 @@ var ConsoleExtension = class {
1029
1065
  cextra.ver = options.ver ?? 0;
1030
1066
  cextra.maxRow = options.maxRow;
1031
1067
  if (options.schedules) cextra.schedules = options.schedules;
1068
+ if (!(0, import_koishi3.isNullable)(options.fillBots)) cextra.fillBots = options.fillBots;
1069
+ if (!(0, import_koishi3.isNullable)(options.allowNegativeScore)) cextra.allowNegativeScore = options.allowNegativeScore;
1032
1070
  cextra.stopCls.clear();
1033
1071
  cextra.setupScheduleTimers((maxRow) => {
1034
1072
  that.manager.persistExtra(cid);
@@ -1064,6 +1102,7 @@ var ConsoleExtension = class {
1064
1102
  if (clsz?.length) {
1065
1103
  for (const cls of clsz) {
1066
1104
  cextra.stopCls.add(cls);
1105
+ cextra.startingCls.delete(cls);
1067
1106
  }
1068
1107
  } else {
1069
1108
  const contest = await that.mahjongpub.getContest(cid);
@@ -1071,6 +1110,7 @@ var ConsoleExtension = class {
1071
1110
  for (const r of Object.values(rounds)) {
1072
1111
  if (r.round !== (cextra.round ?? contest.c_round)) continue;
1073
1112
  cextra.stopCls.add(r.t_class);
1113
+ cextra.startingCls.delete(r.t_class);
1074
1114
  }
1075
1115
  }
1076
1116
  });
@@ -1288,6 +1328,7 @@ var ConsoleExtension = class {
1288
1328
  static {
1289
1329
  __name(this, "ConsoleExtension");
1290
1330
  }
1331
+ static inject = ["sendMessage"];
1291
1332
  mahjongpub;
1292
1333
  };
1293
1334
 
@@ -1340,6 +1381,14 @@ var MahjongPub2 = class extends import_koishi4.Service {
1340
1381
  type: "boolean",
1341
1382
  initial: false
1342
1383
  },
1384
+ fillBots: {
1385
+ type: "boolean",
1386
+ initial: false
1387
+ },
1388
+ allowNegativeScore: {
1389
+ type: "boolean",
1390
+ initial: false
1391
+ },
1343
1392
  subscribers: {
1344
1393
  type: "json",
1345
1394
  initial: []
@@ -1755,7 +1804,7 @@ var MahjongPub2 = class extends import_koishi4.Service {
1755
1804
  ((MahjongPub3) => {
1756
1805
  MahjongPub3.inject = {
1757
1806
  required: ["database"],
1758
- optional: ["assets", "cache", "console", "mahjong", "mahjong.database"]
1807
+ optional: ["assets", "cache", "console", "mahjong", "mahjong.database", "sendMessage"]
1759
1808
  };
1760
1809
  MahjongPub3.Config = import_koishi4.Schema.object({
1761
1810
  informNotbind: import_koishi4.Schema.boolean().default(false),
package/lib/manager.d.ts CHANGED
@@ -22,7 +22,7 @@ interface MatchRecord {
22
22
  results?: PlayerResult[];
23
23
  }
24
24
  export interface ClsStatus {
25
- status: 'pending' | 'running' | 'finished' | 'suspended' | 'error';
25
+ status: 'pending' | 'running' | 'finished' | 'suspended' | 'starting' | 'error';
26
26
  rowi: number;
27
27
  msg?: string;
28
28
  last?: {
@@ -45,6 +45,8 @@ export declare class ContestExtra {
45
45
  ctx: Context;
46
46
  subscribers: Dict<boolean | ((message: string) => Promise<void>)>;
47
47
  stopCls: Set<number>;
48
+ /** Classes currently in startMatch flow (first attempt or retrying) */
49
+ startingCls: Set<number>;
48
50
  type: 'ti' | 'ssb';
49
51
  round?: number;
50
52
  lobby?: string;
@@ -53,6 +55,10 @@ export declare class ContestExtra {
53
55
  maxRow?: number;
54
56
  schedules?: Schedule[];
55
57
  schedulePaused: boolean;
58
+ /** Fill absent players with bots ($0) when timeout exceeded */
59
+ fillBots: boolean;
60
+ /** Allow negative scores (ti mode: don't stop when player goes negative) */
61
+ allowNegativeScore: boolean;
56
62
  /** Per-cls point overrides for next start: { [cls]: number[] } */
57
63
  pointOverrides: Dict<number[]>;
58
64
  /** Per-cls player name overrides for next start: { [cls]: string[] } */
@@ -84,7 +90,6 @@ export declare namespace ContestManager {
84
90
  startTimeoutInterval: number;
85
91
  startMaxTimeout: number;
86
92
  finishInterval: number;
87
- allowNegativeScore: boolean;
88
93
  }
89
94
  const Config: Schema<Config>;
90
95
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hieuzest/koishi-plugin-mahjongpub",
3
3
  "description": "Mahjong.pub API",
4
- "version": "0.3.10",
4
+ "version": "0.3.12",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [