let tok=null, mfa=null; const gate=document.getElementById('gate'), gerr=document.getElementById('gerr'); const api=(u,b)=>fetch(u,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application/json'},body:JSON.stringify(b||{})}); async function refresh(){ try{const r=await api('/api/auth/refresh'); if(!r.ok)return false; tok=(await r.json()).access_token; return true}catch(e){return false} } function showGate(msg){ if(msg) gerr.textContent=msg; gate.hidden=false; } async function load(retry=true){ if(!tok && !(await refresh())) return showGate(); try{ const r=await fetch('points.json?'+Date.now(),{cache:'no-store',headers:{Authorization:'Bearer '+tok}}); if(r.status===401 && retry){ tok=null; return load(false); } if(r.status===401) return showGate(); if(r.status===403){ tok=null; await api('/api/auth/logout'); return showGate('Карта доступна только админам и модераторам пула.'); } if(!r.ok) throw new Error(r.status); gate.hidden=true; draw(await r.json()); }catch(e){ document.getElementById('upd').textContent='не удалось загрузить данные ('+e.message+')'; } } const ERR={invalid_credentials:'Неверный логин или пароль.',pending_approval:'Учётная запись ещё не подтверждена.',blocked:'Учётная запись заблокирована.',rate_limited:'Слишком много попыток, подождите.',too_many_requests:'Слишком много попыток, подождите.'}; document.getElementById('lf').addEventListener('submit',async e=>{ e.preventDefault(); gerr.textContent=''; const lb=document.getElementById('lb'); lb.disabled=true; try{ let r, j; if(mfa){ r=await api('/api/auth/2fa',{mfa_token:mfa,code:document.getElementById('code').value.trim()}); } else{ r=await api('/api/auth/login',{username:document.getElementById('u').value,password:document.getElementById('pw').value}); } j=await r.json().catch(()=>({})); if(!r.ok){ gerr.textContent=ERR[j.error]||(mfa?'Неверный код.':'Не удалось войти ('+(j.error||r.status)+').'); return; } if(j.mfa_required){ mfa=j.mfa_token; const c=document.getElementById('code'); c.hidden=false; c.required=true; c.focus(); document.getElementById('gmsg').textContent='Введите код из приложения 2FA.'; return; } tok=j.access_token; mfa=null; document.getElementById('pw').value=''; first=true; await load(); }finally{ lb.disabled=false; } }); document.getElementById('out').onclick=async()=>{ await api('/api/auth/logout'); tok=null; location.reload(); }; load(); setInterval(()=>{ if(gate.hidden) load(); },60000); Карта майнеров Diablos

Карта майнеров Diablos

загрузка…