koishi-plugin-chat-patch 1.2.0 → 1.3.0

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
@@ -24,4 +24,4 @@ import{defineComponent as De,ref as g,onMounted as wt,h as m,computed as re,watc
24
24
  top: ${t-W}px;
25
25
  width: ${W*2}px;
26
26
  height: ${W*2}px;
27
- `,document.body.appendChild(n),window.dragThresholdCircle=n}function Tt(){const e=window.dragThresholdCircle;e&&e.parentNode&&(e.parentNode.removeChild(e),window.dragThresholdCircle=null)}async function dt(){try{if(!x)return false;const e=Date.now();if(e-Ge<tt)return true;Ge=e;const t=await qt();j=t.totalSize,J=t.totalImages,console.log("数据库健康检查:",{大小:`${(j/1024/1024).toFixed(2)}MB / ${(B/1024/1024).toFixed(2)}MB`,图片数量:`${J} / ${ye}`,使用率:`${(j/B*100).toFixed(1)}%`});const n=j/B,a=J/ye;return(n>q||a>q)&&(console.warn("数据库使用率过高,开始自动清理"),await et()),(n>.95||a>.95)&&(console.error("数据库接近极限,执行紧急清理"),await Cn()),true}catch(e){return console.error("数据库健康检查失败:",e),false}}async function qt(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{const o=a.result||[];let s=0;const c={};o.forEach(l=>{s+=l.size||0,c[l.channelKey]=(c[l.channelKey]||0)+1}),e({totalSize:s,totalImages:o.length,channelStats:c})},a.onerror=()=>{console.error("获取数据库统计失败:",a.error),e({totalSize:0,totalImages:0,channelStats:{}})}}):{totalSize:0,totalImages:0,channelStats:{}}}async function et(){try{console.log("开始自动清理...");const e=await Ut();if(e.length===0)return;const t={};e.forEach(o=>{t[o.channelKey]||(t[o.channelKey]=[]),t[o.channelKey].push(o)});let n=0,a=0;for(const[o,s]of Object.entries(t))if(s.length>Je){s.sort((l,u)=>l.timestamp-u.timestamp);const c=s.slice(0,s.length-Je);for(const l of c)await mt(l.url),n++,a+=l.size||0,k.value[l.url]&&(URL.revokeObjectURL(k.value[l.url]),delete k.value[l.url])}console.log(`自动清理完成: 清理了 ${n} 张图片,释放了 ${(a/1024/1024).toFixed(2)}MB`),J-=n,j-=a}catch(e){console.error("自动清理失败:",e)}}async function Cn(){try{console.log("开始紧急清理...");const e=await Ut();if(e.length===0)return;e.sort((s,c)=>c.timestamp-s.timestamp);const t=Math.floor(ye*.3),n=e.slice(t);let a=0,o=0;for(const s of n)await mt(s.url),a++,o+=s.size||0,k.value[s.url]&&(URL.revokeObjectURL(k.value[s.url]),delete k.value[s.url]);console.log(`紧急清理完成: 清理了 ${a} 张图片,释放了 ${(o/1024/1024).toFixed(2)}MB`),J=t,j-=o}catch(e){console.error("紧急清理失败:",e)}}async function Ut(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{e(a.result||[])},a.onerror=()=>{console.error("获取所有图片失败:",a.error),e([])}}):[]}async function ft(){return new Promise(e=>{try{x&&(x.close(),x=null);const t=indexedDB.deleteDatabase(Ve);t.onsuccess=()=>{console.log("IndexedDB数据库已完全清理"),j=0,J=0,e(true)},t.onerror=()=>{console.error("清理IndexedDB数据库失败:",t.error),e(false)},t.onblocked=()=>{console.warn("IndexedDB数据库删除被阻塞,可能有其他连接正在使用"),setTimeout(()=>{e(false)},5e3)}}catch(t){console.error("清理数据库时出错:",t),e(false)}})}async function bn(){try{return await Kt()?(setTimeout(async()=>{const t=await qt();console.log("数据库初始状态:",{大小:`${(t.totalSize/1024/1024).toFixed(2)}MB`,图片数量:t.totalImages,频道分布:t.channelStats}),(t.totalSize>B*.9||t.totalImages>ye*.9)&&(console.warn("数据库初始状态接近限制,执行清理"),await et())},1e3),true):(console.warn("数据库打开失败,尝试清理后重新初始化"),await ft(),await Kt())}catch(e){return console.error("IndexedDB初始化出错:",e),false}}async function Kt(){return new Promise(e=>{try{const t=indexedDB.open(Ve,je);t.onerror=()=>{console.error("IndexedDB打开失败:",t.error),e(false)},t.onsuccess=()=>{x=t.result,x.onerror=n=>{console.error("IndexedDB运行时错误:",n)},x.onversionchange=()=>{console.warn("IndexedDB版本变更,关闭连接"),x==null||x.close(),x=null},e(true)},t.onupgradeneeded=n=>{const a=n.target.result;if(!a.objectStoreNames.contains(_)){const o=a.createObjectStore(_,{keyPath:"url"});o.createIndex("channelKey","channelKey",{unique:false}),o.createIndex("timestamp","timestamp",{unique:false}),o.createIndex("size","size",{unique:false}),console.log("IndexedDB对象存储创建完成")}},t.onblocked=()=>{console.warn("IndexedDB打开被阻塞"),e(false)}}catch(t){console.error("打开数据库时出错:",t),e(false)}})}async function Rt(e){return x?new Promise((t,n)=>{const s=x.transaction([_],"readonly").objectStore(_).get(e);s.onsuccess=()=>{t(s.result||null)},s.onerror=()=>{console.error("从IndexedDB获取图片失败:",s.error),t(null)}}):null}async function ht(e){if(!x)return false;try{return e.size>Ae?(console.warn(`图片过大,跳过缓存: ${(e.size/1024/1024).toFixed(2)}MB > ${(Ae/1024/1024).toFixed(2)}MB`),false):(await dt(),j+e.size>B&&(console.warn("添加图片会超过数据库大小限制,执行清理"),await et(),j+e.size>B)?(console.warn("清理后仍会超过限制,跳过此图片"),false):J>=ye&&(console.warn("图片数量已达上限,执行清理"),await et(),J>=ye)?(console.warn("清理后仍达上限,跳过此图片"),false):new Promise(t=>{const o=x.transaction([_],"readwrite").objectStore(_).put(e);o.onsuccess=()=>{j+=e.size,J+=1,t(true)},o.onerror=()=>{console.error("保存图片到IndexedDB失败:",o.error),t(false)}}))}catch(t){return console.error("保存图片时出错:",t),false}}async function mt(e){return x?new Promise(t=>{const o=x.transaction([_],"readwrite").objectStore(_).delete(e);o.onsuccess=()=>{t(true)},o.onerror=()=>{console.error("从IndexedDB删除图片失败:",o.error),t(false)}}):false}async function kn(e){return x?new Promise(t=>{const s=x.transaction([_],"readonly").objectStore(_).index("channelKey").getAll(e);s.onsuccess=()=>{t(s.result||[])},s.onerror=()=>{console.error("获取频道图片失败:",s.error),t([])}}):[]}async function vt(e,t){if(V.has(t))return V.get(t)||null;const n=k.value[t];if(n)return n;const a=(async()=>{try{const o=k.value[t];if(o)return o;const s=await Rt(t);if(!s)return null;Ze();const c=URL.createObjectURL(s.blob);return k.value[t]=c,me(M(s.blob)),s.timestamp=Date.now(),await ht(s),c}catch(o){return console.error("获取缓存图片失败:",o),null}finally{V.delete(t)}})();return V.set(t,a),a}async function $e(e,t){if(V.has(t))return V.get(t)||null;const n=k.value[t];if(n)return n;const a=(async()=>{try{const o=k.value[t];if(o)return o;const s=await Rt(t);if(s){Ze();const Be=URL.createObjectURL(s.blob);return k.value[t]=Be,me(M(s.blob)),s.timestamp=Date.now(),await ht(s),Be}const c=await F("fetch-image",{url:t});if(!c.success)return null;const l=c.base64,u=c.contentType||"image/jpeg",v=atob(l),p=new Array(v.length);for(let Be=0;Be<v.length;Be++)p[Be]=v.charCodeAt(Be);const I=new Uint8Array(p),R=new Blob([I],{type:u});if(R.size>Ae)return null;const Q=k.value[t];if(Q)return Q;const Rn={url:t,blob:R,timestamp:Date.now(),size:R.size,channelKey:e};if(!await ht(Rn))return null;Ze();const Nt=URL.createObjectURL(R);return k.value[t]=Nt,me(M(R)),Nt}catch(o){return console.error("缓存图片失败:",o),null}finally{V.delete(t)}})();return V.set(t,a),a}async function Qe(e){try{const t=await kn(e);let n=0;for(const a of t)await mt(a.url),k.value[a.url]&&(URL.revokeObjectURL(k.value[a.url]),delete k.value[a.url],n+=a.size||0);n>0&&me(-n)}catch(t){console.error("清理频道图片缓存失败:",t)}}function Sn(){const e=Object.keys(k.value).length;return{blobCount:e,estimatedMemoryUsage:be,maxMemoryLimit:Pe,maxBlobLimit:Ce,memoryUsagePercent:(be/Pe*100).toFixed(1),blobUsagePercent:(e/Ce*100).toFixed(1)}}async function $n(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{const o=a.result||[],s=new Set;let c=0;o.forEach(l=>{s.add(l.channelKey),c+=l.size}),e({totalImages:o.length,totalSize:c,channels:s.size})},a.onerror=()=>{console.error("获取缓存统计失败:",a.error),e({totalImages:0,totalSize:0,channels:0})}}):{totalImages:0,totalSize:0,channels:0}}function gt(){y.value&&b.value&&(localStorage.setItem("chat-selected-bot",y.value),localStorage.setItem("chat-selected-channel",b.value))}function Pt(){const e=localStorage.getItem("chat-selected-bot"),t=localStorage.getItem("chat-selected-channel");return e&&t&&d.value.bots[e]&&d.value.channels[e]&&d.value.channels[e][t]?(y.value=e,b.value=t,true):false}function jt(e){var t,n,a,o;if(!d.value.bots[e.selfId])d.value.bots[e.selfId]={selfId:e.selfId,platform:e.platform,username:((t=e.bot)==null?void 0:t.name)||`Bot-${e.selfId}`,avatar:(n=e.bot)==null?void 0:n.avatar,status:"online"};else{const s=d.value.bots[e.selfId];s.status="online",(a=e.bot)!=null&&a.name&&s.username!==e.bot.name&&(s.username=e.bot.name),(o=e.bot)!=null&&o.avatar&&s.avatar!==e.bot.avatar&&(s.avatar=e.bot.avatar)}if(d.value.channels[e.selfId]||(d.value.channels[e.selfId]={}),e.channelId&&!d.value.channels[e.selfId][e.channelId]){const s=e.isDirect?`私信 ${e.channelId}`:`${e.guildName||e.channelId} (${e.channelId})`;d.value.channels[e.selfId][e.channelId]={id:e.channelId,name:s,type:e.channelType||0,channelId:e.channelId,guildName:e.guildName||"群聊",isDirect:e.isDirect}}if(e.messageId&&e.content&&e.channelId){const s=`${e.selfId}:${e.channelId}`;if(d.value.messages[s]||(d.value.messages[s]=[]),!d.value.messages[s].find(l=>l.id===e.messageId)){const l={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},u=d.value.messages[s];let v=u.length;for(let I=u.length-1;I>=0;I--){if(u[I].timestamp<=e.timestamp){v=I+1;break}I===0&&(v=0)}u.splice(v,0,l),u.length>100&&(d.value.messages[s]=u.slice(-100)),z.value[s]=u.length;const p=Fe();le(()=>{setTimeout(()=>{p&&Ie()},10)})}}if(e.elements&&e.elements.length>0){const s=`${e.selfId}:${e.channelId}`;e.elements.forEach(c=>{if((c.type==="img"||c.type==="image"||c.type==="mface")&&c.attrs){const l=c.attrs.src||c.attrs.url||c.attrs.file;l&&$e(s,l).catch(u=>{console.warn("预缓存图片失败:",l,u)})}})}d.value={...d.value}}function At(e){const t=`${e.selfId}:${e.channelId}`;d.value.messages[t]||(d.value.messages[t]=[]);const n=d.value.messages[t],a=n.findIndex(o=>o.id.startsWith("bot-msg-")&&Math.abs(o.timestamp-e.timestamp)<5e3);if(a!==-1){const o=n[a];o.id=e.messageId,o.content=e.content,o.userId=e.selfId,o.username=e.botUsername,o.avatar=e.botAvatar,o.channelId=e.channelId,o.selfId=e.selfId,o.elements=e.elements,o.isBot=true,o.quote=e.quote}else if(!n.find(s=>s.id===e.messageId)){const s={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};let c=n.length;for(let u=n.length-1;u>=0;u--){if(n[u].timestamp<=e.timestamp){c=u+1;break}u===0&&(c=0)}n.splice(c,0,s),n.length>100&&(d.value.messages[t]=n.slice(-100)),z.value[t]=n.length;const l=Fe();le(()=>{setTimeout(()=>{l&&Ie()},10)})}d.value={...d.value}}function Bn(e){var t,n,a,o;if(!d.value.bots[e.selfId])d.value.bots[e.selfId]={selfId:e.selfId,platform:e.platform,username:((t=e.bot)==null?void 0:t.name)||`Bot-${e.selfId}`,avatar:(n=e.bot)==null?void 0:n.avatar,status:"online"};else{const s=d.value.bots[e.selfId];s.status="online",(a=e.bot)!=null&&a.name&&s.username!==e.bot.name&&(s.username=e.bot.name),(o=e.bot)!=null&&o.avatar&&s.avatar!==e.bot.avatar&&(s.avatar=e.bot.avatar)}if(d.value.channels[e.selfId]||(d.value.channels[e.selfId]={}),e.channelId&&!d.value.channels[e.selfId][e.channelId]){const s=e.isDirect?`私信 ${e.channelId}`:`${e.guildName||e.channelId} (${e.channelId})`;d.value.channels[e.selfId][e.channelId]={id:e.channelId,name:s,type:e.channelType||0,channelId:e.channelId,guildName:e.guildName||"群聊",isDirect:e.isDirect}}if(e.messageId&&e.content&&e.channelId){const s=`${e.selfId}:${e.channelId}`;if(d.value.messages[s]||(d.value.messages[s]=[]),!d.value.messages[s].find(l=>l.id===e.messageId)){const l={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:true,quote:e.quote},u=d.value.messages[s];let v=u.length;for(let I=u.length-1;I>=0;I--){if(u[I].timestamp<=e.timestamp){v=I+1;break}I===0&&(v=0)}u.splice(v,0,l),u.length>100&&(d.value.messages[s]=u.slice(-100)),z.value[s]=u.length;const p=Fe();le(()=>{setTimeout(()=>{p&&Ie()},10)})}}if(e.elements&&e.elements.length>0){const s=`${e.selfId}:${e.channelId}`;e.elements.forEach(c=>{if((c.type==="img"||c.type==="image"||c.type==="mface")&&c.attrs){const l=c.attrs.src||c.attrs.url||c.attrs.file;l&&$e(s,l).catch(u=>{console.warn("预缓存图片失败:",l,u)})}})}d.value={...d.value}}async function Dn(){try{const e=await F("get-chat-data");if(e.success&&e.data){const t={};se.value=new Set(e.data.pinnedBots||[]),oe.value=new Set(e.data.pinnedChannels||[]);for(const[n,a]of Object.entries(e.data.messages||{})){const o=a.map(s=>({id:s.id,content:s.content,userId:s.userId,username:s.username,avatar:s.avatar,timestamp:s.timestamp,channelId:s.channelId,selfId:s.selfId,elements:s.elements,isBot:s.type==="bot",quote:s.quote}));o.sort((s,c)=>s.timestamp-c.timestamp),t[n]=o}return d.value={bots:e.data.bots||{},channels:e.data.channels||{},messages:t},await Mn(),true}else return console.warn("获取聊天数据失败:",e.error),false}catch(e){return console.error("获取聊天数据时出错:",e),false}}async function Mn(){try{const e=await F("get-all-channel-message-counts");if(e.success&&e.counts){const t={};for(const[n,a]of Object.entries(e.counts))t[n]=a;z.value=t}else console.warn("获取频道消息数量失败:",e.error)}catch(e){console.error("获取频道消息数量时出错:",e)}}async function _n(){try{const e=await F("get-plugin-config");e.success&&e.config?ie.value=e.config:console.warn("获取插件配置失败:",e.error)}catch(e){console.error("获取插件配置时出错:",e)}}async function yt(e,t,n,a){try{const o={selfId:e,channelId:t};n!==void 0&&(o.limit=n,o.offset=a||0);const s=await F("get-history-messages",o);if(s.success&&s.messages){const c=`${e}:${t}`,l=s.messages.map(v=>({id:v.id,content:v.content,userId:v.userId,username:v.username,avatar:v.avatar,timestamp:v.timestamp,channelId:v.channelId,selfId:v.selfId,elements:v.elements,isBot:v.type==="bot",quote:v.quote})),u=a||0;if(n!==void 0)if(l.sort((v,p)=>v.timestamp-p.timestamp),a===0)d.value.messages[c]=l,P.value[c]={offset:l.length,hasMore:l.length>=n&&s.total>l.length,loading:false};else{const v=d.value.messages[c]||[];d.value.messages[c]=[...l,...v];const p=a||0;P.value[c]={offset:p+l.length,hasMore:l.length>=n&&s.total>p+l.length,loading:false}}else l.sort((v,p)=>v.timestamp-p.timestamp),d.value.messages[c]=l,P.value[c]={offset:l.length,hasMore:false,loading:false};return z.value[c]=s.total||l.length,d.value={...d.value},true}else return console.warn("获取历史消息失败:",s.error),false}catch(o){return console.error("获取历史消息时出错:",o),false}}function Ln(e){if(!A.value||e.touches.length!==1)return;const t=e.touches[0];X.value={x:t.clientX,y:t.clientY,time:Date.now()},de.value={x:t.clientX,y:t.clientY},_e.value=false}function Tn(e){if(!A.value||!X.value||e.touches.length!==1)return;const t=e.touches[0];de.value={x:t.clientX,y:t.clientY};const n=t.clientX-X.value.x,a=t.clientY-X.value.y;if(Math.abs(n)>Math.abs(a)&&Math.abs(n)>30){const o=n>0,s=Z.value==="messages"||Z.value==="channels";if(o&&s){_e.value=true;const c=Math.min(n,200),l=150;c>l?E.value={show:true,text:"松开返回"}:E.value={show:true,text:`滑动返回 ${Math.round(c/l*100)}%`},e.preventDefault()}else E.value={show:false,text:""}}else E.value={show:false,text:""}}function qn(e){if(!A.value||!X.value)return;const n=Date.now()-X.value.time;if(de.value){const a=de.value.x-X.value.x,o=de.value.y-X.value.y,s=a>150,c=Math.abs(a)>Math.abs(o),l=n<300&&a>80;(s&&c||l)&&Un()}X.value=null,de.value=null,_e.value=false,E.value={show:false,text:""}}function Un(){switch(Z.value){case"messages":Z.value="channels";break;case"channels":Z.value="bots",y.value="",b.value="";break}}function pt(){A.value=window.innerWidth<=768}function Ot(){return!fe.value||Fe()}const zt=()=>{A.value&&T.value&&le(()=>{Ot()&&Ie()})},Kn=()=>{A.value&&setTimeout(()=>{T.value&&Ot()&&Ie()},300)};return Ft(we,(e,t)=>{t.length===0&&e.length>0&&le(()=>{Ie()})}),wt(async()=>{pt(),window.addEventListener("resize",pt),window.visualViewport&&window.visualViewport.addEventListener("resize",zt),document.addEventListener("click",ut),await _n(),ie.value.clearIndexedDBOnStart&&(console.log("启动时清空 IndexedDB 缓存..."),await ft()?console.log("IndexedDB 缓存已清空"):console.warn("清空 IndexedDB 缓存失败")),await bn()?(console.log("IndexedDB初始化成功"),setTimeout(async()=>{await dt()},2e3),setInterval(async()=>{await dt()},5*60*1e3)):console.warn("IndexedDB初始化失败,图片缓存功能将不可用"),await Dn(),le(()=>{Pt()});const t=Ct("chat-message-event",jt),n=Ct("bot-message-sent-event",At),a=Ct("chat-bot-message-event",Bn);Ft(b,o=>{o&&le(()=>{T.value&&(T.value.removeEventListener("scroll",Ne),T.value.addEventListener("scroll",Ne),Ne()),!A.value&&ne.value&&ne.value.focus()})},{immediate:true}),setInterval(()=>{Ze()},2*60*1e3),Pn(()=>{window.removeEventListener("resize",pt),window.visualViewport&&window.visualViewport.removeEventListener("resize",zt),document.removeEventListener("click",ut),t&&typeof t=="function"&&t(),n&&typeof n=="function"&&n(),a&&typeof a=="function"&&a(),T.value&&T.value.removeEventListener("scroll",Ne),Object.values(k.value).forEach(o=>{URL.revokeObjectURL(o)}),k.value={},x&&(x.close(),x=null)})}),{AvatarComponent:ge,ImageComponent:Y,JsonCardComponent:xe,ForwardMessageComponent:te,MessageElement:Me,chatData:d,channelMessageCounts:z,channelPagination:P,pluginConfig:ie,selectedBot:y,selectedChannel:b,inputMessage:ue,imageBlobUrls:k,pinnedBots:se,pinnedChannels:oe,uploadedImages:G,showActionMenu:pe,isMobile:A,mobileView:Z,touchStart:X,touchCurrent:de,isSwipeActive:_e,swipeIndicator:E,messageHistory:T,messageInput:ne,showScrollButton:Le,isUserScrolling:fe,isSending:ke,isLoadingMore:Se,draggingChannel:he,dragStartPos:N,dragCurrentPos:O,dragElementInitialPos:Te,dragOffset:qe,dragThreshold:W,isDragReady:ae,draggedBubbleElement:S,contextMenu:U,fileInput:Oe,bots:nt,currentChannels:at,currentMessages:we,currentChannelName:st,currentChannelKey:ot,canSendMessage:Ke,canInputMessage:rt,mobileViewClass:bt,inputPlaceholder:h,chatContainerStyle:i,selectBot:Qt,selectChannel:St,handleBotRightClick:en,handleChannelRightClick:tn,handleMessageRightClick:nn,showContextMenu:ct,hideContextMenu:K,handleKeyDown:Ee,toggleBotPin:sn,toggleChannelPin:on,deleteBotMessages:rn,deleteChannelMessages:ln,sendMessage:$t,toggleActionMenu:cn,triggerImageUpload:un,handleFileSelect:dn,handlePaste:fn,uploadImage:it,removeImage:hn,fileToBase64:Bt,handleClickOutside:ut,formatTime:mn,getChannelTypeText:pn,scrollToBottom:Ie,checkScrollPosition:Ne,isNearBottom:Fe,getChannelMessageCount:Mt,startDrag:wn,handleDragMove:He,handleDragEnd:Xe,resetDragState:We,getDragStyle:In,getDragDistance:xn,clearChannelHistory:_t,showNotification:D,createThresholdCircle:Lt,removeThresholdCircle:Tt,handleTouchStart:Ln,handleTouchMove:Tn,handleTouchEnd:qn,handleInputFocus:Kn,loadMoreMessages:Dt,handlePlusOne:vn,handleCopyMessage:gn,handleReplyMessage:yn,parseInlineQuote:lt,getInlineQuoteMessage:ze,getQuoteUser:Vt,getQuoteTimestamp:Jt,getQuoteContent:Gt,getQuoteElements:Zt,getMessageContentWithoutQuote:Et,getCachedImageUrl:vt,cacheImage:$e,clearChannelImageCache:Qe,clearAllIndexedDBData:ft,getMemoryStats:Sn,getCacheStats:$n,isFileUrl:ce,loadHistoryMessages:yt,handleMessageEvent:jt,handleBotMessageSentEvent:At,saveSelectionState:gt,restoreSelectionState:Pt}}const Xn={class:"bot-list"},Wn={class:"bot-items"},Qn=["onClick","onContextmenu"],Yn={class:"bot-avatar"},Vn={key:1,class:"avatar-placeholder"},Jn={class:"bot-info"},Gn={class:"bot-name"},Zn={class:"bot-platform"},En={class:"channel-list"},ea={key:0,class:"empty-state"},ta={key:1,class:"channel-items"},na=["data-channel-id","onClick","onContextmenu"],aa={class:"channel-info"},sa={class:"channel-name"},oa={class:"channel-type"},ra=["onMousedown","onTouchstart","title"],la={class:"message-area"},ca={class:"panel-header"},ia={key:0,class:"empty-state"},ua={key:1,class:"message-content"},da={key:0,class:"loading-more-indicator"},fa=["onContextmenu"],ha={class:"message-avatar"},ma={key:1,class:"avatar-placeholder"},va={class:"message-content-wrapper"},ga={class:"message-header"},ya={class:"message-username"},pa={class:"message-time"},wa={key:0,class:"message-quote"},Ia={class:"quote-header"},xa={class:"quote-avatar"},Ca={key:1,class:"avatar-placeholder"},ba={class:"quote-username"},ka={class:"quote-time"},Sa={class:"quote-content"},$a={class:"message-text"},Ba={class:"message-input"},Da={key:0,class:"image-preview-container"},Ma=["src","alt"],_a=["onClick"],La={class:"input-row"},Ta={class:"input-actions"},qa=["placeholder","disabled"],Ua=["disabled"],Ka=De({__name:"index",setup(ce){const ge=Hn(),{AvatarComponent:Y,MessageElement:xe,selectedBot:te,selectedChannel:Me,inputMessage:d,pinnedBots:z,pinnedChannels:P,uploadedImages:ie,showActionMenu:k,swipeIndicator:V,messageHistory:Pe,messageInput:Ce,showScrollButton:be,isSending:x,isLoadingMore:Ve,draggingChannel:je,dragThreshold:_,contextMenu:B,fileInput:Je,bots:ye,currentChannels:Ae,currentMessages:q,currentChannelName:tt,currentChannelKey:j,canSendMessage:J,canInputMessage:Ge,mobileViewClass:y,inputPlaceholder:b,chatContainerStyle:ue,selectBot:G,selectChannel:pe,handleBotRightClick:Oe,handleChannelRightClick:A,toggleBotPin:Z,toggleChannelPin:X,deleteBotMessages:de,deleteChannelMessages:_e,sendMessage:E,toggleActionMenu:T,triggerImageUpload:ne,handleFileSelect:Le,handlePaste:fe,removeImage:ke,formatTime:Se,getChannelTypeText:he,scrollToBottom:N,getChannelMessageCount:O,startDrag:Te,getDragStyle:qe,getDragDistance:W,handleTouchStart:Ue,handleTouchMove:H,handleTouchEnd:ae,handleInputFocus:S,handleMessageRightClick:U,handlePlusOne:se,handleCopyMessage:oe,handleReplyMessage:nt,getInlineQuoteMessage:at,getQuoteUser:we,getQuoteTimestamp:st,getQuoteContent:ot,getQuoteElements:Ke,getMessageContentWithoutQuote:rt}=ge;return(bt,h)=>(w(),C("div",{class:ve(["chat-container",r(y)]),style:It(r(ue)),onTouchstart:h[18]||(h[18]=(...i)=>r(Ue)&&r(Ue)(...i)),onTouchmove:h[19]||(h[19]=(...i)=>r(H)&&r(H)(...i)),onTouchend:h[20]||(h[20]=(...i)=>r(ae)&&r(ae)(...i))},[$(" 左侧机器人列表 "),f("div",Xn,[h[21]||(h[21]=f("div",{class:"panel-header"},[f("h3",null,"机器人")],-1)),f("div",Wn,[(w(true),C(ee,null,Re(r(ye),i=>(w(),C("div",{key:i.selfId,class:ve(["bot-item",{active:r(te)===i.selfId,pinned:r(z).has(i.selfId)}]),onClick:M=>r(G)(i.selfId),onContextmenu:M=>r(Oe)(M,i.selfId)},[f("div",Yn,[i.avatar?(w(),Ye(r(Y),{key:0,src:i.avatar,alt:i.username,"channel-key":"bot-list"},null,8,["src","alt"])):(w(),C("div",Vn,L(i.username.charAt(0).toUpperCase()),1))]),f("div",Jn,[f("div",Gn,L(i.username),1),f("div",Zn,L(i.platform),1)]),f("div",{class:ve(["bot-status",i.status])},null,2)],42,Qn))),128))])]),$(" 中间频道列表 "),f("div",En,[h[22]||(h[22]=f("div",{class:"panel-header"},[f("h3",null,"频道")],-1)),r(te)?(w(),C("div",ta,[(w(true),C(ee,null,Re(r(Ae),i=>(w(),C("div",{key:i.id,class:ve(["channel-item",{active:r(Me)===i.id,pinned:r(P).has(`${r(te)}:${i.id}`)}]),"data-channel-id":i.id,onClick:M=>r(pe)(i.id),onContextmenu:M=>r(A)(M,i.id)},[f("div",aa,[f("div",sa,L(i.name),1),f("div",oa,L(r(he)(i.type)),1)]),r(O)(i.id)>0?(w(),C("div",{key:0,class:ve(["channel-message-count draggable-bubble",{dragging:r(je)===i.id,"will-delete":r(je)===i.id&&r(W)(i.id)>r(_)}]),onMousedown:M=>r(Te)(M,i.id),onTouchstart:M=>r(Te)(M,i.id),style:It(r(qe)(i.id)),title:r(je)===i.id?r(W)(i.id)>r(_)?"松开清理历史记录":"拖拽更远以清理历史记录":"拖拽清理历史记录"},L(r(O)(i.id)),47,ra)):$("v-if",true)],42,na))),128))])):(w(),C("div",ea," 请选择一个机器人 "))]),$(" 右侧消息区域 "),f("div",la,[f("div",ca,[f("h3",null,L(r(tt)||"选择频道"),1)]),!r(te)||!r(Me)?(w(),C("div",ia," 请选择机器人和频道 ")):(w(),C("div",ua,[$(" 消息历史 "),f("div",{class:"message-history",ref_key:"messageHistory",ref:Pe},[$(" 加载更多指示器 "),r(Ve)?(w(),C("div",da,h[23]||(h[23]=[f("div",{class:"loading-spinner"},null,-1),f("span",null,"加载更多消息中...",-1)]))):$("v-if",true),(w(true),C(ee,null,Re(r(q),i=>(w(),C("div",{key:i.id,class:ve(["message-item",{"bot-message":i.isBot}]),onContextmenu:M=>i.isBot?null:r(U)(M,i)},[f("div",ha,[i.avatar?(w(),Ye(r(Y),{key:0,src:i.avatar,alt:i.username,"channel-key":r(j)},null,8,["src","alt","channel-key"])):(w(),C("div",ma,L(i.username.charAt(0).toUpperCase()),1))]),f("div",va,[f("div",ga,[f("span",ya,L(i.username),1),f("span",pa,L(r(Se)(i.timestamp)),1)]),$(" 引用消息显示 "),i.quote||r(at)(i,r(q))?(w(),C("div",wa,[f("div",Ia,[f("div",xa,[r(we)(i,r(q)).avatar?(w(),Ye(r(Y),{key:0,src:r(we)(i,r(q)).avatar,alt:r(we)(i,r(q)).username,"channel-key":r(j)},null,8,["src","alt","channel-key"])):(w(),C("div",Ca,L(r(we)(i,r(q)).username.charAt(0).toUpperCase()),1))]),f("span",ba,L(r(we)(i,r(q)).username),1),f("span",ka,L(r(Se)(r(st)(i,r(q)))),1)]),f("div",Sa,[r(Ke)(i,r(q))&&r(Ke)(i,r(q)).length>0?(w(true),C(ee,{key:0},Re(r(Ke)(i,r(q)),(M,me)=>(w(),Ye(r(xe),{key:`quote-${me}`,element:M,"channel-key":r(j)},null,8,["element","channel-key"]))),128)):(w(),C(ee,{key:1},[xt(L(r(ot)(i,r(q))),1)],64))])])):$("v-if",true),f("div",$a,[i.elements&&i.elements.length>0?(w(true),C(ee,{key:0},Re(i.elements,(M,me)=>(w(),Ye(r(xe),{key:me,element:M,"channel-key":r(j)},null,8,["element","channel-key"]))),128)):(w(),C(ee,{key:1},[xt(L(r(rt)(i,r(q))),1)],64))])])],42,fa))),128))],512),$(" 悬浮的滚动到底部按钮 "),Ht(f("div",{class:"floating-scroll-button",onClick:h[0]||(h[0]=(...i)=>r(N)&&r(N)(...i))},h[24]||(h[24]=[f("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor"},[f("path",{d:"M7 10l5 5 5-5z"})],-1)]),512),[[jn,r(be)]]),$(" 输入框 "),f("div",Ba,[$(" 图片预览区域 "),r(ie).length>0?(w(),C("div",Da,[(w(true),C(ee,null,Re(r(ie),i=>(w(),C("div",{key:i.tempId,class:"image-preview-item"},[f("img",{src:i.preview,alt:i.filename,class:"preview-image"},null,8,Ma),f("button",{class:"remove-image-btn",onClick:M=>r(ke)(i.tempId),title:"删除图片"},h[25]||(h[25]=[f("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor"},[f("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)]),8,_a)]))),128))])):$("v-if",true),f("div",La,[$(" 加号按钮 "),f("div",Ta,[f("button",{class:ve(["add-button",{active:r(k)}]),onClick:h[1]||(h[1]=(...i)=>r(T)&&r(T)(...i)),title:"更多操作"},h[26]||(h[26]=[f("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[f("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),f("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)]),2),$(" 操作菜单 "),r(k)?(w(),C("div",{key:0,class:"action-menu",onClick:h[3]||(h[3]=Xt(()=>{},["stop"]))},[f("button",{class:"action-menu-item",onClick:h[2]||(h[2]=(...i)=>r(ne)&&r(ne)(...i))},h[27]||(h[27]=[f("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[f("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),f("circle",{cx:"8.5",cy:"8.5",r:"1.5"}),f("polyline",{points:"21,15 16,10 5,21"})],-1),xt(" 上传图片 ",-1)]))])):$("v-if",true)]),Ht(f("input",{"onUpdate:modelValue":h[4]||(h[4]=i=>On(d)?d.value=i:null),type:"text",placeholder:r(b),onKeyup:h[5]||(h[5]=An((...i)=>r(E)&&r(E)(...i),["enter"])),disabled:!r(Ge),ref_key:"messageInput",ref:Ce,onPaste:h[6]||(h[6]=(...i)=>r(fe)&&r(fe)(...i)),onFocus:h[7]||(h[7]=(...i)=>r(S)&&r(S)(...i))},null,40,qa),[[zn,r(d)]]),f("button",{onClick:h[8]||(h[8]=(...i)=>r(E)&&r(E)(...i)),disabled:!r(J),class:ve({"is-sending":r(x)})},L(r(x)?"发送中...":"发送"),11,Ua)]),$(" 隐藏的文件输入 "),f("input",{type:"file",ref_key:"fileInput",ref:Je,onChange:h[9]||(h[9]=(...i)=>r(Le)&&r(Le)(...i)),accept:"image/*",multiple:"",style:{display:"none"}},null,544)])]))]),$(" 右键菜单 "),r(B).show?(w(),C("div",{key:0,class:"context-menu",style:It({left:r(B).x+"px",top:r(B).y+"px"}),onClick:h[17]||(h[17]=Xt(()=>{},["stop"]))},[$(" 机器人右键菜单 "),r(B).type==="bot"?(w(),C(ee,{key:0},[f("div",{class:"context-menu-item",onClick:h[10]||(h[10]=i=>r(Z)(r(B).targetId))},L(r(z).has(r(B).targetId)?"取消置顶":"置顶"),1),f("div",{class:"context-menu-item danger",onClick:h[11]||(h[11]=i=>r(de)(r(B).targetId))}," 彻底删除此机器人所有数据 ")],64)):$("v-if",true),$(" 频道右键菜单 "),r(B).type==="channel"?(w(),C(ee,{key:1},[f("div",{class:"context-menu-item",onClick:h[12]||(h[12]=i=>r(X)(r(B).targetId))},L(r(P).has(`${r(te)}:${r(B).targetId}`)?"取消置顶":"置顶"),1),f("div",{class:"context-menu-item danger",onClick:h[13]||(h[13]=i=>r(_e)(r(B).targetId))}," 彻底删除此频道所有数据 ")],64)):$("v-if",true),$(" 消息右键菜单 "),r(B).type==="message"&&r(B).message?(w(),C(ee,{key:2},[f("div",{class:"context-menu-item",onClick:h[14]||(h[14]=i=>r(se)(r(B).message))}," +1 "),f("div",{class:"context-menu-item",onClick:h[15]||(h[15]=i=>r(oe)(r(B).message))}," 复制 "),f("div",{class:"context-menu-item",onClick:h[16]||(h[16]=i=>r(nt)(r(B).message))}," 回复 ")],64)):$("v-if",true)],4)):$("v-if",true),$(" 滑动指示器 "),f("div",{class:ve(["swipe-indicator",{show:r(V).show}])},L(r(V).text),3)],38))}}),Wt=(ce,ge)=>{const Y=ce.__vccOpts||ce;for(const[xe,te]of ge)Y[xe]=te;return Y},Ra=Wt(Ka,[["__scopeId","data-v-bda63c05"]]),Pa={},ja={class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none"};function Aa(ce,ge){return w(),C("svg",ja,ge[0]||(ge[0]=[f("path",{d:"M8 10.5H16",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),f("path",{d:"M8 14H13.5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),f("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 Oa=Wt(Pa,[["render",Aa]]);Fn.register("activity:chat",Oa);const Ha=ce=>{ce.page({name:"聊天室",path:"/chat-patch",desc:"",authority:4,icon:"activity:chat",component:De({setup(){return()=>m(Nn("k-layout"),{},{default:()=>m(Ra)})}})})};export{Ha as default};
27
+ `,document.body.appendChild(n),window.dragThresholdCircle=n}function Tt(){const e=window.dragThresholdCircle;e&&e.parentNode&&(e.parentNode.removeChild(e),window.dragThresholdCircle=null)}async function dt(){try{if(!x)return false;const e=Date.now();if(e-Ge<tt)return true;Ge=e;const t=await qt();j=t.totalSize,J=t.totalImages,console.log("数据库健康检查:",{大小:`${(j/1024/1024).toFixed(2)}MB / ${(B/1024/1024).toFixed(2)}MB`,图片数量:`${J} / ${ye}`,使用率:`${(j/B*100).toFixed(1)}%`});const n=j/B,a=J/ye;return(n>q||a>q)&&(console.warn("数据库使用率过高,开始自动清理"),await et()),(n>.95||a>.95)&&(console.error("数据库接近极限,执行紧急清理"),await Cn()),true}catch(e){return console.error("数据库健康检查失败:",e),false}}async function qt(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{const o=a.result||[];let s=0;const c={};o.forEach(l=>{s+=l.size||0,c[l.channelKey]=(c[l.channelKey]||0)+1}),e({totalSize:s,totalImages:o.length,channelStats:c})},a.onerror=()=>{console.error("获取数据库统计失败:",a.error),e({totalSize:0,totalImages:0,channelStats:{}})}}):{totalSize:0,totalImages:0,channelStats:{}}}async function et(){try{console.log("开始自动清理...");const e=await Ut();if(e.length===0)return;const t={};e.forEach(o=>{t[o.channelKey]||(t[o.channelKey]=[]),t[o.channelKey].push(o)});let n=0,a=0;for(const[o,s]of Object.entries(t))if(s.length>Je){s.sort((l,u)=>l.timestamp-u.timestamp);const c=s.slice(0,s.length-Je);for(const l of c)await mt(l.url),n++,a+=l.size||0,k.value[l.url]&&(URL.revokeObjectURL(k.value[l.url]),delete k.value[l.url])}console.log(`自动清理完成: 清理了 ${n} 张图片,释放了 ${(a/1024/1024).toFixed(2)}MB`),J-=n,j-=a}catch(e){console.error("自动清理失败:",e)}}async function Cn(){try{console.log("开始紧急清理...");const e=await Ut();if(e.length===0)return;e.sort((s,c)=>c.timestamp-s.timestamp);const t=Math.floor(ye*.3),n=e.slice(t);let a=0,o=0;for(const s of n)await mt(s.url),a++,o+=s.size||0,k.value[s.url]&&(URL.revokeObjectURL(k.value[s.url]),delete k.value[s.url]);console.log(`紧急清理完成: 清理了 ${a} 张图片,释放了 ${(o/1024/1024).toFixed(2)}MB`),J=t,j-=o}catch(e){console.error("紧急清理失败:",e)}}async function Ut(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{e(a.result||[])},a.onerror=()=>{console.error("获取所有图片失败:",a.error),e([])}}):[]}async function ft(){return new Promise(e=>{try{x&&(x.close(),x=null);const t=indexedDB.deleteDatabase(Ve);t.onsuccess=()=>{console.log("IndexedDB数据库已完全清理"),j=0,J=0,e(true)},t.onerror=()=>{console.error("清理IndexedDB数据库失败:",t.error),e(false)},t.onblocked=()=>{console.warn("IndexedDB数据库删除被阻塞,可能有其他连接正在使用"),setTimeout(()=>{e(false)},5e3)}}catch(t){console.error("清理数据库时出错:",t),e(false)}})}async function bn(){try{return await Kt()?(setTimeout(async()=>{const t=await qt();console.log("数据库初始状态:",{大小:`${(t.totalSize/1024/1024).toFixed(2)}MB`,图片数量:t.totalImages,频道分布:t.channelStats}),(t.totalSize>B*.9||t.totalImages>ye*.9)&&(console.warn("数据库初始状态接近限制,执行清理"),await et())},1e3),true):(console.warn("数据库打开失败,尝试清理后重新初始化"),await ft(),await Kt())}catch(e){return console.error("IndexedDB初始化出错:",e),false}}async function Kt(){return new Promise(e=>{try{const t=indexedDB.open(Ve,je);t.onerror=()=>{console.error("IndexedDB打开失败:",t.error),e(false)},t.onsuccess=()=>{x=t.result,x.onerror=n=>{console.error("IndexedDB运行时错误:",n)},x.onversionchange=()=>{console.warn("IndexedDB版本变更,关闭连接"),x==null||x.close(),x=null},e(true)},t.onupgradeneeded=n=>{const a=n.target.result;if(!a.objectStoreNames.contains(_)){const o=a.createObjectStore(_,{keyPath:"url"});o.createIndex("channelKey","channelKey",{unique:false}),o.createIndex("timestamp","timestamp",{unique:false}),o.createIndex("size","size",{unique:false}),console.log("IndexedDB对象存储创建完成")}},t.onblocked=()=>{console.warn("IndexedDB打开被阻塞"),e(false)}}catch(t){console.error("打开数据库时出错:",t),e(false)}})}async function Rt(e){return x?new Promise((t,n)=>{const s=x.transaction([_],"readonly").objectStore(_).get(e);s.onsuccess=()=>{t(s.result||null)},s.onerror=()=>{console.error("从IndexedDB获取图片失败:",s.error),t(null)}}):null}async function ht(e){if(!x)return false;try{return e.size>Ae?(console.warn(`图片过大,跳过缓存: ${(e.size/1024/1024).toFixed(2)}MB > ${(Ae/1024/1024).toFixed(2)}MB`),false):(await dt(),j+e.size>B&&(console.warn("添加图片会超过数据库大小限制,执行清理"),await et(),j+e.size>B)?(console.warn("清理后仍会超过限制,跳过此图片"),false):J>=ye&&(console.warn("图片数量已达上限,执行清理"),await et(),J>=ye)?(console.warn("清理后仍达上限,跳过此图片"),false):new Promise(t=>{const o=x.transaction([_],"readwrite").objectStore(_).put(e);o.onsuccess=()=>{j+=e.size,J+=1,t(true)},o.onerror=()=>{console.error("保存图片到IndexedDB失败:",o.error),t(false)}}))}catch(t){return console.error("保存图片时出错:",t),false}}async function mt(e){return x?new Promise(t=>{const o=x.transaction([_],"readwrite").objectStore(_).delete(e);o.onsuccess=()=>{t(true)},o.onerror=()=>{console.error("从IndexedDB删除图片失败:",o.error),t(false)}}):false}async function kn(e){return x?new Promise(t=>{const s=x.transaction([_],"readonly").objectStore(_).index("channelKey").getAll(e);s.onsuccess=()=>{t(s.result||[])},s.onerror=()=>{console.error("获取频道图片失败:",s.error),t([])}}):[]}async function vt(e,t){if(V.has(t))return V.get(t)||null;const n=k.value[t];if(n)return n;const a=(async()=>{try{const o=k.value[t];if(o)return o;const s=await Rt(t);if(!s)return null;Ze();const c=URL.createObjectURL(s.blob);return k.value[t]=c,me(M(s.blob)),s.timestamp=Date.now(),await ht(s),c}catch(o){return console.error("获取缓存图片失败:",o),null}finally{V.delete(t)}})();return V.set(t,a),a}async function $e(e,t){if(V.has(t))return V.get(t)||null;const n=k.value[t];if(n)return n;const a=(async()=>{try{const o=k.value[t];if(o)return o;const s=await Rt(t);if(s){Ze();const Be=URL.createObjectURL(s.blob);return k.value[t]=Be,me(M(s.blob)),s.timestamp=Date.now(),await ht(s),Be}const c=await F("fetch-image",{url:t});if(!c.success)return null;const l=c.base64,u=c.contentType||"image/jpeg",v=atob(l),p=new Array(v.length);for(let Be=0;Be<v.length;Be++)p[Be]=v.charCodeAt(Be);const I=new Uint8Array(p),R=new Blob([I],{type:u});if(R.size>Ae)return null;const Q=k.value[t];if(Q)return Q;const Rn={url:t,blob:R,timestamp:Date.now(),size:R.size,channelKey:e};if(!await ht(Rn))return null;Ze();const Nt=URL.createObjectURL(R);return k.value[t]=Nt,me(M(R)),Nt}catch(o){return console.error("缓存图片失败:",o),null}finally{V.delete(t)}})();return V.set(t,a),a}async function Qe(e){try{const t=await kn(e);let n=0;for(const a of t)await mt(a.url),k.value[a.url]&&(URL.revokeObjectURL(k.value[a.url]),delete k.value[a.url],n+=a.size||0);n>0&&me(-n)}catch(t){console.error("清理频道图片缓存失败:",t)}}function Sn(){const e=Object.keys(k.value).length;return{blobCount:e,estimatedMemoryUsage:be,maxMemoryLimit:Pe,maxBlobLimit:Ce,memoryUsagePercent:(be/Pe*100).toFixed(1),blobUsagePercent:(e/Ce*100).toFixed(1)}}async function $n(){return x?new Promise(e=>{const a=x.transaction([_],"readonly").objectStore(_).getAll();a.onsuccess=()=>{const o=a.result||[],s=new Set;let c=0;o.forEach(l=>{s.add(l.channelKey),c+=l.size}),e({totalImages:o.length,totalSize:c,channels:s.size})},a.onerror=()=>{console.error("获取缓存统计失败:",a.error),e({totalImages:0,totalSize:0,channels:0})}}):{totalImages:0,totalSize:0,channels:0}}function gt(){y.value&&b.value&&(localStorage.setItem("chat-selected-bot",y.value),localStorage.setItem("chat-selected-channel",b.value))}function Pt(){const e=localStorage.getItem("chat-selected-bot"),t=localStorage.getItem("chat-selected-channel");return e&&t&&d.value.bots[e]&&d.value.channels[e]&&d.value.channels[e][t]?(y.value=e,b.value=t,true):false}function jt(e){var t,n,a,o;if(!d.value.bots[e.selfId])d.value.bots[e.selfId]={selfId:e.selfId,platform:e.platform,username:((t=e.bot)==null?void 0:t.name)||`Bot-${e.selfId}`,avatar:(n=e.bot)==null?void 0:n.avatar,status:"online"};else{const s=d.value.bots[e.selfId];s.status="online",(a=e.bot)!=null&&a.name&&s.username!==e.bot.name&&(s.username=e.bot.name),(o=e.bot)!=null&&o.avatar&&s.avatar!==e.bot.avatar&&(s.avatar=e.bot.avatar)}if(d.value.channels[e.selfId]||(d.value.channels[e.selfId]={}),e.channelId&&!d.value.channels[e.selfId][e.channelId]){const s=e.isDirect?`私聊(${e.username||"未知用户"})`:`${e.guildName||e.channelId} (${e.channelId})`;d.value.channels[e.selfId][e.channelId]={id:e.channelId,name:s,type:e.channelType||0,channelId:e.channelId,guildName:e.guildName||"群聊",isDirect:e.isDirect}}if(e.messageId&&e.content&&e.channelId){const s=`${e.selfId}:${e.channelId}`;if(d.value.messages[s]||(d.value.messages[s]=[]),!d.value.messages[s].find(l=>l.id===e.messageId)){const l={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},u=d.value.messages[s];let v=u.length;for(let I=u.length-1;I>=0;I--){if(u[I].timestamp<=e.timestamp){v=I+1;break}I===0&&(v=0)}u.splice(v,0,l),u.length>100&&(d.value.messages[s]=u.slice(-100)),z.value[s]=u.length;const p=Fe();le(()=>{setTimeout(()=>{p&&Ie()},10)})}}if(e.elements&&e.elements.length>0){const s=`${e.selfId}:${e.channelId}`;e.elements.forEach(c=>{if((c.type==="img"||c.type==="image"||c.type==="mface")&&c.attrs){const l=c.attrs.src||c.attrs.url||c.attrs.file;l&&$e(s,l).catch(u=>{console.warn("预缓存图片失败:",l,u)})}})}d.value={...d.value}}function At(e){const t=`${e.selfId}:${e.channelId}`;d.value.messages[t]||(d.value.messages[t]=[]);const n=d.value.messages[t],a=n.findIndex(o=>o.id.startsWith("bot-msg-")&&Math.abs(o.timestamp-e.timestamp)<5e3);if(a!==-1){const o=n[a];o.id=e.messageId,o.content=e.content,o.userId=e.selfId,o.username=e.botUsername,o.avatar=e.botAvatar,o.channelId=e.channelId,o.selfId=e.selfId,o.elements=e.elements,o.isBot=true,o.quote=e.quote}else if(!n.find(s=>s.id===e.messageId)){const s={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};let c=n.length;for(let u=n.length-1;u>=0;u--){if(n[u].timestamp<=e.timestamp){c=u+1;break}u===0&&(c=0)}n.splice(c,0,s),n.length>100&&(d.value.messages[t]=n.slice(-100)),z.value[t]=n.length;const l=Fe();le(()=>{setTimeout(()=>{l&&Ie()},10)})}d.value={...d.value}}function Bn(e){var t,n,a,o;if(!d.value.bots[e.selfId])d.value.bots[e.selfId]={selfId:e.selfId,platform:e.platform,username:((t=e.bot)==null?void 0:t.name)||`Bot-${e.selfId}`,avatar:(n=e.bot)==null?void 0:n.avatar,status:"online"};else{const s=d.value.bots[e.selfId];s.status="online",(a=e.bot)!=null&&a.name&&s.username!==e.bot.name&&(s.username=e.bot.name),(o=e.bot)!=null&&o.avatar&&s.avatar!==e.bot.avatar&&(s.avatar=e.bot.avatar)}if(d.value.channels[e.selfId]||(d.value.channels[e.selfId]={}),e.channelId&&!d.value.channels[e.selfId][e.channelId]){const s=e.isDirect?`私聊(${e.username||"未知用户"})`:`${e.guildName||e.channelId} (${e.channelId})`;d.value.channels[e.selfId][e.channelId]={id:e.channelId,name:s,type:e.channelType||0,channelId:e.channelId,guildName:e.guildName||"群聊",isDirect:e.isDirect}}if(e.messageId&&e.content&&e.channelId){const s=`${e.selfId}:${e.channelId}`;if(d.value.messages[s]||(d.value.messages[s]=[]),!d.value.messages[s].find(l=>l.id===e.messageId)){const l={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:true,quote:e.quote},u=d.value.messages[s];let v=u.length;for(let I=u.length-1;I>=0;I--){if(u[I].timestamp<=e.timestamp){v=I+1;break}I===0&&(v=0)}u.splice(v,0,l),u.length>100&&(d.value.messages[s]=u.slice(-100)),z.value[s]=u.length;const p=Fe();le(()=>{setTimeout(()=>{p&&Ie()},10)})}}if(e.elements&&e.elements.length>0){const s=`${e.selfId}:${e.channelId}`;e.elements.forEach(c=>{if((c.type==="img"||c.type==="image"||c.type==="mface")&&c.attrs){const l=c.attrs.src||c.attrs.url||c.attrs.file;l&&$e(s,l).catch(u=>{console.warn("预缓存图片失败:",l,u)})}})}d.value={...d.value}}async function Dn(){try{const e=await F("get-chat-data");if(e.success&&e.data){const t={};se.value=new Set(e.data.pinnedBots||[]),oe.value=new Set(e.data.pinnedChannels||[]);for(const[n,a]of Object.entries(e.data.messages||{})){const o=a.map(s=>({id:s.id,content:s.content,userId:s.userId,username:s.username,avatar:s.avatar,timestamp:s.timestamp,channelId:s.channelId,selfId:s.selfId,elements:s.elements,isBot:s.type==="bot",quote:s.quote}));o.sort((s,c)=>s.timestamp-c.timestamp),t[n]=o}return d.value={bots:e.data.bots||{},channels:e.data.channels||{},messages:t},await Mn(),true}else return console.warn("获取聊天数据失败:",e.error),false}catch(e){return console.error("获取聊天数据时出错:",e),false}}async function Mn(){try{const e=await F("get-all-channel-message-counts");if(e.success&&e.counts){const t={};for(const[n,a]of Object.entries(e.counts))t[n]=a;z.value=t}else console.warn("获取频道消息数量失败:",e.error)}catch(e){console.error("获取频道消息数量时出错:",e)}}async function _n(){try{const e=await F("get-plugin-config");e.success&&e.config?ie.value=e.config:console.warn("获取插件配置失败:",e.error)}catch(e){console.error("获取插件配置时出错:",e)}}async function yt(e,t,n,a){try{const o={selfId:e,channelId:t};n!==void 0&&(o.limit=n,o.offset=a||0);const s=await F("get-history-messages",o);if(s.success&&s.messages){const c=`${e}:${t}`,l=s.messages.map(v=>({id:v.id,content:v.content,userId:v.userId,username:v.username,avatar:v.avatar,timestamp:v.timestamp,channelId:v.channelId,selfId:v.selfId,elements:v.elements,isBot:v.type==="bot",quote:v.quote})),u=a||0;if(n!==void 0)if(l.sort((v,p)=>v.timestamp-p.timestamp),a===0)d.value.messages[c]=l,P.value[c]={offset:l.length,hasMore:l.length>=n&&s.total>l.length,loading:false};else{const v=d.value.messages[c]||[];d.value.messages[c]=[...l,...v];const p=a||0;P.value[c]={offset:p+l.length,hasMore:l.length>=n&&s.total>p+l.length,loading:false}}else l.sort((v,p)=>v.timestamp-p.timestamp),d.value.messages[c]=l,P.value[c]={offset:l.length,hasMore:false,loading:false};return z.value[c]=s.total||l.length,d.value={...d.value},true}else return console.warn("获取历史消息失败:",s.error),false}catch(o){return console.error("获取历史消息时出错:",o),false}}function Ln(e){if(!A.value||e.touches.length!==1)return;const t=e.touches[0];X.value={x:t.clientX,y:t.clientY,time:Date.now()},de.value={x:t.clientX,y:t.clientY},_e.value=false}function Tn(e){if(!A.value||!X.value||e.touches.length!==1)return;const t=e.touches[0];de.value={x:t.clientX,y:t.clientY};const n=t.clientX-X.value.x,a=t.clientY-X.value.y;if(Math.abs(n)>Math.abs(a)&&Math.abs(n)>30){const o=n>0,s=Z.value==="messages"||Z.value==="channels";if(o&&s){_e.value=true;const c=Math.min(n,200),l=150;c>l?E.value={show:true,text:"松开返回"}:E.value={show:true,text:`滑动返回 ${Math.round(c/l*100)}%`},e.preventDefault()}else E.value={show:false,text:""}}else E.value={show:false,text:""}}function qn(e){if(!A.value||!X.value)return;const n=Date.now()-X.value.time;if(de.value){const a=de.value.x-X.value.x,o=de.value.y-X.value.y,s=a>150,c=Math.abs(a)>Math.abs(o),l=n<300&&a>80;(s&&c||l)&&Un()}X.value=null,de.value=null,_e.value=false,E.value={show:false,text:""}}function Un(){switch(Z.value){case"messages":Z.value="channels";break;case"channels":Z.value="bots",y.value="",b.value="";break}}function pt(){A.value=window.innerWidth<=768}function Ot(){return!fe.value||Fe()}const zt=()=>{A.value&&T.value&&le(()=>{Ot()&&Ie()})},Kn=()=>{A.value&&setTimeout(()=>{T.value&&Ot()&&Ie()},300)};return Ft(we,(e,t)=>{t.length===0&&e.length>0&&le(()=>{Ie()})}),wt(async()=>{pt(),window.addEventListener("resize",pt),window.visualViewport&&window.visualViewport.addEventListener("resize",zt),document.addEventListener("click",ut),await _n(),ie.value.clearIndexedDBOnStart&&(console.log("启动时清空 IndexedDB 缓存..."),await ft()?console.log("IndexedDB 缓存已清空"):console.warn("清空 IndexedDB 缓存失败")),await bn()?(console.log("IndexedDB初始化成功"),setTimeout(async()=>{await dt()},2e3),setInterval(async()=>{await dt()},5*60*1e3)):console.warn("IndexedDB初始化失败,图片缓存功能将不可用"),await Dn(),le(()=>{Pt()});const t=Ct("chat-message-event",jt),n=Ct("bot-message-sent-event",At),a=Ct("chat-bot-message-event",Bn);Ft(b,o=>{o&&le(()=>{T.value&&(T.value.removeEventListener("scroll",Ne),T.value.addEventListener("scroll",Ne),Ne()),!A.value&&ne.value&&ne.value.focus()})},{immediate:true}),setInterval(()=>{Ze()},2*60*1e3),Pn(()=>{window.removeEventListener("resize",pt),window.visualViewport&&window.visualViewport.removeEventListener("resize",zt),document.removeEventListener("click",ut),t&&typeof t=="function"&&t(),n&&typeof n=="function"&&n(),a&&typeof a=="function"&&a(),T.value&&T.value.removeEventListener("scroll",Ne),Object.values(k.value).forEach(o=>{URL.revokeObjectURL(o)}),k.value={},x&&(x.close(),x=null)})}),{AvatarComponent:ge,ImageComponent:Y,JsonCardComponent:xe,ForwardMessageComponent:te,MessageElement:Me,chatData:d,channelMessageCounts:z,channelPagination:P,pluginConfig:ie,selectedBot:y,selectedChannel:b,inputMessage:ue,imageBlobUrls:k,pinnedBots:se,pinnedChannels:oe,uploadedImages:G,showActionMenu:pe,isMobile:A,mobileView:Z,touchStart:X,touchCurrent:de,isSwipeActive:_e,swipeIndicator:E,messageHistory:T,messageInput:ne,showScrollButton:Le,isUserScrolling:fe,isSending:ke,isLoadingMore:Se,draggingChannel:he,dragStartPos:N,dragCurrentPos:O,dragElementInitialPos:Te,dragOffset:qe,dragThreshold:W,isDragReady:ae,draggedBubbleElement:S,contextMenu:U,fileInput:Oe,bots:nt,currentChannels:at,currentMessages:we,currentChannelName:st,currentChannelKey:ot,canSendMessage:Ke,canInputMessage:rt,mobileViewClass:bt,inputPlaceholder:h,chatContainerStyle:i,selectBot:Qt,selectChannel:St,handleBotRightClick:en,handleChannelRightClick:tn,handleMessageRightClick:nn,showContextMenu:ct,hideContextMenu:K,handleKeyDown:Ee,toggleBotPin:sn,toggleChannelPin:on,deleteBotMessages:rn,deleteChannelMessages:ln,sendMessage:$t,toggleActionMenu:cn,triggerImageUpload:un,handleFileSelect:dn,handlePaste:fn,uploadImage:it,removeImage:hn,fileToBase64:Bt,handleClickOutside:ut,formatTime:mn,getChannelTypeText:pn,scrollToBottom:Ie,checkScrollPosition:Ne,isNearBottom:Fe,getChannelMessageCount:Mt,startDrag:wn,handleDragMove:He,handleDragEnd:Xe,resetDragState:We,getDragStyle:In,getDragDistance:xn,clearChannelHistory:_t,showNotification:D,createThresholdCircle:Lt,removeThresholdCircle:Tt,handleTouchStart:Ln,handleTouchMove:Tn,handleTouchEnd:qn,handleInputFocus:Kn,loadMoreMessages:Dt,handlePlusOne:vn,handleCopyMessage:gn,handleReplyMessage:yn,parseInlineQuote:lt,getInlineQuoteMessage:ze,getQuoteUser:Vt,getQuoteTimestamp:Jt,getQuoteContent:Gt,getQuoteElements:Zt,getMessageContentWithoutQuote:Et,getCachedImageUrl:vt,cacheImage:$e,clearChannelImageCache:Qe,clearAllIndexedDBData:ft,getMemoryStats:Sn,getCacheStats:$n,isFileUrl:ce,loadHistoryMessages:yt,handleMessageEvent:jt,handleBotMessageSentEvent:At,saveSelectionState:gt,restoreSelectionState:Pt}}const Xn={class:"bot-list"},Wn={class:"bot-items"},Qn=["onClick","onContextmenu"],Yn={class:"bot-avatar"},Vn={key:1,class:"avatar-placeholder"},Jn={class:"bot-info"},Gn={class:"bot-name"},Zn={class:"bot-platform"},En={class:"channel-list"},ea={key:0,class:"empty-state"},ta={key:1,class:"channel-items"},na=["data-channel-id","onClick","onContextmenu"],aa={class:"channel-info"},sa={class:"channel-name"},oa={class:"channel-type"},ra=["onMousedown","onTouchstart","title"],la={class:"message-area"},ca={class:"panel-header"},ia={key:0,class:"empty-state"},ua={key:1,class:"message-content"},da={key:0,class:"loading-more-indicator"},fa=["onContextmenu"],ha={class:"message-avatar"},ma={key:1,class:"avatar-placeholder"},va={class:"message-content-wrapper"},ga={class:"message-header"},ya={class:"message-username"},pa={class:"message-time"},wa={key:0,class:"message-quote"},Ia={class:"quote-header"},xa={class:"quote-avatar"},Ca={key:1,class:"avatar-placeholder"},ba={class:"quote-username"},ka={class:"quote-time"},Sa={class:"quote-content"},$a={class:"message-text"},Ba={class:"message-input"},Da={key:0,class:"image-preview-container"},Ma=["src","alt"],_a=["onClick"],La={class:"input-row"},Ta={class:"input-actions"},qa=["placeholder","disabled"],Ua=["disabled"],Ka=De({__name:"index",setup(ce){const ge=Hn(),{AvatarComponent:Y,MessageElement:xe,selectedBot:te,selectedChannel:Me,inputMessage:d,pinnedBots:z,pinnedChannels:P,uploadedImages:ie,showActionMenu:k,swipeIndicator:V,messageHistory:Pe,messageInput:Ce,showScrollButton:be,isSending:x,isLoadingMore:Ve,draggingChannel:je,dragThreshold:_,contextMenu:B,fileInput:Je,bots:ye,currentChannels:Ae,currentMessages:q,currentChannelName:tt,currentChannelKey:j,canSendMessage:J,canInputMessage:Ge,mobileViewClass:y,inputPlaceholder:b,chatContainerStyle:ue,selectBot:G,selectChannel:pe,handleBotRightClick:Oe,handleChannelRightClick:A,toggleBotPin:Z,toggleChannelPin:X,deleteBotMessages:de,deleteChannelMessages:_e,sendMessage:E,toggleActionMenu:T,triggerImageUpload:ne,handleFileSelect:Le,handlePaste:fe,removeImage:ke,formatTime:Se,getChannelTypeText:he,scrollToBottom:N,getChannelMessageCount:O,startDrag:Te,getDragStyle:qe,getDragDistance:W,handleTouchStart:Ue,handleTouchMove:H,handleTouchEnd:ae,handleInputFocus:S,handleMessageRightClick:U,handlePlusOne:se,handleCopyMessage:oe,handleReplyMessage:nt,getInlineQuoteMessage:at,getQuoteUser:we,getQuoteTimestamp:st,getQuoteContent:ot,getQuoteElements:Ke,getMessageContentWithoutQuote:rt}=ge;return(bt,h)=>(w(),C("div",{class:ve(["chat-container",r(y)]),style:It(r(ue)),onTouchstart:h[18]||(h[18]=(...i)=>r(Ue)&&r(Ue)(...i)),onTouchmove:h[19]||(h[19]=(...i)=>r(H)&&r(H)(...i)),onTouchend:h[20]||(h[20]=(...i)=>r(ae)&&r(ae)(...i))},[$(" 左侧机器人列表 "),f("div",Xn,[h[21]||(h[21]=f("div",{class:"panel-header"},[f("h3",null,"机器人")],-1)),f("div",Wn,[(w(true),C(ee,null,Re(r(ye),i=>(w(),C("div",{key:i.selfId,class:ve(["bot-item",{active:r(te)===i.selfId,pinned:r(z).has(i.selfId)}]),onClick:M=>r(G)(i.selfId),onContextmenu:M=>r(Oe)(M,i.selfId)},[f("div",Yn,[i.avatar?(w(),Ye(r(Y),{key:0,src:i.avatar,alt:i.username,"channel-key":"bot-list"},null,8,["src","alt"])):(w(),C("div",Vn,L(i.username.charAt(0).toUpperCase()),1))]),f("div",Jn,[f("div",Gn,L(i.username),1),f("div",Zn,L(i.platform),1)]),f("div",{class:ve(["bot-status",i.status])},null,2)],42,Qn))),128))])]),$(" 中间频道列表 "),f("div",En,[h[22]||(h[22]=f("div",{class:"panel-header"},[f("h3",null,"频道")],-1)),r(te)?(w(),C("div",ta,[(w(true),C(ee,null,Re(r(Ae),i=>(w(),C("div",{key:i.id,class:ve(["channel-item",{active:r(Me)===i.id,pinned:r(P).has(`${r(te)}:${i.id}`)}]),"data-channel-id":i.id,onClick:M=>r(pe)(i.id),onContextmenu:M=>r(A)(M,i.id)},[f("div",aa,[f("div",sa,L(i.name),1),f("div",oa,L(r(he)(i.type)),1)]),r(O)(i.id)>0?(w(),C("div",{key:0,class:ve(["channel-message-count draggable-bubble",{dragging:r(je)===i.id,"will-delete":r(je)===i.id&&r(W)(i.id)>r(_)}]),onMousedown:M=>r(Te)(M,i.id),onTouchstart:M=>r(Te)(M,i.id),style:It(r(qe)(i.id)),title:r(je)===i.id?r(W)(i.id)>r(_)?"松开清理历史记录":"拖拽更远以清理历史记录":"拖拽清理历史记录"},L(r(O)(i.id)),47,ra)):$("v-if",true)],42,na))),128))])):(w(),C("div",ea," 请选择一个机器人 "))]),$(" 右侧消息区域 "),f("div",la,[f("div",ca,[f("h3",null,L(r(tt)||"选择频道"),1)]),!r(te)||!r(Me)?(w(),C("div",ia," 请选择机器人和频道 ")):(w(),C("div",ua,[$(" 消息历史 "),f("div",{class:"message-history",ref_key:"messageHistory",ref:Pe},[$(" 加载更多指示器 "),r(Ve)?(w(),C("div",da,[...h[23]||(h[23]=[f("div",{class:"loading-spinner"},null,-1),f("span",null,"加载更多消息中...",-1)])])):$("v-if",true),(w(true),C(ee,null,Re(r(q),i=>(w(),C("div",{key:i.id,class:ve(["message-item",{"bot-message":i.isBot}]),onContextmenu:M=>i.isBot?null:r(U)(M,i)},[f("div",ha,[i.avatar?(w(),Ye(r(Y),{key:0,src:i.avatar,alt:i.username,"channel-key":r(j)},null,8,["src","alt","channel-key"])):(w(),C("div",ma,L(i.username.charAt(0).toUpperCase()),1))]),f("div",va,[f("div",ga,[f("span",ya,L(i.username),1),f("span",pa,L(r(Se)(i.timestamp)),1)]),$(" 引用消息显示 "),i.quote||r(at)(i,r(q))?(w(),C("div",wa,[f("div",Ia,[f("div",xa,[r(we)(i,r(q)).avatar?(w(),Ye(r(Y),{key:0,src:r(we)(i,r(q)).avatar,alt:r(we)(i,r(q)).username,"channel-key":r(j)},null,8,["src","alt","channel-key"])):(w(),C("div",Ca,L(r(we)(i,r(q)).username.charAt(0).toUpperCase()),1))]),f("span",ba,L(r(we)(i,r(q)).username),1),f("span",ka,L(r(Se)(r(st)(i,r(q)))),1)]),f("div",Sa,[r(Ke)(i,r(q))&&r(Ke)(i,r(q)).length>0?(w(true),C(ee,{key:0},Re(r(Ke)(i,r(q)),(M,me)=>(w(),Ye(r(xe),{key:`quote-${me}`,element:M,"channel-key":r(j)},null,8,["element","channel-key"]))),128)):(w(),C(ee,{key:1},[xt(L(r(ot)(i,r(q))),1)],64))])])):$("v-if",true),f("div",$a,[i.elements&&i.elements.length>0?(w(true),C(ee,{key:0},Re(i.elements,(M,me)=>(w(),Ye(r(xe),{key:me,element:M,"channel-key":r(j)},null,8,["element","channel-key"]))),128)):(w(),C(ee,{key:1},[xt(L(r(rt)(i,r(q))),1)],64))])])],42,fa))),128))],512),$(" 悬浮的滚动到底部按钮 "),Ht(f("div",{class:"floating-scroll-button",onClick:h[0]||(h[0]=(...i)=>r(N)&&r(N)(...i))},[...h[24]||(h[24]=[f("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor"},[f("path",{d:"M7 10l5 5 5-5z"})],-1)])],512),[[jn,r(be)]]),$(" 输入框 "),f("div",Ba,[$(" 图片预览区域 "),r(ie).length>0?(w(),C("div",Da,[(w(true),C(ee,null,Re(r(ie),i=>(w(),C("div",{key:i.tempId,class:"image-preview-item"},[f("img",{src:i.preview,alt:i.filename,class:"preview-image"},null,8,Ma),f("button",{class:"remove-image-btn",onClick:M=>r(ke)(i.tempId),title:"删除图片"},[...h[25]||(h[25]=[f("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor"},[f("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)])],8,_a)]))),128))])):$("v-if",true),f("div",La,[$(" 加号按钮 "),f("div",Ta,[f("button",{class:ve(["add-button",{active:r(k)}]),onClick:h[1]||(h[1]=(...i)=>r(T)&&r(T)(...i)),title:"更多操作"},[...h[26]||(h[26]=[f("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[f("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),f("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])],2),$(" 操作菜单 "),r(k)?(w(),C("div",{key:0,class:"action-menu",onClick:h[3]||(h[3]=Xt(()=>{},["stop"]))},[f("button",{class:"action-menu-item",onClick:h[2]||(h[2]=(...i)=>r(ne)&&r(ne)(...i))},[...h[27]||(h[27]=[f("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[f("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),f("circle",{cx:"8.5",cy:"8.5",r:"1.5"}),f("polyline",{points:"21,15 16,10 5,21"})],-1),xt(" 上传图片 ",-1)])])])):$("v-if",true)]),Ht(f("input",{"onUpdate:modelValue":h[4]||(h[4]=i=>On(d)?d.value=i:null),type:"text",placeholder:r(b),onKeyup:h[5]||(h[5]=An((...i)=>r(E)&&r(E)(...i),["enter"])),disabled:!r(Ge),ref_key:"messageInput",ref:Ce,onPaste:h[6]||(h[6]=(...i)=>r(fe)&&r(fe)(...i)),onFocus:h[7]||(h[7]=(...i)=>r(S)&&r(S)(...i))},null,40,qa),[[zn,r(d)]]),f("button",{onClick:h[8]||(h[8]=(...i)=>r(E)&&r(E)(...i)),disabled:!r(J),class:ve({"is-sending":r(x)})},L(r(x)?"发送中...":"发送"),11,Ua)]),$(" 隐藏的文件输入 "),f("input",{type:"file",ref_key:"fileInput",ref:Je,onChange:h[9]||(h[9]=(...i)=>r(Le)&&r(Le)(...i)),accept:"image/*",multiple:"",style:{display:"none"}},null,544)])]))]),$(" 右键菜单 "),r(B).show?(w(),C("div",{key:0,class:"context-menu",style:It({left:r(B).x+"px",top:r(B).y+"px"}),onClick:h[17]||(h[17]=Xt(()=>{},["stop"]))},[$(" 机器人右键菜单 "),r(B).type==="bot"?(w(),C(ee,{key:0},[f("div",{class:"context-menu-item",onClick:h[10]||(h[10]=i=>r(Z)(r(B).targetId))},L(r(z).has(r(B).targetId)?"取消置顶":"置顶"),1),f("div",{class:"context-menu-item danger",onClick:h[11]||(h[11]=i=>r(de)(r(B).targetId))}," 彻底删除此机器人所有数据 ")],64)):$("v-if",true),$(" 频道右键菜单 "),r(B).type==="channel"?(w(),C(ee,{key:1},[f("div",{class:"context-menu-item",onClick:h[12]||(h[12]=i=>r(X)(r(B).targetId))},L(r(P).has(`${r(te)}:${r(B).targetId}`)?"取消置顶":"置顶"),1),f("div",{class:"context-menu-item danger",onClick:h[13]||(h[13]=i=>r(_e)(r(B).targetId))}," 彻底删除此频道所有数据 ")],64)):$("v-if",true),$(" 消息右键菜单 "),r(B).type==="message"&&r(B).message?(w(),C(ee,{key:2},[f("div",{class:"context-menu-item",onClick:h[14]||(h[14]=i=>r(se)(r(B).message))}," +1 "),f("div",{class:"context-menu-item",onClick:h[15]||(h[15]=i=>r(oe)(r(B).message))}," 复制 "),f("div",{class:"context-menu-item",onClick:h[16]||(h[16]=i=>r(nt)(r(B).message))}," 回复 ")],64)):$("v-if",true)],4)):$("v-if",true),$(" 滑动指示器 "),f("div",{class:ve(["swipe-indicator",{show:r(V).show}])},L(r(V).text),3)],38))}}),Wt=(ce,ge)=>{const Y=ce.__vccOpts||ce;for(const[xe,te]of ge)Y[xe]=te;return Y},Ra=Wt(Ka,[["__scopeId","data-v-d6c77cba"]]),Pa={},ja={class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none"};function Aa(ce,ge){return w(),C("svg",ja,[...ge[0]||(ge[0]=[f("path",{d:"M8 10.5H16",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),f("path",{d:"M8 14H13.5",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},null,-1),f("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 Oa=Wt(Pa,[["render",Aa]]);Fn.register("activity:chat",Oa);const Ha=ce=>{ce.page({name:"聊天室",path:"/chat-patch",desc:"",authority:4,icon:"activity:chat",component:De({setup(){return()=>m(Nn("k-layout"),{},{default:()=>m(Ra)})}})})};export{Ha as default};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .message-quote[data-v-bda63c05]{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-bda63c05]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-bda63c05]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-bda63c05]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-bda63c05]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-bda63c05]{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-bda63c05]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-bda63c05]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-bda63c05]{color:#7276b7;line-height:1.3;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.quote-content .message-image[data-v-bda63c05]{max-width:min(200px,50vw);max-height:100px}.quote-content .message-image-container[data-v-bda63c05]{margin:2px 0}@media (prefers-color-scheme:dark){.message-quote[data-v-bda63c05]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-bda63c05]{color:#adb5bd}.quote-username[data-v-bda63c05]{color:#0d6efd}}.chat-container[data-v-bda63c05]{display:flex;height:100vh;background:0 0;margin-left:0;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-bda63c05],.channel-list[data-v-bda63c05],.message-area[data-v-bda63c05]{display:flex;flex-direction:column;background:0 0;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-bda63c05]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-bda63c05]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-bda63c05]{flex:1;border-right:none}.panel-header[data-v-bda63c05]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:0 0;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-bda63c05]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-bda63c05]{display:none;background:0 0;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-bda63c05]:hover{background:#8080801a}.bot-items[data-v-bda63c05],.channel-items[data-v-bda63c05]{flex:1;overflow-y:auto;overflow-x:hidden;max-height:calc(100vh - 140px);-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.4) rgba(0,0,0,.05);scroll-behavior:smooth;overscroll-behavior:contain;padding-bottom:8px}.bot-item[data-v-bda63c05],.channel-item[data-v-bda63c05]{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-bda63c05]:hover,.channel-item[data-v-bda63c05]:hover{background:#8080801a}.bot-item.active[data-v-bda63c05],.channel-item.active[data-v-bda63c05]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-bda63c05]{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-bda63c05]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-bda63c05]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-bda63c05]{flex:1}.bot-name[data-v-bda63c05]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-bda63c05]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-bda63c05]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-bda63c05]{background:#4caf50}.bot-status.offline[data-v-bda63c05]{background:#f44336}.channel-info[data-v-bda63c05]{flex:1}.channel-name[data-v-bda63c05]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-bda63c05]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-bda63c05]{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-bda63c05]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-bda63c05]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble.dragging[data-v-bda63c05],.channel-message-count.draggable-bubble[data-v-bda63c05]:active{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-bda63c05]{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-bda63c05]{background:#f44336!important;animation:shake-bda63c05 .3s ease-in-out infinite}@keyframes pulseThreshold-bda63c05{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}}@keyframes menuSlideIn-bda63c05{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-bda63c05]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-bda63c05]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-bda63c05]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-bda63c05]:hover{background-color:#8080801a}.message-item.new-message[data-v-bda63c05]{background-color:#4caf5033;animation:highlight-bda63c05 2s ease-out}.message-item.bot-message[data-v-bda63c05]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-bda63c05]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-bda63c05]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-bda63c05]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-bda63c05]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-bda63c05]{order:1}.message-item.bot-message .message-text[data-v-bda63c05]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}@keyframes highlight-bda63c05{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-bda63c05]{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-bda63c05]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-bda63c05]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-bda63c05]{flex:1}.message-header[data-v-bda63c05]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-bda63c05]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-bda63c05]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-bda63c05]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-all;white-space:pre-wrap;max-width:100%;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-item:not(.bot-message) .message-text[data-v-bda63c05]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-input[data-v-bda63c05]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:0 0;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-bda63c05]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-bda63c05]{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-bda63c05]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-bda63c05]:active{transform:scale(.95)}.input-row button[data-v-bda63c05]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-bda63c05]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-bda63c05]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease;max-width:min(400px,66.67vw);max-height:200px;width:auto;height:auto;image-rendering:auto;-webkit-image-rendering:auto;-moz-image-rendering:auto;-o-image-rendering:auto}.message-image[src*=".gif"][data-v-bda63c05],.message-image[src*="image/gif"][data-v-bda63c05]{image-rendering:auto!important;-webkit-image-rendering:auto!important;animation-play-state:running!important}.message-image-loading[data-v-bda63c05]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-bda63c05]{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-paragraph[data-v-bda63c05]{display:block;margin-bottom:4px}.message-paragraph[data-v-bda63c05]:last-child{margin-bottom:0}.forward-message-container[data-v-bda63c05]{border:1px solid #fff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-bda63c05]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-bda63c05]:hover{background:#f0f0f0}.forward-message-title[data-v-bda63c05]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-bda63c05]{color:#666;font-size:13px;margin:2px 0;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.forward-message-footer[data-v-bda63c05]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-bda63c05]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-bda63c05]{color:#666;font-size:12px}.forward-message-expanded[data-v-bda63c05]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-bda63c05]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-bda63c05]:last-child{border-bottom:none}.forwarded-message-header[data-v-bda63c05]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-bda63c05]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-bda63c05]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-bda63c05]{color:#555;font-size:13px;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-at[data-v-bda63c05]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-bda63c05]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-bda63c05]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:0;background:0 0;color:currentColor}.input-row input[data-v-bda63c05]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-bda63c05]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-bda63c05]{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-bda63c05]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-bda63c05]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-bda63c05]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-bda63c05]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-bda63c05]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-bda63c05]{display:inline;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-image-container[data-v-bda63c05]{display:block;margin:4px 0}.message-image[data-v-bda63c05]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-bda63c05]:hover{transform:scale(1.02)}.message-image-loading[data-v-bda63c05]{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-bda63c05]{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-bda63c05]{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-bda63c05]:hover{background:#2196f333}.message-unknown[data-v-bda63c05]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-bda63c05{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-bda63c05]{background:#f44336!important;animation:shake-bda63c05 .3s ease-in-out infinite}@keyframes shake-bda63c05{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-bda63c05]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-bda63c05]{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-bda63c05 1.5s ease-in-out infinite}.context-menu[data-v-bda63c05]{position:fixed;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:10000;min-width:180px}.context-menu-item[data-v-bda63c05]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:0 0;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative;border-bottom:1px solid rgba(0,0,0,.08);min-width:140px}.context-menu-item[data-v-bda63c05]:last-child{border-bottom:none}.context-menu-item[data-v-bda63c05]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea 0,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.context-menu-item[data-v-bda63c05]:hover{background:linear-gradient(90deg,#667eea14 0,#764ba214);color:#667eea;transform:translate(4px)}.context-menu-item[data-v-bda63c05]:hover:before{transform:scaleY(1)}.context-menu-item.danger[data-v-bda63c05]{color:#d32f2f}.context-menu-item.danger[data-v-bda63c05]:hover{background:linear-gradient(90deg,#f4433614 0,#d32f2f14);color:#d32f2f}.bot-item.pinned[data-v-bda63c05],.channel-item.pinned[data-v-bda63c05]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-bda63c05]:before,.channel-item.pinned[data-v-bda63c05]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-bda63c05],.channel-item.pinned[data-v-bda63c05]{position:relative;padding-left:24px}@media (prefers-color-scheme:dark){.context-menu[data-v-bda63c05]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.context-menu-item[data-v-bda63c05]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-bda63c05]:before{background:linear-gradient(135deg,#4facfe 0,#00f2fe)}.context-menu-item[data-v-bda63c05]:hover{background:linear-gradient(90deg,#4facfe1f 0,#00f2fe1f);color:#4facfe}.context-menu-item.danger[data-v-bda63c05]:hover{background:linear-gradient(90deg,#f443361f 0,#ff8a801f);color:#ff8a80}.bot-item.pinned[data-v-bda63c05],.channel-item.pinned[data-v-bda63c05]{background:#ffc10726}}.message-share-card[data-v-bda63c05]{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-bda63c05]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-bda63c05]{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-bda63c05]{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-bda63c05]{transform:scale(1.05)}.share-card-content[data-v-bda63c05]{padding:8px}.share-card-header[data-v-bda63c05]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-bda63c05]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-bda63c05]{flex:1;min-width:0}.share-card-app-name[data-v-bda63c05]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-bda63c05]{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-bda63c05]{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-bda63c05]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-bda63c05]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-bda63c05]:after{transform:translate(2px)}.message-json-error[data-v-bda63c05],.message-json-raw[data-v-bda63c05]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-bda63c05]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-bda63c05]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-bda63c05]{margin-top:8px}.json-raw-data summary[data-v-bda63c05]{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-bda63c05]:hover{background:#2196f333}.json-raw-content[data-v-bda63c05]{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;word-break:break-all;overflow-wrap:anywhere;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme:dark){.message-share-card[data-v-bda63c05]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-bda63c05]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-bda63c05]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width:768px){.chat-container[data-v-bda63c05]{position:relative;height:100vh;height:100dvh}.bot-list[data-v-bda63c05],.channel-list[data-v-bda63c05],.message-area[data-v-bda63c05]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-bda63c05]{transform:translate(0);z-index:3}.channel-list[data-v-bda63c05]{transform:translate(100%);z-index:2}.message-area[data-v-bda63c05]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-bda63c05]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-bda63c05]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-bda63c05]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-bda63c05]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-bda63c05]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-bda63c05]{transform:translate(0);z-index:3}.back-button[data-v-bda63c05]{display:none!important}.panel-header[data-v-bda63c05]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-bda63c05]{text-align:right}.floating-scroll-button[data-v-bda63c05]{right:16px;bottom:calc(90px + env(safe-area-inset-bottom,0px));width:40px;height:40px;transition:bottom .3s ease}.message-input[data-v-bda63c05]{padding:8px 12px calc(12px + env(safe-area-inset-bottom,0px)) 12px;position:fixed;bottom:20px;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10;min-height:calc(60px + env(safe-area-inset-bottom,0px));transition:transform .3s ease;transform:translateZ(0)}.input-row input[data-v-bda63c05]{font-size:16px;padding:10px 12px}.input-row button[data-v-bda63c05]{padding:10px 16px;font-size:16px}.message-history[data-v-bda63c05]{padding:12px;max-height:calc(100vh - 140px - env(safe-area-inset-bottom,0px));max-height:calc(100dvh - 140px - env(safe-area-inset-bottom,0px));padding-bottom:calc(80px + env(safe-area-inset-bottom,0px));overflow-y:auto;-webkit-overflow-scrolling:touch;transition:max-height .3s ease}.message-item[data-v-bda63c05]{margin-bottom:12px;padding:6px}.message-text[data-v-bda63c05]{max-width:90%!important}.message-avatar[data-v-bda63c05]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-bda63c05]{margin-left:8px}.message-image[data-v-bda63c05]{max-width:min(280px,66.67vw);max-height:160px}.quote-content .message-image[data-v-bda63c05]{max-width:min(150px,50vw);max-height:80px}.context-menu[data-v-bda63c05]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-bda63c05]{padding:10px 12px;font-size:13px;min-width:100px}.bot-item[data-v-bda63c05],.channel-item[data-v-bda63c05]{padding:14px 16px}.bot-avatar[data-v-bda63c05]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-bda63c05],.channel-name[data-v-bda63c05]{font-size:15px}.bot-platform[data-v-bda63c05],.channel-type[data-v-bda63c05]{font-size:13px}.bot-items[data-v-bda63c05],.channel-items[data-v-bda63c05]{flex:1;overflow-y:auto;overflow-x:hidden;max-height:calc(100vh - 140px);max-height:calc(100dvh - 140px);-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.4) rgba(0,0,0,.05);scroll-behavior:smooth;overscroll-behavior:contain;padding-bottom:8px}}@media (min-width:769px) and (max-width:1024px){.bot-list[data-v-bda63c05]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-bda63c05]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-bda63c05]{max-width:min(350px,66.67vw);max-height:180px}}.chat-container.swiping[data-v-bda63c05]{overflow:hidden}.bot-list.swiping[data-v-bda63c05],.channel-list.swiping[data-v-bda63c05],.message-area.swiping[data-v-bda63c05]{transition:none!important}.swipe-indicator[data-v-bda63c05]{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-bda63c05]{opacity:1}.message-area .message-content[data-v-bda63c05]{padding-bottom:80px}.image-preview-container[data-v-bda63c05]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-bda63c05]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-bda63c05]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-bda63c05]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-bda63c05]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-bda63c05]{position:relative;margin-right:8px}.add-button[data-v-bda63c05]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea 0,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-bda63c05]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3 0,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-bda63c05]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-bda63c05]:hover:before{opacity:1}.add-button.active[data-v-bda63c05]{background:linear-gradient(135deg,#f093fb 0,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-bda63c05]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-bda63c05]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-bda63c05 .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-bda63c05]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:0 0;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-bda63c05]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea 0,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-bda63c05]:hover{background:linear-gradient(90deg,#667eea14 0,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-bda63c05]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-bda63c05]{flex-shrink:0}@media (prefers-color-scheme:dark){.action-menu[data-v-bda63c05]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-bda63c05]{color:#fff}.action-menu-item[data-v-bda63c05]:before{background:linear-gradient(135deg,#4facfe 0,#00f2fe)}.action-menu-item[data-v-bda63c05]:hover{background:linear-gradient(90deg,#4facfe1f 0,#00f2fe1f);color:#4facfe}.add-button[data-v-bda63c05]{background:linear-gradient(135deg,#4facfe 0,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-bda63c05]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-bda63c05]{background:linear-gradient(135deg,#fa709a 0,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-bda63c05]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width:768px){.image-preview-container[data-v-bda63c05]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-bda63c05]{width:50px;height:50px}.add-button[data-v-bda63c05]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-bda63c05]{min-width:100px}.action-menu-item[data-v-bda63c05]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-bda63c05]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-bda63c05]::-webkit-scrollbar{width:6px}.message-history[data-v-bda63c05]::-webkit-scrollbar-track{background:0 0}.message-history[data-v-bda63c05]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-bda63c05]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-bda63c05]::-webkit-scrollbar,.channel-items[data-v-bda63c05]::-webkit-scrollbar{width:8px}.bot-items[data-v-bda63c05]::-webkit-scrollbar-track,.channel-items[data-v-bda63c05]::-webkit-scrollbar-track{background:#0000000d;border-radius:4px}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb{background-color:#90939966;border-radius:4px;transition:all .3s ease;border:1px solid rgba(255,255,255,.1);background-clip:padding-box}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb:hover{background-color:#90939999;transform:scaleX(1.2)}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb:active,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb:active{background-color:#909399cc}.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar-track{background:0 0}.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-bda63c05]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-bda63c05]::-webkit-scrollbar-track{background:0 0}.json-raw-content[data-v-bda63c05]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-bda63c05]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme:dark){.bot-items[data-v-bda63c05]::-webkit-scrollbar-track,.channel-items[data-v-bda63c05]::-webkit-scrollbar-track{background:#ffffff0d}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar-thumb,.json-raw-content[data-v-bda63c05]::-webkit-scrollbar-thumb,.message-history[data-v-bda63c05]::-webkit-scrollbar-thumb{background-color:#ffffff4d;border-color:#0000001a}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-bda63c05]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-bda63c05]::-webkit-scrollbar-thumb:hover,.message-history[data-v-bda63c05]::-webkit-scrollbar-thumb:hover{background-color:#ffffff80}.bot-items[data-v-bda63c05]::-webkit-scrollbar-thumb:active,.channel-items[data-v-bda63c05]::-webkit-scrollbar-thumb:active{background-color:#ffffffb3}}.loading-more-indicator[data-v-bda63c05]{display:flex;align-items:center;justify-content:center;padding:12px;color:#6c757d;font-size:14px}.loading-spinner[data-v-bda63c05]{width:20px;height:20px;border:2px solid #f3f3f3;border-top:2px solid #2196f3;border-radius:50%;animation:spin-bda63c05 1s linear infinite;margin-right:8px}@keyframes spin-bda63c05{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.layout-iframe{width:100%;height:100%;border:none}
1
+ .message-quote[data-v-d6c77cba]{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-d6c77cba]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-d6c77cba]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-d6c77cba]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-d6c77cba]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-d6c77cba]{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-d6c77cba]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-d6c77cba]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-d6c77cba]{color:#7276b7;line-height:1.3;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.quote-content .message-image[data-v-d6c77cba]{max-width:min(200px,50vw);max-height:100px}.quote-content .message-image-container[data-v-d6c77cba]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-d6c77cba]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-d6c77cba]{color:#adb5bd}.quote-username[data-v-d6c77cba]{color:#0d6efd}}.chat-container[data-v-d6c77cba]{display:flex;height:100vh;background:0 0;margin-left:0;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-d6c77cba],.channel-list[data-v-d6c77cba],.message-area[data-v-d6c77cba]{display:flex;flex-direction:column;background:0 0;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-d6c77cba]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-d6c77cba]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-d6c77cba]{flex:1;border-right:none}.panel-header[data-v-d6c77cba]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:0 0;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-d6c77cba]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-d6c77cba]{display:none;background:0 0;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-d6c77cba]:hover{background:#8080801a}.bot-items[data-v-d6c77cba],.channel-items[data-v-d6c77cba]{flex:1;overflow-y:auto;overflow-x:hidden;max-height:calc(100vh - 140px);-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.4) rgba(0,0,0,.05);scroll-behavior:smooth;overscroll-behavior:contain;padding-bottom:8px}.bot-item[data-v-d6c77cba],.channel-item[data-v-d6c77cba]{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-d6c77cba]:hover,.channel-item[data-v-d6c77cba]:hover{background:#8080801a}.bot-item.active[data-v-d6c77cba],.channel-item.active[data-v-d6c77cba]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-d6c77cba]{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-d6c77cba]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-d6c77cba]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-d6c77cba]{flex:1}.bot-name[data-v-d6c77cba]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-d6c77cba]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-d6c77cba]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-d6c77cba]{background:#4caf50}.bot-status.offline[data-v-d6c77cba]{background:#f44336}.channel-info[data-v-d6c77cba]{flex:1}.channel-name[data-v-d6c77cba]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-d6c77cba]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-d6c77cba]{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-d6c77cba]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-d6c77cba]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble.dragging[data-v-d6c77cba],.channel-message-count.draggable-bubble[data-v-d6c77cba]:active{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-d6c77cba]{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-d6c77cba]{background:#f44336!important;animation:shake-d6c77cba .3s ease-in-out infinite}@keyframes pulseThreshold-d6c77cba{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}}@keyframes menuSlideIn-d6c77cba{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-d6c77cba]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-d6c77cba]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-d6c77cba]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-d6c77cba]:hover{background-color:#8080801a}.message-item.new-message[data-v-d6c77cba]{background-color:#4caf5033;animation:highlight-d6c77cba 2s ease-out}.message-item.bot-message[data-v-d6c77cba]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-d6c77cba]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-d6c77cba]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-d6c77cba]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-d6c77cba]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-d6c77cba]{order:1}.message-item.bot-message .message-text[data-v-d6c77cba]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}@keyframes highlight-d6c77cba{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-d6c77cba]{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-d6c77cba]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-d6c77cba]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-d6c77cba]{flex:1}.message-header[data-v-d6c77cba]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-d6c77cba]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-d6c77cba]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-d6c77cba]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-all;white-space:pre-wrap;max-width:100%;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-item:not(.bot-message) .message-text[data-v-d6c77cba]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-input[data-v-d6c77cba]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:0 0;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-d6c77cba]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-d6c77cba]{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-d6c77cba]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-d6c77cba]:active{transform:scale(.95)}.input-row button[data-v-d6c77cba]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-d6c77cba]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-d6c77cba]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease;max-width:min(400px,66.67vw);max-height:200px;width:auto;height:auto;image-rendering:auto;-webkit-image-rendering:auto;-moz-image-rendering:auto;-o-image-rendering:auto}.message-image[src*=".gif"][data-v-d6c77cba],.message-image[src*="image/gif"][data-v-d6c77cba]{image-rendering:auto!important;-webkit-image-rendering:auto!important;animation-play-state:running!important}.message-image-loading[data-v-d6c77cba]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-d6c77cba]{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-paragraph[data-v-d6c77cba]{display:block;margin-bottom:4px}.message-paragraph[data-v-d6c77cba]:last-child{margin-bottom:0}.forward-message-container[data-v-d6c77cba]{border:1px solid #fff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-d6c77cba]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-d6c77cba]:hover{background:#f0f0f0}.forward-message-title[data-v-d6c77cba]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-d6c77cba]{color:#666;font-size:13px;margin:2px 0;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.forward-message-footer[data-v-d6c77cba]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-d6c77cba]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-d6c77cba]{color:#666;font-size:12px}.forward-message-expanded[data-v-d6c77cba]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-d6c77cba]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-d6c77cba]:last-child{border-bottom:none}.forwarded-message-header[data-v-d6c77cba]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-d6c77cba]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-d6c77cba]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-d6c77cba]{color:#555;font-size:13px;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-at[data-v-d6c77cba]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-d6c77cba]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-d6c77cba]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:0;background:0 0;color:currentColor}.input-row input[data-v-d6c77cba]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-d6c77cba]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-d6c77cba]{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-d6c77cba]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-d6c77cba]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-d6c77cba]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-d6c77cba]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-d6c77cba]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-d6c77cba]{display:inline;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-image-container[data-v-d6c77cba]{display:block;margin:4px 0}.message-image[data-v-d6c77cba]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-d6c77cba]:hover{transform:scale(1.02)}.message-image-loading[data-v-d6c77cba]{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-d6c77cba]{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-d6c77cba]{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-d6c77cba]:hover{background:#2196f333}.message-unknown[data-v-d6c77cba]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-d6c77cba{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-d6c77cba]{background:#f44336!important;animation:shake-d6c77cba .3s ease-in-out infinite}@keyframes shake-d6c77cba{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-d6c77cba]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-d6c77cba]{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-d6c77cba 1.5s ease-in-out infinite}.context-menu[data-v-d6c77cba]{position:fixed;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:10000;min-width:180px}.context-menu-item[data-v-d6c77cba]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:0 0;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative;border-bottom:1px solid rgba(0,0,0,.08);min-width:140px}.context-menu-item[data-v-d6c77cba]:last-child{border-bottom:none}.context-menu-item[data-v-d6c77cba]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea 0,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.context-menu-item[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#667eea14 0,#764ba214);color:#667eea;transform:translate(4px)}.context-menu-item[data-v-d6c77cba]:hover:before{transform:scaleY(1)}.context-menu-item.danger[data-v-d6c77cba]{color:#d32f2f}.context-menu-item.danger[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#f4433614 0,#d32f2f14);color:#d32f2f}.bot-item.pinned[data-v-d6c77cba],.channel-item.pinned[data-v-d6c77cba]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-d6c77cba]:before,.channel-item.pinned[data-v-d6c77cba]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-d6c77cba],.channel-item.pinned[data-v-d6c77cba]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-d6c77cba]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.context-menu-item[data-v-d6c77cba]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-d6c77cba]:before{background:linear-gradient(135deg,#4facfe 0,#00f2fe)}.context-menu-item[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#4facfe1f 0,#00f2fe1f);color:#4facfe}.context-menu-item.danger[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#f443361f 0,#ff8a801f);color:#ff8a80}.bot-item.pinned[data-v-d6c77cba],.channel-item.pinned[data-v-d6c77cba]{background:#ffc10726}}.message-share-card[data-v-d6c77cba]{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-d6c77cba]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-d6c77cba]{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-d6c77cba]{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-d6c77cba]{transform:scale(1.05)}.share-card-content[data-v-d6c77cba]{padding:8px}.share-card-header[data-v-d6c77cba]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-d6c77cba]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-d6c77cba]{flex:1;min-width:0}.share-card-app-name[data-v-d6c77cba]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-d6c77cba]{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-d6c77cba]{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-d6c77cba]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-d6c77cba]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-d6c77cba]:after{transform:translate(2px)}.message-json-error[data-v-d6c77cba],.message-json-raw[data-v-d6c77cba]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-d6c77cba]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-d6c77cba]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-d6c77cba]{margin-top:8px}.json-raw-data summary[data-v-d6c77cba]{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-d6c77cba]:hover{background:#2196f333}.json-raw-content[data-v-d6c77cba]{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;word-break:break-all;overflow-wrap:anywhere;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-d6c77cba]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-d6c77cba]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-d6c77cba]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-d6c77cba]{position:relative;height:100vh;height:100dvh}.bot-list[data-v-d6c77cba],.channel-list[data-v-d6c77cba],.message-area[data-v-d6c77cba]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-d6c77cba]{transform:translate(0);z-index:3}.channel-list[data-v-d6c77cba]{transform:translate(100%);z-index:2}.message-area[data-v-d6c77cba]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-d6c77cba]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-d6c77cba]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-d6c77cba]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-d6c77cba]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-d6c77cba]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-d6c77cba]{transform:translate(0);z-index:3}.back-button[data-v-d6c77cba]{display:none!important}.panel-header[data-v-d6c77cba]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-d6c77cba]{text-align:right}.floating-scroll-button[data-v-d6c77cba]{right:16px;bottom:calc(90px + env(safe-area-inset-bottom,0px));width:40px;height:40px;transition:bottom .3s ease}.message-input[data-v-d6c77cba]{padding:8px 12px calc(12px + env(safe-area-inset-bottom,0px)) 12px;position:fixed;bottom:20px;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10;min-height:calc(60px + env(safe-area-inset-bottom,0px));transition:transform .3s ease;transform:translateZ(0)}.input-row input[data-v-d6c77cba]{font-size:16px;padding:10px 12px}.input-row button[data-v-d6c77cba]{padding:10px 16px;font-size:16px}.message-history[data-v-d6c77cba]{padding:12px;max-height:calc(100vh - 140px - env(safe-area-inset-bottom,0px));max-height:calc(100dvh - 140px - env(safe-area-inset-bottom,0px));padding-bottom:calc(80px + env(safe-area-inset-bottom,0px));overflow-y:auto;-webkit-overflow-scrolling:touch;transition:max-height .3s ease}.message-item[data-v-d6c77cba]{margin-bottom:12px;padding:6px}.message-text[data-v-d6c77cba]{max-width:90%!important}.message-avatar[data-v-d6c77cba]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-d6c77cba]{margin-left:8px}.message-image[data-v-d6c77cba]{max-width:min(280px,66.67vw);max-height:160px}.quote-content .message-image[data-v-d6c77cba]{max-width:min(150px,50vw);max-height:80px}.context-menu[data-v-d6c77cba]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-d6c77cba]{padding:10px 12px;font-size:13px;min-width:100px}.bot-item[data-v-d6c77cba],.channel-item[data-v-d6c77cba]{padding:14px 16px}.bot-avatar[data-v-d6c77cba]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-d6c77cba],.channel-name[data-v-d6c77cba]{font-size:15px}.bot-platform[data-v-d6c77cba],.channel-type[data-v-d6c77cba]{font-size:13px}.bot-items[data-v-d6c77cba],.channel-items[data-v-d6c77cba]{flex:1;overflow-y:auto;overflow-x:hidden;max-height:calc(100vh - 140px);max-height:calc(100dvh - 140px);-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.4) rgba(0,0,0,.05);scroll-behavior:smooth;overscroll-behavior:contain;padding-bottom:8px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-d6c77cba]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-d6c77cba]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-d6c77cba]{max-width:min(350px,66.67vw);max-height:180px}}.chat-container.swiping[data-v-d6c77cba]{overflow:hidden}.bot-list.swiping[data-v-d6c77cba],.channel-list.swiping[data-v-d6c77cba],.message-area.swiping[data-v-d6c77cba]{transition:none!important}.swipe-indicator[data-v-d6c77cba]{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-d6c77cba]{opacity:1}.message-area .message-content[data-v-d6c77cba]{padding-bottom:80px}.image-preview-container[data-v-d6c77cba]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-d6c77cba]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-d6c77cba]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-d6c77cba]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-d6c77cba]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-d6c77cba]{position:relative;margin-right:8px}.add-button[data-v-d6c77cba]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea 0,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-d6c77cba]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3 0,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-d6c77cba]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-d6c77cba]:hover:before{opacity:1}.add-button.active[data-v-d6c77cba]{background:linear-gradient(135deg,#f093fb 0,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-d6c77cba]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-d6c77cba]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-d6c77cba .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-d6c77cba]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:0 0;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-d6c77cba]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea 0,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#667eea14 0,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-d6c77cba]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-d6c77cba]{flex-shrink:0}@media (prefers-color-scheme: dark){.action-menu[data-v-d6c77cba]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-d6c77cba]{color:#fff}.action-menu-item[data-v-d6c77cba]:before{background:linear-gradient(135deg,#4facfe 0,#00f2fe)}.action-menu-item[data-v-d6c77cba]:hover{background:linear-gradient(90deg,#4facfe1f 0,#00f2fe1f);color:#4facfe}.add-button[data-v-d6c77cba]{background:linear-gradient(135deg,#4facfe 0,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-d6c77cba]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-d6c77cba]{background:linear-gradient(135deg,#fa709a 0,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-d6c77cba]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width: 768px){.image-preview-container[data-v-d6c77cba]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-d6c77cba]{width:50px;height:50px}.add-button[data-v-d6c77cba]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-d6c77cba]{min-width:100px}.action-menu-item[data-v-d6c77cba]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-d6c77cba]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-d6c77cba]::-webkit-scrollbar{width:6px}.message-history[data-v-d6c77cba]::-webkit-scrollbar-track{background:0 0}.message-history[data-v-d6c77cba]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-d6c77cba]::-webkit-scrollbar,.channel-items[data-v-d6c77cba]::-webkit-scrollbar{width:8px}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-track,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-track{background:#0000000d;border-radius:4px}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb{background-color:#90939966;border-radius:4px;transition:all .3s ease;border:1px solid rgba(255,255,255,.1);background-clip:padding-box}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover{background-color:#90939999;transform:scaleX(1.2)}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:active,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:active{background-color:#909399cc}.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar-track{background:0 0}.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar-track{background:0 0}.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme: dark){.bot-items[data-v-d6c77cba]::-webkit-scrollbar-track,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-track{background:#ffffff0d}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar-thumb,.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar-thumb,.message-history[data-v-d6c77cba]::-webkit-scrollbar-thumb{background-color:#ffffff4d;border-color:#0000001a}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover,.message-history[data-v-d6c77cba]::-webkit-scrollbar-thumb:hover{background-color:#ffffff80}.bot-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:active,.channel-items[data-v-d6c77cba]::-webkit-scrollbar-thumb:active{background-color:#ffffffb3}}.loading-more-indicator[data-v-d6c77cba]{display:flex;align-items:center;justify-content:center;padding:12px;color:#6c757d;font-size:14px}.loading-spinner[data-v-d6c77cba]{width:20px;height:20px;border:2px solid #f3f3f3;border-top:2px solid #2196f3;border-radius:50%;animation:spin-d6c77cba 1s linear infinite;margin-right:8px}@keyframes spin-d6c77cba{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.layout-iframe{width:100%;height:100%;border:none}
package/lib/index.js CHANGED
@@ -166,14 +166,31 @@ var MessageHandler = class {
166
166
  // 更新频道信息到JSON文件
167
167
  async updateChannelInfoToFile(session) {
168
168
  let guildName = session.channelId;
169
+ let directUserName = session.username || session.userId || "未知用户";
169
170
  const data = this.fileManager.readChatDataFromFile();
170
171
  try {
171
172
  if (session.guildId && session.bot.getGuild && typeof session.bot.getGuild === "function") {
172
173
  const guild = await session.bot.getGuild(session.guildId);
173
174
  guildName = guild?.name || session.channelId;
174
175
  }
175
- } catch (guildError) {
176
- this.logInfo("获取群组信息失败,使用频道ID作为备用:", guildError);
176
+ if (session.isDirect && session.bot.getUser && typeof session.bot.getUser === "function") {
177
+ try {
178
+ const user = await session.bot.getUser(session.userId);
179
+ directUserName = user?.name || session.username || session.userId || "未知用户";
180
+ } catch (userError) {
181
+ this.logInfo("获取用户信息失败,使用备用名称:", userError);
182
+ }
183
+ }
184
+ if (session.guildId && !session.bot.getGuild && session.bot.getChannel && typeof session.bot.getChannel === "function") {
185
+ try {
186
+ const channel = await session.bot.getChannel(session.guildId);
187
+ guildName = channel?.name || session.channelId;
188
+ } catch (channelError) {
189
+ this.logInfo("获取频道信息失败,使用频道ID作为备用:", channelError);
190
+ }
191
+ }
192
+ } catch (error) {
193
+ this.logInfo("获取频道信息失败,使用频道ID作为备用:", error);
177
194
  guildName = session.channelId;
178
195
  }
179
196
  if (!data.channels[session.selfId]) {
@@ -181,7 +198,7 @@ var MessageHandler = class {
181
198
  }
182
199
  const channelInfo = {
183
200
  id: session.channelId,
184
- name: session.isDirect ? `私信 ${session.channelId}` : `${guildName} (${session.channelId})`,
201
+ name: session.isDirect ? `私聊(${directUserName})` : `${guildName} (${session.channelId})`,
185
202
  type: session.type || 0,
186
203
  channelId: session.channelId,
187
204
  guildName,
package/package.json CHANGED
@@ -1,40 +1,40 @@
1
- {
2
- "name": "koishi-plugin-chat-patch",
3
- "description": "[<ruby>chat-patch<rp>(</rp><rt>点我预览效果</rt><rp>)</rp></ruby>](https://i0.hdslb.com/bfs/openplatform/71074dfc9e5256fc3333d8bd8478bec1af874046.png) 视奸小插件((bushi( (低性能警告)。手机端适配。灵感来自 chat 插件。",
4
- "version": "1.2.0",
5
- "main": "lib/index.js",
6
- "typings": "lib/index.d.ts",
7
- "files": [
8
- "client",
9
- "dist",
10
- "lib",
11
- "src"
12
- ],
13
- "license": "MIT",
14
- "homepage": "https://github.com/shangxueink/koishi-shangxue-apps/",
15
- "bugs": {
16
- "url": "https://github.com/shangxueink/koishi-shangxue-apps/issues"
17
- },
18
- "keywords": [
19
- "koishi",
20
- "plugin",
21
- "chat",
22
- "聊天室",
23
- "console"
24
- ],
25
- "cordis": {
26
- "service": {
27
- "required": [
28
- "console"
29
- ]
30
- }
31
- },
32
- "peerDependencies": {
33
- "@koishijs/plugin-console": "^5.11.0",
34
- "koishi": "^4.16.0"
35
- },
36
- "devDependencies": {
37
- "@koishijs/client": "^5.11.0",
38
- "koishi": "^4.16.0"
39
- }
40
- }
1
+ {
2
+ "name": "koishi-plugin-chat-patch",
3
+ "description": "[<ruby>chat-patch<rp>(</rp><rt>点我预览效果</rt><rp>)</rp></ruby>](https://i0.hdslb.com/bfs/openplatform/71074dfc9e5256fc3333d8bd8478bec1af874046.png) 视奸小插件((bushi( (低性能警告)。手机端适配。灵感来自 chat 插件。",
4
+ "version": "1.3.0",
5
+ "main": "lib/index.js",
6
+ "typings": "lib/index.d.ts",
7
+ "files": [
8
+ "client",
9
+ "dist",
10
+ "lib",
11
+ "src"
12
+ ],
13
+ "license": "MIT",
14
+ "homepage": "https://github.com/shangxueink/koishi-shangxue-apps/",
15
+ "bugs": {
16
+ "url": "https://github.com/shangxueink/koishi-shangxue-apps/issues"
17
+ },
18
+ "keywords": [
19
+ "koishi",
20
+ "plugin",
21
+ "chat",
22
+ "聊天室",
23
+ "console"
24
+ ],
25
+ "cordis": {
26
+ "service": {
27
+ "required": [
28
+ "console"
29
+ ]
30
+ }
31
+ },
32
+ "peerDependencies": {
33
+ "@koishijs/plugin-console": "^5.11.0",
34
+ "koishi": "^4.16.0"
35
+ },
36
+ "devDependencies": {
37
+ "@koishijs/client": "^5.11.0",
38
+ "koishi": "^4.16.0"
39
+ }
40
+ }
package/readme.md CHANGED
@@ -1,25 +1,25 @@
1
- # koishi-plugin-chat-patch
2
-
3
- [![npm](https://img.shields.io/npm/v/koishi-plugin-chat-patch?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-chat-patch) [![npm downloads](https://img.shields.io/npm/dm/koishi-plugin-chat-patch)](https://www.npmjs.com/package/koishi-plugin-chat-patch)
4
-
5
- Koishi 控制台聊天插件,允许用户直接在控制台中管理机器人、频道和消息。
6
-
7
- 支持消息的收发、图片缓存、频道置顶等。
8
-
9
- ## ✨ 功能特性
10
-
11
- - **聊天界面**:在 Koishi 控制台内直接查看机器人的聊天记录。
12
- - **消息收发**:支持接收文本、图片等多种类型的消息。
13
- - **图片缓存**:通过 IndexedDB 缓存图片,优化加载速度并减少网络请求。
14
- - **手机端优化**:针对手机端进行适配,提供滑动返回等手势操作,并可配置聊天容器高度以防止输入框被遮挡。
15
- - **平台屏蔽**:可配置屏蔽特定平台的消息,避免不必要的干扰。
16
-
17
- ## 🛠️ 开发与贡献
18
-
19
- 欢迎 PR ~
20
-
21
- PR 方式请参考 -> https://github.com/shangxueink/koishi-shangxue-apps/tree/main?tab=readme-ov-file#%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF%E4%B8%AD%E5%BC%80%E5%8F%91%E6%AD%A4%E4%BB%93%E5%BA%93
22
-
23
- ## 许可证
24
-
25
- 本项目采用 [MIT 许可证](LICENSE) 开源。
1
+ # koishi-plugin-chat-patch
2
+
3
+ [![npm](https://img.shields.io/npm/v/koishi-plugin-chat-patch?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-chat-patch) [![npm downloads](https://img.shields.io/npm/dm/koishi-plugin-chat-patch)](https://www.npmjs.com/package/koishi-plugin-chat-patch)
4
+
5
+ Koishi 控制台聊天插件,允许用户直接在控制台中管理机器人、频道和消息。
6
+
7
+ 支持消息的收发、图片缓存、频道置顶等。
8
+
9
+ ## ✨ 功能特性
10
+
11
+ - **聊天界面**:在 Koishi 控制台内直接查看机器人的聊天记录。
12
+ - **消息收发**:支持接收文本、图片等多种类型的消息。
13
+ - **图片缓存**:通过 IndexedDB 缓存图片,优化加载速度并减少网络请求。
14
+ - **手机端优化**:针对手机端进行适配,提供滑动返回等手势操作,并可配置聊天容器高度以防止输入框被遮挡。
15
+ - **平台屏蔽**:可配置屏蔽特定平台的消息,避免不必要的干扰。
16
+
17
+ ## 🛠️ 开发与贡献
18
+
19
+ 欢迎 PR ~
20
+
21
+ PR 方式请参考 -> https://github.com/shangxueink/koishi-shangxue-apps/tree/main?tab=readme-ov-file#%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF%E4%B8%AD%E5%BC%80%E5%8F%91%E6%AD%A4%E4%BB%93%E5%BA%93
22
+
23
+ ## 许可证
24
+
25
+ 本项目采用 [MIT 许可证](LICENSE) 开源。