1import{B as e,C as t,E as n,F as r,J as i,K as a,N as o,O as s,R as c,S as l,T as u,U as d,W as f,X as p,Z as m,c as h,ct as g,et as _,it as v,k as y,n as b,ot as x,st as S,ut as C,y as w}from"./vendor-vue-Bu-KQjoC.js";import{o as T,s as E,t as D}from"./apiResponse-C8fEm_-L.js";import{ot as O,rt as k,st as A}from"./index-BE2-dWra.js";import{t as ee}from"./BlogContentRenderer-qER_0Wwh.js";import{n as j}from"./vendor-marked-Cm-SUVFQ.js";var M=`main`,N=`otto-chat-token:`,P=`https://api-chat.ottohub.cn`,F={missing_argument:`缺å°å¿
è¦åæ°`,error_token:`ç»å½å·²å¤±æï¼è¯·éæ°ç»å½`,error_password:`è´¦å·æå¯ç é误`,too_many_requests:`æä½è¿äºé¢ç¹ï¼è¯·ç¨ååè¯`,no_permission:`没ææé`,resource_not_found:`èµæºä¸åå¨`,already_deleted:`æ¶æ¯å·²å é¤`,auth_required:`请å
ç»å½åååè¨`,too_short_message:`æ¶æ¯ä¸è½ä¸ºç©º`,too_long_message:`æ¶æ¯è¿é¿ï¼æå¤ 300 åï¼`,rate_limited:`åéè¿äºé¢ç¹`,warn:`æ¶æ¯å
嫿æè¯`,muted:`ä½ å·²è¢«ç¦è¨`,account_banned:`è´¦å·ä¸å¯ç¨`,invalid_reply_to:`åå¤ç®æ æ æ`,reply_target_deleted:`åæ¶æ¯å·²å é¤ï¼æ æ³åå¤`};function I(){return/^https?:\/\//i.test(`https://api-chat.ottohub.cn`)?P:`${typeof window<`u`?window.location.origin:`http://localhost`}${`/${P}`}`}function L(e,t){let n=e.startsWith(`/`)?e:`/${e}`,r=new URL(`${I()}${n}`);if(t)for(let[e,n]of Object.entries(t))n!=null&&n!==``&&r.searchParams.set(e,String(n));return r.toString()}function R(){return I().replace(/^http/i,`ws`)}var z=8e3;function B(e){let t={"Content-Type":`application/json`};return e&&(t.Authorization=`Bearer ${e}`),t}function V(e){if(!e||typeof e!=`object`)return null;let t=e;return t.data&&typeof t.data==`object`?t.data:t}function H(e,t=``){return typeof e==`string`?e:t}function U(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function W(e){if(!e||typeof e!=`object`)return null;let t=e,n=H(t.content);return n?{room:H(t.room,M),content:n,pinned:t.pinned!==!1,updated_by:U(t.updated_by),updated_at:H(t.updated_at)}:null}function G(e){if(!e||typeof e!=`object`)return null;let t=e;return{id:U(t.id),uid:U(t.uid),room_id:t.room_id==null?null:U(t.room_id),muted_until:t.muted_until==null?null:H(t.muted_until),reason:H(t.reason),created_by:U(t.created_by),created_at:H(t.created_at)}}function te(e){if(!e||typeof e!=`object`)return null;let t=e;return{id:U(t.id),uid:U(t.uid),username:H(t.username,`ç¨æ·`),content:H(t.content),deleted:t.deleted===!0||t.deleted===1}}function K(e){return te(e)}function ne(e){return{id:U(e.id),room:H(e.room,M),uid:U(e.uid),username:H(e.username,`ç¨æ·`),content:H(e.content),created_at:H(e.created_at),reply:K(e.reply)}}function q(e){return{chat_token:H(e.chat_token),uid:U(e.uid),username:H(e.username),is_admin:U(e.is_admin)}}async function J(e,t={}){let n=new AbortController,r=setTimeout(()=>n.abort(),z);try{let r=await fetch(L(e,t.query),{method:t.method??`GET`,headers:B(t.token),body:t.body===void 0?void 0:JSON.stringify(t.body),signal:n.signal}),i=await T(r),a=E(r,i,{messages:F,fallback:t.fallback??`请æ±å¤±è´¥`});if(a)throw Error(a);return{data:V(i),raw:i}}catch(e){throw e instanceof Error&&e.name===`AbortError`?Error(t.fallback??`è天室请æ±è¶
æ¶`):e instanceof TypeError?Error(t.fallback??`æ æ³è¿æ¥è天室æå¡`):e}finally{clearTimeout(r)}}function Y(e){return`${N}${e}`}function re(e){try{return localStorage.getItem(Y(e))}catch{return null}}function ie(e,t){try{localStorage.setItem(Y(e),t)}catch{}}function ae(e){try{localStorage.removeItem(Y(e))}catch{}}async function oe(e){let{data:t}=await J(`/api/auth/exchange`,{method:`POST`,body:{main_token:e},fallback:`è天室ç»å½å¤±è´¥`});if(!t?.chat_token)throw Error(F.error_token);return q(t)}async function se(e){let{data:t}=await J(`/api/auth/me`,{token:e,fallback:`è·åè天身份失败`});return{uid:U(t?.uid),username:H(t?.username),is_admin:U(t?.is_admin),mute:G(t?.mute)}}async function ce(e){try{await J(`/api/auth/logout`,{method:`POST`,token:e,fallback:`ç»åºå¤±è´¥`})}catch{}}async function le(e){let t=e.room??`main`,{data:n}=await J(`/api/rooms/${encodeURIComponent(t)}/messages`,{token:e.token,query:{limit:e.limit??50,before_id:e.beforeId},fallback:`å è½½æ¶æ¯å¤±è´¥`}),r=Array.isArray(n?.message_list)?n.message_list:[];return{room:H(n?.room,t),pinned_announcement:W(n?.pinned_announcement),message_list:r.filter(e=>!!e&&typeof e==`object`).map(ne)}}async function ue(e,t=10){let{data:n}=await J(`/api/user/username-match`,{query:{match:e,num:t},fallback:`èæ³ç¨æ·å¤±è´¥`});return(Array.isArray(n?.user_list)?n.user_list:[]).filter(e=>!!e&&typeof e==`object`).map(e=>({uid:U(e.uid),username:H(e.username)}))}async function de(e,t){await J(`/api/messages/${t}`,{method:`DELETE`,token:e,fallback:`å 餿¶æ¯å¤±è´¥`})}async function fe(e){let{data:t}=await J(`/api/blocks`,{token:e,fallback:`å è½½æé»å表失败`});return(Array.isArray(t?.block_list)?t.block_list:[]).filter(e=>!!e&&typeof e==`object`).map(e=>({uid:U(e.uid),username:H(e.username),created_at:H(e.created_at)}))}async function pe(e,t){await J(`/api/blocks`,{method:`POST`,token:e,body:{uid:t},fallback:`æé»å¤±è´¥`})}async function me(e,t){await J(`/api/blocks/${t}`,{method:`DELETE`,token:e,fallback:`åæ¶æé»å¤±è´¥`})}async function he(e,t){await J(`/api/admin/messages/${t}`,{method:`DELETE`,token:e,fallback:`å 餿¶æ¯å¤±è´¥`})}async function ge(e){let{data:t}=await J(`/api/admin/sensitive-words`,{token:e,fallback:`å è½½ææè¯å¤±è´¥`});return(Array.isArray(t?.word_list)&&t.word_list||Array.isArray(t?.sensitive_words)&&t.sensitive_words||Array.isArray(t?.list)&&t.list||[]).filter(e=>!!e&&typeof e==`object`).map(e=>({id:U(e.id),word:H(e.word??e.content),created_at:typeof e.created_at==`string`?e.created_at:void 0}))}async function _e(e,t){await J(`/api/admin/sensitive-words`,{method:`POST`,token:e,body:{word:t},fallback:`æ·»å ææè¯å¤±è´¥`})}async function ve(e,t){await J(`/api/admin/sensitive-words/${t}`,{method:`DELETE`,token:e,fallback:`å 餿æè¯å¤±è´¥`})}async function ye(e,t=0,n=50){let{data:r}=await J(`/api/admin/mutes`,{token:e,query:{offset:t,limit:n},fallback:`å è½½ç¦è¨å表失败`});return(Array.isArray(r?.mute_list)&&r.mute_list||Array.isArray(r?.mutes)&&r.mutes||Array.isArray(r?.list)&&r.list||[]).filter(e=>!!e&&typeof e==`object`).map(e=>
1G(e)).filter(Boolean)}async function be(e,t){await J(`/api/admin/mutes`,{method:`POST`,token:e,body:t,fallback:`ç¦è¨å¤±è´¥`})}async function xe(e,t){await J(`/api/admin/mutes/${t}`,{method:`DELETE`,token:e,fallback:`è§£é¤ç¦è¨å¤±è´¥`})}async function Se(e,t,n){await J(`/api/admin/rooms/${encodeURIComponent(t)}/announcement`,{method:`PUT`,token:e,body:{content:n},fallback:`设置å
¬å失败`})}async function Ce(e,t){await J(`/api/admin/rooms/${encodeURIComponent(t)}/announcement`,{method:`DELETE`,token:e,fallback:`æ¸
空å
¬å失败`})}function we(e,t){return F[e]?F[e]:t||D(e,F,`æä½å¤±è´¥`)}var Te={class:`relative shrink-0 border-t border-border bg-surface px-3 py-2`},Ee={key:0,class:`mb-2 text-[12px] text-danger`},X={key:1,class:`flex items-center justify-between gap-3 py-1`},Z={class:`text-[13px] text-secondary`},De={key:0,class:`mb-2 flex items-start gap-2 rounded-[var(--radius-default)] border border-border bg-elevated px-2.5 py-2`},Q={class:`min-w-0 flex-1 text-left`},$={class:`text-[12px] font-semibold text-accent`},Oe={class:`truncate text-[12px] text-secondary`},ke=[`aria-label`],Ae={key:1,class:`absolute bottom-full left-3 right-3 z-10 mb-1 max-h-40 overflow-y-auto rounded-[var(--radius-default)] border border-border bg-surface shadow-md`},je=[`onMousedown`],Me={class:`flex h-7 w-7 shrink-0 items-center justify-center rounded-full border border-border bg-elevated text-[11px] font-semibold text-secondary`},Ne={class:`min-w-0 flex-1 truncate font-medium text-primary`},Pe={class:`shrink-0 text-[11px] text-muted`},Fe=[`placeholder`,`disabled`],Ie=[`disabled`],Le={class:`hidden sm:inline`},Re={class:`mt-1 text-right text-[11px] text-muted`},ze=r({__name:`ChatComposer`,props:c({disabled:{type:Boolean},muted:{type:Boolean},mute:{},isGuest:{type:Boolean},sending:{type:Boolean},replyTo:{}},{modelValue:{default:``},modelModifiers:{}}),emits:c([`send`,`login`,`clear-reply`],[`update:modelValue`]),setup(r,{emit:c}){let d=p(r,`modelValue`),h=r,x=c,{t:T}=b(),E=v(null),D=v([]),O=v(-1),k=v(0),A=null,ee=u(()=>{if(!h.muted)return``;let e=h.mute?.reason,t=h.mute?.muted_until;return t?T(`chat.mutedUntil`,{until:t,reason:e||T(`chat.mutedNoReason`)}):T(`chat.mutedPermanent`,{reason:e||T(`chat.mutedNoReason`)})}),j=u(()=>300-d.value.length),M=u(()=>{if(!h.replyTo)return``;let e=h.replyTo.content.replace(/\s+/g,` `).trim();return e.length<=60?e:`${e.slice(0,60)}â¦`});m(()=>h.replyTo?.id,()=>{h.replyTo&&e(()=>E.value?.focus())});function N(){return E.value?.selectionStart??d.value.length}function P(){A&&clearTimeout(A),A=setTimeout(()=>void F(),180)}async function F(){let e=N(),t=d.value.slice(0,e).match(/@([^\s@]{0,20})$/);if(!t){D.value=[],O.value=-1;return}O.value=e-t[0].length;let n=t[1]??``;if(!n){D.value=[];return}try{D.value=await ue(n,8),k.value=0}catch{D.value=[]}}function I(t){if(O.value<0)return;let n=N(),r=d.value.slice(0,O.value),i=d.value.slice(n);d.value=`${r}@${t.username} ${i}`,D.value=[],O.value=-1,e(()=>{let e=E.value;if(!e)return;let n=r.length+t.username.length+2;e.focus(),e.setSelectionRange(n,n)})}function L(e){if(D.value.length>0){if(e.key===`ArrowDown`){e.preventDefault(),k.value=(k.value+1)%D.value.length;return}if(e.key===`ArrowUp`){e.preventDefault(),k.value=(k.value-1+D.value.length)%D.value.length;return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault();let t=D.value[k.value];t&&I(t);return}if(e.key===`Escape`){D.value=[];return}}if(e.key===`Enter`&&(e.ctrlKey||e.metaKey)){e.preventDefault(),x(`send`);return}e.key===`Escape`&&h.replyTo&&(e.preventDefault(),x(`clear-reply`))}return m(d,()=>P()),(e,c)=>{let u=i(`MaterialIcon`);return f(),y(`footer`,Te,[r.muted?(f(),y(`p`,Ee,C(ee.value),1)):s(``,!0),r.isGuest?(f(),y(`div`,X,[n(`p`,Z,C(S(T)(`chat.loginToSpeak`)),1),n(`button`,{type:`button`,class:`nico-btn nico-btn-primary nico-btn-sm`,onClick:c[0]||(c[0]=e=>x(`login`))},C(S(T)(`accountMenu.login`)),1)])):(f(),y(t,{key:2},[r.replyTo?(f(),y(`div`,De,[o(u,{name:`reply`,size:16,class:`mt-0.5 shrink-0 text-accent`}),n(`div`,Q,[n(`p`,$,C(S(T)(`chat.reply.replyingTo`,{name:r.replyTo.username})),1),n(`p`,Oe,C(M.value),1)]),n(`button`,{type:`button`,class:`nico-icon-btn !h-7 !w-7 shrink-0 text-muted`,"aria-label":S(T)(`common.cancel`),onClick:c[1]||(c[1]=e=>x(`clear-reply`))},[o(u,{name:`close`,size:16})],8,ke)])):s(``,!0),D.value.length?(f(),y(`div`,Ae,[(f(!0),y(t,null,a(D.value,(e,t)=>(f(),y(`button`,{key:e.uid,type:`button`,class:g([`flex w-full items-center gap-2 border-b border-border px-3 py-2 text-left text-[13px] last:border-b-0 hover:bg-elevated`,{"bg-elevated":t===k.value}]),onMousedown:l(t=>I(e),[`prevent`])},[n(`span`,Me,C(e.username.slice(0,1)),1),n(`span`,Ne,`@`+C(e.username),1),n(`span`,Pe,`OID `+C(e.uid),1)],42,je))),128))])):s(``,!0),n(`form`,{class:`flex items-end gap-2`,onSubmit:c[3]||(c[3]=l(e=>x(`send`),[`prevent`]))}
1,[_(n(`textarea`,{ref_key:`inputRef`,ref:E,"onUpdate:modelValue":c[2]||(c[2]=e=>d.value=e),rows:`1`,maxlength:`300`,class:`nico-input min-h-[40px] max-h-28 flex-1 resize-y py-2 text-[14px]`,placeholder:S(T)(`chat.inputPlaceholder`),disabled:r.disabled||r.muted||r.sending,onKeydown:L},null,40,Fe),[[w,d.value]]),n(`button`,{type:`submit`,class:`nico-btn nico-btn-primary inline-flex h-10 !min-h-10 shrink-0 items-center gap-1 px-3`,disabled:r.disabled||r.muted||r.sending||!d.value.trim()},[o(u,{name:`send`,size:18}),n(`span`,Le,C(S(T)(`chat.send`)),1)],8,Ie)],32),n(`p`,Re,C(j.value),1)],64))])}}}),Be={key:0,class:`mb-2 text-center`},Ve={class:`text-[12px] text-accent`},He={key:1,class:`py-8 text-center text-[13px] text-secondary`},Ue={key:2,class:`flex flex-col items-center justify-center gap-2 px-6 py-12 text-center`},We={class:`text-[13px] text-secondary`},Ge={key:3,class:`space-y-1`},Ke=[`data-msg-id`],qe=[`title`,`onClick`],Je=[`src`],Ye={key:1,class:`flex h-8 w-8 items-center justify-center rounded-full border border-border bg-elevated text-[12px] font-semibold text-secondary`},Xe={key:0,class:`mb-0.5 text-[11px] text-muted`},Ze=[`onClick`],Qe=[`onClick`],$e={class:`mb-0.5 flex shrink-0 items-center gap-0.5`},et=[`title`,`aria-label`,`onClick`],tt=[`title`,`aria-label`,`onClick`],nt=[`title`,`aria-label`,`onClick`],rt={class:`mt-0.5 text-[11px] text-muted`},it=k(r({__name:`ChatMessageList`,props:{messages:{},loading:{type:Boolean},loadingMore:{type:Boolean},hasMore:{type:Boolean},selfUid:{},selfAvatar:{},isAdmin:{type:Boolean},canModerateUsers:{type:Boolean},canReply:{type:Boolean}},emits:[`load-more`,`delete`,`block`,`reply`],setup(r,{emit:c}){let l=r,u=c,{t:d}=b(),p=h(),_=v(null),x=v(!0),w=0,T=null,E=v(null);function D(e){return l.selfUid!=null&&e.uid===l.selfUid}function O(){let e=_.value;if(!e)return;e.scrollTop<48&&l.hasMore&&!l.loadingMore&&(w=e.scrollHeight,u(`load-more`));let t=e.scrollHeight-e.scrollTop-e.clientHeight;x.value=t<80}m(()=>[l.messages.length,l.loadingMore],async([t,n],r)=>{await e();let i=_.value;if(i){if(r?.[1]===!0&&n===!1&&w>0){i.scrollTop=i.scrollHeight-w,w=0;return}(x.value||(r?.[0]??0)===0)&&(i.scrollTop=i.scrollHeight)}});function k(e){e&&p.push(`/u/${e}`)}function A(e){return l.isAdmin?!0:D(e)}function j(e){return l.canModerateUsers&&l.selfUid!=null&&e.uid!==l.selfUid}function M(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=80?t:`${t.slice(0,80)}â¦`}function N(e){let t=_.value?.querySelector(`[data-msg-id="${e}"]`);t&&(t.scrollIntoView({behavior:`smooth`,block:`center`}),E.value=e,T&&clearTimeout(T),T=setTimeout(()=>{E.value=null},1600))}return(e,c)=>{let l=i(`MaterialIcon`);return f(),y(`div`,{ref_key:`listRef`,ref:_,class:`min-h-0 flex-1 overflow-y-auto py-3`,onScroll:O},[r.loadingMore?(f(),y(`div`,Be,[n(`span`,Ve,C(S(d)(`common.loading`)),1)])):s(``,!0),r.loading&&r.messages.length===0?(f(),y(`p`,He,C(S(d)(`common.loading`)),1)):!r.loading&&r.messages.length===0?(f(),y(`div`,Ue,[o(l,{name:`chat_bubble_outline`,size:40,class:`text-muted`}),n(`p`,We,C(S(d)(`chat.empty`)),1)])):(f(),y(`div`,Ge,[(f(!0),y(t,null,a(r.messages,e=>(f(),y(`div`,{key:e.id,"data-msg-id":e.id,class:g([`flex gap-2 px-3 py-1 transition-colors`,[D(e)?`flex-row-reverse`:`flex-row`,E.value===e.id?`bg-accent-muted/40`:``]])},[n(`button`,{type:`button`,class:`mt-0.5 shrink-0`,title:e.username,onClick:t=>k(e.uid)},[D(e)&&r.selfAvatar?(f(),y(`img`,{key:0,src:r.selfAvatar,alt:``,class:`h-8 w-8 rounded-full border border-border object-cover`},null,8,Je)):(f(),y(`div`,Ye,C((e.username||`?`).slice(0,1)),1))],8,qe),n(`div`,{class:g([`max-w-[78%] min-w-0`,D(e)?`text-right`:`text-left`])},[D(e)?s(``,!0):(f(),y(`p`,Xe,[n(`button`,{type:`button`,class:`hover:text-accent hover:underline`,onClick:t=>k(e.uid)},C(e.username),9,Ze)])),n(`div`,{class:g([`flex items-end gap-1`,D(e)?`flex-row-reverse`:`flex-row`])},[n(`div`,{class:g([`chat-msg-body inline-block max-w-full break-words rounded-[var(--radius-default)] px-3 py-2 text-left text-[14px] leading-snug`,D(e)?`chat-msg-body--mine bg-accent text-accent-contrast`:`border border-border bg-surface text-primary`])}
1,[e.reply?(f(),y(`button`,{key:0,type:`button`,class:g([`chat-msg-reply mb-1.5 block w-full rounded-[var(--radius-default)] border-l-[3px] px-2 py-1 text-left`,D(e)?`border-[var(--accent-contrast)]/50 bg-[var(--accent-contrast)]/12`:`border-accent bg-accent-muted/40`]),onClick:t=>N(e.reply.id)},[n(`p`,{class:g([`truncate text-[11px] font-semibold`,D(e)?`text-accent-contrast/90`:`text-accent`])},C(e.reply.username),3),n(`p`,{class:g([`line-clamp-2 text-[12px] leading-snug`,D(e)?`text-accent-contrast/80`:`text-secondary`])},C(e.reply.deleted?S(d)(`chat.reply.deleted`):M(e.reply.content)),3)],10,Qe)):s(``,!0),o(ee,{variant:`comment`,"open-internal-in-new-tab":``,content:e.content},null,8,[`content`])],2),n(`div`,$e,[r.canReply?(f(),y(`button`,{key:0,type:`button`,class:`inline-flex h-7 w-7 items-center justify-center rounded-full border border-border bg-elevated text-muted hover:bg-reader hover:text-primary`,title:S(d)(`chat.reply.action`),"aria-label":S(d)(`chat.reply.action`),onClick:t=>u(`reply`,e)},[o(l,{name:`reply`,size:14})],8,et)):s(``,!0),j(e)?(f(),y(`button`,{key:1,type:`button`,class:`inline-flex h-7 w-7 items-center justify-center rounded-full border border-border bg-elevated text-muted hover:bg-reader hover:text-primary`,title:S(d)(`chat.blocks.block`),"aria-label":S(d)(`chat.blocks.block`),onClick:t=>u(`block`,e.uid)},[o(l,{name:`block`,size:14})],8,tt)):s(``,!0),A(e)?(f(),y(`button`,{key:2,type:`button`,class:`inline-flex h-7 w-7 items-center justify-center rounded-full border border-border bg-elevated text-muted hover:bg-reader hover:text-danger`,title:S(d)(`chat.delete`),"aria-label":S(d)(`chat.delete`),onClick:t=>u(`delete`,e)},[o(l,{name:`delete`,size:14})],8,nt)):s(``,!0)])],2),n(`p`,rt,C(e.created_at),1)],2)],10,Ke))),128))]))],544)}}}),[[`__scopeId`,`data-v-2b8fe50a`]]),at={key:0,class:`flex shrink-0 items-center gap-2 border-b border-accent/20 bg-accent-muted/30 px-3 py-2`},ot={class:`flex h-6 w-6 shrink-0 items-center justify-center rounded-[var(--radius-default)] bg-accent-muted text-accent`},st={class:`min-w-0 flex-1 whitespace-pre-wrap break-words text-[13px] leading-snug text-primary`},ct=r({__name:`ChatPinnedBar`,props:{pinned:{}},setup(e){return(t,r)=>{let a=i(`MaterialIcon`);return e.pinned?.content?(f(),y(`div`,at,[n(`span`,ot,[o(a,{name:`campaign`,size:16})]),n(`p`,st,C(e.pinned.content),1)])):s(``,!0)}}}),lt=25e3,ut=1500,dt=2e4,ft=8;function pt(e,t){let n=new URLSearchParams({room:e});return t&&n.set(`token`,t),`${R()}/ws?${n.toString()}`}var mt=class{constructor(){j(this,`socket`,null),j(this,`pingTimer`,null),j(this,`reconnectTimer`,null),j(this,`reconnectAttempt`,0),j(this,`intentionallyClosed`,!1),j(this,`room`,M),j(this,`token`,null),j(this,`handlers`,{})}connect(e){this.intentionallyClosed=!1,this.reconnectAttempt=0,this.room=e.room??`main`,this.token=e.token??null,e.handlers&&(this.handlers=e.handlers),this.openSocket()}updateHandlers(e){this.handlers=e}reconnectWithToken(e){this.token=e,this.intentionallyClosed=!1,this.closeSocketOnly(),this.openSocket()}sendMessage(e,t){let n={type:`message`,content:e};t!=null&&Number.isFinite(t)&&t>0&&(n.reply_to=t),this.sendRaw(n)}ping(){this.sendRaw({type:`ping`})}close(){this.intentionallyClosed=!0,this.clearReconnect(),this.closeSocketOnly()}get connected(){return this.socket?.readyState===WebSocket.OPEN}sendRaw(e){!this.socket||this.socket.readyState!==WebSocket.OPEN||this.socket.send(JSON.stringify(e))}openSocket(){this.closeSocketOnly();let e;try{e=new WebSocket(pt(this.room,this.token))}catch{this.handlers.onError?.(),this.intentionallyClosed||this.scheduleReconnect();return}this.socket=e,e.onopen=()=>{this.reconnectAttempt=0,this.startPing(),this.handlers.onOpen?.()},e.onmessage=e=>{let t;try{t=JSON.parse(String(e.data))}catch{return}this.handlers.onEvent?.(t)},e.onerror=()=>{this.handlers.onError?.()},e.onclose=()=>{this.stopPing(),this.handlers.onClose?.(),this.intentionallyClosed||this.scheduleReconnect()}}closeSocketOnly(){if(this.stopPing(),this.socket){this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null;try{this.socket.close()}catch{}this.socket=null}}startPing(){this.stopPing(),this.pingTimer=setInterval(()=>this.ping(),lt)}stopPing(){this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null)}scheduleReconnect(){if(this.clearReconnect(),this.reconnectAttempt>=ft){this.handlers.onError?.();return}let e=Math.min(dt,ut*1.6**this.reconnectAttempt);this.reconnectAttempt+=1,this.reconnectTimer=setTimeout(()=>{this.intentionallyClosed||this.openSocket()},e)}clearReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}};function ht(e={}){let{t}=b(),n=A(),r=O(),i=e.lite===!0,a=M,o=v([]),s=v(null),c=v(0),l=v(!1),f=v(!1),p=v(!0),h=v(null),g=v(!1),_=v(!1),y=v(null),S=v(null),C=v(``),w=v(!1),T=v(`guest`),E=v(null),D=v(``),k=v(!1),ee=v(!1),j=v(null),N=v([]),P=v(!1),F=v([]),I=v(!1),L=v([]),R=v(!1),z=new mt,B=0,V=!0;function H(){return V&&x(e.enabled??!0)}let U=u(()=>T.value===`member`&&!!y.value),W=u(()=>{if(!E.value)return!1;if(!E.value.muted_until)return!0;let e=Date.parse(E.value.muted_until.replace(/-/g,`/`));return!Number.isFinite(e)||e>Date.now()}),G=u(()=>U.value&&!W.value&&!k.value&&_.value);function K(e,t){let n=e instanceof Error&&e.message?e.message:t;r.error(n)}function ne(e){o.value.some(t=>t.id===e.id)||(o.value=[...o.value,e])}function q(e){o.value=o.value.filter(t=>t.id!==e)}function J(e){if(H())switch(e.type){case`welcome`:T.value=e.role===`member`?`member`:`guest`,typeof e.uid==`number`&&(S.value=e.uid),typeof e.username==`string`&&(C.value=e.username),i?w.value=!1:e.is_admin!==void 0&&e.is_admin!==null?w.value=Number(e.is_admin)===1:e.role===`guest`&&(w.value=!1),s.value=e.pinned_announcement??null,E.value=e.mute??null;break;case`message`:ne({id:e.id,room:e.room,uid:e.uid,username:e.username,content:e.content,created_at:e.created_at,reply:te(e.reply)});break;case`message_deleted`:q(e.id);break;case`pinned_announcement`:s.value=e.pinned_announcement??null;break;case`online_count`:c.value=e.count;break;case`muted`:S.value!=null&&e.uid===S.value&&(E.value={id:0,uid:e.uid,room_id:null,muted_until:e.muted_until,reason:e.reason,created_by:0,created_at:``},r.error(we(`muted`,e.reason||t(`chat.errors.muted`))));break;case`error`:r.error(we(e.code,e.message)),e.code,k.value=!1}}async function Y(e){if(H()){if(e?.append){if(f.value||!p.value)return;f.value=!0}else l.value=!0,h.value=null;try{let t=await le({room:a,limit:50,beforeId:e?.beforeId,token:y.value});if(!H())return;if(!e?.append)s.value=t.pinned_announcement,o.value=t.message_list,p.value=t.message_list.length>=50,h.value=null;else if(t.message_list.length===0)p.value=!1;else{let e=new Set(o.value.map(e=>e.id)),n=t.message_list.filter(t=>!e.has(t.id));o.value=[...n,...o.value],p.value=t.message_list.length>=50}}catch(n){if(!H())return;let r=n instanceof Error&&n.message?n.message:t(`chat.errors.loadHistory`);e?.append||(h.value=r,o.value=[]),K(n,t(`chat.errors.loadHistory`))}finally{l.value=!1,f.value=!1}}}async function ue(){let e=o.value[0];e&&await Y({beforeId:e.id,append:!0})}function Te(){H()&&(g.value=!0,_.value=!1,z.connect({room:a,token:y.value,handlers:{onEvent:J,onOpen:()=>
1{if(!H()){z.close();return}g.value=!1,_.value=!0},onClose:()=>{_.value=!1},onError:()=>{g.value=!1}}}))}async function Ee(){if(!H())return;let e=n.activeAccount?.token,r=n.activeAccount?.uid;if(!e||r==null){y.value=null,S.value=null,C.value=``,w.value=!1,T.value=`guest`,E.value=null;return}let a=e=>{y.value=e.token,S.value=e.uid,C.value=e.username,w.value=!i&&e.is_admin===1,T.value=`member`,e.mute!==void 0&&(E.value=e.mute)};try{let t=await oe(e);if(!H())return;a({token:t.chat_token,uid:t.uid,username:t.username,is_admin:t.is_admin}),ie(r,t.chat_token);try{let e=await se(t.chat_token);if(!H())return;E.value=e.mute,i||(w.value=e.is_admin===1),e.username&&(C.value=e.username)}catch{}return}catch(e){if(!H())return;let n=re(r);if(n)try{let e=await se(n);if(!H())return;a({token:n,uid:e.uid||r,username:e.username,is_admin:e.is_admin,mute:e.mute});return}catch{ae(r)}y.value=null,w.value=!1,T.value=`guest`,K(e,t(`chat.errors.auth`))}}function X(){B+=1,_.value=!1,g.value=!1,l.value=!1,f.value=!1,z.close(),j.value=null,D.value=``,o.value=[],s.value=null,c.value=0,h.value=null,p.value=!0}async function Z(){if(!H())return;let e=++B;z.close(),_.value=!1,g.value=!1,h.value=null,l.value=!0,await Ee().catch(e=>{H()&&K(e,t(`chat.errors.auth`))}),!(!H()||e!==B)&&(await Promise.all([Y(),!i&&y.value?Q():Promise.resolve()]),!(!H()||e!==B)&&Te())}function De(){H()&&Z()}m(w,e=>{!i&&H()&&e&&y.value&&$()}),m(()=>y.value,(e,t)=>{if(!(i||!H())){if(!e){N.value=[],F.value=[],L.value=[];return}t&&t!==e&&Q()}});async function Q(){if(!(i||!H()||!y.value)){P.value=!0;try{N.value=await fe(y.value)}catch(e){H()&&K(e,t(`chat.errors.loadBlocks`))}finally{P.value=!1}}}async function $(){if(!(i||!H()||!y.value||!w.value)){I.value=!0,R.value=!0;try{let[e,t]=await Promise.all([ge(y.value),ye(y.value)]);if(!H())return;F.value=e,L.value=t}catch(e){H()&&K(e,t(`chat.errors.loadAdmin`))}finally{I.value=!1,R.value=!1}}}function Oe(e){j.value=e}function ke(){j.value=null}let Ae=u(()=>{let e=o.value;if(e.length<2)return null;let t=e[e.length-1]?.content??``;if(!t.trim())return null;let n=1;for(let r=e.length-2;r>=0&&e[r]?.content===t;--r)n+=1;return n>=2?t:null});function je(e,i=null){if(e.trim()){if(!n.isAuthenticated){n.openAuth(`login`);return}if(!G.value){W.value&&r.error(t(`chat.errors.muted`));return}if(e.length>300){r.error(t(`chat.errors.tooLong`));return}k.value=!0,z.sendMessage(e,i),window.setTimeout(()=>{k.value=!1},400)}}function Me(){let e=D.value.trim();e&&(je(e,j.value?.id??null),D.value=``,j.value=null)}function Ne(){let e=Ae.value;e&&je(e,null)}async function Pe(e){if(y.value&&window.confirm(t(`chat.deleteConfirm`)))try{if(!i&&w.value&&e.uid!==S.value)await he(y.value,e.id);else if(e.uid===S.value)await de(y.value,e.id);else if(!i&&w.value)await he(y.value,e.id);else{r.error(t(`chat.errors.noPermission`));return}q(e.id)}catch(e){K(e,t(`chat.errors.deleteMessage`))}}async function Fe(e){if(!(i||!y.value)&&window.confirm(t(`chat.blocks.blockConfirm`)))try{await pe(y.value,e),r.success(t(`chat.blocks.blocked`)),o.value=o.value.filter(t=>t.uid!==e),await Q()}catch(e){K(e,t(`chat.errors.block`))}}async function Ie(e){if(!(i||!y.value))try{await me(y.value,e),r.success(t(`chat.blocks.unblocked`)),await Q(),await Y()}catch(e){K(e,t(`chat.errors.unblock`))}}async function Le(e){if(!(i||!y.value))try{await Se(y.value,a,e),r.success(t(`chat.admin.announcementSaved`))}catch(e){K(e,t(`chat.errors.saveAnnouncement`))}}async function Re(){if(!(i||!y.value))try{await Ce(y.value,a),r.success(t(`chat.admin.announcementCleared`))}catch(e){K(e,t(`chat.errors.clearAnnouncement`))}}async function ze(e){if(!(i||!y.value))try{await _e(y.value,e),r.success(t(`chat.admin.wordAdded`)),await $()}catch(e){K(e,t(`chat.errors.addWord`))}}async function Be(e){if(!(i||!y.value))try{await ve(y.value,e),r.success(t(`chat.admin.wordRemoved`)),F.value=F.value.filter(t=>t.id!==e)}catch(e){K(e,t(`chat.errors.removeWord`))}}async function Ve(e){if(!(i||!y.value))try{await be(y.value,{uid:e.uid,duration_seconds:e.duration_seconds,reason:e.reason,room:a}),r.success(t(`chat.admin.muted`)),await $()}catch(e){K(e,t(`chat.errors.mute`))}}async function He(e){if(!(i||!y.value))try{await xe(y.value,e),r.success(t(`chat.admin.unmuted`)),L.value=L.value.filter(t=>t.id!==e)}catch(e){K(e,t(`chat.errors.unmute`))}}async function Ue(e,t){t&&await ce(t),e!=null&&ae(e)}return m(()=>x(e.enabled??!0),(e,t)=>{V&&(e?n.isReady&&Z():t&&X())}),m(()=>[n.isReady,n.activeAccount?.uid,n.activeAccount?.token],async([e,t],n)=>{if(!H()||!e)return;let r=n?.[1],i=!!n?.[2];r!=null&&r!==t&&i&&(await Ue(r,re(r)),!H())||await Z()},{immediate:!0}),d(()=>{V=!1,X()}),m(()=>n.isAuthenticated,async(e,t)=>{if(H()&&t&&!e){let e=S.value??void 0,t=y.value;y.value=null,S.value=null,w.value=!1,T.value=`guest`,E.value=null,N.value=[],F.value=[],L.value=[],j.value=null,z.close(),await Ue(e,t)}}),{authStore:n,room:a,messages:o,pinned:s,onlineCount:c,loadingHistory:l,loadingMore:f,hasMoreHistory:p,loadError:h,connecting:g,connected:_,chatUid:S,chatUsername:C,isAdmin:w,role:T,mute:E,isMuted:W,isMember:U,canSend:G,input:D,sending:k,showSidePanel:ee,replyTo:j,setReplyTo:Oe,clearReplyTo:ke,plusOneContent:Ae,sendPlusOne:Ne,blocks:N,loadingBlocks:P,sensitiveWords:F,loadingSensitive:I,mutes:L,loadingMutes:R,loadM
1oreHistory:ue,retryBoot:De,sendChat:Me,deleteMessage:Pe,blockUser:Fe,unblockUser:Ie,refreshBlocks:Q,refreshAdminData:$,saveAnnouncement:Le,clearAnnouncement:Re,addWord:ze,removeWord:Be,muteUser:Ve,unmute:He}}export{ze as i,ct as n,it as r,ht as t};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.