koishi-plugin-filter-pro 1.0.2 → 1.0.4

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 +1 @@
1
- let e=require(`@koishijs/client`),t=require(`vue`);const n=[`disabled`],r={class:`label`},i=[`onClick`];var a=(0,t.defineComponent)({__name:`fp-select`,props:{modelValue:{type:String,required:!0},options:{type:Array,required:!0},placeholder:{type:String,required:!1},disabled:{type:Boolean,required:!1}},emits:[`update:modelValue`],setup(e,{emit:a}){let o=e,s=a,c=(0,t.ref)(null),l=(0,t.ref)(!1),u=(0,t.ref)({left:0,top:0,width:0}),d=(0,t.computed)(()=>o.options.find(e=>e.value===o.modelValue)?.label||``);function f(){o.disabled||(l.value=!l.value,l.value&&h())}function p(e){s(`update:modelValue`,e),l.value=!1}function m(e){let t=e.target;!c.value||!t||c.value.contains(t)||(l.value=!1)}function h(){if(!c.value)return;let e=c.value.getBoundingClientRect(),t=window.innerHeight-e.bottom-6,n=e.top-6,r=t<180&&n>t,i=Math.min(240,r?n:t);u.value={left:e.left,width:e.width,top:r?Math.max(8,e.top-Math.max(120,i)-6):e.bottom+6}}function g(){l.value&&h()}return(0,t.watch)(l,e=>{e&&h()}),(0,t.onMounted)(()=>{document.addEventListener(`click`,m),window.addEventListener(`resize`,g),window.addEventListener(`scroll`,g,!0)}),(0,t.onBeforeUnmount)(()=>{document.removeEventListener(`click`,m),window.removeEventListener(`resize`,g),window.removeEventListener(`scroll`,g,!0)}),(a,o)=>((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,null,[(0,t.createElementVNode)(`div`,{class:`fp-select`,ref_key:`root`,ref:c},[(0,t.createElementVNode)(`button`,{type:`button`,class:(0,t.normalizeClass)([`trigger`,{disabled:e.disabled}]),onClick:f,disabled:e.disabled},[(0,t.createElementVNode)(`span`,r,(0,t.toDisplayString)(d.value||e.placeholder),1),o[0]||=(0,t.createElementVNode)(`span`,{class:`arrow`},`▾`,-1)],10,n)],512),((0,t.openBlock)(),(0,t.createBlock)(t.Teleport,{to:`body`},[l.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:`menu`,style:(0,t.normalizeStyle)({left:`${u.value.left}px`,top:`${u.value.top}px`,width:`${u.value.width}px`})},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.options,n=>((0,t.openBlock)(),(0,t.createElementBlock)(`button`,{key:n.value,type:`button`,class:(0,t.normalizeClass)([`item`,{active:n.value===e.modelValue}]),onClick:e=>p(n.value)},(0,t.toDisplayString)(n.label),11,i))),128))],4)):(0,t.createCommentVNode)(`v-if`,!0)]))],64))}}),o=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},s=o(a,[[`__scopeId`,`data-v-4a262c3e`]]);const c={class:`cf-editor`},l={class:`rows-section`},u={key:0,class:`connector-sep`},d=[`title`,`onClick`],f={class:`cf-row`},p=[`onUpdate:modelValue`],m={key:1,class:`bool-toggle`},h=[`checked`,`onChange`],g={class:`bool-label`},_=[`onUpdate:modelValue`,`onInput`],v=[`disabled`,`onClick`],y={class:`add-section`},b={class:`preview-section`},x={class:`preview-code`};var S=o((0,t.defineComponent)({name:`ExprEditor`,__name:`expr-editor`,props:{modelValue:{type:Object,required:!0}},emits:[`update:modelValue`],setup(e,{emit:n}){let r=0,i=()=>String(++r),a=[{value:`guildId`,label:`群组 ID(guildId)`},{value:`channelId`,label:`频道 ID(channelId)`},{value:`userId`,label:`用户 ID(userId)`},{value:`platform`,label:`平台(platform)`},{value:`content`,label:`消息内容(content)`},{value:`isDirect`,label:`私聊(isDirect)`},{value:`subtype`,label:`消息子类型(subtype)`}],o=[...a,{value:`__custom__`,label:`自定义字段...`}],S=[{value:`eq`,label:`等于`},{value:`ne`,label:`不等于`},{value:`includes`,label:`包含`},{value:`regex`,label:`正则匹配`},{value:`gt`,label:`大于`},{value:`gte`,label:`大于等于`},{value:`lt`,label:`小于`},{value:`lte`,label:`小于等于`},{value:`exists`,label:`存在`}],C=[{value:`eq`,label:`等于`},{value:`ne`,label:`不等于`},{value:`exists`,label:`存在`}],w={eq:`eq`,ne:`ne`,includes:`contains`,regex:`matches`,gt:`gt`,gte:`gte`,lt:`lt`,lte:`lte`,exists:`exists`},T=e,E=n,D=(0,t.ref)(j(T.modelValue)),O=JSON.stringify(T.modelValue);(0,t.watch)(()=>T.modelValue,e=>{let t=JSON.stringify(e);t!==O&&(O=t,D.value=j(e))},{deep:!0});function k(e,t=`guildId`){let n=t===`isDirect`;return{id:i(),field:t,customField:``,operator:`eq`,valueText:n?`false`:``,value:n?!1:``,connector:e}}function A(e,t){let n=a.some(t=>t.value===e.field),r=n?e.field:`__custom__`,o=r===`isDirect`?!1:``,s=e.value??o;return{id:i(),field:r,customField:n?``:e.field,operator:e.operator,valueText:s==null?``:String(s),value:s,connector:t}}function j(e){if(!e)return[k(null)];if(e.type===`compare`)return[A(e,null)];if(e.type===`group`){if(e.children.every(e=>e.type===`compare`))return e.children.map((t,n)=>A(t,n===0?null:e.operator));if(e.operator===`or`){let t=[],n=!0;for(let r of e.children)r.type===`compare`?(t.push(A(r,n?null:`or`)),n=!1):r.type===`group`&&r.operator===`and`&&r.children.forEach((e,r)=>{e.type===`compare`&&(t.push(A(e,n?null:r===0?`or`:`and`)),n=!1)});if(t.length>0)return t}}return[k(null)]}function M(e){return{type:`compare`,field:e.field===`__custom__`?(e.customField||``).trim()||`guildId`:e.field,operator:e.operator,value:e.operator===`exists`?void 0:e.value}}function N(e){if(e.length===0)return{type:`compare`,field:`guildId`,operator:`eq`,value:``};if(e.length===1)return M(e[0]);let t=[],n=[e[0]];for(let r=1;r<e.length;r++)e[r].connector===`or`?(t.push(n),n=[e[r]]):n.push(e[r]);t.push(n);let r=t.map(e=>e.length===1?M(e[0]):{type:`group`,operator:`and`,children:e.map(M)});return r.length===1?r[0]:{type:`group`,operator:`or`,children:r}}function P(e){if(e.type===`compare`){let t=w[e.operator]||e.operator,n=e.value===void 0?``:JSON.stringify(e.value);return`(${e.field} ${t} ${n})`}if(e.type===`group`){let t=e.operator===`and`?` AND `:` OR `;return e.children.map(P).join(t)}return e.type===`not`?`NOT (${P(e.child)})`:``}let F=(0,t.computed)(()=>P(N(D.value)));function I(){let e=N(D.value);O=JSON.stringify(e),E(`update:modelValue`,e)}function L(e){D.value.push(k(e??`and`)),I()}function R(e){D.value.length<=1||(D.value.splice(e,1),e===0&&(D.value[0].connector=null),I())}function z(e){e<=0||(D.value[e].connector=D.value[e].connector===`or`?`and`:`or`,I())}function B(e){let t=e.trim();if(!t)return``;if(t===`true`)return!0;if(t===`false`)return!1;if(t===`null`)return null;let n=Number(t);return Number.isFinite(n)?n:e}return(e,n)=>{let r=(0,t.resolveComponent)(`k-button`);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,c,[(0,t.createCommentVNode)(` 条件行 `),(0,t.createElementVNode)(`div`,l,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(D.value,(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:e.id},[(0,t.createCommentVNode)(` 连接符(第一行之后显示) `),n>0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,u,[(0,t.createElementVNode)(`button`,{class:(0,t.normalizeClass)([`connector-toggle`,`conn-`+e.connector]),title:`点击切换为`+(e.connector===`or`?`且(AND)`:`或(OR)`),onClick:e=>z(n)},(0,t.toDisplayString)(e.connector===`or`?`或(OR)`:`且(AND)`),11,d)])):(0,t.createCommentVNode)(`v-if`,!0),(0,t.createCommentVNode)(` 条件行 `),(0,t.createElementVNode)(`div`,f,[(0,t.createVNode)(s,{"model-value":e.field,options:o,class:`sel-field`,"onUpdate:modelValue":t=>{let n=e.field===`isDirect`;e.field=t,t===`isDirect`?(e.value=!1,e.valueText=`false`,[`eq`,`ne`,`exists`].includes(e.operator)||(e.operator=`eq`)):n&&(e.value=``,e.valueText=``),I()}},null,8,[`model-value`,`onUpdate:modelValue`]),e.field===`__custom__`?(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`input`,{key:0,class:`input custom-input`,"onUpdate:modelValue":t=>e.customField=t,onInput:I,placeholder:`字段路径,如 author.name`},null,40,p)),[[t.vModelText,e.customField]]):(0,t.createCommentVNode)(`v-if`,!0),(0,t.createVNode)(s,{"model-value":e.operator,options:e.field===`isDirect`?C:S,class:`sel-op`,"onUpdate:modelValue":t=>{e.operator=t,I()}},null,8,[`model-value`,`options`,`onUpdate:modelValue`]),(0,t.createCommentVNode)(` isDirect:开关 `),e.field===`isDirect`&&e.operator!==`exists`?((0,t.openBlock)(),(0,t.createElementBlock)(`label`,m,[(0,t.createElementVNode)(`input`,{type:`checkbox`,checked:e.value===!0,onChange:t=>{e.value=t.target.checked,e.valueText=String(e.value),I()}},null,40,h),(0,t.createElementVNode)(`span`,g,(0,t.toDisplayString)(e.value===!0?`是(true)`:`否(false)`),1)])):e.field!==`isDirect`&&e.operator!==`exists`?((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:2},[(0,t.createCommentVNode)(` 普通文本输入 `),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{class:`input val-input`,"onUpdate:modelValue":t=>e.valueText=t,onInput:()=>{e.value=B(e.valueText),I()},placeholder:`比较值`},null,40,_),[[t.vModelText,e.valueText]])],2112)):(0,t.createCommentVNode)(`v-if`,!0),(0,t.createElementVNode)(`button`,{class:`del-btn`,disabled:D.value.length<=1,onClick:e=>R(n),title:`删除此条件`},`✕`,8,v)])],64))),128))]),(0,t.createCommentVNode)(` 添加条件 `),(0,t.createElementVNode)(`div`,y,[D.value.length===0?((0,t.openBlock)(),(0,t.createBlock)(r,{key:0,onClick:n[0]||=e=>L(null)},{default:(0,t.withCtx)(()=>[...n[3]||=[(0,t.createTextVNode)(`+ 添加条件`,-1)]]),_:1})):((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:1},[(0,t.createVNode)(r,{onClick:n[1]||=e=>L(`and`)},{default:(0,t.withCtx)(()=>[...n[4]||=[(0,t.createTextVNode)(`且(AND)`,-1)]]),_:1}),(0,t.createVNode)(r,{onClick:n[2]||=e=>L(`or`)},{default:(0,t.withCtx)(()=>[...n[5]||=[(0,t.createTextVNode)(`或(OR)`,-1)]]),_:1})],64))]),(0,t.createCommentVNode)(` 表达式预览 `),(0,t.createElementVNode)(`div`,b,[n[6]||=(0,t.createElementVNode)(`div`,{class:`preview-title`},`表达式预览`,-1),(0,t.createElementVNode)(`code`,x,(0,t.toDisplayString)(F.value||`(空)`),1)])])}}}),[[`__scopeId`,`data-v-40533e84`]]);const C={class:`fp-layout`},w={class:`fp-header`},T={class:`actions`},E={class:`fp-main`},D={class:`rule-list`},O=[`onClick`],k={class:`top`},A={class:`name`},j={class:`meta`},M={class:`editor-body`},N={class:`editor-grid`},P={class:`field`},F={class:`field`},I={key:0,class:`field`},L={class:`field`},R={class:`field`},z={class:`field switch`},B=[`checked`],V={key:0,class:`field`},H={class:`expr-wrap`},U={class:`footer-actions`};var W=o((0,t.defineComponent)({__name:`page`,setup(n){let r=e.send,i={bypass:`放行`,block:`拦截`},a=[{label:`全局`,value:`global`},{label:`插件`,value:`plugin`}],o=[{label:`放行(bypass)`,value:`bypass`},{label:`拦截(block)`,value:`block`}],s=(0,t.computed)(()=>[{label:`请选择插件实例`,value:``},...l.value.map(e=>({label:e.label,value:e.key}))]),c=(0,t.ref)([]),l=(0,t.ref)([]),u=(0,t.ref)(``),d=(0,t.computed)(()=>[...c.value].sort((e,t)=>e.priority-t.priority||e.id.localeCompare(t.id))),f=(0,t.computed)(()=>d.value.find(e=>e.id===u.value));function p(){return{type:`group`,operator:`and`,children:[{type:`compare`,field:`guildId`,operator:`eq`,value:``}]}}async function m(){let[e,t]=await Promise.all([r(`filter-pro/list`),r(`filter-pro/targets`)]);l.value=t,c.value=e,(!u.value||!c.value.some(e=>e.id===u.value))&&(u.value=d.value[0]?.id||``)}async function h(){await r(`filter-pro/create`,{name:`new-rule`,enabled:!0,priority:(d.value.at(-1)?.priority??-1)+1,action:`block`,target:{type:`global`,value:``},condition:p(),response:``}),await m(),u.value=d.value.at(-1)?.id||u.value}async function g(e,t){e.enabled=!!t.target?.checked,await r(`filter-pro/toggle`,{id:e.id,enabled:e.enabled})}async function _(e){let t=e.target.type===`global`?{type:`global`,value:``}:{type:`plugin`,value:e.target.value||``};await r(`filter-pro/update`,{id:e.id,name:e.name,enabled:e.enabled,priority:e.priority,action:e.action,target:t,condition:e.condition,response:e.response||``}),await m()}async function v(e){await r(`filter-pro/delete`,e),await m()}async function y(e,t){let n=d.value,i=n.findIndex(t=>t.id===e);if(i<0)return;let a=i+t;if(a<0||a>=n.length)return;let o=[...n];[o[i],o[a]]=[o[a],o[i]],await r(`filter-pro/reorder`,o.map(e=>e.id)),await m()}return m(),(e,n)=>{let r=(0,t.resolveComponent)(`k-button`),c=(0,t.resolveComponent)(`k-card`),l=(0,t.resolveComponent)(`FpSelect`),p=(0,t.resolveComponent)(`k-layout`);return(0,t.openBlock)(),(0,t.createBlock)(p,null,{default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,C,[(0,t.createElementVNode)(`div`,w,[n[16]||=(0,t.createElementVNode)(`div`,null,[(0,t.createElementVNode)(`h2`,null,`Filter Pro`),(0,t.createElementVNode)(`p`,null,[(0,t.createTextVNode)(`持久化目录:`),(0,t.createElementVNode)(`code`,null,`data/filterpro`)])],-1),(0,t.createElementVNode)(`div`,T,[(0,t.createVNode)(r,{onClick:h},{default:(0,t.withCtx)(()=>[...n[12]||=[(0,t.createTextVNode)(`新建规则`,-1)]]),_:1}),(0,t.createVNode)(r,{onClick:n[0]||=e=>f.value&&_(f.value),disabled:!f.value},{default:(0,t.withCtx)(()=>[...n[13]||=[(0,t.createTextVNode)(`保存`,-1)]]),_:1},8,[`disabled`]),(0,t.createVNode)(r,{onClick:n[1]||=e=>f.value&&v(f.value.id),disabled:!f.value},{default:(0,t.withCtx)(()=>[...n[14]||=[(0,t.createTextVNode)(`删除`,-1)]]),_:1},8,[`disabled`]),(0,t.createVNode)(r,{onClick:m},{default:(0,t.withCtx)(()=>[...n[15]||=[(0,t.createTextVNode)(`刷新`,-1)]]),_:1})])]),(0,t.createElementVNode)(`div`,E,[(0,t.createVNode)(c,{class:`panel list`},{header:(0,t.withCtx)(()=>[...n[17]||=[(0,t.createElementVNode)(`div`,{class:`panel-title`},`规则列表`,-1)]]),default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,D,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(d.value,e=>((0,t.openBlock)(),(0,t.createElementBlock)(`button`,{key:e.id,class:(0,t.normalizeClass)([`rule-item`,{active:u.value===e.id}]),onClick:t=>u.value=e.id},[(0,t.createElementVNode)(`div`,k,[(0,t.createElementVNode)(`span`,A,(0,t.toDisplayString)(e.name||`未命名规则`),1),(0,t.createElementVNode)(`span`,{class:(0,t.normalizeClass)([`badge`,e.action])},(0,t.toDisplayString)(i[e.action]),3)]),(0,t.createElementVNode)(`div`,j,[(0,t.createElementVNode)(`span`,null,`#`+(0,t.toDisplayString)(e.priority),1),(0,t.createElementVNode)(`span`,null,(0,t.toDisplayString)(e.target.type===`global`?`全局`:e.target.value||`未指定插件`),1),(0,t.createElementVNode)(`span`,null,(0,t.toDisplayString)(e.enabled?`启用`:`停用`),1)])],10,O))),128))])]),_:1}),f.value?((0,t.openBlock)(),(0,t.createBlock)(c,{key:0,class:`panel editor`},{header:(0,t.withCtx)(()=>[...n[18]||=[(0,t.createElementVNode)(`div`,{class:`panel-title`},`规则编辑`,-1)]]),default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,M,[(0,t.createElementVNode)(`div`,N,[(0,t.createElementVNode)(`label`,P,[n[19]||=(0,t.createElementVNode)(`span`,null,`规则名`,-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{class:`input`,"onUpdate:modelValue":n[2]||=e=>f.value.name=e,placeholder:`输入规则名`},null,512),[[t.vModelText,f.value.name]])]),(0,t.createElementVNode)(`label`,F,[n[20]||=(0,t.createElementVNode)(`span`,null,`目标`,-1),(0,t.createVNode)(l,{modelValue:f.value.target.type,"onUpdate:modelValue":n[3]||=e=>f.value.target.type=e,options:a},null,8,[`modelValue`])]),f.value.target.type===`plugin`?((0,t.openBlock)(),(0,t.createElementBlock)(`label`,I,[n[21]||=(0,t.createElementVNode)(`span`,null,`插件实例`,-1),(0,t.createVNode)(l,{"model-value":f.value.target.value??``,options:s.value,"onUpdate:modelValue":n[4]||=e=>f.value.target.value=e},null,8,[`model-value`,`options`])])):(0,t.createCommentVNode)(`v-if`,!0),(0,t.createElementVNode)(`label`,L,[n[22]||=(0,t.createElementVNode)(`span`,null,`动作`,-1),(0,t.createVNode)(l,{modelValue:f.value.action,"onUpdate:modelValue":n[5]||=e=>f.value.action=e,options:o},null,8,[`modelValue`])]),(0,t.createElementVNode)(`label`,R,[n[23]||=(0,t.createElementVNode)(`span`,null,`优先级`,-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{class:`input`,type:`number`,"onUpdate:modelValue":n[6]||=e=>f.value.priority=e},null,512),[[t.vModelText,f.value.priority,void 0,{number:!0}]])]),(0,t.createElementVNode)(`label`,z,[n[24]||=(0,t.createElementVNode)(`span`,null,`启用状态`,-1),(0,t.createElementVNode)(`input`,{type:`checkbox`,checked:f.value.enabled,onChange:n[7]||=e=>g(f.value,e)},null,40,B)])]),f.value.action===`block`?((0,t.openBlock)(),(0,t.createElementBlock)(`label`,V,[n[25]||=(0,t.createElementVNode)(`span`,null,`拦截响应`,-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{class:`input`,"onUpdate:modelValue":n[8]||=e=>f.value.response=e,placeholder:`可选,留空则静默拦截`},null,512),[[t.vModelText,f.value.response]])])):(0,t.createCommentVNode)(`v-if`,!0),(0,t.createElementVNode)(`div`,H,[n[26]||=(0,t.createElementVNode)(`div`,{class:`panel-title small`},`条件表达式`,-1),(0,t.createVNode)(S,{modelValue:f.value.condition,"onUpdate:modelValue":n[9]||=e=>f.value.condition=e},null,8,[`modelValue`])]),(0,t.createElementVNode)(`div`,U,[(0,t.createVNode)(r,{onClick:n[10]||=e=>y(f.value.id,-1)},{default:(0,t.withCtx)(()=>[...n[27]||=[(0,t.createTextVNode)(`上移`,-1)]]),_:1}),(0,t.createVNode)(r,{onClick:n[11]||=e=>y(f.value.id,1)},{default:(0,t.withCtx)(()=>[...n[28]||=[(0,t.createTextVNode)(`下移`,-1)]]),_:1})])])]),_:1})):(0,t.createCommentVNode)(`v-if`,!0)])])]),_:1})}}}),[[`__scopeId`,`data-v-0e916acc`]]);const G={},K={class:`k-icon`,viewBox:`0 0 512 512`,xmlns:`http://www.w3.org/2000/svg`};function q(e,n){return(0,t.openBlock)(),(0,t.createElementBlock)(`svg`,K,[(0,t.createCommentVNode)(` 漏斗主体 `),n[0]||=(0,t.createElementVNode)(`path`,{fill:`none`,stroke:`currentColor`,"stroke-width":`32`,"stroke-linejoin":`round`,d:`M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z`},null,-1)])}var J=o(G,[[`render`,q]]),Y=t=>{e.icons.register(`activity:filter-pro`,J),t.page({name:`规则集`,path:`/filter-pro`,icon:`activity:filter-pro`,order:320,component:W})};module.exports=Y;
1
+ import{icons as e,send as t}from"@koishijs/client";import{Fragment as n,Teleport as r,computed as i,createBlock as a,createCommentVNode as o,createElementBlock as s,createElementVNode as c,createTextVNode as l,createVNode as u,defineComponent as d,normalizeClass as f,normalizeStyle as p,onBeforeUnmount as m,onMounted as h,openBlock as g,ref as _,renderList as v,resolveComponent as y,toDisplayString as b,vModelText as x,watch as S,withCtx as C,withDirectives as w}from"vue";const T=[`disabled`],E={class:`label`},D=[`onClick`];var O=d({__name:`fp-select`,props:{modelValue:{type:String,required:!0},options:{type:Array,required:!0},placeholder:{type:String,required:!1},disabled:{type:Boolean,required:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let l=e,u=t,d=_(null),y=_(!1),x=_({left:0,top:0,width:0}),C=i(()=>l.options.find(e=>e.value===l.modelValue)?.label||``);function w(){l.disabled||(y.value=!y.value,y.value&&A())}function O(e){u(`update:modelValue`,e),y.value=!1}function k(e){let t=e.target;!d.value||!t||d.value.contains(t)||(y.value=!1)}function A(){if(!d.value)return;let e=d.value.getBoundingClientRect(),t=window.innerHeight-e.bottom-6,n=e.top-6,r=t<180&&n>t,i=Math.min(240,r?n:t);x.value={left:e.left,width:e.width,top:r?Math.max(8,e.top-Math.max(120,i)-6):e.bottom+6}}function j(){y.value&&A()}return S(y,e=>{e&&A()}),h(()=>{document.addEventListener(`click`,k),window.addEventListener(`resize`,j),window.addEventListener(`scroll`,j,!0)}),m(()=>{document.removeEventListener(`click`,k),window.removeEventListener(`resize`,j),window.removeEventListener(`scroll`,j,!0)}),(t,i)=>(g(),s(n,null,[c(`div`,{class:`fp-select`,ref_key:`root`,ref:d},[c(`button`,{type:`button`,class:f([`trigger`,{disabled:e.disabled}]),onClick:w,disabled:e.disabled},[c(`span`,E,b(C.value||e.placeholder),1),i[0]||=c(`span`,{class:`arrow`},`▾`,-1)],10,T)],512),(g(),a(r,{to:`body`},[y.value?(g(),s(`div`,{key:0,class:`menu`,style:p({left:`${x.value.left}px`,top:`${x.value.top}px`,width:`${x.value.width}px`})},[(g(!0),s(n,null,v(e.options,t=>(g(),s(`button`,{key:t.value,type:`button`,class:f([`item`,{active:t.value===e.modelValue}]),onClick:e=>O(t.value)},b(t.label),11,D))),128))],4)):o(`v-if`,!0)]))],64))}}),k=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},A=k(O,[[`__scopeId`,`data-v-4a262c3e`]]);const j={class:`cf-editor`},M={class:`rows-section`},N={key:0,class:`connector-sep`},P=[`title`,`onClick`],F={class:`cf-row`},I=[`onUpdate:modelValue`],L={key:1,class:`bool-toggle`},ee=[`checked`,`onChange`],te={class:`bool-label`},ne=[`onUpdate:modelValue`,`onInput`],re=[`disabled`,`onClick`],ie={class:`add-section`},R={class:`preview-section`},z={class:`preview-code`};var B=k(d({name:`ExprEditor`,__name:`expr-editor`,props:{modelValue:{type:Object,required:!0}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=0,d=()=>String(++r),p=[{value:`guildId`,label:`群组 ID(guildId)`},{value:`channelId`,label:`频道 ID(channelId)`},{value:`userId`,label:`用户 ID(userId)`},{value:`platform`,label:`平台(platform)`},{value:`content`,label:`消息内容(content)`},{value:`isDirect`,label:`私聊(isDirect)`},{value:`subtype`,label:`消息子类型(subtype)`}],m=[...p,{value:`__custom__`,label:`自定义字段...`}],h=[{value:`eq`,label:`等于`},{value:`ne`,label:`不等于`},{value:`includes`,label:`包含`},{value:`regex`,label:`正则匹配`},{value:`gt`,label:`大于`},{value:`gte`,label:`大于等于`},{value:`lt`,label:`小于`},{value:`lte`,label:`小于等于`},{value:`exists`,label:`存在`}],T=[{value:`eq`,label:`等于`},{value:`ne`,label:`不等于`},{value:`exists`,label:`存在`}],E={eq:`eq`,ne:`ne`,includes:`contains`,regex:`matches`,gt:`gt`,gte:`gte`,lt:`lt`,lte:`lte`,exists:`exists`},D=e,O=t,k=_(U(D.modelValue)),B=JSON.stringify(D.modelValue);S(()=>D.modelValue,e=>{let t=JSON.stringify(e);t!==B&&(B=t,k.value=U(e))},{deep:!0});function V(e,t=`guildId`){let n=t===`isDirect`;return{id:d(),field:t,customField:``,operator:`eq`,valueText:n?`false`:``,value:n?!1:``,connector:e}}function H(e,t){let n=p.some(t=>t.value===e.field),r=n?e.field:`__custom__`,i=r===`isDirect`?!1:``,a=e.value??i;return{id:d(),field:r,customField:n?``:e.field,operator:e.operator,valueText:a==null?``:String(a),value:a,connector:t}}function U(e){if(!e)return[V(null)];if(e.type===`compare`)return[H(e,null)];if(e.type===`group`){if(e.children.every(e=>e.type===`compare`))return e.children.map((t,n)=>H(t,n===0?null:e.operator));if(e.operator===`or`){let t=[],n=!0;for(let r of e.children)r.type===`compare`?(t.push(H(r,n?null:`or`)),n=!1):r.type===`group`&&r.operator===`and`&&r.children.forEach((e,r)=>{e.type===`compare`&&(t.push(H(e,n?null:r===0?`or`:`and`)),n=!1)});if(t.length>0)return t}}return[V(null)]}function W(e){return{type:`compare`,field:e.field===`__custom__`?(e.customField||``).trim()||`guildId`:e.field,operator:e.operator,value:e.operator===`exists`?void 0:e.value}}function G(e){if(e.length===0)return{type:`compare`,field:`guildId`,operator:`eq`,value:``};if(e.length===1)return W(e[0]);let t=[],n=[e[0]];for(let r=1;r<e.length;r++)e[r].connector===`or`?(t.push(n),n=[e[r]]):n.push(e[r]);t.push(n);let r=t.map(e=>e.length===1?W(e[0]):{type:`group`,operator:`and`,children:e.map(W)});return r.length===1?r[0]:{type:`group`,operator:`or`,children:r}}function K(e){if(e.type===`compare`){let t=E[e.operator]||e.operator,n=e.value===void 0?``:JSON.stringify(e.value);return`(${e.field} ${t} ${n})`}if(e.type===`group`){let t=e.operator===`and`?` AND `:` OR `;return e.children.map(K).join(t)}return e.type===`not`?`NOT (${K(e.child)})`:``}let q=i(()=>K(G(k.value)));function J(){let e=G(k.value);B=JSON.stringify(e),O(`update:modelValue`,e)}function Y(e){k.value.push(V(e??`and`)),J()}function X(e){k.value.length<=1||(k.value.splice(e,1),e===0&&(k.value[0].connector=null),J())}function Z(e){e<=0||(k.value[e].connector=k.value[e].connector===`or`?`and`:`or`,J())}function Q(e){let t=e.trim();if(!t)return``;if(t===`true`)return!0;if(t===`false`)return!1;if(t===`null`)return null;let n=Number(t);return Number.isFinite(n)?n:e}return(e,t)=>{let r=y(`k-button`);return g(),s(`div`,j,[o(` 条件行 `),c(`div`,M,[(g(!0),s(n,null,v(k.value,(e,t)=>(g(),s(n,{key:e.id},[o(` 连接符(第一行之后显示) `),t>0?(g(),s(`div`,N,[c(`button`,{class:f([`connector-toggle`,`conn-`+e.connector]),title:`点击切换为`+(e.connector===`or`?`且(AND)`:`或(OR)`),onClick:e=>Z(t)},b(e.connector===`or`?`或(OR)`:`且(AND)`),11,P)])):o(`v-if`,!0),o(` 条件行 `),c(`div`,F,[u(A,{"model-value":e.field,options:m,class:`sel-field`,"onUpdate:modelValue":t=>{let n=e.field===`isDirect`;e.field=t,t===`isDirect`?(e.value=!1,e.valueText=`false`,[`eq`,`ne`,`exists`].includes(e.operator)||(e.operator=`eq`)):n&&(e.value=``,e.valueText=``),J()}},null,8,[`model-value`,`onUpdate:modelValue`]),e.field===`__custom__`?w((g(),s(`input`,{key:0,class:`input custom-input`,"onUpdate:modelValue":t=>e.customField=t,onInput:J,placeholder:`字段路径,如 author.name`},null,40,I)),[[x,e.customField]]):o(`v-if`,!0),u(A,{"model-value":e.operator,options:e.field===`isDirect`?T:h,class:`sel-op`,"onUpdate:modelValue":t=>{e.operator=t,J()}},null,8,[`model-value`,`options`,`onUpdate:modelValue`]),o(` isDirect:开关 `),e.field===`isDirect`&&e.operator!==`exists`?(g(),s(`label`,L,[c(`input`,{type:`checkbox`,checked:e.value===!0,onChange:t=>{e.value=t.target.checked,e.valueText=String(e.value),J()}},null,40,ee),c(`span`,te,b(e.value===!0?`是(true)`:`否(false)`),1)])):e.field!==`isDirect`&&e.operator!==`exists`?(g(),s(n,{key:2},[o(` 普通文本输入 `),w(c(`input`,{class:`input val-input`,"onUpdate:modelValue":t=>e.valueText=t,onInput:()=>{e.value=Q(e.valueText),J()},placeholder:`比较值`},null,40,ne),[[x,e.valueText]])],2112)):o(`v-if`,!0),c(`button`,{class:`del-btn`,disabled:k.value.length<=1,onClick:e=>X(t),title:`删除此条件`},`✕`,8,re)])],64))),128))]),o(` 添加条件 `),c(`div`,ie,[k.value.length===0?(g(),a(r,{key:0,onClick:t[0]||=e=>Y(null)},{default:C(()=>[...t[3]||=[l(`+ 添加条件`,-1)]]),_:1})):(g(),s(n,{key:1},[u(r,{onClick:t[1]||=e=>Y(`and`)},{default:C(()=>[...t[4]||=[l(`且(AND)`,-1)]]),_:1}),u(r,{onClick:t[2]||=e=>Y(`or`)},{default:C(()=>[...t[5]||=[l(`或(OR)`,-1)]]),_:1})],64))]),o(` 表达式预览 `),c(`div`,R,[t[6]||=c(`div`,{class:`preview-title`},`表达式预览`,-1),c(`code`,z,b(q.value||`(空)`),1)])])}}}),[[`__scopeId`,`data-v-40533e84`]]);const V={class:`fp-layout`},H={class:`fp-header`},U={class:`actions`},W={class:`fp-main`},G={class:`rule-list`},K=[`onClick`],q={class:`top`},J={class:`name`},Y={class:`meta`},X={class:`editor-body`},Z={class:`editor-grid`},Q={class:`field`},ae={class:`field`},oe={key:0,class:`field`},se={class:`field`},ce={class:`field`},le={class:`field switch`},ue={key:0,class:`field`},de={class:`expr-wrap`},fe={class:`footer-actions`};var pe=k(d({__name:`page`,setup(e){let r=t,d={bypass:`放行`,block:`拦截`},p=[{label:`全局`,value:`global`},{label:`插件`,value:`plugin`}],m=[{label:`放行(bypass)`,value:`bypass`},{label:`拦截(block)`,value:`block`}],h=i(()=>[{label:`请选择插件实例`,value:``},...T.value.map(e=>({label:e.label,value:e.key}))]),S=_([]),T=_([]),E=_(``),D=i(()=>[...S.value].sort((e,t)=>e.priority-t.priority||e.id.localeCompare(t.id))),O=i(()=>D.value.find(e=>e.id===E.value));function k(){return{type:`group`,operator:`and`,children:[{type:`compare`,field:`guildId`,operator:`eq`,value:``}]}}async function j(){let[e,t]=await Promise.all([r(`filter-pro/list`),r(`filter-pro/targets`)]);T.value=t,S.value=e,(!E.value||!S.value.some(e=>e.id===E.value))&&(E.value=D.value[0]?.id||``)}async function M(){await r(`filter-pro/create`,{name:`new-rule`,enabled:!0,priority:(D.value.at(-1)?.priority??-1)+1,action:`block`,target:{type:`global`,value:``},condition:k(),response:``}),await j(),E.value=D.value.at(-1)?.id||E.value}async function N(e){e.enabled=!e.enabled,await r(`filter-pro/toggle`,{id:e.id,enabled:e.enabled})}async function P(e){let t=e.target.type===`global`?{type:`global`,value:``}:{type:`plugin`,value:e.target.value||``};await r(`filter-pro/update`,{id:e.id,name:e.name,enabled:e.enabled,priority:e.priority,action:e.action,target:t,condition:e.condition,response:e.response||``}),await j()}async function F(e){await r(`filter-pro/delete`,e),await j()}async function I(e,t){let n=D.value,i=n.findIndex(t=>t.id===e);if(i<0)return;let a=i+t;if(a<0||a>=n.length)return;let o=[...n];[o[i],o[a]]=[o[a],o[i]],await r(`filter-pro/reorder`,o.map(e=>e.id)),await j()}return j(),(e,t)=>{let r=y(`k-button`),i=y(`k-card`),_=y(`k-layout`);return g(),a(_,null,{default:C(()=>[c(`div`,V,[c(`div`,H,[t[16]||=c(`div`,null,[c(`h2`,null,`Filter Pro`),c(`p`,null,[l(`持久化目录:`),c(`code`,null,`data/filterpro`)])],-1),c(`div`,U,[u(r,{onClick:M},{default:C(()=>[...t[12]||=[l(`新建规则`,-1)]]),_:1}),u(r,{onClick:t[0]||=e=>O.value&&P(O.value),disabled:!O.value},{default:C(()=>[...t[13]||=[l(`保存`,-1)]]),_:1},8,[`disabled`]),u(r,{onClick:t[1]||=e=>O.value&&F(O.value.id),disabled:!O.value},{default:C(()=>[...t[14]||=[l(`删除`,-1)]]),_:1},8,[`disabled`]),u(r,{onClick:j},{default:C(()=>[...t[15]||=[l(`刷新`,-1)]]),_:1})])]),c(`div`,W,[u(i,{class:`panel list`},{header:C(()=>[...t[17]||=[c(`div`,{class:`panel-title`},`规则列表`,-1)]]),default:C(()=>[c(`div`,G,[(g(!0),s(n,null,v(D.value,e=>(g(),s(`button`,{key:e.id,class:f([`rule-item`,{active:E.value===e.id}]),onClick:t=>E.value=e.id},[c(`div`,q,[c(`span`,J,b(e.name||`未命名规则`),1),c(`span`,{class:f([`badge`,e.action])},b(d[e.action]),3)]),c(`div`,Y,[c(`span`,null,`#`+b(e.priority),1),c(`span`,null,b(e.target.type===`global`?`全局`:e.target.value||`未指定插件`),1),c(`span`,null,b(e.enabled?`启用`:`停用`),1)])],10,K))),128))])]),_:1}),O.value?(g(),a(i,{key:0,class:`panel editor`},{header:C(()=>[...t[18]||=[c(`div`,{class:`panel-title`},`规则编辑`,-1)]]),default:C(()=>[c(`div`,X,[c(`div`,Z,[c(`label`,Q,[t[19]||=c(`span`,null,`规则名`,-1),w(c(`input`,{class:`input`,"onUpdate:modelValue":t[2]||=e=>O.value.name=e,placeholder:`输入规则名`},null,512),[[x,O.value.name]])]),c(`label`,ae,[t[20]||=c(`span`,null,`目标`,-1),u(A,{modelValue:O.value.target.type,"onUpdate:modelValue":t[3]||=e=>O.value.target.type=e,options:p},null,8,[`modelValue`])]),O.value.target.type===`plugin`?(g(),s(`label`,oe,[t[21]||=c(`span`,null,`插件实例`,-1),u(A,{"model-value":O.value.target.value??``,options:h.value,"onUpdate:modelValue":t[4]||=e=>O.value.target.value=e},null,8,[`model-value`,`options`])])):o(`v-if`,!0),c(`label`,se,[t[22]||=c(`span`,null,`动作`,-1),u(A,{modelValue:O.value.action,"onUpdate:modelValue":t[5]||=e=>O.value.action=e,options:m},null,8,[`modelValue`])]),c(`label`,ce,[t[23]||=c(`span`,null,`优先级`,-1),w(c(`input`,{class:`input`,type:`number`,"onUpdate:modelValue":t[6]||=e=>O.value.priority=e},null,512),[[x,O.value.priority,void 0,{number:!0}]])]),c(`label`,le,[t[25]||=c(`span`,null,`启用状态`,-1),c(`div`,{class:f([`toggle-switch`,{active:O.value.enabled}]),onClick:t[7]||=e=>N(O.value)},[...t[24]||=[c(`div`,{class:`toggle-thumb`},null,-1)]],2)])]),O.value.action===`block`?(g(),s(`label`,ue,[t[26]||=c(`span`,null,`拦截响应`,-1),w(c(`input`,{class:`input`,"onUpdate:modelValue":t[8]||=e=>O.value.response=e,placeholder:`可选,留空则静默拦截`},null,512),[[x,O.value.response]])])):o(`v-if`,!0),c(`div`,de,[t[27]||=c(`div`,{class:`panel-title small`},`条件表达式`,-1),u(B,{modelValue:O.value.condition,"onUpdate:modelValue":t[9]||=e=>O.value.condition=e},null,8,[`modelValue`])]),c(`div`,fe,[u(r,{onClick:t[10]||=e=>I(O.value.id,-1)},{default:C(()=>[...t[28]||=[l(`上移`,-1)]]),_:1}),u(r,{onClick:t[11]||=e=>I(O.value.id,1)},{default:C(()=>[...t[29]||=[l(`下移`,-1)]]),_:1})])])]),_:1})):o(`v-if`,!0)])])]),_:1})}}}),[[`__scopeId`,`data-v-0e916acc`]]);const $={},me={class:`k-icon`,viewBox:`0 0 512 512`,xmlns:`http://www.w3.org/2000/svg`};function he(e,t){return g(),s(`svg`,me,[o(` 漏斗主体 `),t[0]||=c(`path`,{fill:`none`,stroke:`currentColor`,"stroke-width":`32`,"stroke-linejoin":`round`,d:`M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z`},null,-1)])}var ge=k($,[[`render`,he]]),_e=t=>{e.register(`activity:filter-pro`,ge),t.page({name:`规则集`,path:`/filter-pro`,icon:`activity:filter-pro`,order:320,component:pe})};export{_e as default};
@@ -347,6 +347,33 @@
347
347
  .field.switch[data-v-0e916acc] {
348
348
  justify-content: flex-end;
349
349
  }
