koishi-plugin-chat-patch 0.8.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.js ADDED
@@ -0,0 +1,27 @@
1
+ import{defineComponent as Z,ref as v,onMounted as Se,h as d,computed as q,watch as Xe,nextTick as se,onUnmounted as Mt,createElementBlock as m,openBlock as f,normalizeStyle as Be,normalizeClass as z,createElementVNode as i,createCommentVNode as le,Fragment as R,renderList as oe,createBlock as re,unref as ce,toDisplayString as p,withDirectives as ze,createTextVNode as Ye,vShow as Tt,withKeys as Dt,vModelText as qt,withModifiers as Lt,resolveComponent as Kt}from"vue";import{receive as Fe,send as M,icons as Nt}from"@koishijs/client";const Pt={class:"bot-list"},jt={class:"bot-items"},Ut=["onClick","onContextmenu"],Ot={class:"bot-avatar"},At={key:1,class:"avatar-placeholder"},Rt={class:"bot-info"},Ht={class:"bot-name"},Xt={class:"bot-platform"},zt={class:"channel-list"},Yt={key:0,class:"empty-state"},Ft={key:1,class:"channel-items"},Wt=["data-channel-id","onClick","onContextmenu"],Jt={class:"channel-info"},Vt={class:"channel-name"},Gt={class:"channel-type"},Qt=["onMousedown","onTouchstart","title"],Zt={class:"message-area"},Et={class:"panel-header"},ea={key:0,class:"empty-state"},ta={key:1,class:"message-content"},aa={class:"message-avatar"},na={key:1,class:"avatar-placeholder"},sa={class:"message-content-wrapper"},la={class:"message-header"},oa={class:"message-username"},ra={class:"message-time"},ca={key:0,class:"message-quote"},ia={class:"quote-header"},ua={class:"quote-avatar"},da={key:1,class:"avatar-placeholder"},va={class:"quote-username"},ha={class:"quote-time"},fa={class:"quote-content"},ma={class:"message-text"},ga={class:"message-input"},ya={class:"input-row"},pa=["placeholder","disabled"],wa=["disabled"],We=200,ba="ChatImageCache",xa=1,L="images",K=80,Ca=Z({__name:"index",setup(F){const H=Z({props:{src:{type:String,required:true},alt:{type:String,default:"头像"},channelKey:{type:String,required:true}},setup(e){const a=v("loading"),t=v(e.src),n=v(""),s=async()=>{try{a.value="loading";const r=await _e(e.channelKey,e.src);if(r){t.value=r,a.value="loaded";return}const o=new Image;o.crossOrigin="anonymous",o.referrerPolicy="no-referrer",o.draggable=false;const c=new Promise((C,b)=>{o.onload=()=>C(),o.onerror=()=>b(new Error("Direct load failed")),o.src=e.src}),x=new Promise((C,b)=>{setTimeout(()=>b(new Error("Timeout")),3e3)});try{await Promise.race([c,x]),t.value=e.src,a.value="loaded",ae(e.channelKey,e.src).catch(C=>{console.warn("异步缓存头像失败:",C)})}catch{await l()}}catch(r){console.error("头像加载失败:",r),a.value="error",n.value="头像加载失败"}},l=async()=>{try{a.value="caching";const r=await ae(e.channelKey,e.src);if(r)t.value=r,a.value="loaded";else throw new Error("缓存系统加载失败")}catch(r){console.error("缓存系统加载头像失败:",r),a.value="error",n.value=(r==null?void 0:r.message)||"缓存加载失败"}};return Se(()=>{s()}),()=>{switch(a.value){case"loading":case"caching":return d("div",{class:"avatar-placeholder"},e.alt.charAt(0).toUpperCase());case"loaded":return d("img",{src:t.value,alt:e.alt,draggable:false,style:{width:"100%",height:"100%","object-fit":"cover"}});case"error":return d("div",{class:"avatar-placeholder"},e.alt.charAt(0).toUpperCase());default:return d("div",{class:"avatar-placeholder"},e.alt.charAt(0).toUpperCase())}}}}),W=Z({props:{src:{type:String,required:true},alt:{type:String,default:"图片"},filename:{type:String,default:""},channelKey:{type:String,required:true}},setup(e){const a=v("loading"),t=v(e.src),n=v(""),s=v(null),l=async()=>{try{a.value="loading";const o=await _e(e.channelKey,e.src);if(o){t.value=o,a.value="loaded";return}const c=new Image;c.crossOrigin="anonymous",c.referrerPolicy="no-referrer",c.draggable=false;const x=new Promise((b,ye)=>{c.onload=()=>b(),c.onerror=()=>ye(new Error("Direct load failed")),c.src=e.src}),C=new Promise((b,ye)=>{setTimeout(()=>ye(new Error("Timeout")),3e3)});try{await Promise.race([x,C]),t.value=e.src,a.value="loaded",ae(e.channelKey,e.src).catch(b=>{console.warn("异步缓存图片失败:",b)})}catch{await r()}}catch(o){console.error("图片加载失败:",o),a.value="error",n.value="图片加载失败"}},r=async()=>{try{a.value="caching";const o=await ae(e.channelKey,e.src);if(o)t.value=o,a.value="loaded";else throw new Error("缓存系统加载失败")}catch(o){console.error("缓存系统加载图片失败:",o),a.value="error",n.value=(o==null?void 0:o.message)||"缓存加载失败"}};return Se(()=>{l()}),()=>{switch(a.value){case"loading":return d("div",{class:"message-image-loading"},"加载中...");case"caching":return d("div",{class:"message-image-loading"},"[图片加载缓存中...]");case"loaded":return d("img",{src:t.value,alt:e.alt,class:"message-image",loading:"lazy",ref:s,draggable:false,style:{"max-width":"400px","max-height":"200px",width:"auto",height:"auto","object-fit":"contain"}});case"error":return d("div",{class:"message-image-error"},["图片加载失败",d("br"),d("small",e.filename||e.alt||"未知图片"),d("br"),d("small",{style:"color: #ff9800;"},n.value)]);default:return d("div",{class:"message-image-error"},"未知状态")}}}}),pe=Z({props:{data:{type:String,required:true},channelKey:{type:String,required:true}},setup(e){const t=(()=>{try{const s=JSON.parse(e.data);if(s.meta&&s.meta.detail_1){const l=s.meta.detail_1;return{type:"share_card",title:l.title||s.prompt||"分享内容",desc:l.desc||"",preview:l.preview?l.preview.replace(/\\\//g,"/"):"",icon:l.icon?l.icon.replace(/\\\//g,"/"):"",url:l.qqdocurl?l.qqdocurl.replace(/\\\//g,"/"):l.url?l.url.replace(/\\\//g,"/"):"",appName:l.title||"应用"}}return{type:"raw",data:s}}catch(s){return console.error("解析JSON数据失败:",s),{type:"error",error:"无法解析的JSON数据"}}})(),n=()=>{t.type==="share_card"&&t.url&&window.open(t.url,"_blank","noopener,noreferrer")};return()=>t.type==="share_card"&&t.preview?d("img",{src:t.preview,alt:t.title||"[分享小程序]",class:"message-image",loading:"lazy",draggable:false,onClick:n,style:{"max-width":"400px","max-height":"200px",width:"auto",height:"auto","object-fit":"contain",cursor:t.url?"pointer":"default"},title:t.url?`点击打开: ${t.title||"链接"}`:t.title,onError:s=>{const r=s.target.parentElement;r&&(r.style.display="none")}}):t.type==="error"?d("div",{class:"message-json-error"},[d("span",{class:"json-error-text"},t.error),d("details",{class:"json-raw-data"},[d("summary","查看原始数据"),d("pre",{class:"json-raw-content"},e.data)])]):d("div",{class:"message-json-raw"},[d("div",{class:"json-label"},"[JSON数据]"),d("details",{class:"json-raw-data"},[d("summary","查看详情"),d("pre",{class:"json-raw-content"},JSON.stringify(t.data,null,2))])])}}),ie=Z({props:{element:{type:Object,required:true},channelKey:{type:String,required:true}},setup(e){const a=t=>{var n,s,l,r,o,c;switch(t.type){case"text":return d("span",{class:"message-text-content"},t.attrs.content||"");case"forward":return d("span",{class:"message-text-content"},`[转发消息 ${t.attrs.id}]`||"[转发消息]");case"img":case"image":const x=t.attrs.src||t.attrs.url||t.attrs.file;return d("div",{class:"message-image-container"},[d(W,{src:x,alt:t.attrs.summary||"图片",filename:t.attrs.filename||t.attrs.summary||"",channelKey:e.channelKey})]);case"mface":const C=t.attrs.src||t.attrs.url||t.attrs.file;return d("div",{class:"message-image-container"},[d(W,{src:C,alt:t.attrs.summary||"表情",filename:t.attrs.emojiId||t.attrs.summary||"",channelKey:e.channelKey})]);case"face":if((s=(n=t.children[0])==null?void 0:n.attrs)!=null&&s.src){const b=((r=(l=t.children[0])==null?void 0:l.attrs)==null?void 0:r.src)||((c=(o=t.children[0])==null?void 0:o.attrs)==null?void 0:c.url);return d("div",{class:"message-image-container"},[d(W,{src:b,alt:t.attrs.name||t.attrs.id||"[表情]",filename:t.attrs.name||t.attrs.id||"[表情]",channelKey:e.channelKey})])}else return d("span",{class:"message-text-content"},`[${t.attrs.name||t.attrs.id}]`||"[表情]");case"at":return d("span",{class:"message-at",title:t.attrs.name},`${t.attrs.name||t.attrs.id}`);case"json":return d("div",{class:"message-image-container"},[d(pe,{data:t.attrs.data||"",channelKey:e.channelKey})]);default:return d("span",{class:"message-unknown",title:`未知消息类型: ${t.type}`},t.attrs.content||`[${t.type}]`)}};return()=>a(e.element)}}),u=v({bots:{},channels:{},messages:{}}),N=v({}),we=v({maxMessagesPerChannel:1e3,keepMessagesOnClear:50,loggerinfo:false,blockedPlatforms:[],chatContainerHeight:80}),$=v({});let k=null;const h=v(""),w=v(""),E=v(""),S=v(false),X=v("bots"),P=v(null),J=v(null),be=v(false),Y=v({show:false,text:""}),I=v(),ee=v(),xe=v(false),ue=v(false),V=v(false),j=v(""),T=v({x:0,y:0}),B=v({x:0,y:0}),Me=v({x:0,y:0}),Ce=v({x:0,y:0}),Ie=v(0),D=v(null),G=v(false),g=v(null),y=v({show:false,x:0,y:0,type:null,targetId:"",isSecondClick:false}),U=v(new Set),O=v(new Set),Ve=q(()=>Object.values(u.value.bots).sort((a,t)=>{const n=U.value.has(a.selfId),s=U.value.has(t.selfId);return n&&!s?-1:!n&&s?1:0})),Ge=q(()=>!h.value||!u.value.channels[h.value]?[]:Object.values(u.value.channels[h.value]).sort((a,t)=>{const n=O.value.has(`${h.value}:${a.id}`),s=O.value.has(`${h.value}:${t.id}`);return n&&!s?-1:!n&&s?1:0})),Te=q(()=>{if(!h.value||!w.value)return[];const e=`${h.value}:${w.value}`,a=u.value.messages[e]||[];return a.filter(t=>t.quote),a}),Qe=q(()=>{var a;if(!h.value||!w.value)return"";const e=u.value.channels[h.value];return((a=e==null?void 0:e[w.value])==null?void 0:a.name)||""}),de=q(()=>!h.value||!w.value?"":`${h.value}:${w.value}`),De=q(()=>h.value&&w.value&&E.value.trim()&&!V.value),Ze=q(()=>h.value&&w.value&&!V.value),Ee=q(()=>{if(!S.value)return"";switch(X.value){case"channels":return"show-channels";case"messages":return"show-messages";default:return""}}),et=q(()=>S.value?"屏幕左滑返回,上滑唤起聊天框":"输入消息..."),tt=q(()=>{if(S.value){const e=we.value.chatContainerHeight||80,a=100-e-19;return{height:`${e}vh`,marginTop:`${a}vh`}}return{}});function at(e){h.value=e,w.value="",S.value&&(X.value="channels")}function nt(e,a){if(e.preventDefault(),e.stopPropagation(),y.value.show&&y.value.type==="bot"&&y.value.targetId===a){A();return}qe(e,"bot",a)}function st(e,a){if(e.preventDefault(),e.stopPropagation(),y.value.show&&y.value.type==="channel"&&y.value.targetId===a){A();return}qe(e,"channel",a)}function qe(e,a,t){let l=e.clientX,r=e.clientY;l+180>window.innerWidth&&(l=window.innerWidth-180-10),r+80>window.innerHeight&&(r=window.innerHeight-80-10),y.value={show:true,x:l,y:r,type:a,targetId:t,isSecondClick:false},document.addEventListener("click",A,{once:true}),document.addEventListener("keydown",Le)}function A(){y.value.show=false,document.removeEventListener("click",A),document.removeEventListener("keydown",Le)}function Le(e){e.key==="Escape"&&y.value.show&&A()}async function lt(e){U.value.has(e)?U.value.delete(e):U.value.add(e),await M("set-pinned-bots",{pinnedBots:Array.from(U.value)}),A()}async function ot(e){const a=`${h.value}:${e}`;O.value.has(a)?O.value.delete(a):O.value.add(a),await M("set-pinned-channels",{pinnedChannels:Array.from(O.value)}),A()}async function rt(e){try{const a=await M("delete-bot-data",{selfId:e});if(a.success){const t=Object.keys(u.value.messages).filter(n=>n.startsWith(`${e}:`));for(const n of t)delete u.value.messages[n],delete N.value[n],await ge(n);delete u.value.bots[e],delete u.value.channels[e],h.value===e&&(h.value="",w.value=""),_(a.message||"已删除该机器人的所有数据","success")}else throw new Error(a.error||"删除失败")}catch(a){console.error("删除机器人数据失败:",a),_("删除失败: "+((a==null?void 0:a.message)||String(a)),"error")}A()}async function ct(e){try{const a=await M("delete-channel-data",{selfId:h.value,channelId:e});if(a.success){const t=`${h.value}:${e}`;delete u.value.messages[t],delete N.value[t],u.value.channels[h.value]&&delete u.value.channels[h.value][e],await ge(t),w.value===e&&(w.value=""),_(a.message||"已删除该频道的所有数据","success")}else throw new Error(a.error||"删除失败")}catch(a){console.error("删除频道数据失败:",a),_("删除失败: "+((a==null?void 0:a.message)||String(a)),"error")}A()}async function it(e){w.value=e,ue.value=false,S.value&&(X.value="messages"),h.value&&await Ct(h.value,e),se(()=>{te(),!S.value&&ee.value&&ee.value.focus()})}async function Ke(){if(!De.value)return;const e=E.value.trim();if(e){V.value=true;try{const a=await M("send-message",{selfId:h.value,channelId:w.value,content:e});a.success?E.value="":(console.error("消息发送失败:",a.error),_("发送失败: "+a.error,"error"))}catch(a){console.error("发送消息时出错:",a),_("发送失败: "+((a==null?void 0:a.message)||String(a)),"error")}finally{V.value=false}}}function Ne(e){return new Date(e).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"})}function ut(e){if(typeof e=="number")switch(e){case 0:return"文本";case 1:return"私聊";default:return"未知"}return String(e)}function te(){I.value&&(I.value.scrollTop=I.value.scrollHeight,xe.value=false,ue.value=false)}function ve(){if(I.value){const{scrollTop:e,scrollHeight:a,clientHeight:t}=I.value,s=a-(e+t)<=50,l=!s;xe.value=l,s?ue.value=false:ue.value=true}}function Pe(){if(!I.value)return true;const{scrollTop:e,scrollHeight:a,clientHeight:t}=I.value;return a-(e+t)<=200}function ke(e){var n;if(!h.value)return 0;const a=`${h.value}:${e}`,t=N.value[a];return t!==void 0?t:((n=u.value.messages[a])==null?void 0:n.length)||0}function je(e,a){e.preventDefault(),e.stopPropagation();const t="touches"in e?e.touches[0].clientX:e.clientX,n="touches"in e?e.touches[0].clientY:e.clientY;Ie.value=Date.now(),T.value={x:t,y:n},B.value={x:t,y:n},G.value=false;const l=e.target.getBoundingClientRect();Me.value={x:l.left,y:l.top},Ce.value={x:t-l.left,y:n-l.top},D.value=window.setTimeout(()=>{if(Ie.value>0){G.value=true,j.value=a;const r=e.target,o=r.cloneNode(true);o.classList.add("dragging-clone"),o.style.position="fixed",o.style.zIndex="1000",o.style.pointerEvents="none";const c=r.getBoundingClientRect();o.style.left=`${c.left}px`,o.style.top=`${c.top}px`,o.style.width=`${c.width}px`,o.style.height=`${c.height}px`,document.body.appendChild(o),g.value=o,document.body.style.userSelect="none",document.body.style.cursor="grabbing",document.body.classList.add("dragging-bubble-global"),ht(T.value.x,T.value.y)}},60),document.addEventListener("mousemove",he),document.addEventListener("mouseup",fe),document.addEventListener("touchmove",he),document.addEventListener("touchend",fe)}function he(e){if(!G.value||!g.value)return;e.preventDefault();const a="touches"in e?e.touches[0].clientX:e.clientX,t="touches"in e?e.touches[0].clientY:e.clientY;B.value={x:a,y:t};const n=B.value.x-T.value.x,s=B.value.y-T.value.y,l=Math.sqrt(n*n+s*s),r=Math.max(.3,1-l/(K*2)),o=Math.max(.8,1-l/(K*3)),c=l>K,x=B.value.x-Ce.value.x,C=B.value.y-Ce.value.y;g.value.style.left=`${x}px`,g.value.style.top=`${C}px`,g.value.style.transform=`scale(${o})`,g.value.style.opacity=`${r}`,g.value.style.backgroundColor=c?"#f44336":"#2196f3",g.value.style.boxShadow=c?"0 4px 12px rgba(244, 67, 54, 0.4)":"0 4px 12px rgba(33, 150, 243, 0.4)",c?g.value.classList.add("will-delete"):g.value.classList.remove("will-delete")}function fe(e){if(D.value&&(clearTimeout(D.value),D.value=null),D.value&&(clearTimeout(D.value),D.value=null),!G.value||!j.value){me();return}const a=j.value;if(Math.sqrt(Math.pow(B.value.x-T.value.x,2)+Math.pow(B.value.y-T.value.y,2))>K)vt(a),me();else if(g.value){g.value.style.transition="all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)";const n=document.querySelector(`[data-channel-id="${a}"] .channel-message-count`);if(n){const s=n.getBoundingClientRect();g.value.style.left=`${s.left}px`,g.value.style.top=`${s.top}px`,g.value.style.transform="scale(1)",g.value.style.opacity="1",g.value.style.backgroundColor="#2196f3",g.value.style.boxShadow="0 4px 12px rgba(33, 150, 243, 0.4)"}setTimeout(()=>{me()},300)}else me()}function me(){D.value&&(clearTimeout(D.value),D.value=null),j.value="",T.value={x:0,y:0},B.value={x:0,y:0},Me.value={x:0,y:0},Ie.value=0,G.value=false,document.removeEventListener("mousemove",he),document.removeEventListener("mouseup",fe),document.removeEventListener("touchmove",he),document.removeEventListener("touchend",fe),document.body.style.userSelect="",document.body.style.cursor="",document.body.classList.remove("dragging-bubble-global"),g.value&&g.value.parentNode&&(g.value.parentNode.removeChild(g.value),g.value=null),ft()}function dt(e){return j.value===e&&G.value?{visibility:"hidden",pointerEvents:"none",transition:"none"}:{}}function Ue(e){if(j.value!==e)return 0;const a=B.value.x-T.value.x,t=B.value.y-T.value.y;return Math.sqrt(a*a+t*t)}async function vt(e){if(h.value)try{const a=`${h.value}:${e}`,t=ke(e),n=we.value.keepMessagesOnClear;if(n>0&&t<=n){_("当前消息还很少诶~ 无需清理","success");return}const s=await M("clear-channel-history",{selfId:h.value,channelId:e});if(s.success)if(s.clearedCount&&s.clearedCount>0){if(u.value.messages[a]){const r=[...u.value.messages[a]].sort((o,c)=>o.timestamp-c.timestamp);u.value.messages[a]=r.slice(-s.keptCount)}N.value[a]=s.keptCount,await ge(a),_(`历史记录已清理,清理了 ${s.clearedCount} 条消息,保留最新 ${s.keptCount} 条`,"success")}else n===0?(u.value.messages[a]&&(u.value.messages[a]=[]),N.value[a]=0,await ge(a),_("历史记录已清理,所有消息已删除","success")):_("当前消息还很少诶~ 无需清理","success");else console.error("清理历史记录失败:",s.error),_("清理失败: "+s.error,"error")}catch(a){console.error("清理历史记录时出错:",a),_("清理失败: "+((a==null?void 0:a.message)||String(a)),"error")}}function _(e,a="success"){const t=document.createElement("div");t.className=`notification ${a}`,t.textContent=e;let n="#4caf50";switch(a){case"info":n="#2196f3";break;case"warn":n="#ff9800";break;case"error":n="#f44336";break;case"success":n="#4caf50";break}t.style.cssText=`
2
+ position: fixed;
3
+ top: 20px;
4
+ right: 20px;
5
+ padding: 12px 20px;
6
+ border-radius: 6px;
7
+ color: white;
8
+ font-weight: 500;
9
+ z-index: 10000;
10
+ animation: slideIn 0.3s ease-out;
11
+ background: ${n};
12
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
13
+ `;const s=document.createElement("style");s.textContent=`
14
+ @keyframes slideIn {
15
+ from { transform: translateX(100%); opacity: 0; }
16
+ to { transform: translateX(0); opacity: 1; }
17
+ }
18
+ @keyframes slideOut {
19
+ from { transform: translateX(0); opacity: 1; }
20
+ to { transform: translateX(100%); opacity: 0; }
21
+ }
22
+ `,document.head.appendChild(s),document.body.appendChild(t),setTimeout(()=>{t.style.animation="slideOut 0.3s ease-in",setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),s.parentNode&&s.parentNode.removeChild(s)},300)},3e3)}function ht(e,a){const t=document.createElement("div");t.className="drag-threshold-circle",t.style.cssText=`
23
+ left: ${e-K}px;
24
+ top: ${a-K}px;
25
+ width: ${K*2}px;
26
+ height: ${K*2}px;
27
+ `,document.body.appendChild(t),window.dragThresholdCircle=t}function ft(){const e=window.dragThresholdCircle;e&&e.parentNode&&(e.parentNode.removeChild(e),window.dragThresholdCircle=null)}async function mt(){return new Promise((e,a)=>{const t=indexedDB.open(ba,xa);t.onerror=()=>{console.error("IndexedDB初始化失败:",t.error),e(false)},t.onsuccess=()=>{k=t.result,e(true)},t.onupgradeneeded=n=>{const s=n.target.result;if(!s.objectStoreNames.contains(L)){const l=s.createObjectStore(L,{keyPath:"url"});l.createIndex("channelKey","channelKey",{unique:false}),l.createIndex("timestamp","timestamp",{unique:false})}}})}async function gt(e){return k?new Promise((a,t)=>{const l=k.transaction([L],"readonly").objectStore(L).get(e);l.onsuccess=()=>{a(l.result||null)},l.onerror=()=>{console.error("从IndexedDB获取图片失败:",l.error),a(null)}}):null}async function Oe(e){return k?new Promise(a=>{const s=k.transaction([L],"readwrite").objectStore(L).put(e);s.onsuccess=()=>{a(true)},s.onerror=()=>{console.error("保存图片到IndexedDB失败:",s.error),a(false)}}):false}async function Ae(e){return k?new Promise(a=>{const s=k.transaction([L],"readwrite").objectStore(L).delete(e);s.onsuccess=()=>{a(true)},s.onerror=()=>{console.error("从IndexedDB删除图片失败:",s.error),a(false)}}):false}async function Re(e){return k?new Promise(a=>{const l=k.transaction([L],"readonly").objectStore(L).index("channelKey").getAll(e);l.onsuccess=()=>{a(l.result||[])},l.onerror=()=>{console.error("获取频道图片失败:",l.error),a([])}}):[]}async function _e(e,a){const t=$.value[a];if(t)return t;const n=await gt(a);if(!n)return null;const s=URL.createObjectURL(n.blob);return $.value[a]=s,n.timestamp=Date.now(),await Oe(n),s}async function ae(e,a){try{const t=await _e(e,a);if(t)return t;const n=await M("fetch-image",{url:a});if(!n.success)return console.error("获取图片失败:",n.error),null;const s=n.base64,l=n.contentType||"image/jpeg",r=atob(s),o=new Array(r.length);for(let ne=0;ne<r.length;ne++)o[ne]=r.charCodeAt(ne);const c=new Uint8Array(o),x=new Blob([c],{type:l}),C=await Re(e);if(C.length>=We){const St=C.sort((Q,Bt)=>Q.timestamp-Bt.timestamp).slice(0,C.length-We+1);for(const Q of St)await Ae(Q.url),$.value[Q.url]&&(URL.revokeObjectURL($.value[Q.url]),delete $.value[Q.url])}const b={url:a,blob:x,timestamp:Date.now(),size:x.size,channelKey:e};if(!await Oe(b))return console.error("保存图片到IndexedDB失败"),null;const He=URL.createObjectURL(x);return $.value[a]=He,He}catch(t){return console.error("缓存图片失败:",t),null}}async function ge(e){try{const a=await Re(e);for(const t of a)await Ae(t.url),$.value[t.url]&&(URL.revokeObjectURL($.value[t.url]),delete $.value[t.url])}catch(a){console.error("清理频道图片缓存失败:",a)}}function yt(e){var a,t,n,s;if(!u.value.bots[e.selfId])u.value.bots[e.selfId]={selfId:e.selfId,platform:e.platform,username:((a=e.bot)==null?void 0:a.name)||`Bot-${e.selfId}`,avatar:(t=e.bot)==null?void 0:t.avatar,status:"online"};else{const l=u.value.bots[e.selfId];l.status="online",(n=e.bot)!=null&&n.name&&l.username!==e.bot.name&&(l.username=e.bot.name),(s=e.bot)!=null&&s.avatar&&l.avatar!==e.bot.avatar&&(l.avatar=e.bot.avatar)}if(u.value.channels[e.selfId]||(u.value.channels[e.selfId]={}),e.channelId&&!u.value.channels[e.selfId][e.channelId]){const l=e.guildId?`${e.guildName||e.guildId} (${e.channelId})`:`私信 ${e.channelId}`;u.value.channels[e.selfId][e.channelId]={id:e.channelId,name:l,type:e.channelType||0,guildId:e.guildId,guildName:e.guildName||e.guildId||"私聊"}}if(e.messageId&&e.content&&e.channelId){const l=`${e.selfId}:${e.channelId}`;if(u.value.messages[l]||(u.value.messages[l]=[]),!u.value.messages[l].find(o=>o.id===e.messageId)){const o={id:e.messageId,content:e.content,userId:e.userId,username:e.username,avatar:e.avatar,timestamp:e.timestamp,channelId:e.channelId,selfId:e.selfId,elements:e.elements,isBot:false,quote:e.quote},c=u.value.messages[l];let x=c.length;for(let b=c.length-1;b>=0;b--){if(c[b].timestamp<=e.timestamp){x=b+1;break}b===0&&(x=0)}c.splice(x,0,o),c.length>100&&(u.value.messages[l]=c.slice(-100)),N.value[l]=c.length;const C=Pe();se(()=>{setTimeout(()=>{C&&te()},10)})}}if(e.elements&&e.elements.length>0){const l=`${e.selfId}:${e.channelId}`;e.elements.forEach(r=>{if((r.type==="img"||r.type==="image"||r.type==="mface")&&r.attrs){const o=r.attrs.src||r.attrs.url||r.attrs.file;o&&ae(l,o).catch(c=>{console.warn("预缓存图片失败:",o,c)})}})}u.value={...u.value}}function pt(e){const a=`${e.selfId}:${e.channelId}`;if(u.value.messages[a]||(u.value.messages[a]=[]),!u.value.messages[a].find(n=>n.id===e.messageId)){const n={id:e.messageId,content:e.content,userId:e.selfId,username:e.botUsername,avatar:e.botAvatar,timestamp:e.timestamp,channelId:e.channelId,selfId:e.selfId,elements:e.elements,isBot:true,quote:e.quote},s=u.value.messages[a];let l=s.length;for(let o=s.length-1;o>=0;o--){if(s[o].timestamp<=e.timestamp){l=o+1;break}o===0&&(l=0)}s.splice(l,0,n),s.length>100&&(u.value.messages[a]=s.slice(-100)),N.value[a]=s.length;const r=Pe();se(()=>{setTimeout(()=>{r&&te()},10)})}u.value={...u.value}}Xe(Te,(e,a)=>{a.length===0&&e.length>0&&se(()=>{te()})});async function wt(){try{const e=await M("get-chat-data");if(e.success&&e.data){const a={};U.value=new Set(e.data.pinnedBots||[]),O.value=new Set(e.data.pinnedChannels||[]);for(const[t,n]of Object.entries(e.data.messages||{})){const s=n.map(c=>({id:c.id,content:c.content,userId:c.userId,username:c.username,avatar:c.avatar,timestamp:c.timestamp,channelId:c.channelId,selfId:c.selfId,elements:c.elements,isBot:c.type==="bot",quote:c.quote}));s.sort((c,x)=>c.timestamp-x.timestamp);const[l,r]=t.split("-"),o=`${l}:${r}`;a[o]=s}return u.value={bots:e.data.bots||{},channels:e.data.channels||{},messages:a},await bt(),true}else return console.warn("获取聊天数据失败:",e.error),false}catch(e){return console.error("获取聊天数据时出错:",e),false}}async function bt(){try{const e=await M("get-all-channel-message-counts");if(e.success&&e.counts){const a={};for(const[t,n]of Object.entries(e.counts)){const[s,l]=t.split("-"),r=`${s}:${l}`;a[r]=n}N.value=a}else console.warn("获取频道消息数量失败:",e.error)}catch(e){console.error("获取频道消息数量时出错:",e)}}async function xt(){try{const e=await M("get-plugin-config");e.success&&e.config?we.value=e.config:console.warn("获取插件配置失败:",e.error)}catch(e){console.error("获取插件配置时出错:",e)}}async function Ct(e,a){try{const t=await M("get-history-messages",{selfId:e,channelId:a});if(t.success&&t.messages){const n=`${e}:${a}`,s=t.messages.map(l=>({id:l.id,content:l.content,userId:l.userId,username:l.username,avatar:l.avatar,timestamp:l.timestamp,channelId:l.channelId,selfId:l.selfId,elements:l.elements,isBot:l.type==="bot",quote:l.quote}));return s.sort((l,r)=>l.timestamp-r.timestamp),u.value.messages[n]=s,N.value[n]=s.length,u.value={...u.value},true}else return console.warn("获取历史消息失败:",t.error),false}catch(t){return console.error("获取历史消息时出错:",t),false}}function It(e){if(!S.value||e.touches.length!==1)return;const a=e.touches[0];P.value={x:a.clientX,y:a.clientY,time:Date.now()},J.value={x:a.clientX,y:a.clientY},be.value=false}function kt(e){if(!S.value||!P.value||e.touches.length!==1)return;const a=e.touches[0];J.value={x:a.clientX,y:a.clientY};const t=a.clientX-P.value.x,n=a.clientY-P.value.y;if(Math.abs(t)>Math.abs(n)&&Math.abs(t)>30){const s=t>0,l=X.value==="messages"||X.value==="channels";if(s&&l){be.value=true;const r=Math.min(t,150),o=100;r>o?Y.value={show:true,text:"松开返回"}:Y.value={show:true,text:`滑动返回 ${Math.round(r/o*100)}%`},e.preventDefault()}else Y.value={show:false,text:""}}else Y.value={show:false,text:""}}function _t(e){if(!S.value||!P.value)return;const t=Date.now()-P.value.time;if(J.value){const n=J.value.x-P.value.x,s=J.value.y-P.value.y,l=n>100,r=Math.abs(n)>Math.abs(s),o=t<300&&n>50;(l&&r||o)&&$t()}P.value=null,J.value=null,be.value=false,Y.value={show:false,text:""}}function $t(){switch(X.value){case"messages":X.value="channels";break;case"channels":X.value="bots",h.value="",w.value="";break}}function $e(){S.value=window.innerWidth<=768}return Se(async()=>{$e(),window.addEventListener("resize",$e),await mt()||console.warn("IndexedDB初始化失败,图片缓存功能将不可用"),await xt(),await wt();const a=Fe("chat-message-event",yt),t=Fe("bot-message-sent-event",pt);Xe(w,n=>{n&&se(()=>{I.value&&(I.value.removeEventListener("scroll",ve),I.value.addEventListener("scroll",ve),ve()),!S.value&&ee.value&&ee.value.focus()})},{immediate:true}),Mt(()=>{window.removeEventListener("resize",$e),a&&typeof a=="function"&&a(),t&&typeof t=="function"&&t(),I.value&&I.value.removeEventListener("scroll",ve),Object.values($.value).forEach(n=>{URL.revokeObjectURL(n)}),$.value={},k&&(k.close(),k=null)})}),(e,a)=>(f(),m("div",{class:z(["chat-container",Ee.value]),style:Be(tt.value),onTouchstart:It,onTouchmove:kt,onTouchend:_t},[i("div",Pt,[a[6]||(a[6]=i("div",{class:"panel-header"},[i("h3",null,"机器人")],-1)),i("div",jt,[(f(true),m(R,null,oe(Ve.value,t=>(f(),m("div",{key:t.selfId,class:z(["bot-item",{active:h.value===t.selfId,pinned:U.value.has(t.selfId)}]),onClick:n=>at(t.selfId),onContextmenu:n=>nt(n,t.selfId)},[i("div",Ot,[t.avatar?(f(),re(ce(H),{key:0,src:t.avatar,alt:t.username,"channel-key":"bot-list"},null,8,["src","alt"])):(f(),m("div",At,p(t.username.charAt(0).toUpperCase()),1))]),i("div",Rt,[i("div",Ht,p(t.username),1),i("div",Xt,p(t.platform),1)]),i("div",{class:z(["bot-status",t.status])},null,2)],42,Ut))),128))])]),i("div",zt,[a[7]||(a[7]=i("div",{class:"panel-header"},[i("h3",null,"频道")],-1)),h.value?(f(),m("div",Ft,[(f(true),m(R,null,oe(Ge.value,t=>(f(),m("div",{key:t.id,class:z(["channel-item",{active:w.value===t.id,pinned:O.value.has(`${h.value}:${t.id}`)}]),"data-channel-id":t.id,onClick:n=>it(t.id),onContextmenu:n=>st(n,t.id)},[i("div",Jt,[i("div",Vt,p(t.name),1),i("div",Gt,p(ut(t.type)),1)]),ke(t.id)>0?(f(),m("div",{key:0,class:z(["channel-message-count draggable-bubble",{dragging:j.value===t.id,"will-delete":j.value===t.id&&Ue(t.id)>K}]),onMousedown:n=>je(n,t.id),onTouchstart:n=>je(n,t.id),style:Be(dt(t.id)),title:j.value===t.id?Ue(t.id)>K?"松开清理历史记录":"拖拽更远以清理历史记录":"拖拽清理历史记录"},p(ke(t.id)),47,Qt)):le("",true)],42,Wt))),128))])):(f(),m("div",Yt," 请选择一个机器人 "))]),i("div",Zt,[i("div",Et,[i("h3",null,p(Qe.value||"选择频道"),1)]),!h.value||!w.value?(f(),m("div",ea," 请选择机器人和频道 ")):(f(),m("div",ta,[i("div",{class:"message-history",ref_key:"messageHistory",ref:I},[(f(true),m(R,null,oe(Te.value,t=>(f(),m("div",{key:t.id,class:z(["message-item",{"bot-message":t.isBot}])},[i("div",aa,[t.avatar?(f(),re(ce(H),{key:0,src:t.avatar,alt:t.username,"channel-key":de.value},null,8,["src","alt","channel-key"])):(f(),m("div",na,p(t.username.charAt(0).toUpperCase()),1))]),i("div",sa,[i("div",la,[i("span",oa,p(t.username),1),i("span",ra,p(Ne(t.timestamp)),1)]),t.quote?(f(),m("div",ca,[i("div",ia,[i("div",ua,[t.quote.user.avatar?(f(),re(ce(H),{key:0,src:t.quote.user.avatar,alt:t.quote.user.username,"channel-key":de.value},null,8,["src","alt","channel-key"])):(f(),m("div",da,p(t.quote.user.username.charAt(0).toUpperCase()),1))]),i("span",va,p(t.quote.user.username),1),i("span",ha,p(Ne(t.quote.timestamp)),1)]),i("div",fa,[t.quote.elements&&t.quote.elements.length>0?(f(true),m(R,{key:0},oe(t.quote.elements,(n,s)=>(f(),re(ce(ie),{key:`quote-${s}`,element:n,"channel-key":de.value},null,8,["element","channel-key"]))),128)):(f(),m(R,{key:1},[Ye(p(t.quote.content),1)],64))])])):le("",true),i("div",ma,[t.elements&&t.elements.length>0?(f(true),m(R,{key:0},oe(t.elements,(n,s)=>(f(),re(ce(ie),{key:s,element:n,"channel-key":de.value},null,8,["element","channel-key"]))),128)):(f(),m(R,{key:1},[Ye(p(t.content),1)],64))])])],2))),128))],512),ze(i("div",{class:"floating-scroll-button",onClick:te},a[8]||(a[8]=[i("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor"},[i("path",{d:"M7 10l5 5 5-5z"})],-1)]),512),[[Tt,xe.value]]),i("div",ga,[i("div",ya,[ze(i("input",{"onUpdate:modelValue":a[0]||(a[0]=t=>E.value=t),type:"text",placeholder:et.value,onKeyup:Dt(Ke,["enter"]),disabled:!Ze.value,ref_key:"messageInput",ref:ee},null,40,pa),[[qt,E.value]]),i("button",{onClick:Ke,disabled:!De.value,class:z({"is-sending":V.value})},p(V.value?"发送中...":"发送"),11,wa)])])]))]),y.value.show?(f(),m("div",{key:0,class:"context-menu",style:Be({left:y.value.x+"px",top:y.value.y+"px"}),onClick:a[5]||(a[5]=Lt(()=>{},["stop"]))},[y.value.type==="bot"?(f(),m(R,{key:0},[i("div",{class:"context-menu-item",onClick:a[1]||(a[1]=t=>lt(y.value.targetId))},p(U.value.has(y.value.targetId)?"取消置顶":"置顶"),1),i("div",{class:"context-menu-item danger",onClick:a[2]||(a[2]=t=>rt(y.value.targetId))}," 彻底删除此机器人所有数据 ")],64)):le("",true),y.value.type==="channel"?(f(),m(R,{key:1},[i("div",{class:"context-menu-item",onClick:a[3]||(a[3]=t=>ot(y.value.targetId))},p(O.value.has(`${h.value}:${y.value.targetId}`)?"取消置顶":"置顶"),1),i("div",{class:"context-menu-item danger",onClick:a[4]||(a[4]=t=>ct(y.value.targetId))}," 彻底删除此频道所有数据 ")],64)):le("",true)],4)):le("",true),i("div",{class:z(["swipe-indicator",{show:Y.value.show}])},p(Y.value.text),3)],38))}}),Je=(F,H)=>{const W=F.__vccOpts||F;for(const[pe,ie]of H)W[pe]=ie;return W},Ia=Je(Ca,[["__scopeId","data-v-23dd8b18"]]),ka={},_a={class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none"};function $a(F,H){return f(),m("svg",_a,H[0]||(H[0]=[i("path",{d:"M8 10.5H16",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),i("path",{d:"M8 14H13.5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),i("path",{d:"M17 3.33782C15.5291 2.48697 13.8214 2 12 2C6.47715 2 2 6.47715 2 12C2 13.5997 2.37562 15.1116 3.04346 16.4525C3.22094 16.8088 3.28001 17.2161 3.17712 17.6006L2.58151 19.8267C2.32295 20.793 3.20701 21.677 4.17335 21.4185L6.39939 20.8229C6.78393 20.72 7.19121 20.7791 7.54753 20.9565C8.88837 21.6244 10.4003 22 12 22C17.5228 22 22 17.5228 22 12C22 10.1786 21.513 8.47087 20.6622 7",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1)]))}const Sa=Je(ka,[["render",$a]]);Nt.register("activity:chat",Sa);const Ta=F=>{F.page({name:"聊天室",path:"/chat-patch",desc:"",authority:4,icon:"activity:chat",component:Z({setup(){return()=>d(Kt("k-layout"),{},{default:()=>d(Ia)})}})})};export{Ta as default};
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .message-quote[data-v-23dd8b18]{margin:8px 0;padding:8px 12px;background-color:#bebebe1a;border-left:4px solid rgba(151,152,152,.45);border-radius:6px;font-size:.9em;position:relative}.quote-indicator[data-v-23dd8b18]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-23dd8b18]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-23dd8b18]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-23dd8b18]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-23dd8b18]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#6c757d;color:#fff;font-size:10px;font-weight:700}.quote-username[data-v-23dd8b18]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-23dd8b18]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-23dd8b18]{color:#7276b7;line-height:1.3;word-wrap:break-word}.quote-content .message-image[data-v-23dd8b18]{max-width:200px;max-height:100px}.quote-content .message-image-container[data-v-23dd8b18]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-23dd8b18]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-23dd8b18]{color:#adb5bd}.quote-username[data-v-23dd8b18]{color:#0d6efd}}.chat-container[data-v-23dd8b18]{display:flex;height:100vh;background:transparent;margin-left:0%;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-23dd8b18],.channel-list[data-v-23dd8b18],.message-area[data-v-23dd8b18]{display:flex;flex-direction:column;background:transparent;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-23dd8b18]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-23dd8b18]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-23dd8b18]{flex:1;border-right:none}.panel-header[data-v-23dd8b18]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:transparent;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-23dd8b18]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-23dd8b18]{display:none;background:none;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-23dd8b18]:hover{background:#8080801a}.bot-items[data-v-23dd8b18],.channel-items[data-v-23dd8b18]{flex:1;overflow-y:auto;max-height:calc(100vh - 60px)}.bot-item[data-v-23dd8b18],.channel-item[data-v-23dd8b18]{display:flex;align-items:center;padding:12px 16px;cursor:pointer;border-bottom:1px solid rgba(128,128,128,.1);transition:background-color .2s}.bot-item[data-v-23dd8b18]:hover,.channel-item[data-v-23dd8b18]:hover{background:#8080801a}.bot-item.active[data-v-23dd8b18],.channel-item.active[data-v-23dd8b18]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-23dd8b18]{width:40px;height:40px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0}.bot-avatar img[data-v-23dd8b18]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-23dd8b18]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-23dd8b18]{flex:1}.bot-name[data-v-23dd8b18]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-23dd8b18]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-23dd8b18]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-23dd8b18]{background:#4caf50}.bot-status.offline[data-v-23dd8b18]{background:#f44336}.channel-info[data-v-23dd8b18]{flex:1}.channel-name[data-v-23dd8b18]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-23dd8b18]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-23dd8b18]{background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;position:relative;transition:all .2s ease}.channel-message-count.draggable-bubble[data-v-23dd8b18]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-23dd8b18]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble[data-v-23dd8b18]:active,.channel-message-count.draggable-bubble.dragging[data-v-23dd8b18]{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-23dd8b18]{position:fixed;z-index:1000;pointer-events:none;transition:none;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;box-shadow:0 4px 12px #2196f366}.dragging-clone.will-delete[data-v-23dd8b18]{background:#f44336!important;animation:shake-23dd8b18 .3s ease-in-out infinite}@keyframes pulseThreshold-23dd8b18{0%,to{opacity:.4;transform:scale(.9);border-color:#f4433699;box-shadow:0 0 15px #f4433633}50%{opacity:.8;transform:scale(1.1);border-color:#f44336;box-shadow:0 0 25px #f4433666}}.message-content[data-v-23dd8b18]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-23dd8b18]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-23dd8b18]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-23dd8b18]:hover{background-color:#8080801a}.message-item.new-message[data-v-23dd8b18]{background-color:#4caf5033;animation:highlight-23dd8b18 2s ease-out}.message-item.bot-message[data-v-23dd8b18]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-23dd8b18]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-23dd8b18]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-23dd8b18]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-23dd8b18]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-23dd8b18]{order:1}.message-item.bot-message .message-text[data-v-23dd8b18]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left}@keyframes highlight-23dd8b18{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-23dd8b18]{width:32px;height:32px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0;flex-shrink:0}.message-avatar img[data-v-23dd8b18]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-23dd8b18]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-23dd8b18]{flex:1}.message-header[data-v-23dd8b18]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-23dd8b18]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-23dd8b18]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-23dd8b18]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-word;white-space:pre-wrap;max-width:100%;overflow-wrap:break-word}.message-item:not(.bot-message) .message-text[data-v-23dd8b18]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%}.message-input[data-v-23dd8b18]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:transparent;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-23dd8b18]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-23dd8b18]{position:absolute;right:24px;bottom:18%;width:48px;height:48px;background:#2196f3;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #2196f34d;color:#fff;transition:all .3s ease;z-index:100;border:2px solid rgba(255,255,255,.2)}.floating-scroll-button[data-v-23dd8b18]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-23dd8b18]:active{transform:scale(.95)}.input-row button[data-v-23dd8b18]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-23dd8b18]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-23dd8b18]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease}.message-image-loading[data-v-23dd8b18]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-23dd8b18]{display:inline-block;padding:8px 12px;background:#f443361a;border:1px solid rgba(244,67,54,.3);border-radius:4px;color:#f44336;font-size:12px;max-width:300px;word-break:break-word}.message-at[data-v-23dd8b18]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-23dd8b18]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-23dd8b18]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:none;background:transparent;color:currentColor}.input-row input[data-v-23dd8b18]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-23dd8b18]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-23dd8b18]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;flex-shrink:0;white-space:nowrap}.input-row button[data-v-23dd8b18]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-23dd8b18]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-23dd8b18]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-23dd8b18]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-23dd8b18]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-23dd8b18]{display:inline}.message-image-container[data-v-23dd8b18]{display:block;margin:4px 0}.message-image[data-v-23dd8b18]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-23dd8b18]:hover{transform:scale(1.02)}.message-image-loading[data-v-23dd8b18]{height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3)}.message-image-error[data-v-23dd8b18]{min-height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3);padding:8px;text-align:center}.message-at[data-v-23dd8b18]{background:#2196f31a;color:#2196f3;padding:2px 6px;border-radius:4px;font-weight:500;cursor:pointer;display:inline-block;margin:0 2px}.message-at[data-v-23dd8b18]:hover{background:#2196f333}.message-unknown[data-v-23dd8b18]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-23dd8b18{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-23dd8b18]{background:#f44336!important;animation:shake-23dd8b18 .3s ease-in-out infinite}@keyframes shake-23dd8b18{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-23dd8b18]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-23dd8b18]{position:fixed;pointer-events:none;border:3px dashed rgba(244,67,54,.8);border-radius:50%;z-index:999;background:#f443361a;box-shadow:0 0 20px #f443364d;animation:pulseThreshold-23dd8b18 1.5s ease-in-out infinite}.context-menu[data-v-23dd8b18]{position:fixed;background:#ffffffa6;border:1px solid rgba(0,0,0,.1);border-radius:8px;box-shadow:0 8px 32px #00000026;z-index:10000;min-width:180px;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);overflow:hidden}.context-menu-item[data-v-23dd8b18]{padding:12px 16px;cursor:pointer;color:#333;font-size:14px;font-weight:500;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.08);position:relative}.context-menu-item[data-v-23dd8b18]:last-child{border-bottom:none}.context-menu-item[data-v-23dd8b18]:hover{background:#2196f31a;color:#1976d2;transform:translate(2px)}.context-menu-item.danger[data-v-23dd8b18]{color:#d32f2f}.context-menu-item.danger[data-v-23dd8b18]:hover{background:#f443361a;color:#c62828}.bot-item.pinned[data-v-23dd8b18],.channel-item.pinned[data-v-23dd8b18]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-23dd8b18]:before,.channel-item.pinned[data-v-23dd8b18]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-23dd8b18],.channel-item.pinned[data-v-23dd8b18]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-23dd8b18]{background:#ffffff26;border-color:#fff3;box-shadow:0 8px 32px #0006}.context-menu-item[data-v-23dd8b18]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-23dd8b18]:hover{background:#2196f333;color:#64b5f6}.context-menu-item.danger[data-v-23dd8b18]{color:#ff8a80}.context-menu-item.danger[data-v-23dd8b18]:hover{background:#f4433633;color:#ffab91}.bot-item.pinned[data-v-23dd8b18],.channel-item.pinned[data-v-23dd8b18]{background:#ffc10726}}.message-share-card[data-v-23dd8b18]{display:inline-block;width:75px;margin:8px 0;border:1px solid rgba(128,128,128,.2);border-radius:12px;background:#ffffff0d;transition:all .3s ease;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.message-share-card[data-v-23dd8b18]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-23dd8b18]{width:100%;position:relative;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:12px 12px 0 0}.share-card-image[data-v-23dd8b18]{max-width:calc(100% - 8px);width:auto;height:auto;object-fit:contain;transition:transform .3s ease;display:block;border-radius:4px}.message-share-card:hover .share-card-image[data-v-23dd8b18]{transform:scale(1.05)}.share-card-content[data-v-23dd8b18]{padding:8px}.share-card-header[data-v-23dd8b18]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-23dd8b18]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-23dd8b18]{flex:1;min-width:0}.share-card-app-name[data-v-23dd8b18]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-23dd8b18]{font-size:10px;font-weight:600;color:currentColor;line-height:1.2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.share-card-desc[data-v-23dd8b18]{font-size:14px;color:currentColor;opacity:.8;line-height:1.4;margin-bottom:12px;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.share-card-link-hint[data-v-23dd8b18]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-23dd8b18]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-23dd8b18]:after{transform:translate(2px)}.message-json-error[data-v-23dd8b18],.message-json-raw[data-v-23dd8b18]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-23dd8b18]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-23dd8b18]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-23dd8b18]{margin-top:8px}.json-raw-data summary[data-v-23dd8b18]{cursor:pointer;font-size:12px;color:#2196f3;font-weight:500;padding:4px 8px;border-radius:4px;background:#2196f31a;display:inline-block;transition:background-color .2s ease}.json-raw-data summary[data-v-23dd8b18]:hover{background:#2196f333}.json-raw-content[data-v-23dd8b18]{margin-top:8px;padding:12px;background:#8080801a;border-radius:8px;font-family:Courier New,monospace;font-size:12px;color:currentColor;opacity:.8;white-space:pre-wrap;word-wrap:break-word;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-23dd8b18]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-23dd8b18]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-23dd8b18]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-23dd8b18]{position:relative}.bot-list[data-v-23dd8b18],.channel-list[data-v-23dd8b18],.message-area[data-v-23dd8b18]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-23dd8b18]{transform:translate(0);z-index:3}.channel-list[data-v-23dd8b18]{transform:translate(100%);z-index:2}.message-area[data-v-23dd8b18]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-23dd8b18]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-23dd8b18]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-23dd8b18]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-23dd8b18]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-23dd8b18]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-23dd8b18]{transform:translate(0);z-index:3}.back-button[data-v-23dd8b18]{display:none!important}.panel-header[data-v-23dd8b18]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-23dd8b18]{text-align:right}.floating-scroll-button[data-v-23dd8b18]{right:16px;bottom:70px;width:40px;height:40px}.message-input[data-v-23dd8b18]{padding:8px 12px 12px;position:fixed;bottom:0;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10}.input-row input[data-v-23dd8b18]{font-size:16px;padding:10px 12px}.input-row button[data-v-23dd8b18]{padding:10px 16px;font-size:16px}.message-history[data-v-23dd8b18]{padding:12px 12px 80px;max-height:calc(100vh - 140px)}.message-item[data-v-23dd8b18]{margin-bottom:12px;padding:6px}.message-avatar[data-v-23dd8b18]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-23dd8b18]{margin-left:8px}.message-image[data-v-23dd8b18]{max-width:280px;max-height:160px}.quote-content .message-image[data-v-23dd8b18]{max-width:150px;max-height:80px}.context-menu[data-v-23dd8b18]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-23dd8b18]{padding:14px 16px;font-size:16px}.bot-item[data-v-23dd8b18],.channel-item[data-v-23dd8b18]{padding:14px 16px}.bot-avatar[data-v-23dd8b18]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-23dd8b18],.channel-name[data-v-23dd8b18]{font-size:15px}.bot-platform[data-v-23dd8b18],.channel-type[data-v-23dd8b18]{font-size:13px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-23dd8b18]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-23dd8b18]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-23dd8b18]{max-width:350px;max-height:180px}}.chat-container.swiping[data-v-23dd8b18]{overflow:hidden}.bot-list.swiping[data-v-23dd8b18],.channel-list.swiping[data-v-23dd8b18],.message-area.swiping[data-v-23dd8b18]{transition:none!important}.swipe-indicator[data-v-23dd8b18]{position:fixed;top:50%;left:20px;transform:translateY(-50%);background:#2196f3cc;color:#fff;padding:8px 12px;border-radius:20px;font-size:14px;z-index:1000;opacity:0;transition:opacity .2s ease;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.swipe-indicator.show[data-v-23dd8b18]{opacity:1}.message-area .message-content[data-v-23dd8b18]{padding-bottom:80px}.layout-iframe{width:100%;height:100%;border:none}
package/lib/index.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { Context, Schema } from 'koishi';
2
+ export declare const name = "chat-patch";
3
+ export declare const reusable = false;
4
+ export declare const filter = false;
5
+ export declare const inject: {
6
+ required: string[];
7
+ };
8
+ export declare const usage = "\n---\n\n\u5F00\u542F\u540E\uFF0C\u5373\u53EF\u5728koishi\u63A7\u5236\u53F0\u64CD\u4F5C\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u5566\n\n\u6682\u65F6\u53EA\u652F\u6301\u63A5\u53D7\u56FE\u6587\u6D88\u606F / \u53D1\u9001\u6587\u5B57\u6D88\u606F\n\n---\n";
9
+ export interface Config {
10
+ loggerinfo: boolean;
11
+ maxMessagesPerChannel: number;
12
+ keepMessagesOnClear: number;
13
+ blockedPlatforms: Array<{
14
+ platformName: string;
15
+ exactMatch: boolean;
16
+ }>;
17
+ chatContainerHeight: number;
18
+ }
19
+ export declare const Config: Schema<Config>;
20
+ export declare function apply(ctx: Context, config: Config): Promise<void>;