koishi-plugin-adapter-onebot-multi 1.0.4 → 1.0.6

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/client/page.vue CHANGED
@@ -430,11 +430,12 @@ function openListEditor(target: 'blacklist' | 'whitelist' | 'priority') {
430
430
  }
431
431
 
432
432
  function saveListEditor() {
433
- const filtered = listEditorText.value
433
+ const parsed = listEditorText.value
434
434
  .split('\n')
435
435
  .map(v => v.trim())
436
436
  .filter(v => /^\d+$/.test(v))
437
- .join('\n')
437
+
438
+ const filtered = Array.from(new Set(parsed)).join('\n')
438
439
 
439
440
  if (listEditorTarget.value === 'blacklist') blacklistText.value = filtered
440
441
  else if (listEditorTarget.value === 'whitelist') whitelistText.value = filtered
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import{send as x,icons as wt}from"@koishijs/client";import{defineComponent as Ct,ref as b,reactive as K,computed as It,onMounted as ht,onUnmounted as _t,resolveComponent as Bt,createBlock as Vt,openBlock as a,withCtx as Ut,createElementVNode as e,createElementBlock as i,createCommentVNode as m,withDirectives as o,normalizeClass as O,Fragment as R,renderList as N,toDisplayString as d,createTextVNode as p,vModelText as f,vModelCheckbox as z,vShow as Y,vModelSelect as Q,withModifiers as G}from"vue";const Tt={class:"pop-wrapper"},Mt={key:0,class:"pop-loading"},$t={key:1,class:"pop-container"},Lt={class:"pop-header"},Et={class:"pop-tabs"},At={class:"pop-panel bots-panel"},St={key:0,class:"empty-state"},Ot={key:1,class:"bot-grid"},Rt={class:"bot-header"},Nt=["src"],Pt={class:"bot-info"},jt={class:"bot-name"},Dt={class:"bot-sub"},Ft={class:"bot-id"},Wt={class:"bot-stats"},zt={class:"stat-box"},Gt={class:"stat-box"},Xt={class:"stat-box"},Ht={class:"stat-box"},qt={class:"bot-meta"},Jt={class:"bot-actions"},Kt=["onClick"],Qt=["onClick"],Yt=["onClick"],Zt=["onClick"],te=["onClick"],ee=["onClick"],le={class:"form-grid"},se={class:"pop-label"},ne={class:"pop-label"},oe={class:"pop-label"},ae={class:"pop-label"},ie={class:"pop-label"},ue={class:"pop-label pop-checkbox",style:{"align-self":"center","margin-top":"24px"}},pe={class:"pop-panel balance-panel"},de={class:"form-grid"},re={class:"pop-label pop-checkbox"},ce={class:"pop-label"},ve={class:"pop-label"},be={class:"pop-label"},me={class:"pop-label"},fe={class:"split-grid"},ye={class:"pop-label"},ke={class:"list-summary-box"},ge={class:"list-count"},xe={class:"pop-label"},we={class:"list-summary-box"},Ce={class:"list-count"},Ie={class:"pop-label"},he={class:"list-summary-box"},_e={class:"list-count"},Be={class:"pop-table-editor"},Ve={class:"table-body"},Ue={key:0,class:"empty-row"},Te=["onUpdate:modelValue"],Me=["value"],$e=["onUpdate:modelValue"],Le=["onClick"],Ee={class:"pop-table-editor full-width"},Ae={class:"table-body"},Se={key:0,class:"empty-row"},Oe={style:{display:"flex",gap:"8px"}},Re=["onUpdate:modelValue"],Ne=["onClick"],Pe={class:"bot-checkbox-group",style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"8px"}},je=["value","onUpdate:modelValue"],De={class:"pop-modal comic-panel"},Fe={class:"form-grid modal-grid"},We={class:"pop-label"},ze={class:"pop-label hidden"},Ge={class:"pop-label"},Xe={class:"pop-label"},He={class:"pop-label"},qe={class:"pop-label"},Je={class:"pop-label pop-checkbox"},Ke={class:"modal-actions"},Qe={class:"pop-modal comic-panel"},Ye={class:"modal-sub"},Ze={class:"pop-label"},tl={class:"modal-actions"},el={class:"pop-modal comic-panel"},ll={class:"modal-sub"},sl={class:"pop-label"},nl={class:"modal-actions"},ol={class:"pop-modal comic-panel"},al={class:"modal-actions"},il={key:0},ul={key:1},pl=Ct({__name:"page",setup(V){const _=b(true),w=b("bots"),B=b([]),y=K({responseTimeout:6e4,heartbeatInterval:3e4,retryTimes:6,retryInterval:5e3,retryLazy:6e4,advanced:{splitMixedContent:true}}),v=K({enabled:false,balanceInterval:600,channelFilterMode:"blacklist",channelBlacklist:[],channelWhitelist:[],priorityChannels:[],defaultMaxLoad:0,botMaxLoad:{},unassignedValue:"",channelBotPriority:{}}),L=b(""),E=b(""),A=b(""),U=b([]),T=b([]),k=b(null),M=b(""),P=b("create"),X=b(""),u=b(null),C=b(null),j=b(""),I=b(null),S=b(""),h=K({show:false,type:"success",message:""});let D=null,H=false;function F(s){return s.split(`
2
- `).map(t=>t.trim()).filter(Boolean)}function q(s){return F(s).length}const tt=It(()=>k.value==="blacklist"?"编辑群黑名单":k.value==="whitelist"?"编辑群白名单":k.value==="priority"?"编辑优先群聊":"编辑列表");function J(s){k.value=s,s==="blacklist"?M.value=L.value:s==="whitelist"?M.value=E.value:s==="priority"&&(M.value=A.value)}function et(){const s=M.value.split(`
3
- `).map(t=>t.trim()).filter(t=>/^\d+$/.test(t)).join(`
4
- `);k.value==="blacklist"?L.value=s:k.value==="whitelist"?E.value=s:k.value==="priority"&&(A.value=s),k.value=null,c("success","列表已暂存,请点击保存规则生效")}function c(s,t){h.type=s,h.message=t,h.show=true,setTimeout(()=>{h.show=false},2e3)}function lt(s){return s==="online"?"在线":s==="connecting"?"连接中":"离线"}function st(){L.value=v.channelBlacklist.join(`
1
+ import{send as w,icons as wt}from"@koishijs/client";import{defineComponent as Ct,ref as b,reactive as K,computed as It,onMounted as ht,onUnmounted as _t,resolveComponent as Bt,createBlock as Vt,openBlock as a,withCtx as Ut,createElementVNode as e,createElementBlock as i,createCommentVNode as m,withDirectives as o,normalizeClass as O,Fragment as R,renderList as N,toDisplayString as d,createTextVNode as p,vModelText as f,vModelCheckbox as z,vShow as Y,vModelSelect as Q,withModifiers as G}from"vue";const Tt={class:"pop-wrapper"},Mt={key:0,class:"pop-loading"},$t={key:1,class:"pop-container"},Lt={class:"pop-header"},Et={class:"pop-tabs"},At={class:"pop-panel bots-panel"},St={key:0,class:"empty-state"},Ot={key:1,class:"bot-grid"},Rt={class:"bot-header"},Nt=["src"],Pt={class:"bot-info"},jt={class:"bot-name"},Dt={class:"bot-sub"},Ft={class:"bot-id"},Wt={class:"bot-stats"},zt={class:"stat-box"},Gt={class:"stat-box"},Xt={class:"stat-box"},Ht={class:"stat-box"},qt={class:"bot-meta"},Jt={class:"bot-actions"},Kt=["onClick"],Qt=["onClick"],Yt=["onClick"],Zt=["onClick"],te=["onClick"],ee=["onClick"],le={class:"form-grid"},se={class:"pop-label"},ne={class:"pop-label"},oe={class:"pop-label"},ae={class:"pop-label"},ie={class:"pop-label"},ue={class:"pop-label pop-checkbox",style:{"align-self":"center","margin-top":"24px"}},pe={class:"pop-panel balance-panel"},de={class:"form-grid"},re={class:"pop-label pop-checkbox"},ce={class:"pop-label"},ve={class:"pop-label"},be={class:"pop-label"},me={class:"pop-label"},fe={class:"split-grid"},ye={class:"pop-label"},ke={class:"list-summary-box"},ge={class:"list-count"},xe={class:"pop-label"},we={class:"list-summary-box"},Ce={class:"list-count"},Ie={class:"pop-label"},he={class:"list-summary-box"},_e={class:"list-count"},Be={class:"pop-table-editor"},Ve={class:"table-body"},Ue={key:0,class:"empty-row"},Te=["onUpdate:modelValue"],Me=["value"],$e=["onUpdate:modelValue"],Le=["onClick"],Ee={class:"pop-table-editor full-width"},Ae={class:"table-body"},Se={key:0,class:"empty-row"},Oe={style:{display:"flex",gap:"8px"}},Re=["onUpdate:modelValue"],Ne=["onClick"],Pe={class:"bot-checkbox-group",style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"8px"}},je=["value","onUpdate:modelValue"],De={class:"pop-modal comic-panel"},Fe={class:"form-grid modal-grid"},We={class:"pop-label"},ze={class:"pop-label hidden"},Ge={class:"pop-label"},Xe={class:"pop-label"},He={class:"pop-label"},qe={class:"pop-label"},Je={class:"pop-label pop-checkbox"},Ke={class:"modal-actions"},Qe={class:"pop-modal comic-panel"},Ye={class:"modal-sub"},Ze={class:"pop-label"},tl={class:"modal-actions"},el={class:"pop-modal comic-panel"},ll={class:"modal-sub"},sl={class:"pop-label"},nl={class:"modal-actions"},ol={class:"pop-modal comic-panel"},al={class:"modal-actions"},il={key:0},ul={key:1},pl=Ct({__name:"page",setup(U){const B=b(true),C=b("bots"),V=b([]),y=K({responseTimeout:6e4,heartbeatInterval:3e4,retryTimes:6,retryInterval:5e3,retryLazy:6e4,advanced:{splitMixedContent:true}}),v=K({enabled:false,balanceInterval:600,channelFilterMode:"blacklist",channelBlacklist:[],channelWhitelist:[],priorityChannels:[],defaultMaxLoad:0,botMaxLoad:{},unassignedValue:"",channelBotPriority:{}}),L=b(""),E=b(""),A=b(""),T=b([]),M=b([]),k=b(null),$=b(""),P=b("create"),X=b(""),u=b(null),I=b(null),j=b(""),h=b(null),S=b(""),_=K({show:false,type:"success",message:""});let D=null,H=false;function F(s){return s.split(`
2
+ `).map(t=>t.trim()).filter(Boolean)}function q(s){return F(s).length}const tt=It(()=>k.value==="blacklist"?"编辑群黑名单":k.value==="whitelist"?"编辑群白名单":k.value==="priority"?"编辑优先群聊":"编辑列表");function J(s){k.value=s,s==="blacklist"?$.value=L.value:s==="whitelist"?$.value=E.value:s==="priority"&&($.value=A.value)}function et(){const s=$.value.split(`
3
+ `).map(x=>x.trim()).filter(x=>/^\d+$/.test(x)),t=Array.from(new Set(s)).join(`
4
+ `);k.value==="blacklist"?L.value=t:k.value==="whitelist"?E.value=t:k.value==="priority"&&(A.value=t),k.value=null,c("success","列表已暂存,请点击保存规则生效")}function c(s,t){_.type=s,_.message=t,_.show=true,setTimeout(()=>{_.show=false},2e3)}function lt(s){return s==="online"?"在线":s==="connecting"?"连接中":"离线"}function st(){L.value=v.channelBlacklist.join(`
5
5
  `),E.value=v.channelWhitelist.join(`
6
6
  `),A.value=v.priorityChannels.join(`
7
- `),U.value=Object.entries(v.botMaxLoad||{}).map(([s,t])=>({botId:s,maxLoad:Number(t)||0})),T.value=Object.entries(v.channelBotPriority||{}).map(([s,t])=>({channelId:s,botIds:Array.isArray(t)?[...t]:[]}))}function nt(){U.value.push({botId:"",maxLoad:0})}function ot(s){U.value.splice(s,1)}function at(){T.value.push({channelId:"",botIds:[]})}function it(s){T.value.splice(s,1)}async function g(){if(!H){H=true;try{const s=await x("onebot-multi/state");B.value=(s==null?void 0:s.bots)||[],Object.assign(y,(s==null?void 0:s.runtime)||{}),Object.assign(v,(s==null?void 0:s.loadBalance)||{}),st()}catch(s){c("error",(s==null?void 0:s.message)||"刷新失败")}finally{H=false}}}function ut(){P.value="create",X.value="",u.value={token:"",protocol:"ws-reverse",endpoint:"",path:"/onebot",name:"",enabled:true}}function pt(s){P.value="edit",X.value=s.selfId,u.value={...s}}async function dt(){if(u.value)try{P.value==="create"?await x("onebot-multi/bots/create",u.value):await x("onebot-multi/bots/update",{oldSelfId:X.value,bot:u.value}),u.value=null,await g(),c("success","保存成功")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}async function rt(s){if(confirm(`确认删除 Bot ${s.selfId} 吗?`))try{await x("onebot-multi/bots/delete",{selfId:s.selfId}),await g(),c("success","删除成功")}catch(t){c("error",(t==null?void 0:t.message)||"删除失败")}}async function ct(s){try{await x("onebot-multi/bots/toggle",{selfId:s.selfId}),await g(),c("success","状态已更新")}catch(t){c("error",(t==null?void 0:t.message)||"更新失败")}}async function vt(s){try{await x("onebot-multi/bots/restart",{selfId:s.selfId}),await g(),c("success","重启已触发")}catch(t){c("error",(t==null?void 0:t.message)||"重启失败")}}function bt(s){C.value=s,j.value=s.nickname||""}async function mt(){if(C.value)try{const s=await x("onebot-multi/bots/profile",{selfId:C.value.selfId,nickname:j.value});if(!(s!=null&&s.success))throw new Error((s==null?void 0:s.error)||"保存失败");C.value=null,await g(),c("success","昵称已更新")}catch(s){c("error",(s==null?void 0:s.message)||"更新失败")}}function ft(s){I.value=s,S.value=""}function yt(s){var r;const $=(r=s.target.files)==null?void 0:r[0];if(!$){S.value="";return}const l=new FileReader;l.onload=n=>{var W;S.value=(W=n.target)==null?void 0:W.result},l.readAsDataURL($)}async function kt(){if(!I.value||!S.value.trim()){c("error","请先选择图片文件");return}try{const s=await x("onebot-multi/bots/avatar",{selfId:I.value.selfId,file:S.value});if(!(s!=null&&s.success))throw new Error((s==null?void 0:s.error)||"保存失败");I.value=null,c("success","头像已更新")}catch(s){c("error",(s==null?void 0:s.message)||"更新失败")}}async function gt(){try{await x("onebot-multi/settings/runtime/update",{...y}),await g(),c("success","运行时设置已保存")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}async function xt(){try{const s={};for(const l of U.value){const r=l.botId.trim();if(!r)continue;const n=Math.max(0,Number(l.maxLoad||0));s[r]=n}const t={};for(const l of T.value){const r=l.channelId.trim();if(!r)continue;const n=(l.botIds||[]).filter(Boolean);n.length>0&&(t[r]=n)}const $={...v,channelBlacklist:F(L.value),channelWhitelist:F(E.value),priorityChannels:F(A.value),botMaxLoad:s,channelBotPriority:t};await x("onebot-multi/settings/load-balance/update",$),await g(),c("success","负载均衡设置已保存")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}return ht(async()=>{await g(),_.value=false,D=setInterval(()=>{g()},5e3)}),_t(()=>{D&&(clearInterval(D),D=null)}),(s,t)=>{const $=Bt("k-layout");return a(),Vt($,null,{default:Ut(()=>[e("div",Tt,[_.value?(a(),i("div",Mt,[...t[33]||(t[33]=[e("div",{class:"comic-text"},"LOADING...",-1)])])):(a(),i("div",$t,[m(" HEADER "),e("header",Lt,[t[34]||(t[34]=e("div",{class:"brand"},[e("div",{class:"logo"},"✦"),e("div",{class:"title-box"},[e("h1",null,"ONEBOT 控制中心"),e("p",null,"实例管理与负载分发路由")])],-1)),e("nav",Et,[e("button",{class:O(["pop-btn",{active:w.value==="bots"}]),onClick:t[0]||(t[0]=l=>w.value="bots")},"Bot 管理",2),e("button",{class:O(["pop-btn",{active:w.value==="balance"}]),onClick:t[1]||(t[1]=l=>w.value="balance")},"负载均衡",2),e("button",{class:"pop-btn action-btn",onClick:g},"刷新状态")])]),m(" BOTS TAB "),o(e("section",At,[e("div",{class:"panel-header"},[t[35]||(t[35]=e("div",{class:"panel-title"},[e("h2",null,"Bot 状态"),e("p",null,"查看与管理当前运行实例")],-1)),e("button",{class:"pop-btn primary-btn",onClick:ut},"新增节点")]),B.value.length===0?(a(),i("div",St,[...t[36]||(t[36]=[e("div",{class:"comic-speech"},"无可用实例。请点击“新增节点”以配置。",-1)])])):(a(),i("div",Ot,[(a(true),i(R,null,N(B.value,l=>(a(),i("article",{key:l.selfId,class:O(["bot-card",{disabled:l.enabled===false}])},[e("div",Rt,[e("img",{class:"bot-avatar",src:l.avatarUrl||"",alt:"avatar"},null,8,Nt),e("div",Pt,[e("div",jt,d(l.name||`Bot ${l.selfId}`),1),e("div",Dt,d(l.nickname||"未知")+" | "+d(l.protocol==="ws-reverse"?"反向 WebSocket":l.protocol||"反向 WebSocket"),1),e("div",Ft,d(l.selfId),1)]),e("div",{class:O(["status-badge",`status-${l.status||"offline"}`])},d(lt(l.status)),3)]),e("div",Wt,[e("div",zt,[t[37]||(t[37]=e("span",null,"群组",-1)),e("strong",null,d(l.groupCount??"-"),1)]),e("div",Gt,[t[38]||(t[38]=e("span",null,"好友",-1)),e("strong",null,d(l.friendCount??"-"),1)]),e("div",Xt,[t[39]||(t[39]=e("span",null,"收",-1)),e("strong",null,d(l.messageReceived??"-"),1)]),e("div",Ht,[t[40]||(t[40]=e("span",null,"发",-1)),e("strong",null,d(l.messageSent??"-"),1)])]),e("div",qt,[e("div",null,[t[41]||(t[41]=e("strong",null,"终端:",-1)),p(" "+d(l.endpoint||"-"),1)]),e("div",null,[t[42]||(t[42]=e("strong",null,"路径:",-1)),p(" "+d(l.path||"/onebot"),1)])]),e("div",Jt,[e("button",{class:"pop-btn mini",onClick:r=>pt(l)},"编辑",8,Kt),e("button",{class:"pop-btn mini",onClick:r=>ct(l)},d(l.enabled===false?"启用":"禁用"),9,Qt),e("button",{class:"pop-btn mini",onClick:r=>vt(l)},"重启",8,Yt),e("button",{class:"pop-btn mini",onClick:r=>bt(l)},"昵称",8,Zt),e("button",{class:"pop-btn mini",onClick:r=>ft(l)},"头像",8,te),e("button",{class:"pop-btn mini danger",onClick:r=>rt(l)},"删除",8,ee)])],2))),128))])),m(" MERGED RUNTIME SETTINGS "),t[49]||(t[49]=e("div",{class:"panel-header",style:{"margin-top":"40px"}},[e("div",{class:"panel-title"},[e("h2",null,"运行参数"),e("p",null,"调整核心连接与重试策略")])],-1)),e("div",le,[e("label",se,[t[43]||(t[43]=p(" 超时时间 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>y.responseTimeout=l),type:"number",class:"pop-input"},null,512),[[f,y.responseTimeout,void 0,{number:true}]])]),e("label",ne,[t[44]||(t[44]=p(" 心跳间隔 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>y.heartbeatInterval=l),type:"number",class:"pop-input"},null,512),[[f,y.heartbeatInterval,void 0,{number:true}]])]),e("label",oe,[t[45]||(t[45]=p(" 重试次数 ",-1)),o(e("input",{"onUpdate:modelValue":t[4]||(t[4]=l=>y.retryTimes=l),type:"number",class:"pop-input"},null,512),[[f,y.retryTimes,void 0,{number:true}]])]),e("label",ae,[t[46]||(t[46]=p(" 重试间隔 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>y.retryInterval=l),type:"number",class:"pop-input"},null,512),[[f,y.retryInterval,void 0,{number:true}]])]),e("label",ie,[t[47]||(t[47]=p(" 懒重试 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[6]||(t[6]=l=>y.retryLazy=l),type:"number",class:"pop-input"},null,512),[[f,y.retryLazy,void 0,{number:true}]])]),e("label",ue,[o(e("input",{"onUpdate:modelValue":t[7]||(t[7]=l=>y.advanced.splitMixedContent=l),type:"checkbox",class:"pop-check"},null,512),[[z,y.advanced.splitMixedContent]]),t[48]||(t[48]=e("span",null,"拆分混合内容",-1))])]),e("div",{class:"panel-footer"},[e("button",{class:"pop-btn primary-btn",onClick:gt},"保存配置")])],512),[[Y,w.value==="bots"]]),m(" LOAD BALANCE TAB "),o(e("section",pe,[t[62]||(t[62]=e("div",{class:"panel-header"},[e("div",{class:"panel-title"},[e("h2",null,"负载均衡"),e("p",null,"配置全局流量分发规则")])],-1)),e("div",de,[e("label",re,[o(e("input",{"onUpdate:modelValue":t[8]||(t[8]=l=>v.enabled=l),type:"checkbox",class:"pop-check"},null,512),[[z,v.enabled]]),t[50]||(t[50]=e("span",null,"启用负载均衡",-1))]),e("label",ce,[t[51]||(t[51]=p(" 均衡间隔 (秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[9]||(t[9]=l=>v.balanceInterval=l),type:"number",class:"pop-input"},null,512),[[f,v.balanceInterval,void 0,{number:true}]])]),e("label",ve,[t[53]||(t[53]=p(" 过滤模式 ",-1)),o(e("select",{"onUpdate:modelValue":t[10]||(t[10]=l=>v.channelFilterMode=l),class:"pop-select"},[...t[52]||(t[52]=[e("option",{value:"blacklist"},"黑名单",-1),e("option",{value:"whitelist"},"白名单",-1)])],512),[[Q,v.channelFilterMode]])]),e("label",be,[t[54]||(t[54]=p(" 默认最大负载 (0=无限) ",-1)),o(e("input",{"onUpdate:modelValue":t[11]||(t[11]=l=>v.defaultMaxLoad=l),type:"number",class:"pop-input"},null,512),[[f,v.defaultMaxLoad,void 0,{number:true}]])]),e("label",me,[t[55]||(t[55]=p(" 未分配值 ",-1)),o(e("input",{"onUpdate:modelValue":t[12]||(t[12]=l=>v.unassignedValue=l),type:"text",class:"pop-input"},null,512),[[f,v.unassignedValue]])])]),e("div",fe,[e("div",ye,[t[56]||(t[56]=p(" 群黑名单 ",-1)),e("div",ke,[e("span",ge,"已配置 "+d(q(L.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[13]||(t[13]=l=>J("blacklist"))},"编辑")])]),e("div",xe,[t[57]||(t[57]=p(" 群白名单 ",-1)),e("div",we,[e("span",Ce,"已配置 "+d(q(E.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[14]||(t[14]=l=>J("whitelist"))},"编辑")])]),e("div",Ie,[t[58]||(t[58]=p(" 优先群聊 ",-1)),e("div",he,[e("span",_e,"已配置 "+d(q(A.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[15]||(t[15]=l=>J("priority"))},"编辑")])]),e("div",Be,[e("div",{class:"table-head"},[t[59]||(t[59]=e("span",null,"节点最大负载",-1)),e("button",{class:"pop-btn mini",onClick:nt},"添加行")]),e("div",Ve,[U.value.length===0?(a(),i("div",Ue,"暂无规则。")):m("v-if",true),(a(true),i(R,null,N(U.value,(l,r)=>(a(),i("div",{key:`max-${r}`,class:"editor-row"},[o(e("select",{"onUpdate:modelValue":n=>l.botId=n,class:"pop-select mini-input"},[t[60]||(t[60]=e("option",{disabled:"",value:""},"选择 Bot",-1)),(a(true),i(R,null,N(B.value,n=>(a(),i("option",{key:n.selfId,value:n.selfId},d(n.name||n.nickname||n.selfId),9,Me))),128))],8,Te),[[Q,l.botId]]),o(e("input",{"onUpdate:modelValue":n=>l.maxLoad=n,type:"number",min:"0",placeholder:"最大值",class:"pop-input mini-input"},null,8,$e),[[f,l.maxLoad,void 0,{number:true}]]),e("button",{class:"pop-btn mini danger",onClick:n=>ot(r)},"X",8,Le)]))),128))])]),e("div",Ee,[e("div",{class:"table-head"},[t[61]||(t[61]=e("span",null,"群聊专属节点",-1)),e("button",{class:"pop-btn mini",onClick:at},"添加行")]),e("div",Ae,[T.value.length===0?(a(),i("div",Se,"暂无规则。")):m("v-if",true),(a(true),i(R,null,N(T.value,(l,r)=>(a(),i("div",{key:`priority-${r}`,class:"editor-row",style:{display:"flex","flex-direction":"column"}},[e("div",Oe,[o(e("input",{"onUpdate:modelValue":n=>l.channelId=n,type:"text",placeholder:"群号",class:"pop-input mini-input",style:{flex:"1"}},null,8,Re),[[f,l.channelId]]),e("button",{class:"pop-btn mini danger",onClick:n=>it(r)},"X",8,Ne)]),e("div",Pe,[(a(true),i(R,null,N(B.value,n=>(a(),i("label",{key:n.selfId,class:"pop-checkbox mini-checkbox"},[o(e("input",{type:"checkbox",value:n.selfId,"onUpdate:modelValue":W=>l.botIds=W,class:"pop-check mini-check"},null,8,je),[[z,l.botIds]]),e("span",null,d(n.name||n.nickname||n.selfId),1)]))),128))])]))),128))])])]),e("div",{class:"panel-footer"},[e("button",{class:"pop-btn primary-btn",onClick:xt},"保存规则")])],512),[[Y,w.value==="balance"]])])),m(" MODALS "),m(" Create/Edit Bot "),u.value?(a(),i("div",{key:2,class:"pop-modal-overlay",onClick:t[24]||(t[24]=G(l=>u.value=null,["self"]))},[e("div",De,[t[71]||(t[71]=e("div",{class:"comic-burst"},"★",-1)),e("h3",null,d(P.value==="create"?"创建节点":"编辑节点"),1),e("div",Fe,[e("label",We,[t[63]||(t[63]=p("名称",-1)),o(e("input",{"onUpdate:modelValue":t[16]||(t[16]=l=>u.value.name=l),type:"text",class:"pop-input",placeholder:"选填"},null,512),[[f,u.value.name]])]),e("label",ze,[t[64]||(t[64]=p("自身 ID",-1)),o(e("input",{"onUpdate:modelValue":t[17]||(t[17]=l=>u.value.selfId=l),type:"text",class:"pop-input"},null,512),[[f,u.value.selfId]])]),e("label",Ge,[t[65]||(t[65]=p("访问密钥",-1)),o(e("input",{"onUpdate:modelValue":t[18]||(t[18]=l=>u.value.token=l),type:"text",class:"pop-input"},null,512),[[f,u.value.token]])]),e("label",Xe,[t[67]||(t[67]=p("协议 ",-1)),o(e("select",{"onUpdate:modelValue":t[19]||(t[19]=l=>u.value.protocol=l),class:"pop-select"},[...t[66]||(t[66]=[e("option",{value:"ws-reverse"},"反向 WebSocket",-1),e("option",{value:"ws"},"ws",-1)])],512),[[Q,u.value.protocol]])]),e("label",He,[t[68]||(t[68]=p("终端地址 (ws)",-1)),o(e("input",{"onUpdate:modelValue":t[20]||(t[20]=l=>u.value.endpoint=l),type:"text",class:"pop-input"},null,512),[[f,u.value.endpoint]])]),e("label",qe,[t[69]||(t[69]=p("Path (反向 WebSocket)",-1)),o(e("input",{"onUpdate:modelValue":t[21]||(t[21]=l=>u.value.path=l),type:"text",class:"pop-input"},null,512),[[f,u.value.path]])]),e("label",Je,[o(e("input",{"onUpdate:modelValue":t[22]||(t[22]=l=>u.value.enabled=l),type:"checkbox",class:"pop-check"},null,512),[[z,u.value.enabled]]),t[70]||(t[70]=e("span",null,"已启用",-1))])]),e("div",Ke,[e("button",{class:"pop-btn primary-btn",onClick:dt},"保存"),e("button",{class:"pop-btn",onClick:t[23]||(t[23]=l=>u.value=null)},"取消")])])])):m("v-if",true),m(" Profile Modal "),C.value?(a(),i("div",{key:3,class:"pop-modal-overlay",onClick:t[27]||(t[27]=G(l=>C.value=null,["self"]))},[e("div",Qe,[t[73]||(t[73]=e("h3",null,"修改昵称",-1)),e("p",Ye,d(C.value.selfId),1),e("label",Ze,[t[72]||(t[72]=p("昵称",-1)),o(e("input",{"onUpdate:modelValue":t[25]||(t[25]=l=>j.value=l),type:"text",class:"pop-input"},null,512),[[f,j.value]])]),e("div",tl,[e("button",{class:"pop-btn primary-btn",onClick:mt},"保存"),e("button",{class:"pop-btn",onClick:t[26]||(t[26]=l=>C.value=null)},"取消")])])])):m("v-if",true),m(" Avatar Modal "),I.value?(a(),i("div",{key:4,class:"pop-modal-overlay",onClick:t[29]||(t[29]=G(l=>I.value=null,["self"]))},[e("div",el,[t[75]||(t[75]=e("h3",null,"修改头像",-1)),e("p",ll,d(I.value.selfId),1),e("label",sl,[t[74]||(t[74]=p(" 选择图片文件 ",-1)),e("input",{type:"file",accept:"image/*",class:"pop-file-input",onChange:yt},null,32)]),e("div",nl,[e("button",{class:"pop-btn primary-btn",onClick:kt},"保存"),e("button",{class:"pop-btn",onClick:t[28]||(t[28]=l=>I.value=null)},"取消")])])])):m("v-if",true),m(" List Editor Modal "),k.value?(a(),i("div",{key:5,class:"pop-modal-overlay",onClick:t[32]||(t[32]=G(l=>k.value=null,["self"]))},[e("div",ol,[t[76]||(t[76]=e("div",{class:"comic-burst",style:{background:"var(--pop-secondary)",color:"var(--pop-text)"}},"✎",-1)),e("h3",null,d(tt.value),1),t[77]||(t[77]=e("p",{class:"modal-sub"},"每行输入一个群号(仅保留数字)",-1)),o(e("textarea",{"onUpdate:modelValue":t[30]||(t[30]=l=>M.value=l),rows:"10",class:"pop-textarea",style:{width:"100%"}},null,512),[[f,M.value]]),e("div",al,[e("button",{class:"pop-btn primary-btn",onClick:et},"确认保存"),e("button",{class:"pop-btn",onClick:t[31]||(t[31]=l=>k.value=null)},"取消")])])])):m("v-if",true),m(" Toast "),h.show?(a(),i("div",{key:6,class:O(["pop-toast comic-panel",h.type])},[h.type==="success"?(a(),i("span",il,"✓")):(a(),i("span",ul,"✕")),p(" "+d(h.message),1)],2)):m("v-if",true)])]),_:1})}}}),Z=(V,_)=>{const w=V.__vccOpts||V;for(const[B,y]of _)w[B]=y;return w},dl=Z(pl,[["__scopeId","data-v-6479fe79"]]),rl={},cl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"};function vl(V,_){return a(),i("svg",cl,[..._[0]||(_[0]=[e("rect",{x:"2",y:"4",width:"20",height:"18",rx:"3"},null,-1),e("circle",{cx:"8",cy:"13",r:"2.5"},null,-1),e("circle",{cx:"16",cy:"13",r:"2.5"},null,-1)])])}const bl=Z(rl,[["render",vl]]);wt.register("activity:onebot-multi",bl);const yl=V=>{V.page({name:"OneBot Multi",path:"/onebot-multi",component:dl,icon:"activity:onebot-multi",order:600})};export{yl as default};
7
+ `),T.value=Object.entries(v.botMaxLoad||{}).map(([s,t])=>({botId:s,maxLoad:Number(t)||0})),M.value=Object.entries(v.channelBotPriority||{}).map(([s,t])=>({channelId:s,botIds:Array.isArray(t)?[...t]:[]}))}function nt(){T.value.push({botId:"",maxLoad:0})}function ot(s){T.value.splice(s,1)}function at(){M.value.push({channelId:"",botIds:[]})}function it(s){M.value.splice(s,1)}async function g(){if(!H){H=true;try{const s=await w("onebot-multi/state");V.value=(s==null?void 0:s.bots)||[],Object.assign(y,(s==null?void 0:s.runtime)||{}),Object.assign(v,(s==null?void 0:s.loadBalance)||{}),st()}catch(s){c("error",(s==null?void 0:s.message)||"刷新失败")}finally{H=false}}}function ut(){P.value="create",X.value="",u.value={token:"",protocol:"ws-reverse",endpoint:"",path:"/onebot",name:"",enabled:true}}function pt(s){P.value="edit",X.value=s.selfId,u.value={...s}}async function dt(){if(u.value)try{P.value==="create"?await w("onebot-multi/bots/create",u.value):await w("onebot-multi/bots/update",{oldSelfId:X.value,bot:u.value}),u.value=null,await g(),c("success","保存成功")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}async function rt(s){if(confirm(`确认删除 Bot ${s.selfId} 吗?`))try{await w("onebot-multi/bots/delete",{selfId:s.selfId}),await g(),c("success","删除成功")}catch(t){c("error",(t==null?void 0:t.message)||"删除失败")}}async function ct(s){try{await w("onebot-multi/bots/toggle",{selfId:s.selfId}),await g(),c("success","状态已更新")}catch(t){c("error",(t==null?void 0:t.message)||"更新失败")}}async function vt(s){try{await w("onebot-multi/bots/restart",{selfId:s.selfId}),await g(),c("success","重启已触发")}catch(t){c("error",(t==null?void 0:t.message)||"重启失败")}}function bt(s){I.value=s,j.value=s.nickname||""}async function mt(){if(I.value)try{const s=await w("onebot-multi/bots/profile",{selfId:I.value.selfId,nickname:j.value});if(!(s!=null&&s.success))throw new Error((s==null?void 0:s.error)||"保存失败");I.value=null,await g(),c("success","昵称已更新")}catch(s){c("error",(s==null?void 0:s.message)||"更新失败")}}function ft(s){h.value=s,S.value=""}function yt(s){var r;const x=(r=s.target.files)==null?void 0:r[0];if(!x){S.value="";return}const l=new FileReader;l.onload=n=>{var W;S.value=(W=n.target)==null?void 0:W.result},l.readAsDataURL(x)}async function kt(){if(!h.value||!S.value.trim()){c("error","请先选择图片文件");return}try{const s=await w("onebot-multi/bots/avatar",{selfId:h.value.selfId,file:S.value});if(!(s!=null&&s.success))throw new Error((s==null?void 0:s.error)||"保存失败");h.value=null,c("success","头像已更新")}catch(s){c("error",(s==null?void 0:s.message)||"更新失败")}}async function gt(){try{await w("onebot-multi/settings/runtime/update",{...y}),await g(),c("success","运行时设置已保存")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}async function xt(){try{const s={};for(const l of T.value){const r=l.botId.trim();if(!r)continue;const n=Math.max(0,Number(l.maxLoad||0));s[r]=n}const t={};for(const l of M.value){const r=l.channelId.trim();if(!r)continue;const n=(l.botIds||[]).filter(Boolean);n.length>0&&(t[r]=n)}const x={...v,channelBlacklist:F(L.value),channelWhitelist:F(E.value),priorityChannels:F(A.value),botMaxLoad:s,channelBotPriority:t};await w("onebot-multi/settings/load-balance/update",x),await g(),c("success","负载均衡设置已保存")}catch(s){c("error",(s==null?void 0:s.message)||"保存失败")}}return ht(async()=>{await g(),B.value=false,D=setInterval(()=>{g()},5e3)}),_t(()=>{D&&(clearInterval(D),D=null)}),(s,t)=>{const x=Bt("k-layout");return a(),Vt(x,null,{default:Ut(()=>[e("div",Tt,[B.value?(a(),i("div",Mt,[...t[33]||(t[33]=[e("div",{class:"comic-text"},"LOADING...",-1)])])):(a(),i("div",$t,[m(" HEADER "),e("header",Lt,[t[34]||(t[34]=e("div",{class:"brand"},[e("div",{class:"logo"},"✦"),e("div",{class:"title-box"},[e("h1",null,"ONEBOT 控制中心"),e("p",null,"实例管理与负载分发路由")])],-1)),e("nav",Et,[e("button",{class:O(["pop-btn",{active:C.value==="bots"}]),onClick:t[0]||(t[0]=l=>C.value="bots")},"Bot 管理",2),e("button",{class:O(["pop-btn",{active:C.value==="balance"}]),onClick:t[1]||(t[1]=l=>C.value="balance")},"负载均衡",2),e("button",{class:"pop-btn action-btn",onClick:g},"刷新状态")])]),m(" BOTS TAB "),o(e("section",At,[e("div",{class:"panel-header"},[t[35]||(t[35]=e("div",{class:"panel-title"},[e("h2",null,"Bot 状态"),e("p",null,"查看与管理当前运行实例")],-1)),e("button",{class:"pop-btn primary-btn",onClick:ut},"新增节点")]),V.value.length===0?(a(),i("div",St,[...t[36]||(t[36]=[e("div",{class:"comic-speech"},"无可用实例。请点击“新增节点”以配置。",-1)])])):(a(),i("div",Ot,[(a(true),i(R,null,N(V.value,l=>(a(),i("article",{key:l.selfId,class:O(["bot-card",{disabled:l.enabled===false}])},[e("div",Rt,[e("img",{class:"bot-avatar",src:l.avatarUrl||"",alt:"avatar"},null,8,Nt),e("div",Pt,[e("div",jt,d(l.name||`Bot ${l.selfId}`),1),e("div",Dt,d(l.nickname||"未知")+" | "+d(l.protocol==="ws-reverse"?"反向 WebSocket":l.protocol||"反向 WebSocket"),1),e("div",Ft,d(l.selfId),1)]),e("div",{class:O(["status-badge",`status-${l.status||"offline"}`])},d(lt(l.status)),3)]),e("div",Wt,[e("div",zt,[t[37]||(t[37]=e("span",null,"群组",-1)),e("strong",null,d(l.groupCount??"-"),1)]),e("div",Gt,[t[38]||(t[38]=e("span",null,"好友",-1)),e("strong",null,d(l.friendCount??"-"),1)]),e("div",Xt,[t[39]||(t[39]=e("span",null,"收",-1)),e("strong",null,d(l.messageReceived??"-"),1)]),e("div",Ht,[t[40]||(t[40]=e("span",null,"发",-1)),e("strong",null,d(l.messageSent??"-"),1)])]),e("div",qt,[e("div",null,[t[41]||(t[41]=e("strong",null,"终端:",-1)),p(" "+d(l.endpoint||"-"),1)]),e("div",null,[t[42]||(t[42]=e("strong",null,"路径:",-1)),p(" "+d(l.path||"/onebot"),1)])]),e("div",Jt,[e("button",{class:"pop-btn mini",onClick:r=>pt(l)},"编辑",8,Kt),e("button",{class:"pop-btn mini",onClick:r=>ct(l)},d(l.enabled===false?"启用":"禁用"),9,Qt),e("button",{class:"pop-btn mini",onClick:r=>vt(l)},"重启",8,Yt),e("button",{class:"pop-btn mini",onClick:r=>bt(l)},"昵称",8,Zt),e("button",{class:"pop-btn mini",onClick:r=>ft(l)},"头像",8,te),e("button",{class:"pop-btn mini danger",onClick:r=>rt(l)},"删除",8,ee)])],2))),128))])),m(" MERGED RUNTIME SETTINGS "),t[49]||(t[49]=e("div",{class:"panel-header",style:{"margin-top":"40px"}},[e("div",{class:"panel-title"},[e("h2",null,"运行参数"),e("p",null,"调整核心连接与重试策略")])],-1)),e("div",le,[e("label",se,[t[43]||(t[43]=p(" 超时时间 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>y.responseTimeout=l),type:"number",class:"pop-input"},null,512),[[f,y.responseTimeout,void 0,{number:true}]])]),e("label",ne,[t[44]||(t[44]=p(" 心跳间隔 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>y.heartbeatInterval=l),type:"number",class:"pop-input"},null,512),[[f,y.heartbeatInterval,void 0,{number:true}]])]),e("label",oe,[t[45]||(t[45]=p(" 重试次数 ",-1)),o(e("input",{"onUpdate:modelValue":t[4]||(t[4]=l=>y.retryTimes=l),type:"number",class:"pop-input"},null,512),[[f,y.retryTimes,void 0,{number:true}]])]),e("label",ae,[t[46]||(t[46]=p(" 重试间隔 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>y.retryInterval=l),type:"number",class:"pop-input"},null,512),[[f,y.retryInterval,void 0,{number:true}]])]),e("label",ie,[t[47]||(t[47]=p(" 懒重试 (毫秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[6]||(t[6]=l=>y.retryLazy=l),type:"number",class:"pop-input"},null,512),[[f,y.retryLazy,void 0,{number:true}]])]),e("label",ue,[o(e("input",{"onUpdate:modelValue":t[7]||(t[7]=l=>y.advanced.splitMixedContent=l),type:"checkbox",class:"pop-check"},null,512),[[z,y.advanced.splitMixedContent]]),t[48]||(t[48]=e("span",null,"拆分混合内容",-1))])]),e("div",{class:"panel-footer"},[e("button",{class:"pop-btn primary-btn",onClick:gt},"保存配置")])],512),[[Y,C.value==="bots"]]),m(" LOAD BALANCE TAB "),o(e("section",pe,[t[62]||(t[62]=e("div",{class:"panel-header"},[e("div",{class:"panel-title"},[e("h2",null,"负载均衡"),e("p",null,"配置全局流量分发规则")])],-1)),e("div",de,[e("label",re,[o(e("input",{"onUpdate:modelValue":t[8]||(t[8]=l=>v.enabled=l),type:"checkbox",class:"pop-check"},null,512),[[z,v.enabled]]),t[50]||(t[50]=e("span",null,"启用负载均衡",-1))]),e("label",ce,[t[51]||(t[51]=p(" 均衡间隔 (秒) ",-1)),o(e("input",{"onUpdate:modelValue":t[9]||(t[9]=l=>v.balanceInterval=l),type:"number",class:"pop-input"},null,512),[[f,v.balanceInterval,void 0,{number:true}]])]),e("label",ve,[t[53]||(t[53]=p(" 过滤模式 ",-1)),o(e("select",{"onUpdate:modelValue":t[10]||(t[10]=l=>v.channelFilterMode=l),class:"pop-select"},[...t[52]||(t[52]=[e("option",{value:"blacklist"},"黑名单",-1),e("option",{value:"whitelist"},"白名单",-1)])],512),[[Q,v.channelFilterMode]])]),e("label",be,[t[54]||(t[54]=p(" 默认最大负载 (0=无限) ",-1)),o(e("input",{"onUpdate:modelValue":t[11]||(t[11]=l=>v.defaultMaxLoad=l),type:"number",class:"pop-input"},null,512),[[f,v.defaultMaxLoad,void 0,{number:true}]])]),e("label",me,[t[55]||(t[55]=p(" 未分配值 ",-1)),o(e("input",{"onUpdate:modelValue":t[12]||(t[12]=l=>v.unassignedValue=l),type:"text",class:"pop-input"},null,512),[[f,v.unassignedValue]])])]),e("div",fe,[e("div",ye,[t[56]||(t[56]=p(" 群黑名单 ",-1)),e("div",ke,[e("span",ge,"已配置 "+d(q(L.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[13]||(t[13]=l=>J("blacklist"))},"编辑")])]),e("div",xe,[t[57]||(t[57]=p(" 群白名单 ",-1)),e("div",we,[e("span",Ce,"已配置 "+d(q(E.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[14]||(t[14]=l=>J("whitelist"))},"编辑")])]),e("div",Ie,[t[58]||(t[58]=p(" 优先群聊 ",-1)),e("div",he,[e("span",_e,"已配置 "+d(q(A.value))+" 个群",1),e("button",{class:"pop-btn mini action-btn",onClick:t[15]||(t[15]=l=>J("priority"))},"编辑")])]),e("div",Be,[e("div",{class:"table-head"},[t[59]||(t[59]=e("span",null,"节点最大负载",-1)),e("button",{class:"pop-btn mini",onClick:nt},"添加行")]),e("div",Ve,[T.value.length===0?(a(),i("div",Ue,"暂无规则。")):m("v-if",true),(a(true),i(R,null,N(T.value,(l,r)=>(a(),i("div",{key:`max-${r}`,class:"editor-row"},[o(e("select",{"onUpdate:modelValue":n=>l.botId=n,class:"pop-select mini-input"},[t[60]||(t[60]=e("option",{disabled:"",value:""},"选择 Bot",-1)),(a(true),i(R,null,N(V.value,n=>(a(),i("option",{key:n.selfId,value:n.selfId},d(n.name||n.nickname||n.selfId),9,Me))),128))],8,Te),[[Q,l.botId]]),o(e("input",{"onUpdate:modelValue":n=>l.maxLoad=n,type:"number",min:"0",placeholder:"最大值",class:"pop-input mini-input"},null,8,$e),[[f,l.maxLoad,void 0,{number:true}]]),e("button",{class:"pop-btn mini danger",onClick:n=>ot(r)},"X",8,Le)]))),128))])]),e("div",Ee,[e("div",{class:"table-head"},[t[61]||(t[61]=e("span",null,"群聊专属节点",-1)),e("button",{class:"pop-btn mini",onClick:at},"添加行")]),e("div",Ae,[M.value.length===0?(a(),i("div",Se,"暂无规则。")):m("v-if",true),(a(true),i(R,null,N(M.value,(l,r)=>(a(),i("div",{key:`priority-${r}`,class:"editor-row",style:{display:"flex","flex-direction":"column"}},[e("div",Oe,[o(e("input",{"onUpdate:modelValue":n=>l.channelId=n,type:"text",placeholder:"群号",class:"pop-input mini-input",style:{flex:"1"}},null,8,Re),[[f,l.channelId]]),e("button",{class:"pop-btn mini danger",onClick:n=>it(r)},"X",8,Ne)]),e("div",Pe,[(a(true),i(R,null,N(V.value,n=>(a(),i("label",{key:n.selfId,class:"pop-checkbox mini-checkbox"},[o(e("input",{type:"checkbox",value:n.selfId,"onUpdate:modelValue":W=>l.botIds=W,class:"pop-check mini-check"},null,8,je),[[z,l.botIds]]),e("span",null,d(n.name||n.nickname||n.selfId),1)]))),128))])]))),128))])])]),e("div",{class:"panel-footer"},[e("button",{class:"pop-btn primary-btn",onClick:xt},"保存规则")])],512),[[Y,C.value==="balance"]])])),m(" MODALS "),m(" Create/Edit Bot "),u.value?(a(),i("div",{key:2,class:"pop-modal-overlay",onClick:t[24]||(t[24]=G(l=>u.value=null,["self"]))},[e("div",De,[t[71]||(t[71]=e("div",{class:"comic-burst"},"★",-1)),e("h3",null,d(P.value==="create"?"创建节点":"编辑节点"),1),e("div",Fe,[e("label",We,[t[63]||(t[63]=p("名称",-1)),o(e("input",{"onUpdate:modelValue":t[16]||(t[16]=l=>u.value.name=l),type:"text",class:"pop-input",placeholder:"选填"},null,512),[[f,u.value.name]])]),e("label",ze,[t[64]||(t[64]=p("自身 ID",-1)),o(e("input",{"onUpdate:modelValue":t[17]||(t[17]=l=>u.value.selfId=l),type:"text",class:"pop-input"},null,512),[[f,u.value.selfId]])]),e("label",Ge,[t[65]||(t[65]=p("访问密钥",-1)),o(e("input",{"onUpdate:modelValue":t[18]||(t[18]=l=>u.value.token=l),type:"text",class:"pop-input"},null,512),[[f,u.value.token]])]),e("label",Xe,[t[67]||(t[67]=p("协议 ",-1)),o(e("select",{"onUpdate:modelValue":t[19]||(t[19]=l=>u.value.protocol=l),class:"pop-select"},[...t[66]||(t[66]=[e("option",{value:"ws-reverse"},"反向 WebSocket",-1),e("option",{value:"ws"},"ws",-1)])],512),[[Q,u.value.protocol]])]),e("label",He,[t[68]||(t[68]=p("终端地址 (ws)",-1)),o(e("input",{"onUpdate:modelValue":t[20]||(t[20]=l=>u.value.endpoint=l),type:"text",class:"pop-input"},null,512),[[f,u.value.endpoint]])]),e("label",qe,[t[69]||(t[69]=p("Path (反向 WebSocket)",-1)),o(e("input",{"onUpdate:modelValue":t[21]||(t[21]=l=>u.value.path=l),type:"text",class:"pop-input"},null,512),[[f,u.value.path]])]),e("label",Je,[o(e("input",{"onUpdate:modelValue":t[22]||(t[22]=l=>u.value.enabled=l),type:"checkbox",class:"pop-check"},null,512),[[z,u.value.enabled]]),t[70]||(t[70]=e("span",null,"已启用",-1))])]),e("div",Ke,[e("button",{class:"pop-btn primary-btn",onClick:dt},"保存"),e("button",{class:"pop-btn",onClick:t[23]||(t[23]=l=>u.value=null)},"取消")])])])):m("v-if",true),m(" Profile Modal "),I.value?(a(),i("div",{key:3,class:"pop-modal-overlay",onClick:t[27]||(t[27]=G(l=>I.value=null,["self"]))},[e("div",Qe,[t[73]||(t[73]=e("h3",null,"修改昵称",-1)),e("p",Ye,d(I.value.selfId),1),e("label",Ze,[t[72]||(t[72]=p("昵称",-1)),o(e("input",{"onUpdate:modelValue":t[25]||(t[25]=l=>j.value=l),type:"text",class:"pop-input"},null,512),[[f,j.value]])]),e("div",tl,[e("button",{class:"pop-btn primary-btn",onClick:mt},"保存"),e("button",{class:"pop-btn",onClick:t[26]||(t[26]=l=>I.value=null)},"取消")])])])):m("v-if",true),m(" Avatar Modal "),h.value?(a(),i("div",{key:4,class:"pop-modal-overlay",onClick:t[29]||(t[29]=G(l=>h.value=null,["self"]))},[e("div",el,[t[75]||(t[75]=e("h3",null,"修改头像",-1)),e("p",ll,d(h.value.selfId),1),e("label",sl,[t[74]||(t[74]=p(" 选择图片文件 ",-1)),e("input",{type:"file",accept:"image/*",class:"pop-file-input",onChange:yt},null,32)]),e("div",nl,[e("button",{class:"pop-btn primary-btn",onClick:kt},"保存"),e("button",{class:"pop-btn",onClick:t[28]||(t[28]=l=>h.value=null)},"取消")])])])):m("v-if",true),m(" List Editor Modal "),k.value?(a(),i("div",{key:5,class:"pop-modal-overlay",onClick:t[32]||(t[32]=G(l=>k.value=null,["self"]))},[e("div",ol,[t[76]||(t[76]=e("div",{class:"comic-burst",style:{background:"var(--pop-secondary)",color:"var(--pop-text)"}},"✎",-1)),e("h3",null,d(tt.value),1),t[77]||(t[77]=e("p",{class:"modal-sub"},"每行输入一个群号(仅保留数字)",-1)),o(e("textarea",{"onUpdate:modelValue":t[30]||(t[30]=l=>$.value=l),rows:"10",class:"pop-textarea",style:{width:"100%"}},null,512),[[f,$.value]]),e("div",al,[e("button",{class:"pop-btn primary-btn",onClick:et},"确认保存"),e("button",{class:"pop-btn",onClick:t[31]||(t[31]=l=>k.value=null)},"取消")])])])):m("v-if",true),m(" Toast "),_.show?(a(),i("div",{key:6,class:O(["pop-toast comic-panel",_.type])},[_.type==="success"?(a(),i("span",il,"✓")):(a(),i("span",ul,"✕")),p(" "+d(_.message),1)],2)):m("v-if",true)])]),_:1})}}}),Z=(U,B)=>{const C=U.__vccOpts||U;for(const[V,y]of B)C[V]=y;return C},dl=Z(pl,[["__scopeId","data-v-3a32f70e"]]),rl={},cl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"};function vl(U,B){return a(),i("svg",cl,[...B[0]||(B[0]=[e("rect",{x:"2",y:"4",width:"20",height:"18",rx:"3"},null,-1),e("circle",{cx:"8",cy:"13",r:"2.5"},null,-1),e("circle",{cx:"16",cy:"13",r:"2.5"},null,-1)])])}const bl=Z(rl,[["render",vl]]);wt.register("activity:onebot-multi",bl);const yl=U=>{U.page({name:"OneBot Multi",path:"/onebot-multi",component:dl,icon:"activity:onebot-multi",order:600})};export{yl as default};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- [data-v-6479fe79] .k-layout,[data-v-6479fe79] .k-layout__main{background:transparent!important;padding:0!important;margin:0!important;height:100%;position:relative}.pop-wrapper[data-v-6479fe79]{--pop-bg: #fffbeb;--pop-text: #6b5243;--pop-border: 3px solid var(--pop-text);--pop-shadow-color: var(--pop-text);--pop-panel: #ffffff;--pop-primary: #ff9a9e;--pop-secondary: #a1c4fd;--pop-success: #b2fba5;--pop-danger: #ffb3ba;--pop-dot: rgba(107, 82, 67, .05);width:100%;height:100%;box-sizing:border-box;color:var(--pop-text);font-family:Nunito,Varela Round,PingFang SC,Microsoft YaHei,sans-serif;background-color:var(--pop-bg);background-image:radial-gradient(var(--pop-dot) 15%,transparent 16%),radial-gradient(var(--pop-dot) 15%,transparent 16%);background-size:24px 24px;background-position:0 0,12px 12px;position:absolute;top:0;left:0;right:0;bottom:0;z-index:0;overflow-y:auto;padding:24px;font-weight:800}.pop-wrapper[data-v-6479fe79] *{box-sizing:border-box}.comic-panel[data-v-6479fe79]{background:var(--pop-panel);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);border-radius:16px}.pop-loading[data-v-6479fe79]{display:flex;justify-content:center;align-items:center;height:60vh}.comic-text[data-v-6479fe79]{font-size:4rem;color:#fff;text-shadow:2px 2px 0 var(--pop-text),-1px -1px 0 var(--pop-text),1px -1px 0 var(--pop-text),-1px 1px 0 var(--pop-text),1px 1px 0 var(--pop-text);transform:rotate(-2deg);animation:pulse-6479fe79 1s infinite alternate}@keyframes pulse-6479fe79{0%{transform:rotate(-5deg) scale(1)}to{transform:rotate(-5deg) scale(1.1)}}.pop-container[data-v-6479fe79]{max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:24px}.pop-header[data-v-6479fe79]{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;background:var(--pop-secondary);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);padding:20px 24px;border-radius:16px;position:relative;overflow:hidden}.pop-header[data-v-6479fe79]:before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background-image:repeating-linear-gradient(45deg,transparent,transparent 10px,rgba(255,255,255,.2) 10px,rgba(255,255,255,.2) 20px);z-index:0}.pop-header[data-v-6479fe79]>*{position:relative;z-index:1}.brand[data-v-6479fe79]{display:flex;align-items:center;gap:16px}.logo[data-v-6479fe79]{font-size:42px;background:var(--pop-bg);width:72px;height:72px;border-radius:50%;border:var(--pop-border);display:flex;align-items:center;justify-content:center;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:rotate(-5deg)}.title-box h1[data-v-6479fe79]{margin:0;font-size:36px;font-weight:900;color:#fff;text-shadow:2px 2px 0 var(--pop-text),-1px -1px 0 var(--pop-text),1px -1px 0 var(--pop-text),-1px 1px 0 var(--pop-text),1px 1px 0 var(--pop-text);letter-spacing:2px;text-transform:uppercase}.title-box p[data-v-6479fe79]{margin:4px 0 0;background:var(--pop-text);color:#fff;display:inline-block;padding:4px 8px;font-size:14px;transform:skew(-5deg);text-transform:uppercase}.pop-tabs[data-v-6479fe79]{display:flex;gap:12px;flex-wrap:wrap}.pop-btn[data-v-6479fe79]{background:#fff;color:var(--pop-text);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);padding:10px 20px;font-size:16px;font-family:inherit;font-weight:900;cursor:pointer;border-radius:16px;transition:all .1s ease;position:relative;text-transform:uppercase}.pop-btn[data-v-6479fe79]:hover{transform:translate(-2px,-2px);box-shadow:4px 4px 0 var(--pop-shadow-color)}.pop-btn[data-v-6479fe79]:active{transform:translate(4px,4px);box-shadow:0 0 0 var(--pop-shadow-color)}.pop-btn.active[data-v-6479fe79]{background:var(--pop-primary);color:#fff}.pop-btn.primary-btn[data-v-6479fe79]{background:var(--pop-primary);color:#fff;font-size:18px}.pop-btn.action-btn[data-v-6479fe79]{background:#ffb347;color:#fff}.pop-btn.mini[data-v-6479fe79]{padding:6px 12px;font-size:13px;box-shadow:2px 2px 0 var(--pop-shadow-color);border-width:2px}.pop-btn.mini[data-v-6479fe79]:hover{transform:translate(-1px,-1px);box-shadow:4px 4px 0 var(--pop-shadow-color)}.pop-btn.mini[data-v-6479fe79]:active{transform:translate(3px,3px);box-shadow:0 0 0 var(--pop-shadow-color)}.pop-btn.danger[data-v-6479fe79]{background:var(--pop-danger);color:#fff}.pop-panel[data-v-6479fe79]{background:var(--pop-panel);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);border-radius:16px;padding:24px;position:relative}.panel-header[data-v-6479fe79]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:24px;border-bottom:3px solid var(--pop-text);padding-bottom:16px}.panel-title h2[data-v-6479fe79]{margin:0;font-size:28px;color:var(--pop-primary);text-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.panel-title p[data-v-6479fe79]{margin:4px 0 0;font-size:16px;font-weight:700;text-transform:uppercase}.bot-grid[data-v-6479fe79]{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:20px}.bot-card[data-v-6479fe79]{border:var(--pop-border);border-radius:16px;background:#fff;padding:16px;box-shadow:4px 4px 0 var(--pop-shadow-color);transition:transform .2s,box-shadow .2s;position:relative;overflow:hidden}.bot-card[data-v-6479fe79]:before{content:"";position:absolute;top:0;right:0;width:40px;height:40px;background:var(--pop-bg);border-bottom-left-radius:20px;border-left:var(--pop-border);border-bottom:var(--pop-border)}.bot-card.disabled[data-v-6479fe79]{background:#e5e7eb;opacity:.8}.bot-card.disabled .bot-avatar[data-v-6479fe79]{filter:grayscale(1)}.bot-card[data-v-6479fe79]:hover{transform:translate(-4px,-4px);box-shadow:6px 6px 0 var(--pop-shadow-color)}.bot-header[data-v-6479fe79]{display:flex;align-items:center;gap:12px;margin-bottom:16px}.bot-avatar[data-v-6479fe79]{width:64px;height:64px;border-radius:50%;border:var(--pop-border);background:var(--pop-bg);object-fit:cover;box-shadow:2px 2px 0 var(--pop-text)}.bot-info[data-v-6479fe79]{flex:1;overflow:hidden}.bot-name[data-v-6479fe79]{font-size:20px;font-weight:900;margin-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;text-transform:uppercase}.bot-sub[data-v-6479fe79]{font-size:13px;color:var(--pop-text);background:var(--pop-bg);display:inline-block;padding:2px 6px;border:2px solid var(--pop-text);border-radius:4px;margin-bottom:4px}.bot-id[data-v-6479fe79]{font-family:Courier New,Courier,monospace;font-size:12px;font-weight:700}.status-badge[data-v-6479fe79]{border:3px solid var(--pop-text);border-radius:16px;padding:4px 10px;font-size:14px;font-weight:900;box-shadow:2px 2px 0 var(--pop-text);transform:rotate(2deg);text-transform:uppercase}.status-online[data-v-6479fe79]{background:var(--pop-success);color:var(--pop-text)}.status-offline[data-v-6479fe79]{background:var(--pop-danger);color:#fff}.status-connecting[data-v-6479fe79]{background:var(--pop-bg);color:var(--pop-text)}.bot-stats[data-v-6479fe79]{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-bottom:16px}.stat-box[data-v-6479fe79]{display:flex;justify-content:space-between;padding:6px 10px;border:2px solid var(--pop-text);border-radius:10px;background:#f8f9fa;box-shadow:2px 2px 0 var(--pop-shadow-color)}.stat-box span[data-v-6479fe79]{color:#666;font-size:12px;font-weight:700;text-transform:uppercase}.stat-box strong[data-v-6479fe79]{font-size:16px}.bot-meta[data-v-6479fe79]{background:var(--pop-secondary);border:2px solid var(--pop-text);padding:8px;border-radius:10px;font-size:12px;margin-bottom:16px;word-break:break-all}.bot-actions[data-v-6479fe79]{display:flex;flex-wrap:wrap;gap:8px}.form-grid[data-v-6479fe79]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:24px}.modal-grid[data-v-6479fe79]{grid-template-columns:1fr;gap:12px;max-height:50vh;overflow-y:auto;padding-right:8px}.pop-label[data-v-6479fe79]{display:flex;flex-direction:column;gap:8px;font-size:16px;font-weight:700;text-transform:uppercase}.pop-label.hidden[data-v-6479fe79]{display:none}.pop-input[data-v-6479fe79],.pop-select[data-v-6479fe79],.pop-textarea[data-v-6479fe79]{border:3px solid var(--pop-text);border-radius:16px;padding:10px 14px;font-size:15px;font-family:inherit;font-weight:700;background:#fff;color:var(--pop-text);box-shadow:inset 2px 2px #0000001a;transition:all .2s}.pop-input[data-v-6479fe79]:focus,.pop-select[data-v-6479fe79]:focus,.pop-textarea[data-v-6479fe79]:focus{outline:none;background:#fffde7;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:translate(-2px,-2px)}.pop-textarea[data-v-6479fe79]{resize:vertical}.pop-file-input[data-v-6479fe79]{border:3px solid var(--pop-text);border-radius:16px;padding:8px;font-size:14px;font-family:inherit;font-weight:700;background:#fff;color:var(--pop-text);box-shadow:inset 2px 2px #0000001a;transition:all .2s;cursor:pointer}.pop-file-input[data-v-6479fe79]:focus,.pop-file-input[data-v-6479fe79]:hover{outline:none;background:#fffde7;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:translate(-2px,-2px)}.pop-file-input[data-v-6479fe79]::file-selector-button{background:var(--pop-primary);color:#fff;border:2px solid var(--pop-text);border-radius:8px;padding:6px 12px;font-weight:700;cursor:pointer;margin-right:12px;text-transform:uppercase}.pop-checkbox[data-v-6479fe79]{flex-direction:row;align-items:center;cursor:pointer;background:var(--pop-bg);padding:10px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-shadow-color);transition:transform .1s}.pop-checkbox[data-v-6479fe79]:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--pop-shadow-color)}.pop-check[data-v-6479fe79]{width:20px;height:20px;accent-color:var(--pop-primary);border:2px solid var(--pop-text);cursor:pointer}.mini-checkbox[data-v-6479fe79]{padding:4px 8px;border-radius:8px;font-size:13px;gap:4px;border-width:2px}.mini-check[data-v-6479fe79]{width:14px;height:14px}.split-grid[data-v-6479fe79]{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:24px}.list-summary-box[data-v-6479fe79]{display:flex;align-items:center;justify-content:space-between;background:#fff;border:3px solid var(--pop-text);border-radius:12px;padding:8px 12px;box-shadow:2px 2px 0 var(--pop-shadow-color);margin-top:4px}.list-count[data-v-6479fe79]{font-size:14px;font-weight:900;color:var(--pop-primary)}.pop-table-editor[data-v-6479fe79]{border:3px dashed var(--pop-text);background:var(--pop-secondary);border-radius:16px;padding:16px;display:flex;flex-direction:column;gap:12px;position:relative}.pop-table-editor.full-width[data-v-6479fe79]{grid-column:1/-1;background:#ffb3ff}.table-head[data-v-6479fe79]{display:flex;justify-content:space-between;align-items:center;font-size:18px;font-weight:900;background:#fff;padding:6px 12px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.table-body[data-v-6479fe79]{display:flex;flex-direction:column;gap:8px;max-height:250px;overflow-y:auto;padding-right:8px}.empty-row[data-v-6479fe79]{background:#fff;padding:12px;text-align:center;border:3px solid var(--pop-text);border-radius:16px;font-weight:700;text-transform:uppercase}.editor-row[data-v-6479fe79]{display:grid;grid-template-columns:1fr 1fr auto;gap:8px;background:#fff;padding:8px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-text)}.editor-row.wide[data-v-6479fe79]{grid-template-columns:1fr 2fr auto}.mini-input[data-v-6479fe79]{padding:6px 10px;font-size:14px}.panel-footer[data-v-6479fe79]{margin-top:24px;padding-top:20px;border-top:3px solid var(--pop-text);display:flex;justify-content:flex-end}.pop-modal-overlay[data-v-6479fe79]{position:fixed;top:0;right:0;bottom:0;left:0;background:#6b524366;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000}.pop-modal[data-v-6479fe79]{width:min(600px,90vw);position:relative;padding:32px}.pop-modal h3[data-v-6479fe79]{font-size:32px;margin:0 0 8px;color:var(--pop-primary);text-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.modal-sub[data-v-6479fe79]{font-family:Courier New,Courier,monospace;background:var(--pop-bg);display:inline-block;padding:4px 8px;border:2px solid var(--pop-text);margin-bottom:20px;font-weight:700}.comic-burst[data-v-6479fe79]{position:absolute;top:-15px;right:-15px;background:var(--pop-bg);color:var(--pop-text);font-size:24px;font-weight:900;padding:10px;border:var(--pop-border);border-radius:50%;transform:rotate(5deg);box-shadow:4px 4px 0 var(--pop-shadow-color);animation:pop-6479fe79 .5s cubic-bezier(.175,.885,.32,1.275);text-transform:uppercase}@keyframes pop-6479fe79{0%{transform:scale(0) rotate(0)}to{transform:scale(1) rotate(15deg)}}.modal-actions[data-v-6479fe79]{display:flex;gap:12px;margin-top:24px;justify-content:flex-end}.pop-toast[data-v-6479fe79]{position:fixed;bottom:24px;left:50%;transform:translate(-50%);padding:12px 24px;font-size:20px;font-weight:900;z-index:1100;display:flex;align-items:center;gap:12px;animation:slideUp-6479fe79 .3s ease-out;text-transform:uppercase}.pop-toast.success[data-v-6479fe79]{background:var(--pop-success);color:var(--pop-text)}.pop-toast.error[data-v-6479fe79]{background:var(--pop-danger);color:#fff}@keyframes slideUp-6479fe79{0%{transform:translate(-50%,100%);opacity:0}to{transform:translate(-50%);opacity:1}}.empty-state[data-v-6479fe79]{display:flex;justify-content:center;padding:40px}.comic-speech[data-v-6479fe79]{position:relative;background:#fff;border:3px solid var(--pop-text);border-radius:16px;padding:20px 30px;font-size:24px;font-weight:700;box-shadow:4px 4px 0 var(--pop-shadow-color);text-transform:uppercase}.comic-speech[data-v-6479fe79]:after{display:none;content:"";position:absolute;bottom:-20px;left:30px;border-width:12px 12px 0 0;border-style:solid;border-color:#fff transparent transparent transparent}.comic-speech[data-v-6479fe79]:before{display:none;content:"";position:absolute;bottom:-26px;left:28px;border-width:14px 14px 0 0;border-style:solid;border-color:var(--pop-text) transparent transparent transparent;z-index:-1}[data-v-6479fe79]::-webkit-scrollbar{width:12px}[data-v-6479fe79]::-webkit-scrollbar-track{background:var(--pop-bg);border-left:3px solid var(--pop-text)}[data-v-6479fe79]::-webkit-scrollbar-thumb{background:var(--pop-primary);border:3px solid var(--pop-text);border-radius:0}@media (max-width: 960px){.split-grid[data-v-6479fe79]{grid-template-columns:1fr}}@media (max-width: 768px){.pop-wrapper[data-v-6479fe79]{padding:12px}.pop-header[data-v-6479fe79]{flex-direction:column;text-align:center}.pop-tabs[data-v-6479fe79]{justify-content:center;width:100%}.pop-btn[data-v-6479fe79]{flex:1;min-width:45%;text-align:center}.bot-actions .pop-btn[data-v-6479fe79]{flex:1;min-width:30%}.pop-modal[data-v-6479fe79]{padding:20px}.comic-speech[data-v-6479fe79]{font-size:18px}.bot-grid[data-v-6479fe79]{grid-template-columns:1fr}}
1
+ [data-v-3a32f70e] .k-layout,[data-v-3a32f70e] .k-layout__main{background:transparent!important;padding:0!important;margin:0!important;height:100%;position:relative}.pop-wrapper[data-v-3a32f70e]{--pop-bg: #fffbeb;--pop-text: #6b5243;--pop-border: 3px solid var(--pop-text);--pop-shadow-color: var(--pop-text);--pop-panel: #ffffff;--pop-primary: #ff9a9e;--pop-secondary: #a1c4fd;--pop-success: #b2fba5;--pop-danger: #ffb3ba;--pop-dot: rgba(107, 82, 67, .05);width:100%;height:100%;box-sizing:border-box;color:var(--pop-text);font-family:Nunito,Varela Round,PingFang SC,Microsoft YaHei,sans-serif;background-color:var(--pop-bg);background-image:radial-gradient(var(--pop-dot) 15%,transparent 16%),radial-gradient(var(--pop-dot) 15%,transparent 16%);background-size:24px 24px;background-position:0 0,12px 12px;position:absolute;top:0;left:0;right:0;bottom:0;z-index:0;overflow-y:auto;padding:24px;font-weight:800}.pop-wrapper[data-v-3a32f70e] *{box-sizing:border-box}.comic-panel[data-v-3a32f70e]{background:var(--pop-panel);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);border-radius:16px}.pop-loading[data-v-3a32f70e]{display:flex;justify-content:center;align-items:center;height:60vh}.comic-text[data-v-3a32f70e]{font-size:4rem;color:#fff;text-shadow:2px 2px 0 var(--pop-text),-1px -1px 0 var(--pop-text),1px -1px 0 var(--pop-text),-1px 1px 0 var(--pop-text),1px 1px 0 var(--pop-text);transform:rotate(-2deg);animation:pulse-3a32f70e 1s infinite alternate}@keyframes pulse-3a32f70e{0%{transform:rotate(-5deg) scale(1)}to{transform:rotate(-5deg) scale(1.1)}}.pop-container[data-v-3a32f70e]{max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:24px}.pop-header[data-v-3a32f70e]{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;background:var(--pop-secondary);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);padding:20px 24px;border-radius:16px;position:relative;overflow:hidden}.pop-header[data-v-3a32f70e]:before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background-image:repeating-linear-gradient(45deg,transparent,transparent 10px,rgba(255,255,255,.2) 10px,rgba(255,255,255,.2) 20px);z-index:0}.pop-header[data-v-3a32f70e]>*{position:relative;z-index:1}.brand[data-v-3a32f70e]{display:flex;align-items:center;gap:16px}.logo[data-v-3a32f70e]{font-size:42px;background:var(--pop-bg);width:72px;height:72px;border-radius:50%;border:var(--pop-border);display:flex;align-items:center;justify-content:center;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:rotate(-5deg)}.title-box h1[data-v-3a32f70e]{margin:0;font-size:36px;font-weight:900;color:#fff;text-shadow:2px 2px 0 var(--pop-text),-1px -1px 0 var(--pop-text),1px -1px 0 var(--pop-text),-1px 1px 0 var(--pop-text),1px 1px 0 var(--pop-text);letter-spacing:2px;text-transform:uppercase}.title-box p[data-v-3a32f70e]{margin:4px 0 0;background:var(--pop-text);color:#fff;display:inline-block;padding:4px 8px;font-size:14px;transform:skew(-5deg);text-transform:uppercase}.pop-tabs[data-v-3a32f70e]{display:flex;gap:12px;flex-wrap:wrap}.pop-btn[data-v-3a32f70e]{background:#fff;color:var(--pop-text);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);padding:10px 20px;font-size:16px;font-family:inherit;font-weight:900;cursor:pointer;border-radius:16px;transition:all .1s ease;position:relative;text-transform:uppercase}.pop-btn[data-v-3a32f70e]:hover{transform:translate(-2px,-2px);box-shadow:4px 4px 0 var(--pop-shadow-color)}.pop-btn[data-v-3a32f70e]:active{transform:translate(4px,4px);box-shadow:0 0 0 var(--pop-shadow-color)}.pop-btn.active[data-v-3a32f70e]{background:var(--pop-primary);color:#fff}.pop-btn.primary-btn[data-v-3a32f70e]{background:var(--pop-primary);color:#fff;font-size:18px}.pop-btn.action-btn[data-v-3a32f70e]{background:#ffb347;color:#fff}.pop-btn.mini[data-v-3a32f70e]{padding:6px 12px;font-size:13px;box-shadow:2px 2px 0 var(--pop-shadow-color);border-width:2px}.pop-btn.mini[data-v-3a32f70e]:hover{transform:translate(-1px,-1px);box-shadow:4px 4px 0 var(--pop-shadow-color)}.pop-btn.mini[data-v-3a32f70e]:active{transform:translate(3px,3px);box-shadow:0 0 0 var(--pop-shadow-color)}.pop-btn.danger[data-v-3a32f70e]{background:var(--pop-danger);color:#fff}.pop-panel[data-v-3a32f70e]{background:var(--pop-panel);border:var(--pop-border);box-shadow:4px 4px 0 var(--pop-shadow-color);border-radius:16px;padding:24px;position:relative}.panel-header[data-v-3a32f70e]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:24px;border-bottom:3px solid var(--pop-text);padding-bottom:16px}.panel-title h2[data-v-3a32f70e]{margin:0;font-size:28px;color:var(--pop-primary);text-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.panel-title p[data-v-3a32f70e]{margin:4px 0 0;font-size:16px;font-weight:700;text-transform:uppercase}.bot-grid[data-v-3a32f70e]{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:20px}.bot-card[data-v-3a32f70e]{border:var(--pop-border);border-radius:16px;background:#fff;padding:16px;box-shadow:4px 4px 0 var(--pop-shadow-color);transition:transform .2s,box-shadow .2s;position:relative;overflow:hidden}.bot-card[data-v-3a32f70e]:before{content:"";position:absolute;top:0;right:0;width:40px;height:40px;background:var(--pop-bg);border-bottom-left-radius:20px;border-left:var(--pop-border);border-bottom:var(--pop-border)}.bot-card.disabled[data-v-3a32f70e]{background:#e5e7eb;opacity:.8}.bot-card.disabled .bot-avatar[data-v-3a32f70e]{filter:grayscale(1)}.bot-card[data-v-3a32f70e]:hover{transform:translate(-4px,-4px);box-shadow:6px 6px 0 var(--pop-shadow-color)}.bot-header[data-v-3a32f70e]{display:flex;align-items:center;gap:12px;margin-bottom:16px}.bot-avatar[data-v-3a32f70e]{width:64px;height:64px;border-radius:50%;border:var(--pop-border);background:var(--pop-bg);object-fit:cover;box-shadow:2px 2px 0 var(--pop-text)}.bot-info[data-v-3a32f70e]{flex:1;overflow:hidden}.bot-name[data-v-3a32f70e]{font-size:20px;font-weight:900;margin-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;text-transform:uppercase}.bot-sub[data-v-3a32f70e]{font-size:13px;color:var(--pop-text);background:var(--pop-bg);display:inline-block;padding:2px 6px;border:2px solid var(--pop-text);border-radius:4px;margin-bottom:4px}.bot-id[data-v-3a32f70e]{font-family:Courier New,Courier,monospace;font-size:12px;font-weight:700}.status-badge[data-v-3a32f70e]{border:3px solid var(--pop-text);border-radius:16px;padding:4px 10px;font-size:14px;font-weight:900;box-shadow:2px 2px 0 var(--pop-text);transform:rotate(2deg);text-transform:uppercase}.status-online[data-v-3a32f70e]{background:var(--pop-success);color:var(--pop-text)}.status-offline[data-v-3a32f70e]{background:var(--pop-danger);color:#fff}.status-connecting[data-v-3a32f70e]{background:var(--pop-bg);color:var(--pop-text)}.bot-stats[data-v-3a32f70e]{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-bottom:16px}.stat-box[data-v-3a32f70e]{display:flex;justify-content:space-between;padding:6px 10px;border:2px solid var(--pop-text);border-radius:10px;background:#f8f9fa;box-shadow:2px 2px 0 var(--pop-shadow-color)}.stat-box span[data-v-3a32f70e]{color:#666;font-size:12px;font-weight:700;text-transform:uppercase}.stat-box strong[data-v-3a32f70e]{font-size:16px}.bot-meta[data-v-3a32f70e]{background:var(--pop-secondary);border:2px solid var(--pop-text);padding:8px;border-radius:10px;font-size:12px;margin-bottom:16px;word-break:break-all}.bot-actions[data-v-3a32f70e]{display:flex;flex-wrap:wrap;gap:8px}.form-grid[data-v-3a32f70e]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:24px}.modal-grid[data-v-3a32f70e]{grid-template-columns:1fr;gap:12px;max-height:50vh;overflow-y:auto;padding-right:8px}.pop-label[data-v-3a32f70e]{display:flex;flex-direction:column;gap:8px;font-size:16px;font-weight:700;text-transform:uppercase}.pop-label.hidden[data-v-3a32f70e]{display:none}.pop-input[data-v-3a32f70e],.pop-select[data-v-3a32f70e],.pop-textarea[data-v-3a32f70e]{border:3px solid var(--pop-text);border-radius:16px;padding:10px 14px;font-size:15px;font-family:inherit;font-weight:700;background:#fff;color:var(--pop-text);box-shadow:inset 2px 2px #0000001a;transition:all .2s}.pop-input[data-v-3a32f70e]:focus,.pop-select[data-v-3a32f70e]:focus,.pop-textarea[data-v-3a32f70e]:focus{outline:none;background:#fffde7;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:translate(-2px,-2px)}.pop-textarea[data-v-3a32f70e]{resize:vertical}.pop-file-input[data-v-3a32f70e]{border:3px solid var(--pop-text);border-radius:16px;padding:8px;font-size:14px;font-family:inherit;font-weight:700;background:#fff;color:var(--pop-text);box-shadow:inset 2px 2px #0000001a;transition:all .2s;cursor:pointer}.pop-file-input[data-v-3a32f70e]:focus,.pop-file-input[data-v-3a32f70e]:hover{outline:none;background:#fffde7;box-shadow:4px 4px 0 var(--pop-shadow-color);transform:translate(-2px,-2px)}.pop-file-input[data-v-3a32f70e]::file-selector-button{background:var(--pop-primary);color:#fff;border:2px solid var(--pop-text);border-radius:8px;padding:6px 12px;font-weight:700;cursor:pointer;margin-right:12px;text-transform:uppercase}.pop-checkbox[data-v-3a32f70e]{flex-direction:row;align-items:center;cursor:pointer;background:var(--pop-bg);padding:10px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-shadow-color);transition:transform .1s}.pop-checkbox[data-v-3a32f70e]:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--pop-shadow-color)}.pop-check[data-v-3a32f70e]{width:20px;height:20px;accent-color:var(--pop-primary);border:2px solid var(--pop-text);cursor:pointer}.mini-checkbox[data-v-3a32f70e]{padding:4px 8px;border-radius:8px;font-size:13px;gap:4px;border-width:2px}.mini-check[data-v-3a32f70e]{width:14px;height:14px}.split-grid[data-v-3a32f70e]{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:24px}.list-summary-box[data-v-3a32f70e]{display:flex;align-items:center;justify-content:space-between;background:#fff;border:3px solid var(--pop-text);border-radius:12px;padding:8px 12px;box-shadow:2px 2px 0 var(--pop-shadow-color);margin-top:4px}.list-count[data-v-3a32f70e]{font-size:14px;font-weight:900;color:var(--pop-primary)}.pop-table-editor[data-v-3a32f70e]{border:3px dashed var(--pop-text);background:var(--pop-secondary);border-radius:16px;padding:16px;display:flex;flex-direction:column;gap:12px;position:relative}.pop-table-editor.full-width[data-v-3a32f70e]{grid-column:1/-1;background:#ffb3ff}.table-head[data-v-3a32f70e]{display:flex;justify-content:space-between;align-items:center;font-size:18px;font-weight:900;background:#fff;padding:6px 12px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.table-body[data-v-3a32f70e]{display:flex;flex-direction:column;gap:8px;max-height:250px;overflow-y:auto;padding-right:8px}.empty-row[data-v-3a32f70e]{background:#fff;padding:12px;text-align:center;border:3px solid var(--pop-text);border-radius:16px;font-weight:700;text-transform:uppercase}.editor-row[data-v-3a32f70e]{display:grid;grid-template-columns:1fr 1fr auto;gap:8px;background:#fff;padding:8px;border:3px solid var(--pop-text);border-radius:16px;box-shadow:2px 2px 0 var(--pop-text)}.editor-row.wide[data-v-3a32f70e]{grid-template-columns:1fr 2fr auto}.mini-input[data-v-3a32f70e]{padding:6px 10px;font-size:14px}.panel-footer[data-v-3a32f70e]{margin-top:24px;padding-top:20px;border-top:3px solid var(--pop-text);display:flex;justify-content:flex-end}.pop-modal-overlay[data-v-3a32f70e]{position:fixed;top:0;right:0;bottom:0;left:0;background:#6b524366;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000}.pop-modal[data-v-3a32f70e]{width:min(600px,90vw);position:relative;padding:32px}.pop-modal h3[data-v-3a32f70e]{font-size:32px;margin:0 0 8px;color:var(--pop-primary);text-shadow:2px 2px 0 var(--pop-text);text-transform:uppercase}.modal-sub[data-v-3a32f70e]{font-family:Courier New,Courier,monospace;background:var(--pop-bg);display:inline-block;padding:4px 8px;border:2px solid var(--pop-text);margin-bottom:20px;font-weight:700}.comic-burst[data-v-3a32f70e]{position:absolute;top:-15px;right:-15px;background:var(--pop-bg);color:var(--pop-text);font-size:24px;font-weight:900;padding:10px;border:var(--pop-border);border-radius:50%;transform:rotate(5deg);box-shadow:4px 4px 0 var(--pop-shadow-color);animation:pop-3a32f70e .5s cubic-bezier(.175,.885,.32,1.275);text-transform:uppercase}@keyframes pop-3a32f70e{0%{transform:scale(0) rotate(0)}to{transform:scale(1) rotate(15deg)}}.modal-actions[data-v-3a32f70e]{display:flex;gap:12px;margin-top:24px;justify-content:flex-end}.pop-toast[data-v-3a32f70e]{position:fixed;bottom:24px;left:50%;transform:translate(-50%);padding:12px 24px;font-size:20px;font-weight:900;z-index:1100;display:flex;align-items:center;gap:12px;animation:slideUp-3a32f70e .3s ease-out;text-transform:uppercase}.pop-toast.success[data-v-3a32f70e]{background:var(--pop-success);color:var(--pop-text)}.pop-toast.error[data-v-3a32f70e]{background:var(--pop-danger);color:#fff}@keyframes slideUp-3a32f70e{0%{transform:translate(-50%,100%);opacity:0}to{transform:translate(-50%);opacity:1}}.empty-state[data-v-3a32f70e]{display:flex;justify-content:center;padding:40px}.comic-speech[data-v-3a32f70e]{position:relative;background:#fff;border:3px solid var(--pop-text);border-radius:16px;padding:20px 30px;font-size:24px;font-weight:700;box-shadow:4px 4px 0 var(--pop-shadow-color);text-transform:uppercase}.comic-speech[data-v-3a32f70e]:after{display:none;content:"";position:absolute;bottom:-20px;left:30px;border-width:12px 12px 0 0;border-style:solid;border-color:#fff transparent transparent transparent}.comic-speech[data-v-3a32f70e]:before{display:none;content:"";position:absolute;bottom:-26px;left:28px;border-width:14px 14px 0 0;border-style:solid;border-color:var(--pop-text) transparent transparent transparent;z-index:-1}[data-v-3a32f70e]::-webkit-scrollbar{width:12px}[data-v-3a32f70e]::-webkit-scrollbar-track{background:var(--pop-bg);border-left:3px solid var(--pop-text)}[data-v-3a32f70e]::-webkit-scrollbar-thumb{background:var(--pop-primary);border:3px solid var(--pop-text);border-radius:0}@media (max-width: 960px){.split-grid[data-v-3a32f70e]{grid-template-columns:1fr}}@media (max-width: 768px){.pop-wrapper[data-v-3a32f70e]{padding:12px}.pop-header[data-v-3a32f70e]{flex-direction:column;text-align:center}.pop-tabs[data-v-3a32f70e]{justify-content:center;width:100%}.pop-btn[data-v-3a32f70e]{flex:1;min-width:45%;text-align:center}.bot-actions .pop-btn[data-v-3a32f70e]{flex:1;min-width:30%}.pop-modal[data-v-3a32f70e]{padding:20px}.comic-speech[data-v-3a32f70e]{font-size:18px}.bot-grid[data-v-3a32f70e]{grid-template-columns:1fr}}
@@ -0,0 +1,19 @@
1
+ import { Context } from 'koishi';
2
+ import { ConfigStore } from './config-store';
3
+ import { LoadBalancer } from './load-balancer';
4
+ export declare class CsvSyncManager {
5
+ private ctx;
6
+ private configStore;
7
+ private loadBalancer;
8
+ private logger;
9
+ private csvPath;
10
+ constructor(ctx: Context, configStore: ConfigStore, loadBalancer: LoadBalancer);
11
+ /**
12
+ * 手动触发同步 CSV 到 PriorityChannels
13
+ */
14
+ syncFromCsv(): {
15
+ success: boolean;
16
+ count: number;
17
+ error?: string;
18
+ };
19
+ }
package/lib/index.d.ts CHANGED
@@ -70,7 +70,7 @@ declare module 'koishi' {
70
70
  'onebot-multi/bot-offline'(bot: OneBotBot): void;
71
71
  }
72
72
  }
73
- declare module '@satorijs/core' {
73
+ declare module 'koishi' {
74
74
  interface Session {
75
75
  onebot?: OneBot.Payload & OneBot.Internal;
76
76
  }
package/lib/index.js CHANGED
@@ -146,7 +146,7 @@ var Internal = class _Internal {
146
146
  static prepareArg(name2, params, args) {
147
147
  const fixedArg = Object.fromEntries(params.map((name3, index) => [name3, args[index]]));
148
148
  for (const key in fixedArg) {
149
- if (!name2.includes("guild") && key.endsWith("_id")) {
149
+ if (!name2.includes("guild") && key.endsWith("_id") && key !== "message_id") {
150
150
  const value = +fixedArg[key];
151
151
  if (Math.abs(value) < 4294967296) {
152
152
  fixedArg[key] = value;
@@ -350,9 +350,15 @@ async function adaptMessage(bot, data, message = {}, payload = message) {
350
350
  const [guildId, channelId] = decodeGuildChannelId(data);
351
351
  if (message.elements[0]?.type === "reply") {
352
352
  const reply = message.elements.shift();
353
- message.quote = await bot.getMessage(channelId, reply.attrs.id).catch((error) => {
354
- bot.logger.warn(error);
355
- return void 0;
353
+ const replyId = String(reply.attrs.id);
354
+ message.quote = await bot.getMessage(channelId, replyId).catch((error) => {
355
+ bot.logger.warn(
356
+ "failed to fetch quoted message %s in %s: %s",
357
+ replyId,
358
+ channelId,
359
+ error?.message || error
360
+ );
361
+ return { id: replyId };
356
362
  });
357
363
  }
358
364
  message.content = message.elements.join("");
@@ -496,6 +502,7 @@ async function adaptSession(bot, data) {
496
502
  if (session.subtype === "poke") {
497
503
  session.channelId ||= `private:${session.userId}`;
498
504
  } else if (session.subtype === "honor") {
505
+ ;
499
506
  session.subsubtype = (0, import_koishi2.hyphenate)(data.honor_type);
500
507
  }
501
508
  break;
@@ -2128,7 +2135,7 @@ var ConfigStore = class {
2128
2135
  };
2129
2136
 
2130
2137
  // src/index.ts
2131
- var Config = import_koishi9.Schema.object({}).description("配置已迁移到 data/adapter-onebot-multi/config.yaml");
2138
+ var Config = import_koishi9.Schema.object({}).description("在侧边栏webui使用,配置文件在data/adapter-onebot-multi/config.yaml");
2132
2139
  var name = "adapter-onebot-multi";
2133
2140
  var inject = {
2134
2141
  required: ["server", "database"],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-adapter-onebot-multi",
3
3
  "description": "奶龙bot定制版onebot适配器,支持自动负载均衡与黑白名单,控制台侧边栏管理",
4
- "version": "1.0.4",
4
+ "version": "1.0.6",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -39,13 +39,14 @@
39
39
  },
40
40
  "peerDependencies": {
41
41
  "@koishijs/plugin-console": "^5.30.0",
42
- "koishi": "^4.18.6"
42
+ "koishi": "*"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@koishijs/client": "^5.30.0",
46
46
  "@koishijs/plugin-console": "^5.30.8",
47
47
  "@koishijs/plugin-server": "^3.2.4",
48
- "@types/node": "^22.7.5"
48
+ "@types/node": "^22.7.5",
49
+ "koishi": "^4.18.11"
49
50
  },
50
51
  "dependencies": {
51
52
  "qface": "^1.4.1",