350
+ .toggle-switch[data-v-0e916acc] {
351
+ position: relative;
352
+ width: 44px;
353
+ height: 24px;
354
+ border-radius: 12px;
355
+ background: var(--k-card-border, rgba(127, 127, 127, 0.4));
356
+ cursor: pointer;
357
+ transition: background 0.25s;
358
+ flex-shrink: 0;
359
+ }
360
+ .toggle-switch.active[data-v-0e916acc] {
361
+ background: var(--k-color-active, #5865f2);
362
+ }
363
+ .toggle-thumb[data-v-0e916acc] {
364
+ position: absolute;
365
+ top: 3px;
366
+ left: 3px;
367
+ width: 18px;
368
+ height: 18px;
369
+ border-radius: 50%;
370
+ background: #fff;
371
+ transition: transform 0.25s;
372
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
373
+ }
374
+ .toggle-switch.active .toggle-thumb[data-v-0e916acc] {
375
+ transform: translateX(20px);
376
+ }
350
377
  .input[data-v-0e916acc] {
351
378
  width: 100%;
352
379
  min-width: 0;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-filter-pro",
3
- "description": "Ruleset middleware plugin for Koishi",
4
- "version": "1.0.2",
3
+ "description": "A powerful filter plugin for Koishi",
4
+ "version": "1.0.4",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "lib/index.mjs",
7
7
  "types": "lib/index.d.ts",
@@ -52,14 +52,14 @@
52
52
  "koishi": "^4.18.10"
53
53
  },
54
54
  "devDependencies": {
55
- "@biomejs/biome": "^2.3.14",
56
- "@koishijs/client": "^5.11.0",
55
+ "@biomejs/biome": "^2.4.4",
56
+ "@koishijs/client": "^5.30.11",
57
57
  "@koishijs/plugin-console": "^5.30.11",
58
58
  "@koishijs/plugin-proxy-agent": "^0.3.3",
59
- "@types/node": "^25.2.1",
59
+ "@types/node": "^25.3.0",
60
60
  "@vitejs/plugin-vue": "^6.0.4",
61
61
  "koishi": "^4.18.10",
62
- "rolldown": "^1.0.0-rc.3",
62
+ "rolldown": "^1.0.0-rc.5",
63
63
  "rolldown-plugin-dts": "^0.22.1"
64
64
  }
65
65
  }