koishi-plugin-filter-pro 1.0.0 → 1.0.2

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.css ADDED
@@ -0,0 +1,376 @@
1
+
2
+ .fp-select[data-v-4a262c3e] {
3
+ position: relative;
4
+ min-width: 140px;
5
+ }
6
+ .trigger[data-v-4a262c3e] {
7
+ width: 100%;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: 8px;
12
+ color: var(--k-text-normal, inherit);
13
+ background: var(--k-input-bg, transparent);
14
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
15
+ border-radius: 6px;
16
+ padding: 6px 10px;
17
+ cursor: pointer;
18
+ }
19
+ .trigger.disabled[data-v-4a262c3e] {
20
+ opacity: 0.6;
21
+ cursor: not-allowed;
22
+ }
23
+ .label[data-v-4a262c3e] {
24
+ overflow: hidden;
25
+ text-overflow: ellipsis;
26
+ white-space: nowrap;
27
+ }
28
+ .menu[data-v-4a262c3e] {
29
+ position: fixed;
30
+ z-index: 9999;
31
+ background: var(--k-card-bg, #1e1e1e);
32
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
33
+ border-radius: 8px;
34
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
35
+ max-height: 240px;
36
+ overflow: auto;
37
+ }
38
+ .item[data-v-4a262c3e] {
39
+ display: block;
40
+ width: 100%;
41
+ border: none;
42
+ background: transparent;
43
+ color: var(--k-text-normal, inherit);
44
+ text-align: left;
45
+ padding: 8px 10px;
46
+ cursor: pointer;
47
+ }
48
+ .item[data-v-4a262c3e]:hover,
49
+ .item.active[data-v-4a262c3e] {
50
+ background: color-mix(in srgb, var(--k-color-primary, #4f7cff) 18%, transparent);
51
+ }
52
+
53
+
54
+ .cf-editor[data-v-40533e84] {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: 10px;
58
+ }
59
+
60
+ /* ── 连接符 ── */
61
+ .connector-sep[data-v-40533e84] {
62
+ display: flex;
63
+ align-items: center;
64
+ padding: 2px 0;
65
+ }
66
+ .connector-toggle[data-v-40533e84] {
67
+ font-size: 12px;
68
+ font-weight: 700;
69
+ padding: 2px 12px;
70
+ border-radius: 4px;
71
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.4));
72
+ cursor: pointer;
73
+ background: var(--k-input-bg, transparent);
74
+ color: var(--k-text-normal, inherit);
75
+ letter-spacing: 0.04em;
76
+ transition: opacity 0.15s;
77
+ }
78
+ .connector-toggle[data-v-40533e84]:hover { opacity: 0.75;
79
+ }
80
+ .connector-toggle.conn-and[data-v-40533e84] {
81
+ border-color: var(--k-color-primary, #4f7cff);
82
+ color: var(--k-color-primary, #4f7cff);
83
+ }
84
+ .connector-toggle.conn-or[data-v-40533e84] {
85
+ border-color: #e67e22;
86
+ color: #e67e22;
87
+ }
88
+
89
+ /* ── 条件行 ── */
90
+ .cf-row[data-v-40533e84] {
91
+ display: flex;
92
+ align-items: center;
93
+ gap: 8px;
94
+ flex-wrap: wrap;
95
+ padding: 8px 10px;
96
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
97
+ border-radius: 8px;
98
+ background: color-mix(in srgb, var(--k-card-bg, #1a1a1a) 60%, transparent);
99
+ }
100
+ .sel-field[data-v-40533e84] { min-width: 168px;
101
+ }
102
+ .sel-op[data-v-40533e84] { min-width: 110px;
103
+ }
104
+ .val-input[data-v-40533e84],
105
+ .custom-input[data-v-40533e84] {
106
+ flex: 1;
107
+ min-width: 120px;
108
+ color: var(--k-text-normal, inherit);
109
+ background: var(--k-input-bg, transparent);
110
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
111
+ border-radius: 6px;
112
+ padding: 5px 10px;
113
+ font-size: 14px;
114
+ }
115
+
116
+ /* ── 布尔开关 ── */
117
+ .bool-toggle[data-v-40533e84] {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 8px;
121
+ cursor: pointer;
122
+ flex: 1;
123
+ min-width: 120px;
124
+ }
125
+ .bool-toggle input[type='checkbox'][data-v-40533e84] {
126
+ appearance: none;
127
+ -webkit-appearance: none;
128
+ width: 36px;
129
+ height: 20px;
130
+ border-radius: 999px;
131
+ background: var(--k-card-border, rgba(127,127,127,0.4));
132
+ position: relative;
133
+ cursor: pointer;
134
+ transition: background 0.2s;
135
+ flex-shrink: 0;
136
+ }
137
+ .bool-toggle input[type='checkbox'][data-v-40533e84]::after {
138
+ content: '';
139
+ position: absolute;
140
+ width: 14px;
141
+ height: 14px;
142
+ border-radius: 50%;
143
+ background: #fff;
144
+ top: 3px;
145
+ left: 3px;
146
+ transition: left 0.2s;
147
+ }
148
+ .bool-toggle input[type='checkbox'][data-v-40533e84]:checked {
149
+ background: var(--k-color-primary, #4f7cff);
150
+ }
151
+ .bool-toggle input[type='checkbox'][data-v-40533e84]:checked::after {
152
+ left: 19px;
153
+ }
154
+ .bool-label[data-v-40533e84] {
155
+ font-size: 13px;
156
+ color: var(--k-text-normal, inherit);
157
+ user-select: none;
158
+ }
159
+ .del-btn[data-v-40533e84] {
160
+ flex-shrink: 0;
161
+ width: 28px;
162
+ height: 28px;
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ border: none;
167
+ border-radius: 6px;
168
+ background: transparent;
169
+ color: var(--k-text-secondary, #888);
170
+ cursor: pointer;
171
+ font-size: 14px;
172
+ margin-left: auto;
173
+ transition: color 0.15s, background 0.15s;
174
+ }
175
+ .del-btn[data-v-40533e84]:hover {
176
+ color: #e74c3c;
177
+ background: color-mix(in srgb, #e74c3c 15%, transparent);
178
+ }
179
+ .del-btn[data-v-40533e84]:disabled {
180
+ opacity: 0.3;
181
+ cursor: default;
182
+ }
183
+
184
+ /* ── 添加按钮 ── */
185
+ .add-section[data-v-40533e84] {
186
+ display: flex;
187
+ gap: 8px;
188
+ }
189
+
190
+ /* ── 表达式预览 ── */
191
+ .preview-section[data-v-40533e84] {
192
+ border-top: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.2));
193
+ padding-top: 10px;
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 6px;
197
+ }
198
+ .preview-title[data-v-40533e84] {
199
+ font-size: 11px;
200
+ font-weight: 700;
201
+ color: var(--k-text-secondary, #888);
202
+ text-transform: uppercase;
203
+ letter-spacing: 0.06em;
204
+ }
205
+ .preview-code[data-v-40533e84] {
206
+ display: block;
207
+ font-family: 'Consolas', 'Monaco', 'Fira Code', monospace;
208
+ font-size: 13px;
209
+ background: color-mix(in srgb, #000 35%, transparent);
210
+ padding: 10px 14px;
211
+ border-radius: 6px;
212
+ white-space: pre-wrap;
213
+ word-break: break-all;
214
+ color: var(--k-text-normal, inherit);
215
+ line-height: 1.6;
216
+ }
217
+
218
+
219
+ .fp-layout[data-v-0e916acc] {
220
+ position: absolute;
221
+ top: 0;
222
+ left: 0;
223
+ right: 0;
224
+ bottom: 0;
225
+ display: flex;
226
+ flex-direction: column;
227
+ padding: 12px;
228
+ color: var(--k-text-normal, inherit);
229
+ box-sizing: border-box;
230
+ overflow: hidden;
231
+ }
232
+ .fp-header[data-v-0e916acc] {
233
+ display: flex;
234
+ justify-content: space-between;
235
+ align-items: flex-start;
236
+ gap: 12px;
237
+ margin-bottom: 12px;
238
+ }
239
+ .fp-header h2[data-v-0e916acc] {
240
+ margin: 0;
241
+ font-size: 20px;
242
+ }
243
+ .fp-header p[data-v-0e916acc] {
244
+ margin: 4px 0 0;
245
+ color: var(--k-text-secondary, #888);
246
+ }
247
+ .actions[data-v-0e916acc] {
248
+ display: flex;
249
+ gap: 8px;
250
+ }
251
+ .fp-main[data-v-0e916acc] {
252
+ display: grid;
253
+ grid-template-columns: 320px 1fr;
254
+ gap: 12px;
255
+ min-height: 0;
256
+ flex: 1;
257
+ overflow: hidden;
258
+ }
259
+ .list[data-v-0e916acc],
260
+ .editor[data-v-0e916acc] {
261
+ height: 100%;
262
+ min-height: 0;
263
+ display: flex;
264
+ flex-direction: column;
265
+ overflow: hidden;
266
+ }
267
+ .list[data-v-0e916acc] .k-card-body,
268
+ .editor[data-v-0e916acc] .k-card-body {
269
+ display: flex;
270
+ flex-direction: column;
271
+ flex: 1;
272
+ min-height: 0;
273
+ overflow: auto;
274
+ }
275
+ .panel[data-v-0e916acc] {
276
+ background: var(--k-card-bg, transparent);
277
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
278
+ border-radius: 10px;
279
+ }
280
+ .panel-title[data-v-0e916acc] {
281
+ font-weight: 600;
282
+ }
283
+ .panel-title.small[data-v-0e916acc] {
284
+ margin-bottom: 8px;
285
+ }
286
+ .rule-list[data-v-0e916acc] {
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 8px;
290
+ }
291
+ .editor-body[data-v-0e916acc] {
292
+ display: flex;
293
+ flex-direction: column;
294
+ }
295
+ .rule-item[data-v-0e916acc] {
296
+ width: 100%;
297
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
298
+ background: var(--k-input-bg, transparent);
299
+ color: var(--k-text-normal, inherit);
300
+ border-radius: 8px;
301
+ padding: 8px;
302
+ text-align: left;
303
+ cursor: pointer;
304
+ }
305
+ .rule-item.active[data-v-0e916acc] {
306
+ border-color: var(--k-color-primary, #4f7cff);
307
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--k-color-primary, #4f7cff) 20%, transparent);
308
+ }
309
+ .rule-item .top[data-v-0e916acc] {
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: space-between;
313
+ }
314
+ .rule-item .name[data-v-0e916acc] {
315
+ font-weight: 600;
316
+ }
317
+ .rule-item .meta[data-v-0e916acc] {
318
+ margin-top: 4px;
319
+ display: flex;
320
+ gap: 8px;
321
+ flex-wrap: wrap;
322
+ color: var(--k-text-secondary, #888);
323
+ font-size: 12px;
324
+ }
325
+ .badge[data-v-0e916acc] {
326
+ border-radius: 999px;
327
+ padding: 2px 8px;
328
+ font-size: 12px;
329
+ }
330
+ .badge.bypass[data-v-0e916acc] {
331
+ background: color-mix(in srgb, #1abc9c 20%, transparent);
332
+ }
333
+ .badge.block[data-v-0e916acc] {
334
+ background: color-mix(in srgb, #e74c3c 20%, transparent);
335
+ }
336
+ .editor-grid[data-v-0e916acc] {
337
+ display: grid;
338
+ grid-template-columns: repeat(2, minmax(0, 1fr));
339
+ gap: 10px;
340
+ margin-bottom: 12px;
341
+ }
342
+ .field[data-v-0e916acc] {
343
+ display: flex;
344
+ flex-direction: column;
345
+ gap: 6px;
346
+ }
347
+ .field.switch[data-v-0e916acc] {
348
+ justify-content: flex-end;
349
+ }
350
+ .input[data-v-0e916acc] {
351
+ width: 100%;
352
+ min-width: 0;
353
+ box-sizing: border-box;
354
+ color: var(--k-text-normal, inherit);
355
+ background: var(--k-input-bg, transparent);
356
+ border: 1px solid var(--k-card-border, rgba(127, 127, 127, 0.35));
357
+ border-radius: 6px;
358
+ padding: 6px 10px;
359
+ }
360
+ .expr-wrap[data-v-0e916acc] {
361
+ margin: 8px 0 12px;
362
+ }
363
+ .footer-actions[data-v-0e916acc] {
364
+ display: flex;
365
+ gap: 8px;
366
+ flex-wrap: wrap;
367
+ }
368
+ @media (max-width: 980px) {
369
+ .fp-main[data-v-0e916acc] {
370
+ grid-template-columns: 1fr;
371
+ }
372
+ .editor-grid[data-v-0e916acc] {
373
+ grid-template-columns: 1fr;
374
+ }
375
+ }
376
+
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{send as j,icons as A}from"@koishijs/client";import{defineComponent as H,computed as $,ref as T,resolveComponent as k,createBlock as N,openBlock as f,withCtx as s,createElementVNode as t,createTextVNode as c,createVNode as d,createCommentVNode as C,createElementBlock as w,Fragment as G,renderList as J,normalizeClass as O,toDisplayString as _,withDirectives as I,vModelText as R}from"vue";const K={class:"fp-layout"},Q={class:"fp-header"},W={class:"actions"},X={class:"fp-main"},Y={class:"rule-list"},Z=["onClick"],h={class:"top"},ee={class:"name"},te={class:"meta"},le={class:"editor-body"},oe={class:"editor-grid"},ne={class:"field"},ae={class:"field"},ie={key:0,class:"field"},se={class:"field"},de={class:"field"},re={class:"field switch"},ue=["checked"],pe={key:0,class:"field"},ve={class:"expr-wrap"},ce={class:"footer-actions"},fe=H({__name:"page",setup(m){const i=j,V={bypass:"放行",block:"拦截"},x=[{label:"全局",value:"global"},{label:"插件",value:"plugin"}],E=[{label:"放行(bypass)",value:"bypass"},{label:"拦截(block)",value:"block"}],P=$(()=>[{label:"请选择插件实例",value:""},...B.value.map(l=>({label:l.label,value:l.key}))]),U=T([]),B=T([]),u=T(""),b=$(()=>[...U.value].sort((l,e)=>l.priority-e.priority||l.id.localeCompare(e.id))),n=$(()=>b.value.find(l=>l.id===u.value));function S(){return{type:"group",operator:"and",children:[{type:"compare",field:"guildId",operator:"eq",value:""}]}}async function g(){var a;const[l,e]=await Promise.all([i("filter-pro/list"),i("filter-pro/targets")]);B.value=e,U.value=l,(!u.value||!U.value.some(r=>r.id===u.value))&&(u.value=((a=b.value[0])==null?void 0:a.id)||"")}async function q(){var l,e;await i("filter-pro/create",{name:"new-rule",enabled:true,priority:(((l=b.value.at(-1))==null?void 0:l.priority)??-1)+1,action:"block",target:{type:"global",value:""},condition:S(),response:""}),await g(),u.value=((e=b.value.at(-1))==null?void 0:e.id)||u.value}async function z(l,e){const a=e.target;l.enabled=!!(a!=null&&a.checked),await i("filter-pro/toggle",{id:l.id,enabled:l.enabled})}async function D(l){const e=l.target.type==="global"?{type:"global",value:""}:{type:"plugin",value:l.target.value||""};await i("filter-pro/update",{id:l.id,name:l.name,enabled:l.enabled,priority:l.priority,action:l.action,target:e,condition:l.condition,response:l.response||""}),await g()}async function M(l){await i("filter-pro/delete",l),await g()}async function F(l,e){const a=b.value,r=a.findIndex(y=>y.id===l);if(r<0)return;const p=r+e;if(p<0||p>=a.length)return;const v=[...a];[v[r],v[p]]=[v[p],v[r]],await i("filter-pro/reorder",v.map(y=>y.id)),await g()}return g(),(l,e)=>{const a=k("k-button"),r=k("k-card"),p=k("FpSelect"),v=k("ExprEditor"),y=k("k-layout");return f(),N(y,null,{default:s(()=>[t("div",K,[t("div",Q,[e[16]||(e[16]=t("div",null,[t("h2",null,"Filter Pro"),t("p",null,[c("持久化目录:"),t("code",null,"data/filterpro")])],-1)),t("div",W,[d(a,{onClick:q},{default:s(()=>[...e[12]||(e[12]=[c("新建规则",-1)])]),_:1}),d(a,{onClick:e[0]||(e[0]=o=>n.value&&D(n.value)),disabled:!n.value},{default:s(()=>[...e[13]||(e[13]=[c("保存",-1)])]),_:1},8,["disabled"]),d(a,{onClick:e[1]||(e[1]=o=>n.value&&M(n.value.id)),disabled:!n.value},{default:s(()=>[...e[14]||(e[14]=[c("删除",-1)])]),_:1},8,["disabled"]),d(a,{onClick:g},{default:s(()=>[...e[15]||(e[15]=[c("刷新",-1)])]),_:1})])]),t("div",X,[d(r,{class:"panel list"},{header:s(()=>[...e[17]||(e[17]=[t("div",{class:"panel-title"},"规则列表",-1)])]),default:s(()=>[t("div",Y,[(f(true),w(G,null,J(b.value,o=>(f(),w("button",{key:o.id,class:O(["rule-item",{active:u.value===o.id}]),onClick:_e=>u.value=o.id},[t("div",h,[t("span",ee,_(o.name||"未命名规则"),1),t("span",{class:O(["badge",o.action])},_(V[o.action]),3)]),t("div",te,[t("span",null,"#"+_(o.priority),1),t("span",null,_(o.target.type==="global"?"全局":o.target.value||"未指定插件"),1),t("span",null,_(o.enabled?"启用":"停用"),1)])],10,Z))),128))])]),_:1}),n.value?(f(),N(r,{key:0,class:"panel editor"},{header:s(()=>[...e[18]||(e[18]=[t("div",{class:"panel-title"},"规则编辑",-1)])]),default:s(()=>[t("div",le,[t("div",oe,[t("label",ne,[e[19]||(e[19]=t("span",null,"规则名",-1)),I(t("input",{class:"input","onUpdate:modelValue":e[2]||(e[2]=o=>n.value.name=o),placeholder:"输入规则名"},null,512),[[R,n.value.name]])]),t("label",ae,[e[20]||(e[20]=t("span",null,"目标",-1)),d(p,{modelValue:n.value.target.type,"onUpdate:modelValue":e[3]||(e[3]=o=>n.value.target.type=o),options:x},null,8,["modelValue"])]),n.value.target.type==="plugin"?(f(),w("label",ie,[e[21]||(e[21]=t("span",null,"插件实例",-1)),d(p,{modelValue:n.value.target.value,"onUpdate:modelValue":e[4]||(e[4]=o=>n.value.target.value=o),options:P.value},null,8,["modelValue","options"])])):C("v-if",true),t("label",se,[e[22]||(e[22]=t("span",null,"动作",-1)),d(p,{modelValue:n.value.action,"onUpdate:modelValue":e[5]||(e[5]=o=>n.value.action=o),options:E},null,8,["modelValue"])]),t("label",de,[e[23]||(e[23]=t("span",null,"优先级",-1)),I(t("input",{class:"input",type:"number","onUpdate:modelValue":e[6]||(e[6]=o=>n.value.priority=o)},null,512),[[R,n.value.priority,void 0,{number:true}]])]),t("label",re,[e[24]||(e[24]=t("span",null,"启用状态",-1)),t("input",{type:"checkbox",checked:n.value.enabled,onChange:e[7]||(e[7]=o=>z(n.value,o))},null,40,ue)])]),n.value.action==="block"?(f(),w("label",pe,[e[25]||(e[25]=t("span",null,"拦截响应",-1)),I(t("input",{class:"input","onUpdate:modelValue":e[8]||(e[8]=o=>n.value.response=o),placeholder:"可选,留空则静默拦截"},null,512),[[R,n.value.response]])])):C("v-if",true),t("div",ve,[e[26]||(e[26]=t("div",{class:"panel-title small"},"条件表达式",-1)),d(v,{modelValue:n.value.condition,"onUpdate:modelValue":e[9]||(e[9]=o=>n.value.condition=o)},null,8,["modelValue"])]),t("div",ce,[d(a,{onClick:e[10]||(e[10]=o=>F(n.value.id,-1))},{default:s(()=>[...e[27]||(e[27]=[c("上移",-1)])]),_:1}),d(a,{onClick:e[11]||(e[11]=o=>F(n.value.id,1))},{default:s(()=>[...e[28]||(e[28]=[c("下移",-1)])]),_:1})])])]),_:1})):C("v-if",true)])])]),_:1})}}}),L=(m,i)=>{const V=m.__vccOpts||m;for(const[x,E]of i)V[x]=E;return V},me=L(fe,[["__scopeId","data-v-c2842c3d"]]),be={},ge={class:"k-icon",viewBox:"0 0 512 512",xmlns:"http://www.w3.org/2000/svg"};function ye(m,i){return f(),w("svg",ge,[C(" 漏斗主体 "),i[0]||(i[0]=t("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))])}const ke=L(be,[["render",ye]]),Ce=m=>{A.register("activity:filter-pro",ke),m.page({name:"规则集",path:"/filter-pro",icon:"activity:filter-pro",order:320,component:me})};export{Ce as default};
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;