Home প্রিমিয়াম পোস্ট APPS STORE NEW WEBSITE TO APP কোর্স

প্রম্পট এবং কোড দেখুন

AI Test Lab

Test your prompts directly on official platforms.

ভিডিও সাইটের এডমিন প্যানেল Intex.html

DownloadLockNewpopularprice-299
DownloadLockNewpopularprice-299
✦Tanbin Premium
🔐

এটি একটি Premium কন্টেন্ট

মাত্র ৫০ টাকা

bKash/Nagad অ্যাপে Send Money করে (Payment নয়) ৫০ টাকা পাঠান ও ফর্ম জমা দিন — অ্যাডমিন অ্যাপ্রুভ করলেই কন্টেন্ট আনলক হবে।

💰 পেমেন্ট মাধ্যম

যেকোনো একটি মাধ্যমে ৫০ টাকা পাঠান। bKash / Nagad / Rocket অ্যাপে অবশ্যই “Send Money” অপশন ব্যবহার করুন — “Payment” নয়।

💳 কীভাবে আনলক করবেন

  1. 1পছন্দের মাধ্যম (bKash/Nagad/Binance) বেছে নিন।
  2. 2
    ৫০ টাকা Send Money করুন (Payment নয়)।
  3. 3Transaction ID সংরক্ষণ করুন।
  4. 4ফর্ম পূরণ করে জমা দিন — রিকোয়েস্ট শুধু একবারই দেবেন।
  5. 5স্ট্যাটাসে “Pending” দেখাবে, অ্যাডমিন যাচাই করছেন।
  6. 6অ্যাপ্রুভ হলেই এই পেজে কন্টেন্ট নিজে থেকে আনলক হবে।

 







