PageSourceSearch

https://faptap.net/assets/Admin.4b7332bf.js

js faptap.net collected 2026-09-25 22:12:03 UTC 11,083 bytes, 1 lines download raw bytes

1import{d as Y,u as Z,G as ee,b as i,c as te,K as se,f as u,i as l,j as a,t as m,l as P,z as T,n as o,_ as v,k as le,F as j,N as E,D,g as ae,O as ne,h as oe,P as ie,Q as de,a as y,v as r,x as h,m as p,aq as $,a1 as re,R as ue,e as me,C as ce}from"./index.16ba4ea0.js";import{_ as fe}from"./Notfound.vue_vue_type_script_setup_true_lang.b9e0406b.js";import"./vendor-highcharts.9b480a8e.js";import"https://cdn.jsdelivr.net/npm/[email protected]/dist/buttplug-wasm.mjs";const ve={class:"mx-auto max-w-4xl px-4 py-6"},pe={key:0,class:"bg-red-500/10 border border-red-500/20 text-red-500 text-sm font-medium p-3 rounded-md flex items-center gap-1.5 mb-4"},we={class:"flex gap-2 shrink-0 w-full sm:w-auto justify-between sm:justify-start"},ge={id:"userlist"},xe=["value"],he={key:1,class:"py-12 flex justify-center"},_e={key:2,class:"bg-zinc-800 rounded-lg divide-y divide-zinc-700 shadow-lg overflow-hidden"},be={class:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2"},ye={class:"min-w-0 flex-1"},Ce=["href","title"],ke=["title"],Ve={class:"flex items-center gap-2 text-sm text-zinc-300"},Ue={key:0,class:"text-zinc-200 truncate"},ze={key:1,class:"text-zinc-500"},De={class:"flex flex-col sm:flex-row gap-3 sm:items-center sm:justify-between"},$e={class:"flex flex-wrap items-center gap-3 sm:gap-4 text-sm font-medium text-zinc-300"},Se={class:"flex items-center gap-1.5 whitespace-nowrap"},Ae={class:"flex items-center gap-1.5 whitespace-nowrap"},Ne={class:"flex items-center gap-1.5 whitespace-nowrap"},Pe={class:"flex items-center gap-1.5 whitespace-nowrap"},je={class:"flex flex-col sm:flex-row gap-2 sm:gap-3"},Ee={key:3,class:"mt-12"},Fe={class:"mt-4"},Be={class:"text-zinc-300"},Me={class:"flex gap-3 mt-6"},Ie={class:"mt-4"},Te={class:"text-zinc-300"},Ke={class:"flex gap-3 mt-6"},Re={class:"mt-4"},Oe={class:"text-zinc-300 mb-4"},qe={class:"font-medium text-zinc-100"},He={class:"bg-zinc-800 border border-zinc-700 rounded-lg p-4 mb-4"},Le={class:"font-mono text-lg text-zinc-100 break-all"},Ge={class:"flex gap-3"},Qe={class:"mt-4"},Je={class:"font-medium text-zinc-100 mb-4"},We={class:"flex gap-3 mt-6"},st=Y({__name:"Admin",setup(Xe){const{isAdmin:F}=Z(),{isMobile:K}=ee(),_=i(""),c=i([]),B=i(!1),k=i([]),V=i(""),S=i(!1),x=i("All"),R=["All","Creators","Disabled","Admins","Shadowbanned"],C=i(!1),M=te(()=>x.value==="Creators"?c.value.filter(s=>s.creator):x.value==="Disabled"?c.value.filter(s=>!s.enabled):x.value==="Admins"?c.value.filter(s=>s.admin):x.value==="Shadowbanned"?c.value.filter(s=>!!s.is_shadowbanned):c.value),w=i({show:!1,title:"",message:"",onConfirm:()=>{}}),g=i({show:!1,title:"",message:""}),b=i({show:!1,username:"",password:""}),d=i({show:!1,userId:"",username:"",value:"",loading:!1}),U=i(!1),O=async()=>{try{await navigator.clipboard.writeText(b.value.password),U.value=!0,setTimeout(()=>{U.value=!1},2e3)}catch(s){console.error("Failed to copy password:",s)}},q=async()=>{var s;S.value=!0,V.value="";try{c.value=await y.admin.findUsers(_.value),B.value=!0}catch(e){V.value=((s=e==null?void 0:e.toString)==null?void 0:s.call(e))||"Failed to search users"}finally{S.value=!1}},H=async()=>{if(_.value.length>2)try{k.value=await y.admin.findUsers(_.value)}catch{k.value=[]}else k.value=[]},z=async(s,e)=>{var t;const f=e!=null?e:!!s.is_shadowbanned;try{const n=await y.admin.updateUser(s.id,{creator:s.creator,admin:s.admin,enabled:s.enabled,shadowbanned:f});s.is_shadowbanned=(t=n==null?void 0:n.is_shadowbanned)!=null?t:null}catch(n){g.value={show:!0,title:"Error",message:n.toString()}}},L=(s,e)=>{z(s,e)},A=s=>{var e;return(s.discord_username||((e=s.profile)==null?void 0:e.discord_username)||"").trim()},G=s=>{!F||(d.value={show:!0,userId:s.id,username:s.username,value:A(s),loading:!1})},I=async()=>{if(!F)return;const s=c.value.find(f=>f.id===d.value.userId);if(!s)return;const e=(d.value.value||"").trim();d.value.loading=!0;try{await y.admin.updateUser(s.id,{discord_username:e}),s.profile||(s.profile={}),s.profile.discord_username=e,s.discord_username=e,d.value.show=!1}catch(f){g.value={show:!0,title:"Error",message:f.toString()}}finally{d.value.loading=!1}},Q=async s=>{try{const e=X();await y.admin.updateUser(s.id,{password:e}),b.value={show:!0,username:s.username,password:e},U.value=!1}catch(e){g.value={show:!0,title:"Error",message:e.toString()}}},N=i(!1),J=async s=>{w.value={show:!0,title:"Delete User",message:`Are you sure you want to delete ${s.username}? This action cannot be undone.`,onConfirm:async()=>{w.value.show=!1,await W(s)}}},W=async s=>{N.value=!0;try{await y.admin.deleteUser(s.id),c.value=c.value.filter(e=>
1e.id!==s.id)}catch(e){alert(e)}finally{N.value=!1}},X=()=>{const s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let e="";for(let f=0;f<8;f++)e+=s[Math.floor(Math.random()*s.length)];return e};return se(()=>{me(ce("admin",{title:"User Manager \u2013 FapTap",description:"Internal administrative panel for user management."}))}),(s,e)=>{var f;return r(),u("div",ve,[e[26]||(e[26]=l("h1",{class:"font-medium text-2xl text-center mb-4"},"Admin Area",-1)),e[27]||(e[27]=l("p",{class:"mb-4 text-center text-sm text-zinc-400"},"Admin access only",-1)),V.value?(r(),u("div",pe,[a(h,{name:"danger",class:"h-4 w-4 shrink-0 text-red-500"}),l("span",null,m(V.value),1)])):P("",!0),l("form",{class:"flex flex-col sm:flex-row items-stretch sm:items-center gap-3 mb-4 w-full",onSubmit:le(q,["prevent"])},[a(T,{required:"",modelValue:_.value,"onUpdate:modelValue":e[0]||(e[0]=t=>_.value=t),placeholder:"User, email, or Discord username",list:"userlist",onInput:H,class:"flex-1 w-full bg-zinc-800 border-zinc-700 text-sm"},null,8,["modelValue"]),l("div",we,[a(v,{type:"submit",theme:"blue",class:"flex-1 sm:flex-none justify-center"},{default:o(()=>[...e[11]||(e[11]=[p("Search",-1)])]),_:1}),a(v,{ref:"filterButton",type:"button",class:"flex items-center justify-center gap-1 flex-1 sm:flex-none",onClick:e[1]||(e[1]=t=>C.value=!C.value)},{default:o(()=>[a(h,{name:"sort-ascending",class:"h-5 w-5"}),l("span",null,m(x.value),1)]),_:1},512)])],32),l("datalist",ge,[(r(!0),u(j,null,E(k.value,t=>(r(),u("option",{key:t.id,value:t.username},null,8,xe))),128))]),S.value?(r(),u("div",he,[a(h,{name:"loading",class:"h-8 w-8 text-blue-500 animate-spin"})])):P("",!0),M.value.length?(r(),u("div",_e,[(r(!0),u(j,null,E(M.value,t=>(r(),u("div",{key:t.id,class:"p-4 flex flex-col gap-3"},[l("div",be,[l("div",ye,[l("a",{target:"_blank",rel:"noopener noreferrer",href:`/u/${t.username}`,class:"font-medium text-zinc-100 hover:text-blue-500 transition-colors truncate block text-sm sm:text-base",title:t.username},[p(m(t.username)+" ",1),a(h,{name:"open-in-new",class:"h-4 w-3 inline-block text-zinc-400 relative -top-1 ml-0.5"})],8,Ce),l("div",{class:"text-xs sm:text-sm text-zinc-400 truncate mt-0.5",title:t.email},m(t.email),9,ke)]),l("div",Ve,[a(h,{name:"discord",class:"h-5 w-5 shrink-0"}),A(t)?(r(),u("span",Ue,m(A(t)),1)):(r(),u("span",ze,"Not set")),a(v,{theme:"transparent",dense:"",class:"shrink-0",onClick:n=>G(t)},{default:o(()=>[a(h,{name:"edit",class:"h-4 w-4 text-zinc-300"})]),_:1},8,["onClick"])])]),l("div",De,[l("div",$e,[l("div",Se,[e[12]||(e[12]=l("div",null,"Creator",-1)),a($,{modelValue:t.creator,"onUpdate:modelValue":n=>t.creator=n,onChange:n=>z(t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),l("div",Ae,[e[13]||(e[13]=l("div",null,"Admin",-1)),a($,{modelValue:t.admin,"onUpdate:modelValue":n=>t.admin=n,onChange:n=>z(t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),l("div",Ne,[e[14]||(e[14]=l("div",null,"Enabled",-1)),a($,{modelValue:t.enabled,"onUpdate:modelValue":n=>t.enabled=n,onChange:n=>z(t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),l("div",Pe,[e[15]||(e[15]=l("div",null,"Shadow",-1)),a($,{"model-value":!!t.is_shadowbanned,"onUpdate:modelValue":n=>L(t,n)},null,8,["model-value","onUpdate:modelValue"])])]),l("div",je,[a(v,{onClick:n=>Q(t),dense:"",theme:"light",class:"whitespace-nowrap"},{default:o(()=>[...e[16]||(e[16]=[p("Reset Password",-1)])]),_:1},8,["onClick"]),a(v,{onClick:n=>J(t),dense:"",theme:"red",loading:N.value,class:"whitespace-nowrap"},{default:o(()=>[...e[17]||(e[17]=[p("Delete",-1)])]),_:1},8,["onClick","loading"])])])]))),128))])):B.value?(r(),u("div",Ee,[a(fe,{title:c.value.length?"No Users Found":"No Search Results",message:c.value.length?"No users in this list match the selected filter.":`No users match '${_.value}'.`},null,8,["title","message"])])):P("",!0),a(D,{modelValue:w.value.show,"onUpdate:modelValue":e[3]||(e[3]=t=>w.value.show=t),title:w.value.title},{default:o(()=>[l("div",Fe,[l("p",Be,m(w.value.message),1),l("div",Me,[a(v,{onClick:e[2]||(e[2]=t=>w.value.show=!1),theme:"light",class:"flex-1"},{default:o(()=>[...e[18]||(e[18]=[p("Cancel",-1)])]),_:1}),a(v,{onClick:w.value.onConfirm,theme:"red",class:"flex-1"},{default:o(()=>[...e[19]||(e[19]=[p("Confirm",-1)])]),_:1},8,["onClick"])])])]),_:1},8,["modelValue","title"]),a(D,{modelValue:g.value.show,"onUpdate:modelValue":e[5]||(e[5]=t=>g.value.show=t),title:g.value.title},{default:o(()=>[l("div",Ie,[l("p",Te,m(g.value.message),1),l("div",Ke,[a(v,{onClick:e[4]||(e[4]=t=>g.value.show=!1),theme:"blue",class:"flex-1"},{default:o(()=>[...e[20]||(e[20]=[p("OK",-1)])]),_:1})])])]),_:1},8,["modelValue","title"]),a(D,{modelValue:b.value.show,"onUpdate:modelValue":e[6]||(e[6]=t=>b.value.show=t),title:"Password Reset"},{default:o(()=>[l("div",Re,[l("p",Oe,[e[21]||(e[21]=p("Password has been reset for ",-1)),l("span",qe,m(b.value.username),1)]),l("div",He,[e[22]||(e[22]=l("div",{class:"text-sm text-zinc-400 mb-2"},"New Password",-1)),l("div",Le,m(b.value.password),1)]),l("div",Ge,[a(v,{onClick:O,theme:"blue",class:"flex-1 flex items-center justify-center gap-2"},{default:o(()=>[a(h,{name:"content_copy",class:"w-5 h-5"}),l("span",null,m(U.value?"Copied!":"Copy Password"),1)]),_:1})])])]),_:1},8,["modelValue"]),a(D,{modelValue:d.value.show,"onUpdate:modelValue":e[9]||(e[9]=t=>d.value.show=t),title:"Edit Discord Username"},{default:o(()=>[l("div",Qe,[e[25]||(e[25]=l("div",{class:"text-sm text-zinc-400 mb-2"},"Discord username for",-1)),l("div",Je,m(d.value.username),1),a(T,{modelValue:d.value.value,"onUpdate:modelValue":e[7]||
1(e[7]=t=>d.value.value=t),placeholder:"Discord username",class:"w-full",onKeyup:re(I,["enter"])},null,8,["modelValue"]),l("div",We,[a(v,{onClick:e[8]||(e[8]=t=>d.value.show=!1),theme:"light",class:"flex-1"},{default:o(()=>[...e[23]||(e[23]=[p("Cancel",-1)])]),_:1}),a(v,{onClick:I,theme:"blue",class:"flex-1",loading:d.value.loading},{default:o(()=>[...e[24]||(e[24]=[p(" Save ",-1)])]),_:1},8,["loading"])])])]),_:1},8,["modelValue"]),(r(),ae(ne(oe(K)?ie:de),{modelValue:C.value,"onUpdate:modelValue":e[10]||(e[10]=t=>C.value=t),placement:"bottom",target:(f=s.$refs.filterButton)==null?void 0:f.$el,class:"text-white text-sm py-1 w-32",offset:8},{default:o(()=>[(r(),u(j,null,E(R,t=>a(ue,{key:t,active:t===x.value,onClick:n=>{x.value=t,C.value=!1}},{default:o(()=>[p(m(t),1)]),_:2},1032,["active","onClick"])),64))]),_:1},8,["modelValue","target"]))])}}});export{st as default};

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.