<!doctype html>
<html lang="bn">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<meta name="robots" content="noindex,nofollow">
<title>VIDORA Admin</title>
<link href="https://fonts.googleapis.com/css2?family=Hind+Siliguri:wght@400;500;600;700&family=Playfair+Display:wght@700;800&display=swap" rel="stylesheet">
<script src="https://www.gstatic.com/firebasejs/10.12.2/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/10.12.2/firebase-auth-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/10.12.2/firebase-firestore-compat.js"></script>
<style>
:root{--bg:#07070b;--card:#12121a;--card2:#1a1a25;--tx:#f4f0e6;--mut:#9a95a8;--ac:#f0c45c;--ac2:#c58a22;--ln:rgba(240,196,92,.22);--ok:#22c55e;--bad:#ef4444}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
body{background:var(--bg);color:var(--tx);font-family:'Hind Siliguri',system-ui,sans-serif;line-height:1.55;min-height:100vh}
body::before{content:'';position:fixed;inset:0;z-index:-1;background:radial-gradient(600px 400px at 0 0,rgba(240,196,92,.13),transparent 70%),radial-gradient(600px 500px at 100% 0,rgba(139,92,246,.12),transparent 70%)}
button,input,select,textarea{font:inherit;color:inherit}
input,select,textarea{font-size:16px}
a{color:var(--ac)}
.mut{color:var(--mut)}.sm{font-size:.82rem}
[hidden]{display:none!important}
.btn{border:0;cursor:pointer;padding:10px 18px;border-radius:99px;font-weight:700;color:#1b1406;background:linear-gradient(135deg,#fbe9a8,var(--ac),var(--ac2));transition:.2s;white-space:nowrap}
.btn:hover{filter:brightness(1.08)}
.btn.gh{background:var(--card2);color:var(--tx);border:1px solid var(--ln)}
.btn.ok{background:var(--ok);color:#fff}.btn.bad{background:var(--bad);color:#fff}
.btn.s{padding:6px 12px;font-size:.8rem}
.btn[disabled]{opacity:.5}
input,select,textarea{width:100%;padding:11px 12px;border-radius:12px;border:1px solid rgba(255,255,255,.12);background:rgba(0,0,0,.35);outline:0}
input:focus,select:focus,textarea:focus{border-color:var(--ac)}
textarea{min-height:90px;font-family:ui-monospace,Menlo,monospace;font-size:14px}
label{display:block;font-size:.82rem;color:var(--mut);margin-top:10px}
label input,label select,label textarea{margin-top:4px;color:var(--tx)}
.chk{display:flex;align-items:center;gap:8px;margin-top:12px;color:var(--tx);font-size:.95rem}
.chk input{width:auto}
/* login */
#login{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:16px}
.lbox{width:100%;max-width:380px;background:linear-gradient(180deg,var(--card2),var(--card));border:1px solid var(--ln);border-radius:22px;padding:26px;box-shadow:0 20px 60px rgba(0,0,0,.6)}
.logo{font-family:'Playfair Display',serif;font-weight:800;font-size:1.6rem;letter-spacing:3px;background:linear-gradient(135deg,#fff3c4,var(--ac),var(--ac2));-webkit-background-clip:text;background-clip:text;color:transparent;text-align:center}
/* layout */
#app{display:flex;min-height:100vh}
.side{width:230px;flex:none;background:rgba(18,18,26,.9);border-right:1px solid var(--ln);padding:18px 12px;position:sticky;top:0;height:100vh;overflow-y:auto}
.side .logo{margin-bottom:16px}
.side button{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:11px 12px;margin-bottom:4px;border-radius:12px;border:0;background:none;cursor:pointer;color:var(--mut);transition:.2s}
.side button:hover{background:rgba(255,255,255,.05);color:var(--tx)}
.side button.on{background:linear-gradient(135deg,rgba(240,196,92,.22),rgba(139,92,246,.14));color:var(--ac);font-weight:700}
.side .bg{margin-left:auto;background:var(--bad);color:#fff;border-radius:99px;font-size:.7rem;padding:1px 8px}
.main{flex:1;min-width:0;padding:20px}
.top{display:none}
@media(max-width:820px){
  #app{flex-direction:column}
  .side{width:100%;height:auto;position:sticky;z-index:20;display:flex;gap:6px;overflow-x:auto;padding:8px;border-right:0;border-bottom:1px solid var(--ln)}
  .side .logo{display:none}
  .side button{width:auto;flex:none;margin:0;padding:8px 12px;white-space:nowrap}
  .main{padding:14px}
}
h2{font-family:'Playfair Display','Hind Siliguri',serif;margin-bottom:12px}
h3{margin:16px 0 8px;color:var(--ac)}
.card{background:var(--card);border:1px solid var(--ln);border-radius:18px;padding:16px;margin-bottom:16px}
.stats{display:grid;gap:12px;grid-template-columns:repeat(2,1fr)}
@media(min-width:900px){.stats{grid-template-columns:repeat(4,1fr)}}
.stat{padding:16px;border-radius:18px;background:linear-gradient(135deg,rgba(240,196,92,.14),rgba(139,92,246,.1));border:1px solid var(--ln)}
.stat b{display:block;font-size:1.8rem;color:var(--ac)}
.g2{display:grid;gap:0 14px;grid-template-columns:1fr}
@media(min-width:700px){.g2{grid-template-columns:1fr 1fr}}
.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.tbl{display:flex;flex-direction:column;gap:8px}
.it{display:flex;gap:12px;align-items:center;padding:10px;border-radius:14px;background:var(--card2);border:1px solid rgba(255,255,255,.06);flex-wrap:wrap}
.it img,.it .tp{width:84px;height:50px;border-radius:8px;object-fit:cover;background:#000;flex:none;display:flex;align-items:center;justify-content:center}
.it .inf{flex:1;min-width:160px}
.it .inf b{display:block}
.pill{font-size:.72rem;font-weight:700;padding:2px 9px;border-radius:99px;display:inline-block}
.pill.f{background:var(--ok);color:#fff}.pill.p{background:var(--ac);color:#1b1406}.pill.pending{background:#f59e0b;color:#1b1406}.pill.approved,.pill.paid{background:var(--ok);color:#fff}.pill.rejected{background:var(--bad);color:#fff}
.chat{display:grid;gap:12px;grid-template-columns:1fr}
@media(min-width:800px){.chat{grid-template-columns:260px 1fr}}
.cl{max-height:60vh;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.cl button{text-align:left;padding:10px;border-radius:12px;border:1px solid rgba(255,255,255,.06);background:var(--card2);cursor:pointer}
.cl button.on{border-color:var(--ac)}
.cl .un{color:var(--bad);font-weight:700}
.cm{height:50vh;overflow-y:auto;display:flex;flex-direction:column;gap:8px;padding:10px;background:rgba(0,0,0,.3);border-radius:14px}
.m{max-width:80%;padding:8px 12px;border-radius:14px;word-break:break-word}
.m.a{align-self:flex-end;background:linear-gradient(135deg,#fbe9a8,var(--ac2));color:#1b1406}
.m.u{align-self:flex-start;background:var(--card2);border:1px solid var(--ln)}
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:#14141c;border:1px solid var(--ln);color:var(--ac);padding:10px 20px;border-radius:99px;z-index:99}
.note{padding:10px 14px;border-radius:12px;background:rgba(240,196,92,.08);border:1px dashed var(--ln);font-size:.88rem;color:var(--mut);margin-bottom:12px}
</style>
</head>
<body>

<div id="login">
  <form class="lbox" id="lf">
    <div class="logo">▶ VIDORA</div>
    <p class="mut sm" style="text-align:center;margin:4px 0 10px">অ্যাডমিন প্যানেল</p>
    <label>ইমেইল<input id="le" type="email" required autocomplete="username"></label>
    <label>পাসওয়ার্ড<input id="lp" type="password" required autocomplete="current-password"></label>
    <button class="btn" style="width:100%;margin-top:16px" type="submit">লগইন</button>
    <p id="lerr" class="sm" style="color:var(--bad);margin-top:10px;text-align:center"></p>
  </form>
</div>

<div id="app" hidden>
  <nav class="side" id="side"></nav>
  <div class="main"><div id="view"></div></div>
</div>

<script>
/* ===== Firebase কনফিগ (থিমের কনফিগের সাথে একই) ===== */
var FBCFG = { apiKey: '', authDomain: '', projectId: '', appId: '' };
/* ================================================== */

var $ = function(s, r){ return (r || document).querySelector(s); };
var esc = function(s){ return String(s == null ? '' : s).replace(/[&<>"']/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]; }); };
function toast(m){ var t = document.createElement('div'); t.className = 'toast'; t.textContent = m; document.body.appendChild(t); setTimeout(function(){ t.remove(); }, 2600); }
function money(n){ return '৳' + (Math.round((+n || 0) * 100) / 100); }
function fdate(ts){ try { return (ts && ts.toDate ? ts.toDate() : new Date()).toLocaleString('bn-BD', {day:'numeric', month:'short', hour:'numeric', minute:'2-digit'}); } catch(e) { return ''; } }

if (!FBCFG.apiKey) { document.body.innerHTML = '<div style="padding:40px;text-align:center">⚙️ admin/index.html এর FBCFG-এ Firebase কনফিগ বসান।</div>'; throw new Error('no config'); }
firebase.initializeApp(FBCFG);
var auth = firebase.auth(), db = firebase.firestore(), FV = firebase.firestore.FieldValue;
var ME = null, subs = [], badge = { dep: 0, wd: 0, chat: 0 };

function parseVideo(u){
  u = String(u || '').trim(); var m;
  if (/drive\.google\.com/.test(u) && ((m = u.match(/\/d\/([\w-]+)/)) || (m = u.match(/[?&]id=([\w-]+)/)))) return { p:'drive', thumb:'https://drive.google.com/thumbnail?id=' + m[1] + '&sz=w640' };
  if (/facebook\.com|fb\.watch|fb\.com/.test(u)) return { p:'facebook', thumb:'' };
  if (/tera|1024tera|freeterabox|4funbox|mirrobox|nephobox|momerybox/i.test(u)) return { p:'terabox', thumb:'' };
  if (/\.(mp4|webm|mov|m3u8)(\?|#|$)/i.test(u)) return { p:'direct', thumb:'' };
  return { p:'other', thumb:'' };
}

/* ---------- লগইন ---------- */
$('#lf').onsubmit = function(e){
  e.preventDefault(); $('#lerr').textContent = '';
  auth.signInWithEmailAndPassword($('#le').value.trim(), $('#lp').value).catch(function(){ $('#lerr').textContent = 'ইমেইল বা পাসওয়ার্ড ভুল'; });
};
auth.onAuthStateChanged(function(u){
  subs.forEach(function(s){ s(); }); subs = [];
  if (!u) { $('#login').hidden = false; $('#app').hidden = true; return; }
  db.doc('admins/' + u.uid).get().then(function(s){
    if (!s.exists) { $('#lerr').textContent = 'আপনি অ্যাডমিন নন'; auth.signOut(); return; }
    ME = u; $('#login').hidden = true; $('#app').hidden = false; buildNav(); watchBadges(); go('dash');
  }).catch(function(){ $('#lerr').textContent = 'অনুমতি নেই'; auth.signOut(); });
});

/* ---------- নেভিগেশন ---------- */
var TABS = [['dash','📊','ড্যাশবোর্ড'],['videos','🎬','ভিডিও'],['dep','⬇️','ডিপোজিট'],['wd','⬆️','উইথড্র'],['users','👥','ইউজার'],['notify','🔔','নোটিফিকেশন'],['chat','💬','লাইভ চ্যাট'],['settings','⚙️','সেটিংস']];
var cur = 'dash';
function buildNav(){
  $('#side').innerHTML = '<div class="logo">▶ VIDORA</div>' + TABS.map(function(t){
    var b = badge[t[0]] ? '<span class="bg">' + badge[t[0]] + '</span>' : '';
    return '<button data-t="' + t[0] + '" class="' + (t[0] === cur ? 'on' : '') + '" type="button">' + t[1] + ' ' + t[2] + b + '</button>';
  }).join('') + '<button id="out" type="button">🚪 লগআউট</button>';
  $('#out').onclick = function(){ auth.signOut(); };
  Array.prototype.forEach.call($('#side').querySelectorAll('[data-t]'), function(b){ b.onclick = function(){ go(b.getAttribute('data-t')); }; });
}
function watchBadges(){
  subs.push(db.collection('deposits').where('status', '==', 'pending').onSnapshot(function(q){ badge.dep = q.size; buildNav(); }));
  subs.push(db.collection('withdrawals').where('status', '==', 'pending').onSnapshot(function(q){ badge.wd = q.size; buildNav(); }));
  subs.push(db.collection('chats').where('unreadAdmin', '==', true).onSnapshot(function(q){ badge.chat = q.size; buildNav(); }));
}
var viewSubs = [];
function go(t){
  cur = t; buildNav();
  viewSubs.forEach(function(s){ s(); }); viewSubs = [];
  var v = $('#view'); v.innerHTML = '<p class="mut">লোড হচ্ছে...</p>';
  ({ dash: vDash, videos: vVideos, dep: vDep, wd: vWd, users: vUsers, notify: vNotify, chat: vChat, settings: vSettings })[t](v);
}

/* ---------- ড্যাশবোর্ড ---------- */
function vDash(v){
  Promise.all([db.collection('videos').get(), db.collection('users').limit(1000).get(), db.collection('deposits').where('status', '==', 'approved').get(), db.collection('purchases').get()]).then(function(r){
    var dep = 0; r[2].forEach(function(d){ dep += +d.data().amount || 0; });
    var sales = 0; r[3].forEach(function(d){ sales += +d.data().price || 0; });
    v.innerHTML = '<h2>📊 ড্যাশবোর্ড</h2><div class="stats">' +
      [['ভিডিও', r[0].size], ['ইউজার', r[1].size], ['মোট ডিপোজিট', money(dep)], ['ভিডিও বিক্রি', money(sales) + ' (' + r[3].size + 'টি)']].map(function(x){ return '<div class="stat"><span class="mut sm">' + x[0] + '</span><b>' + x[1] + '</b></div>'; }).join('') +
      '</div><div class="note" style="margin-top:16px">অপেক্ষমাণ ডিপোজিট: ' + badge.dep + ' · অপেক্ষমাণ উইথড্র: ' + badge.wd + ' · অপঠিত চ্যাট: ' + badge.chat + '</div>';
  }).catch(function(e){ v.innerHTML = '<p>লোড হয়নি: ' + esc(e.message) + '</p>'; });
}

/* ---------- ভিডিও ---------- */
function vVideos(v){
  v.innerHTML = '<h2>🎬 ভিডিও</h2><div class="card"><h3 id="vft" style="margin-top:0">➕ নতুন ভিডিও</h3><form id="vf">' +
    '<div class="g2"><label>টাইটেল<input id="vtitle" required></label>' +
    '<label>ভিডিও লিংক (Terabox / Google Drive / Facebook / সরাসরি mp4)<input id="vurl" required placeholder="https://..."></label>' +
    '<label>থাম্বনেইল ইমেজ লিংক (ঐচ্ছিক — না দিলে ভিডিও থেকেই থাম্বনেইল হবে)<input id="vthumb" placeholder="https://..."></label>' +
    '<label>ভিডিও সাইজ<select id="vratio"><option value="16/9">ল্যান্ডস্কেপ (১৬:৯)</option><option value="9/16">পোর্ট্রেট / Shorts (৯:১৬)</option></select></label>' +
    '<label>ধরন<select id="vtype"><option value="free">ফ্রি</option><option value="paid">পেইড (লক করা)</option></select></label>' +
    '<label id="vpw" hidden>প্রাইস (টাকা)<input id="vprice" type="number" min="1" step="1"></label></div>' +
    '<label>বর্ণনা (ঐচ্ছিক)<textarea id="vdesc" style="min-height:60px;font-family:inherit"></textarea></label>' +
    '<label class="chk"><input id="vhide" type="checkbox"> সাইটে লুকিয়ে রাখুন (Hidden)</label>' +
    '<p class="mut sm" id="vdet" style="margin-top:8px"></p>' +
    '<div class="row" style="margin-top:12px"><button class="btn" type="submit" id="vsave">💾 সেভ করুন</button><button class="btn gh" type="button" id="vcancel" hidden>বাতিল</button></div></form></div>' +
    '<div class="tbl" id="vlist"><p class="mut">লোড হচ্ছে...</p></div>';
  var editId = '';
  $('#vtype').onchange = function(){ $('#vpw').hidden = $('#vtype').value !== 'paid'; };
  $('#vurl').oninput = function(){ var i = parseVideo($('#vurl').value); $('#vdet').textContent = $('#vurl').value ? 'প্ল্যাটফর্ম: ' + i.p : ''; };
  function reset(){ editId = ''; $('#vf').reset(); $('#vpw').hidden = true; $('#vft').textContent = '➕ নতুন ভিডিও'; $('#vcancel').hidden = true; $('#vdet').textContent = ''; }
  $('#vcancel').onclick = reset;
  $('#vf').onsubmit = function(e){
    e.preventDefault();
    var url = $('#vurl').value.trim(), paid = $('#vtype').value === 'paid', price = parseFloat($('#vprice').value) || 0;
    if (/youtu\.be|youtube\.com/i.test(url)) { toast('YouTube লিংক সাপোর্টেড নয়। Drive, Terabox, Facebook বা mp4 লিংক দিন'); return; }
    if (paid && price <= 0) { toast('পেইড ভিডিওর প্রাইস দিন'); return; }
    var info = parseVideo(url), id = editId || db.collection('videos').doc().id;
    var data = { title: $('#vtitle').value.trim(), platform: info.p, thumb: $('#vthumb').value.trim(), thumbAuto: info.thumb || '', ratio: $('#vratio').value,
                 paid: paid, price: paid ? price : 0, desc: $('#vdesc').value.trim(), hidden: $('#vhide').checked };
    if (!editId) { data.createdAt = FV.serverTimestamp(); data.views = 0; }
    data.url = paid ? FV.delete() : url;
    $('#vsave').disabled = true;
    var p = paid ? db.doc('videos/' + id + '/private/src').set({ url: url }) : db.doc('videos/' + id + '/private/src').delete().catch(function(){});
    p.then(function(){ return db.doc('videos/' + id).set(data, { merge: true }); }).then(function(){ toast('সেভ হয়েছে ✓'); reset(); }).catch(function(er){ toast('সমস্যা: ' + er.message); }).then(function(){ $('#vsave').disabled = false; });
  };
  viewSubs.push(db.collection('videos').orderBy('createdAt', 'desc').onSnapshot(function(qs){
    var L = $('#vlist'); if (!L) return;
    if (qs.empty) { L.innerHTML = '<p class="mut">এখনো কোনো ভিডিও নেই</p>'; return; }
    L.innerHTML = ''; var cache = {};
    qs.forEach(function(d){
      var x = d.data(); cache[d.id] = x; var t = x.thumb || x.thumbAuto;
      var el = document.createElement('div'); el.className = 'it';
      el.innerHTML = (t ? '<img referrerpolicy="no-referrer" src="' + esc(t) + '" alt="">' : '<div class="tp">🎬</div>') +
        '<div class="inf"><b>' + esc(x.title) + (x.hidden ? ' 🙈' : '') + '</b><span class="pill ' + (x.paid ? 'p' : 'f') + '">' + (x.paid ? '🔒 ' + money(x.price) : 'FREE') + '</span> <span class="mut sm">' + esc(x.platform) + ' · 👁 ' + (x.views || 0) + '</span></div>' +
        '<button class="btn gh s" data-a="e" type="button">✏️ এডিট</button><button class="btn gh s" data-a="h" type="button">' + (x.hidden ? '👁 দেখান' : '🙈 লুকান') + '</button><button class="btn bad s" data-a="d" type="button">🗑</button>';
      el.onclick = function(ev){
        var a = ev.target.closest('[data-a]'); if (!a) return; a = a.getAttribute('data-a');
        if (a === 'd') { if (confirm('ভিডিওটি মুছে ফেলবেন?')) db.doc('videos/' + d.id + '/private/src').delete().catch(function(){}).then(function(){ return db.doc('videos/' + d.id).delete(); }); }
        if (a === 'h') db.doc('videos/' + d.id).update({ hidden: !x.hidden });
        if (a === 'e') {
          editId = d.id; $('#vft').textContent = '✏️ এডিট: ' + x.title; $('#vcancel').hidden = false;
          $('#vtitle').value = x.title || ''; $('#vthumb').value = x.thumb || ''; $('#vratio').value = x.ratio || '16/9';
          $('#vtype').value = x.paid ? 'paid' : 'free'; $('#vpw').hidden = !x.paid; $('#vprice').value = x.price || ''; $('#vdesc').value = x.desc || ''; $('#vhide').checked = !!x.hidden;
          if (x.paid) db.doc('videos/' + d.id + '/private/src').get().then(function(s){ $('#vurl').value = s.exists ? s.data().url : ''; }); else $('#vurl').value = x.url || '';
          window.scrollTo({ top: 0, behavior: 'smooth' });
        }
      };
      L.appendChild(el);
    });
  }, function(e){ var L = $('#vlist'); if (L) L.innerHTML = '<p>' + esc(e.message) + '</p>'; }));
}

/* ---------- ডিপোজিট ---------- */
function vDep(v){
  v.innerHTML = '<h2>⬇️ ডিপোজিট রিকোয়েস্ট</h2><div class="tbl" id="dl"></div>';
  viewSubs.push(db.collection('deposits').orderBy('at', 'desc').limit(100).onSnapshot(function(qs){
    var L = $('#dl'); if (!L) return; L.innerHTML = qs.empty ? '<p class="mut">কিছু নেই</p>' : '';
    qs.forEach(function(d){
      var x = d.data(), el = document.createElement('div'); el.className = 'it';
      el.innerHTML = '<div class="inf"><b>' + money(x.amount) + ' · ' + esc(x.method) + '</b><span class="mut sm">TrxID: <b style="color:var(--tx)">' + esc(x.trx) + '</b></span><br><span class="mut sm">' + esc(x.email) + ' · ' + fdate(x.at) + '</span></div><span class="pill ' + x.status + '">' + x.status + '</span>' +
        (x.status === 'pending' ? '<button class="btn ok s" data-a="ok" type="button">✅ অনুমোদন</button><button class="btn bad s" data-a="no" type="button">❌ বাতিল</button>' : '');
      el.onclick = function(ev){
        var a = ev.target.closest('[data-a]'); if (!a) return; a = a.getAttribute('data-a');
        var ref = db.doc('deposits/' + d.id);
        db.runTransaction(function(t){
          return t.get(ref).then(function(s){
            if (s.data().status !== 'pending') throw new Error('আগেই প্রসেস হয়েছে');
            t.update(ref, { status: a === 'ok' ? 'approved' : 'rejected', by: ME.email });
            if (a === 'ok') t.update(db.doc('users/' + x.uid), { balance: FV.increment(+x.amount) });
            t.set(db.collection('notifications').doc(), { to: x.uid, title: a === 'ok' ? '✅ ডিপোজিট সফল' : '❌ ডিপোজিট বাতিল', body: a === 'ok' ? money(x.amount) + ' আপনার ব্যালেন্সে যোগ হয়েছে।' : 'Transaction ID যাচাই করা যায়নি (' + x.trx + ')।', at: FV.serverTimestamp() });
          });
        }).then(function(){ toast('হয়েছে ✓'); }).catch(function(er){ toast(er.message); });
      };
      L.appendChild(el);
    });
  }));
}

/* ---------- উইথড্র ---------- */
function vWd(v){
  v.innerHTML = '<h2>⬆️ উইথড্র রিকোয়েস্ট</h2><div class="note">রিকোয়েস্টের সময়ই ইউজারের ব্যালেন্স থেকে টাকা কাটা হয়েছে। টাকা পাঠিয়ে "পাঠানো হয়েছে" চাপুন। বাতিল করলে টাকা ফেরত যাবে।</div><div class="tbl" id="wl"></div>';
  viewSubs.push(db.collection('withdrawals').orderBy('at', 'desc').limit(100).onSnapshot(function(qs){
    var L = $('#wl'); if (!L) return; L.innerHTML = qs.empty ? '<p class="mut">কিছু নেই</p>' : '';
    qs.forEach(function(d){
      var x = d.data(), el = document.createElement('div'); el.className = 'it';
      el.innerHTML = '<div class="inf"><b>' + money(x.amount) + ' · ' + esc(x.method) + '</b><span class="mut sm">নম্বর: <b style="color:var(--tx)">' + esc(x.number) + '</b></span><br><span class="mut sm">' + esc(x.email) + ' · ' + fdate(x.at) + '</span></div><span class="pill ' + x.status + '">' + x.status + '</span>' +
        (x.status === 'pending' ? '<button class="btn ok s" data-a="ok" type="button">✅ পাঠানো হয়েছে</button><button class="btn bad s" data-a="no" type="button">❌ বাতিল (ফেরত)</button>' : '');
      el.onclick = function(ev){
        var a = ev.target.closest('[data-a]'); if (!a) return; a = a.getAttribute('data-a');
        var ref = db.doc('withdrawals/' + d.id);
        db.runTransaction(function(t){
          return t.get(ref).then(function(s){
            if (s.data().status !== 'pending') throw new Error('আগেই প্রসেস হয়েছে');
            t.update(ref, { status: a === 'ok' ? 'paid' : 'rejected', by: ME.email });
            if (a === 'no') t.update(db.doc('users/' + x.uid), { balance: FV.increment(+x.amount) });
            t.set(db.collection('notifications').doc(), { to: x.uid, title: a === 'ok' ? '✅ উইথড্র সম্পন্ন' : '❌ উইথড্র বাতিল', body: a === 'ok' ? money(x.amount) + ' আপনার ' + x.method + ' নম্বরে পাঠানো হয়েছে।' : money(x.amount) + ' আপনার ব্যালেন্সে ফেরত দেওয়া হয়েছে।', at: FV.serverTimestamp() });
          });
        }).then(function(){ toast('হয়েছে ✓'); }).catch(function(er){ toast(er.message); });
      };
      L.appendChild(el);
    });
  }));
}

/* ---------- ইউজার ---------- */
function vUsers(v){
  v.innerHTML = '<h2>👥 ইউজার</h2><input id="uq" placeholder="ইমেইল বা নাম দিয়ে খুঁজুন..." style="margin-bottom:12px"><div class="tbl" id="ul"></div>';
  var all = [];
  function draw(){
    var q = $('#uq').value.trim().toLowerCase(), L = $('#ul');
    var list = all.filter(function(u){ return !q || (u.email + ' ' + u.name).toLowerCase().indexOf(q) > -1; });
    L.innerHTML = list.length ? '' : '<p class="mut">কেউ নেই</p>';
    list.forEach(function(u){
      var el = document.createElement('div'); el.className = 'it';
      el.innerHTML = '<div class="inf"><b>' + esc(u.name || u.email) + '</b><span class="mut sm">' + esc(u.email) + '</span><br><span class="mut sm">UID: ' + esc(u.id) + '</span></div><b style="color:var(--ac)">' + money(u.balance) + '</b><button class="btn gh s" type="button">± ব্যালেন্স</button>';
      $('button', el).onclick = function(){
        var n = prompt('কত টাকা যোগ করবেন? (বিয়োগ করতে মাইনাস দিন, যেমন -50)', '0'); n = parseFloat(n);
        if (!n) return;
        db.doc('users/' + u.id).update({ balance: FV.increment(n) }).then(function(){ u.balance = (+u.balance || 0) + n; draw(); toast('ব্যালেন্স আপডেট ✓'); }).catch(function(e){ toast(e.message); });
      };
      L.appendChild(el);
    });
  }
  $('#uq').oninput = draw;
  db.collection('users').orderBy('createdAt', 'desc').limit(500).get().then(function(qs){ qs.forEach(function(d){ var x = d.data(); x.id = d.id; all.push(x); }); draw(); });
}

/* ---------- নোটিফিকেশন ---------- */
function vNotify(v){
  v.innerHTML = '<h2>🔔 নোটিফিকেশন পাঠান</h2><div class="card"><form id="nf"><label>কাকে<select id="nto"><option value="all">সবাইকে</option><option value="uid">নির্দিষ্ট ইউজার (UID)</option></select></label>' +
    '<label id="nuw" hidden>ইউজারের UID<input id="nuid"></label><label>টাইটেল<input id="ntitle" required></label><label>মেসেজ<textarea id="nbody" required style="font-family:inherit"></textarea></label>' +
    '<button class="btn" style="margin-top:12px" type="submit">📨 পাঠান</button></form></div><h3>সাম্প্রতিক</h3><div class="tbl" id="nl"></div>';
  $('#nto').onchange = function(){ $('#nuw').hidden = $('#nto').value !== 'uid'; };
  $('#nf').onsubmit = function(e){
    e.preventDefault();
    var to = $('#nto').value === 'all' ? 'all' : $('#nuid').value.trim(); if (!to) { toast('UID দিন'); return; }
    db.collection('notifications').add({ to: to, title: $('#ntitle').value.trim(), body: $('#nbody').value.trim(), at: FV.serverTimestamp() }).then(function(){ toast('পাঠানো হয়েছে ✓'); $('#nf').reset(); $('#nuw').hidden = true; }).catch(function(er){ toast(er.message); });
  };
  viewSubs.push(db.collection('notifications').orderBy('at', 'desc').limit(30).onSnapshot(function(qs){
    var L = $('#nl'); if (!L) return; L.innerHTML = qs.empty ? '<p class="mut">কিছু নেই</p>' : '';
    qs.forEach(function(d){ var x = d.data(), el = document.createElement('div'); el.className = 'it';
      el.innerHTML = '<div class="inf"><b>' + esc(x.title) + '</b><span class="mut sm">' + esc(x.body) + '</span><br><span class="mut sm">→ ' + (x.to === 'all' ? 'সবাই' : esc(x.to)) + ' · ' + fdate(x.at) + '</span></div><button class="btn bad s" type="button">🗑</button>';
      $('button', el).onclick = function(){ d.ref.delete(); }; L.appendChild(el); });
  }));
}

/* ---------- লাইভ চ্যাট ---------- */
function vChat(v){
  v.innerHTML = '<h2>💬 লাইভ চ্যাট</h2><div class="chat"><div class="cl" id="cl"></div><div><p class="mut" id="ch">বাম পাশ থেকে একজন বেছে নিন</p><div class="cm" id="cm" hidden></div><form class="row" id="cf" style="margin-top:8px" hidden><input id="ci" placeholder="উত্তর লিখুন..." style="flex:1" autocomplete="off"><button class="btn" type="submit">পাঠান</button></form></div></div>';
  var sel = '', msgUnsub = null;
  viewSubs.push(function(){ if (msgUnsub) msgUnsub(); });
  viewSubs.push(db.collection('chats').orderBy('lastAt', 'desc').limit(60).onSnapshot(function(qs){
    var L = $('#cl'); if (!L) return; L.innerHTML = qs.empty ? '<p class="mut">কোনো চ্যাট নেই</p>' : '';
    qs.forEach(function(d){
      var x = d.data(), b = document.createElement('button'); b.type = 'button'; if (d.id === sel) b.className = 'on';
      b.innerHTML = '<b class="' + (x.unreadAdmin ? 'un' : '') + '">' + (x.unreadAdmin ? '● ' : '') + esc(x.name || x.email || d.id) + '</b><br><span class="mut sm">' + esc((x.last || '').slice(0, 40)) + '</span>';
      b.onclick = function(){ open(d.id, x); };
      L.appendChild(b);
    });
  }));
  function open(uid, info){
    sel = uid; if (msgUnsub) msgUnsub();
    $('#ch').textContent = (info.name || '') + ' · ' + (info.email || uid); $('#cm').hidden = false; $('#cf').hidden = false;
    db.doc('chats/' + uid).set({ unreadAdmin: false }, { merge: true });
    msgUnsub = db.collection('chats/' + uid + '/msgs').orderBy('at').onSnapshot(function(qs){
      var c = $('#cm'); if (!c) return; c.innerHTML = '';
      qs.forEach(function(d){ var x = d.data(), m = document.createElement('div'); m.className = 'm ' + (x.from === 'admin' ? 'a' : 'u'); m.textContent = x.text; c.appendChild(m); });
      c.scrollTop = c.scrollHeight;
      db.doc('chats/' + uid).set({ unreadAdmin: false }, { merge: true });
    });
    $('#cf').onsubmit = function(e){
      e.preventDefault(); var t = $('#ci').value.trim(); if (!t) return; $('#ci').value = '';
      db.collection('chats/' + uid + '/msgs').add({ from: 'admin', text: t, at: FV.serverTimestamp() })
        .then(function(){ return db.doc('chats/' + uid).set({ last: '✓ ' + t, lastAt: FV.serverTimestamp(), unreadUser: true, unreadAdmin: false }, { merge: true }); }).catch(function(er){ toast(er.message); });
    };
  }
}

/* ---------- সেটিংস ---------- */
var FIELDS = [
  ['সাইট', [['siteName','সাইটের নাম','text'],['logo','লোগো ইমেজ লিংক (ঐচ্ছিক)','text'],['heroTitle','হিরো টাইটেল','text'],['heroText','হিরো বর্ণনা','text'],['announce','ঘোষণা (উপরে দেখাবে, ঐচ্ছিক)','text'],['facebook','Facebook লিংক','text'],['telegram','Telegram লিংক','text'],['youtube','YouTube লিংক','text'],['whatsapp','WhatsApp নম্বর (দেশের কোড সহ)','text']]],
  ['পেমেন্ট', [['payment.bkash','bKash নম্বর','text'],['payment.nagad','Nagad নম্বর','text'],['payment.minDeposit','ন্যূনতম ডিপোজিট','number'],['payment.minWithdraw','ন্যূনতম উইথড্র','number']]],
  ['ভিডিও চালুর আগের ভেরিফাই', [['verify.enabled','ভেরিফাই চালু','check'],['verify.url','ভেরিফাই লিংক (ক্লিক করলে এই লিংক খুলবে)','text'],['verify.seconds','অপেক্ষার সময় (সেকেন্ড)','number'],['verify.title','ভেরিফাই বক্সের লেখা','text'],['verify.label','বাটনের লেখা','text']]],
  ['বিজ্ঞাপন', [['ads.enabled','সব বিজ্ঞাপন চালু','check'],['ads.feedEvery','কয়টি ভিডিও পর পর ফিড অ্যাড','number'],['ads.top','Top (হোমপেজের উপরে)','area'],['ads.feed','Feed (ভিডিওর মাঝে)','area'],['ads.player','Player (প্লেয়ারের নিচে)','area'],['ads.bottom','Bottom (পেজের নিচে)','area'],['ads.sticky','Sticky (নিচে ভাসমান)','area']]]
];
function getPath(o, p){ return p.split('.').reduce(function(a, k){ return a == null ? undefined : a[k]; }, o); }
function setPath(o, p, val){ var k = p.split('.'), c = o; k.slice(0, -1).forEach(function(x){ c = c[x] = c[x] || {}; }); c[k[k.length - 1]] = val; }
function vSettings(v){
  db.doc('settings/site').get().then(function(s){
    var d = s.exists ? s.data() : {};
    if (getPath(d, 'verify.url') === undefined) setPath(d, 'verify.url', 'https://uplcm.com/4/12003305');
    if (getPath(d, 'verify.seconds') === undefined) setPath(d, 'verify.seconds', 5);
    if (getPath(d, 'verify.enabled') === undefined) setPath(d, 'verify.enabled', true);
    if (getPath(d, 'verify.label') === undefined) setPath(d, 'verify.label', 'ভেরিফাই করুন');
    v.innerHTML = '<h2>⚙️ সেটিংস</h2><form id="sf">' + FIELDS.map(function(g){
      return '<div class="card"><h3 style="margin-top:0">' + g[0] + '</h3><div class="' + (g[1].some(function(f){ return f[2] === 'area'; }) ? '' : 'g2') + '">' + g[1].map(function(f){
        var val = getPath(d, f[0]);
        if (f[2] === 'check') return '<label class="chk"><input type="checkbox" data-p="' + f[0] + '"' + (val ? ' checked' : '') + '> ' + f[1] + '</label>';
        if (f[2] === 'area') return '<label>' + f[1] + '<textarea data-p="' + f[0] + '" placeholder="অ্যাড কোড (script / html) এখানে পেস্ট করুন">' + esc(val || '') + '</textarea></label>';
        return '<label>' + f[1] + '<input data-p="' + f[0] + '" data-n="' + (f[2] === 'number' ? 1 : 0) + '" value="' + esc(val == null ? '' : val) + '"></label>';
      }).join('') + '</div></div>';
    }).join('') + '<button class="btn" type="submit">💾 সেটিংস সেভ করুন</button></form>';
    $('#sf').onsubmit = function(e){
      e.preventDefault(); var out = {};
      Array.prototype.forEach.call($('#sf').querySelectorAll('[data-p]'), function(el){
        var val = el.type === 'checkbox' ? el.checked : (el.getAttribute('data-n') === '1' ? (parseFloat(el.value) || 0) : el.value.trim());
        setPath(out, el.getAttribute('data-p'), val);
      });
      db.doc('settings/site').set(out, { merge: true }).then(function(){ toast('সেভ হয়েছে ✓'); }).catch(function(er){ toast(er.message); });
    };
  });
}
</script>
</body>
</html>

বিজ্ঞাপন
পোস্ট করেছেন

Tanbin Farazi