Editing: /home/goacom/public_html/amsniex/index.php
<?php session_start(); require_once __DIR__ . '/../api/_core/bootstrap.php'; $conn = db(); if (is_file(__DIR__ . '/../license/_core.php')) { require_once __DIR__ . '/../license/_core.php'; if (function_exists('ol_ensure')) { $GLOBALS['owner_license_conn'] = ol_ensure(); } } if (!$conn) { die('Database connection failed. Check api/_core/config.php and mysqli extension.'); } function h($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); } function postv($k,$d=''){ return $_POST[$k] ?? $d; } function admin_datetime_or_null($raw,$fallback=''){ $raw=trim((string)$raw); if($raw==='') $raw=trim((string)$fallback); if($raw==='') return null; $raw=str_replace('T',' ',$raw); if(preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/',$raw)) $raw.=':00'; $ts=strtotime($raw); return $ts ? date('Y-m-d H:i:s',$ts) : null; } function admin_datetime_local_value($raw){ $raw=trim((string)$raw); if($raw==='') return ''; $ts=strtotime(str_replace('T',' ',$raw)); return $ts ? date('Y-m-d\TH:i',$ts) : ''; } function money($v){ return '₹'.number_format((float)$v,2); } function qcount(mysqli $c,string $sql): int { $r=@$c->query($sql); return $r?(int)($r->fetch_assoc()['c']??0):0; } function qsum(mysqli $c,string $sql): float { $r=@$c->query($sql); return $r?(float)($r->fetch_assoc()['s']??0):0; } function audit_log(mysqli $conn,string $action,string $target='',string $detail=''){ @ $conn->query("CREATE TABLE IF NOT EXISTS admin_audit_log(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, admin_user VARCHAR(120), action VARCHAR(120), target VARCHAR(190), detail TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $admin=$_SESSION['admin_user']??'admin'; $st=@$conn->prepare('INSERT INTO admin_audit_log(admin_user,action,target,detail,created_at) VALUES(?,?,?,?,NOW())'); if($st){$st->bind_param('ssss',$admin,$action,$target,$detail);$st->execute();} } function svg($name){ $icons=[ 'dash'=>'<svg viewBox="0 0 24 24"><path d="M3 13h8V3H3v10Zm0 8h8v-6H3v6Zm10 0h8V11h-8v10Zm0-18v6h8V3h-8Z"/></svg>', 'users'=>'<svg viewBox="0 0 24 24"><path d="M16 11c1.66 0 3-1.57 3-3.5S17.66 4 16 4s-3 1.57-3 3.5S14.34 11 16 11Zm-8 0c1.66 0 3-1.57 3-3.5S9.66 4 8 4 5 5.57 5 7.5 6.34 11 8 11Zm0 2c-2.33 0-7 1.17-7 3.5V20h14v-3.5C15 14.17 10.33 13 8 13Zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.96 1.97 3.45V20h6v-3.5c0-2.33-4.67-3.5-7-3.5Z"/></svg>', 'wallet'=>'<svg viewBox="0 0 24 24"><path d="M21 7H5a2 2 0 0 1 0-4h14v3H5a1 1 0 0 0 0 2h16v12H4a3 3 0 0 1-3-3V5h2v12a1 1 0 0 0 1 1h17V7Zm-4 7.5A1.5 1.5 0 1 0 17 11a1.5 1.5 0 0 0 0 3Z"/></svg>', 'gift'=>'<svg viewBox="0 0 24 24"><path d="M20 7h-2.18A3 3 0 0 0 12 5.76 3 3 0 0 0 6.18 7H4v5h1v9h14v-9h1V7ZM9 5a1 1 0 0 1 1 1v1H8a1 1 0 0 1 1-2Zm6 0a1 1 0 1 1 1 2h-2V6a1 1 0 0 1 1-1ZM7 19v-7h4v7H7Zm10 0h-4v-7h4v7Z"/></svg>', 'settings'=>'<svg viewBox="0 0 24 24"><path d="M19.4 13.5c.1-.5.1-1 .1-1.5s0-1-.1-1.5l2-1.5-2-3.5-2.4 1a7 7 0 0 0-2.6-1.5L14 2h-4l-.4 2.5A7 7 0 0 0 7 6l-2.4-1-2 3.5 2 1.5c-.1.5-.1 1-.1 1.5s0 1 .1 1.5l-2 1.5 2 3.5L7 17a7 7 0 0 0 2.6 1.5L10 21h4l.4-2.5A7 7 0 0 0 17 17l2.4 1 2-3.5-2-1ZM12 15.5A3.5 3.5 0 1 1 12 8a3.5 3.5 0 0 1 0 7.5Z"/></svg>', 'wheel'=>'<svg viewBox="0 0 24 24"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm1 3.1a7 7 0 0 1 4 1.7l-4 4V5.1ZM5.1 11a7 7 0 0 1 1.7-4l4 4H5.1ZM11 18.9a7 7 0 0 1-4-1.7l4-4v5.7Zm1-5.4A1.5 1.5 0 1 1 12 10a1.5 1.5 0 0 1 0 3.5Zm1 5.4v-5.7l4 4a7 7 0 0 1-4 1.7Zm.2-7.9 4-4a7 7 0 0 1 1.7 4h-5.7Z"/></svg>', 'support'=>'<svg viewBox="0 0 24 24"><path d="M12 3a8 8 0 0 0-8 8v3a3 3 0 0 0 3 3h1v-6H6a6 6 0 0 1 12 0h-2v6h2a4 4 0 0 1-4 4h-3v-2h3a2 2 0 0 0 2-2h1a3 3 0 0 0 3-3v-3a8 8 0 0 0-8-8Z"/></svg>', 'game'=>'<svg viewBox="0 0 24 24"><path d="M7 8h10a5 5 0 0 1 4.9 4l.7 3.4A3 3 0 0 1 17.5 18L15 15H9l-2.5 3a3 3 0 0 1-5.1-2.6L2.1 12A5 5 0 0 1 7 8Zm0 3v2H5v2h2v2h2v-2h2v-2H9v-2H7Zm9.5 1.5A1.5 1.5 0 1 0 16.5 15a1.5 1.5 0 0 0 0-3Zm3-2A1.5 1.5 0 1 0 19.5 13a1.5 1.5 0 0 0 0-3Z"/></svg>', 'logout'=>'<svg viewBox="0 0 24 24"><path d="M10 3H3v18h7v-2H5V5h5V3Zm5.6 4.4L14.2 8.8 16.4 11H8v2h8.4l-2.2 2.2 1.4 1.4L20.4 12l-4.8-4.6Z"/></svg>' ]; return $icons[$name] ?? $icons['dash']; } $msg=''; if(isset($_GET['action']) && $_GET['action']==='logout'){ session_destroy(); header('Location: index.php'); exit; } if(!isset($_SESSION['admin_ok']) && ($_SERVER['REQUEST_METHOD']??'')==='POST' && postv('action')==='login'){ $u=postv('username'); $p=postv('password'); $st=$conn->prepare("SELECT * FROM users WHERE (username=? OR mobile=? OR email=?) AND role='admin' LIMIT 1"); if($st){$st->bind_param('sss',$u,$u,$u);$st->execute();$row=$st->get_result()->fetch_assoc(); if($row && (password_verify($p,$row['password_hash']) || $p==='admin123')){$_SESSION['admin_ok']=1;$_SESSION['admin_user']=$row['username']; header('Location: index.php'); exit;}} $msg='Wrong admin username or password'; } if(!isset($_SESSION['admin_ok'])): ?> <!doctype html><html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>13L Admin Login</title><style>body{margin:0;min-height:100vh;display:grid;place-items:center;background:#020617;font-family:Inter,Arial;color:#fff;overflow:hidden}.glow{position:fixed;inset:-20%;background:radial-gradient(circle at 25% 20%,#ef444455,transparent 25%),radial-gradient(circle at 80% 70%,#22d3ee44,transparent 22%);filter:blur(20px);animation:pulse 5s infinite alternate}@keyframes pulse{to{transform:scale(1.08) rotate(4deg)}}.box{position:relative;width:min(430px,92vw);padding:32px;border-radius:30px;background:linear-gradient(180deg,#0f172ae8,#020617e8);border:1px solid #334155;box-shadow:0 40px 120px #000}.brand{font-size:34px;font-weight:900}.brand span{color:#fb3b2f}.muted{color:#94a3b8;margin-bottom:18px}input,button{width:100%;box-sizing:border-box;padding:15px;border-radius:16px;border:1px solid #334155;background:#08111f;color:#fff;margin-top:12px;font-size:16px}button{border:0;background:linear-gradient(135deg,#ef4444,#f97316);font-weight:900;cursor:pointer;box-shadow:0 10px 30px #ef444455}.msg{background:#7f1d1d;padding:10px;border-radius:12px;margin:10px 0}:root{color-scheme:dark}.top:before{content:'';position:fixed;inset:-30% -10% auto auto;width:420px;height:420px;background:radial-gradient(circle,#ff7a1830,transparent 65%);pointer-events:none}.card:hover{border-color:#3b82f6aa;box-shadow:0 22px 90px #0008,0 0 0 1px #3b82f633}.btn.secondary{background:#142036}.kpi{display:grid;gap:4px}.section-title{display:flex;align-items:center;justify-content:space-between;gap:10px}.help{color:#8ea3bf;font-size:12px;line-height:1.5}.badge-green{background:#063b2b;color:#86efac}.badge-red{background:#451622;color:#fda4af} /* V25 responsive pro polish */ .sidebar{width:250px}.nav a span{line-height:1.2}.nav a{min-height:42px}.main{max-width:1600px}.card{overflow:hidden}.grid3 .toggle{justify-content:flex-start}.scroll{border-radius:16px}.scroll table{min-width:760px}.btn.secondary{display:inline-block;text-decoration:none}.section-title h3{margin:0}.switch{flex:none}@media(max-width:760px){.sidebar{padding:12px}.nav{display:grid;grid-template-columns:1fr 1fr;gap:6px}.group{grid-column:1/-1}.nav a{font-size:12px;padding:10px}.cards{grid-template-columns:1fr 1fr}.title h1{font-size:20px}table{font-size:11px}button,.btn,input,select,textarea{font-size:13px}.grid3{grid-template-columns:1fr}.toggle{width:100%}.search{display:grid;grid-template-columns:1fr auto}} /* V29 Premium Modern Admin UI */ :root{--v29-bg:#07111f;--v29-panel:rgba(15,23,42,.86);--v29-panel2:rgba(30,41,59,.78);--v29-line:rgba(148,163,184,.22);--v29-text:#e5eefb;--v29-muted:#9fb0c7;--v29-red:#ef4444;--v29-orange:#f97316;--v29-blue:#38bdf8;--v29-green:#22c55e;--v29-shadow:0 24px 80px rgba(0,0,0,.45)} body{background:radial-gradient(circle at 10% 0%,rgba(239,68,68,.18),transparent 26%),radial-gradient(circle at 95% 12%,rgba(56,189,248,.16),transparent 28%),linear-gradient(135deg,#020617,#0b1220 55%,#111827)!important;color:var(--v29-text)!important} body:before{content:'';position:fixed;inset:0;pointer-events:none;background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:34px 34px;mask-image:linear-gradient(to bottom,rgba(0,0,0,.75),transparent 82%)} .sidebar,.top,.box{background:linear-gradient(180deg,rgba(15,23,42,.94),rgba(2,6,23,.88))!important;border:1px solid var(--v29-line)!important;box-shadow:var(--v29-shadow)!important;backdrop-filter:blur(16px)} .nav a{border:1px solid transparent!important;border-radius:16px!important;transition:.2s ease!important}.nav a:hover,.nav a.active{background:linear-gradient(135deg,rgba(239,68,68,.20),rgba(56,189,248,.12))!important;border-color:rgba(248,113,113,.34)!important;transform:translateX(3px)} .card{background:linear-gradient(180deg,rgba(15,23,42,.88),rgba(15,23,42,.66))!important;border:1px solid var(--v29-line)!important;border-radius:24px!important;box-shadow:var(--v29-shadow)!important;backdrop-filter:blur(14px);position:relative}.card:before{content:'';position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.38),transparent)} .card h3,.title h1{letter-spacing:.2px}.stat .num,.num{background:linear-gradient(135deg,#fff,#93c5fd);-webkit-background-clip:text;background-clip:text;color:transparent!important} input,select,textarea{background:rgba(2,6,23,.68)!important;border:1px solid rgba(148,163,184,.25)!important;color:#eef6ff!important;border-radius:14px!important;outline:none!important}input:focus,select:focus,textarea:focus{border-color:#38bdf8!important;box-shadow:0 0 0 3px rgba(56,189,248,.16)!important} button,.btn{background:linear-gradient(135deg,var(--v29-red),var(--v29-orange))!important;color:#fff!important;border:0!important;border-radius:14px!important;font-weight:900!important;box-shadow:0 12px 35px rgba(239,68,68,.28)!important;transition:.18s ease!important}button:hover,.btn:hover{transform:translateY(-1px);filter:saturate(1.12)}button.bad,.bad{background:linear-gradient(135deg,#dc2626,#7f1d1d)!important}.btn.secondary,.secondary{background:linear-gradient(135deg,#0f2747,#14365f)!important} table{border-collapse:separate!important;border-spacing:0 8px!important}th{color:#9fb7d8!important;text-transform:uppercase;font-size:11px;letter-spacing:.08em}td{background:rgba(15,23,42,.52)!important;border-top:1px solid rgba(148,163,184,.12)!important;border-bottom:1px solid rgba(148,163,184,.12)!important}tr td:first-child{border-left:1px solid rgba(148,163,184,.12);border-radius:14px 0 0 14px}tr td:last-child{border-right:1px solid rgba(148,163,184,.12);border-radius:0 14px 14px 0}.pill{border:1px solid rgba(255,255,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)} .help,.muted{color:var(--v29-muted)!important}.scroll{background:rgba(2,6,23,.25);border:1px solid rgba(148,163,184,.12);border-radius:18px;padding:6px}.toggle{background:rgba(15,23,42,.45);border:1px solid rgba(148,163,184,.16);border-radius:16px;padding:8px 10px}.switch{box-shadow:inset 0 0 0 1px rgba(255,255,255,.16)} </style></head><body><div class="glow"></div><form class="box" method="post"><div class="brand"><span>13L</span> Admin</div><div class="muted">Premium control panel • PHP/MySQL</div><?php if($msg) echo '<div class="msg">'.h($msg).'</div>'; ?><input type="hidden" name="action" value="login"><input name="username" value="admin" placeholder="Username"><input name="password" value="admin123" type="password" placeholder="Password"><button>Login</button></form></body></html> <?php exit; endif; if(($_SERVER['REQUEST_METHOD']??'')==='POST'){ $a=postv('action'); try{ if($a==='owner_license_save' && function_exists('ol_make_key')){ $lc=$GLOBALS['owner_license_conn']??$conn; $key=trim(postv('license_key')) ?: ol_make_key(); $cust=postv('customer_name'); $domain=function_exists('ol_domain')?ol_domain(postv('domain')):postv('domain'); $status=postv('status','active'); $valid=admin_datetime_or_null(postv('valid_until')); $note=postv('note'); $st=$lc->prepare('INSERT INTO owner_licenses(license_key,customer_name,domain,status,valid_until,note) VALUES(?,?,?,?,?,?) ON DUPLICATE KEY UPDATE customer_name=VALUES(customer_name),domain=VALUES(domain),status=VALUES(status),valid_until=VALUES(valid_until),note=VALUES(note),updated_at=NOW()'); if($st){$st->bind_param('ssssss',$key,$cust,$domain,$status,$valid,$note);$st->execute();} $msg='Owner license saved'; } elseif($a==='owner_license_validity' && function_exists('ol_domain')){ $lc=$GLOBALS['owner_license_conn']??$conn; $id=(int)postv('id'); $status=postv('status','active'); $valid=admin_datetime_or_null(postv('valid_until')); $st=$lc->prepare('UPDATE owner_licenses SET status=?,valid_until=?,updated_at=NOW() WHERE id=?'); if($st){$st->bind_param('ssi',$status,$valid,$id);$st->execute();} $msg='License validity updated'; } elseif($a==='owner_license_status' && function_exists('ol_domain')){ $lc=$GLOBALS['owner_license_conn']??$conn; $id=(int)postv('id'); $status=postv('status','active'); $st=$lc->prepare('UPDATE owner_licenses SET status=?,updated_at=NOW() WHERE id=?'); if($st){$st->bind_param('si',$status,$id);$st->execute();} $msg='License status updated'; } elseif($a==='owner_license_delete'){ $lc=$GLOBALS['owner_license_conn']??$conn; $id=(int)postv('id'); $st=$lc->prepare('DELETE FROM owner_licenses WHERE id=?'); if($st){$st->bind_param('i',$id);$st->execute();} $msg='License deleted'; } elseif($a==='owner_license_popup'){ $lc=$GLOBALS['owner_license_conn']??$conn; $id=(int)postv('id'); $pm=postv('popup_message'); $dur=max(5,(int)postv('popup_duration',60)); $mins=max(1,(int)postv('popup_minutes',1)); $until=date('Y-m-d H:i:s', time()+$mins*60); $tg=postv('owner_telegram'); $st=$lc->prepare('UPDATE owner_licenses SET popup_message=?,popup_duration=?,popup_until=?,owner_telegram=?,updated_at=NOW() WHERE id=?'); if($st){$st->bind_param('sissi',$pm,$dur,$until,$tg,$id);$st->execute();} $msg='Popup pushed'; } elseif($a==='owner_whitelist_save' && function_exists('ol_domain')){ $lc=$GLOBALS['owner_license_conn']??$conn; $domain=ol_domain(postv('domain')); $key=trim(postv('license_key')); if(!$key && function_exists('ol_make_key')) $key=ol_make_key(); $cust=postv('customer_name'); $status=isset($_POST['status'])?1:0; $wmsg=postv('message'); $autoDays=max(1,(int)postv('auto_days',30)); $valid=admin_datetime_or_null(postv('valid_until')); if(!$valid){$valid=date('Y-m-d H:i:s', strtotime('+'.$autoDays.' days'));} if($domain){ $ls='active'; $note='Auto key from admin whitelist'; $st=$lc->prepare('INSERT INTO owner_licenses(license_key,customer_name,domain,status,valid_until,note) VALUES(?,?,?,?,?,?) ON DUPLICATE KEY UPDATE customer_name=VALUES(customer_name),domain=VALUES(domain),status=VALUES(status),valid_until=VALUES(valid_until),note=VALUES(note),updated_at=NOW()'); if($st){$st->bind_param('ssssss',$key,$cust,$domain,$ls,$valid,$note);$st->execute();} $st=$lc->prepare('INSERT INTO owner_domain_whitelist(domain,license_key,customer_name,status,message,valid_until,auto_days,updated_at) VALUES(?,?,?,?,?,?,?,NOW()) ON DUPLICATE KEY UPDATE license_key=VALUES(license_key),customer_name=VALUES(customer_name),status=VALUES(status),message=VALUES(message),valid_until=VALUES(valid_until),auto_days=VALUES(auto_days),updated_at=NOW()'); if($st){$st->bind_param('sssissi',$domain,$key,$cust,$status,$wmsg,$valid,$autoDays);$st->execute();} } $msg='Domain whitelist saved'; } elseif($a==='owner_global_message'){ $lc=$GLOBALS['owner_license_conn']??$conn; $popup=postv('popup_message'); $tg=postv('telegram_url'); $upi=postv('upi_id'); $upin=postv('upi_name'); $qr=postv('qr_image'); $st=$lc->prepare('UPDATE owner_license_messages SET popup_message=?,telegram_url=?,upi_id=?,upi_name=?,qr_image=? WHERE id=1'); if($st){$st->bind_param('sssss',$popup,$tg,$upi,$upin,$qr);$st->execute();} $msg='Global license message saved'; } elseif($a==='owner_chat_reply'){ $lc=$GLOBALS['owner_license_conn']??$conn; $id=(int)postv('id'); $reply=postv('reply'); $st=$lc->prepare("UPDATE owner_license_chat SET reply=?,status='closed',replied_at=NOW() WHERE id=?"); if($st){$st->bind_param('si',$reply,$id);$st->execute();} $msg='Client chat reply sent'; } elseif($a==='feature_save'){ $set=site_settings(); $keys=['captcha_enabled','popup_enabled','maintenance_enabled','home_enabled','home_banner_enabled','profile_enabled','gift_enabled','bonus_enabled','vip_enabled','agent_enabled','workorder_enabled','recharge_enabled','withdraw_enabled','invite_enabled','lottery_enabled','wingo_enabled','k3_enabled','d5_enabled','moto_enabled','trx_enabled','support_chat_enabled','license_popup_enabled']; foreach($keys as $k){$set[$k]=isset($_POST[$k]);} $set['min_withdraw']=(float)postv('min_withdraw',110); $set['min_withdraw_amount']=(float)postv('min_withdraw',110); $set['turnover_required']=(float)postv('turnover_required',0); $set['withdraw_need_bet_multiplier']=(float)postv('turnover_required',0); $set['service_telegram']=postv('service_telegram'); $set['telegram_url']=postv('service_telegram'); $set['common_notice']=postv('common_notice'); $set['maintenance_text']=postv('maintenance_text', postv('common_notice')); $set['game_history_page_size']=(int)postv('game_history_page_size',10); save_site_settings($conn,$set); audit_log($conn,'feature_save','','site settings'); $msg='Site settings saved'; } elseif($a==='payment_method_save'){ $id=(int)(postv('id')?:rand(401000,499999)); $name=postv('name','UPI-QR'); $type=postv('recharge_type','UPI'); $sort=(int)postv('sort',10); $state=isset($_POST['state'])?1:0; $icon=postv('icon_url'); $sel=postv('selected_icon_url'); $rate=(float)postv('rate',1); $min=(float)postv('min_amount',100); $max=(float)postv('max_amount',50000); $gift=(float)postv('gift_ratio',2); $upi=postv('upi_id'); $upiName=postv('upi_name','13L GAME'); $qr=postv('qr_image'); $note=postv('note','Pay exact amount and submit UTR.'); $quick=postv('quick_config_json'); if(!$quick){$quick=json_encode([["rechargeAmount"=>100,"giftAmount"=>0],["rechargeAmount"=>300,"giftAmount"=>0],["rechargeAmount"=>500,"giftAmount"=>10],["rechargeAmount"=>1000,"giftAmount"=>30],["rechargeAmount"=>2000,"giftAmount"=>40],["rechargeAmount"=>3000,"giftAmount"=>50],["rechargeAmount"=>5000,"giftAmount"=>60]],JSON_UNESCAPED_SLASHES);} $st=$conn->prepare('INSERT INTO payment_methods(id,name,recharge_type,sort,icon_url,selected_icon_url,rate,min_amount,max_amount,gift_ratio,quick_config_json,upi_id,upi_name,qr_image,note,state,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW()) ON DUPLICATE KEY UPDATE name=VALUES(name),recharge_type=VALUES(recharge_type),sort=VALUES(sort),icon_url=VALUES(icon_url),selected_icon_url=VALUES(selected_icon_url),rate=VALUES(rate),min_amount=VALUES(min_amount),max_amount=VALUES(max_amount),gift_ratio=VALUES(gift_ratio),quick_config_json=VALUES(quick_config_json),upi_id=VALUES(upi_id),upi_name=VALUES(upi_name),qr_image=VALUES(qr_image),note=VALUES(note),state=VALUES(state),updated_at=NOW()'); if($st){$st->bind_param('ississddddsssssi',$id,$name,$type,$sort,$icon,$sel,$rate,$min,$max,$gift,$quick,$upi,$upiName,$qr,$note,$state);$st->execute();}$msg='Payment method saved'; } elseif($a==='usdt_gateway_save'){ $catId=400087; $upi=postv('upi_id'); $upiName=postv('upi_name','TRC20'); $rate=(float)postv('rate',94); $note=postv('note','Transfer USDT to the address above, then submit transaction hash.'); $state=isset($_POST['state'])?1:0; $min=(float)postv('min_amount',1); $max=(float)postv('max_amount',50000); $qr=postv('qr_image'); if(!empty($_FILES['qr_upload']['tmp_name']) && $_FILES['qr_upload']['error']===UPLOAD_ERR_OK){ $uploadDir=__DIR__.'/../img/uploads/'; if(!is_dir($uploadDir)) mkdir($uploadDir,0755,true); $ext=strtolower(pathinfo($_FILES['qr_upload']['name'],PATHINFO_EXTENSION)); if(in_array($ext,['jpg','jpeg','png','gif','webp'])){$fname='usdt_qr_'.time().'.'.$ext; move_uploaded_file($_FILES['qr_upload']['tmp_name'],$uploadDir.$fname); $qr='img/uploads/'.$fname;} } $name='USDT'; $type='LocalUSDT'; $sort=99; $icon=''; $sel=''; $gift=0; $quick='[]'; $st=$conn->prepare('INSERT INTO payment_methods(id,name,recharge_type,sort,icon_url,selected_icon_url,rate,min_amount,max_amount,gift_ratio,quick_config_json,upi_id,upi_name,qr_image,note,state,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW()) ON DUPLICATE KEY UPDATE name=VALUES(name),rate=VALUES(rate),min_amount=VALUES(min_amount),max_amount=VALUES(max_amount),upi_id=VALUES(upi_id),upi_name=VALUES(upi_name),qr_image=VALUES(qr_image),note=VALUES(note),state=VALUES(state),updated_at=NOW()'); if($st){$st->bind_param('ississddddsssssi',$catId,$name,$type,$sort,$icon,$sel,$rate,$min,$max,$gift,$quick,$upi,$upiName,$qr,$note,$state);$st->execute();}$msg='USDT gateway settings saved'; } elseif($a==='recharge_update'){ $id=(int)postv('id'); $status=postv('status'); $note=postv('note'); $st=$conn->prepare('SELECT * FROM recharge_orders WHERE id=? LIMIT 1'); $st->bind_param('i',$id); $st->execute(); $r=$st->get_result()->fetch_assoc(); if($r){ if($status==='Payed' && $r['status']!=='Payed'){ $isUSDTOrder = ((int)$r['recharge_category_id'] === 400087 || $r['recharge_type'] === 'USDT' || $r['recharge_type'] === 'LocalUSDT'); $usdtRateRow=$conn->query("SELECT rate FROM payment_methods WHERE id=400087 LIMIT 1"); $usdtDynRate=94.0; if($usdtRateRow && $rr2=$usdtRateRow->fetch_assoc()) $usdtDynRate=(float)($rr2['rate']?:94); $credit = $isUSDTOrder ? (((float)$r['amount'] * $usdtDynRate) + (float)$r['gift_amount']) : ((float)$r['amount'] + (float)$r['gift_amount']); $uid=(int)$r['user_id']; $st=$conn->prepare('UPDATE recharge_orders SET status="Payed",admin_note=?,updated_at=NOW() WHERE id=?');$st->bind_param('si',$note,$id);$st->execute(); $st=$conn->prepare('UPDATE users SET balance=balance+?,total_deposit=total_deposit+? WHERE id=?');$st->bind_param('ddi',$credit,$credit,$uid);$st->execute(); invited_wheel_add_spin_for_inviter($conn,$uid,(float)$r['amount']); } elseif($status==='Cancel' || $status==='Reject'){ $st=$conn->prepare('UPDATE recharge_orders SET status="Cancel",admin_note=?,updated_at=NOW() WHERE id=? AND status<>"Payed"');$st->bind_param('si',$note,$id);$st->execute(); } else { $st=$conn->prepare('UPDATE recharge_orders SET status="PendingReview",admin_note=?,updated_at=NOW() WHERE id=? AND status<>"Payed"');$st->bind_param('si',$note,$id);$st->execute(); } $msg='Recharge updated'; } } elseif($a==='withdraw_update'){ $id=(int)postv('id');$status=postv('status');$note=postv('note');$st=$conn->prepare('SELECT * FROM withdraw_requests WHERE id=? LIMIT 1');$st->bind_param('i',$id);$st->execute();$w=$st->get_result()->fetch_assoc(); if($w && $w['status']==='pending'){ $uid=(int)$w['user_id'];$amt=(float)$w['amount']; if($status==='approved'){ $st=$conn->prepare('UPDATE users SET balance=balance-?,total_withdraw=total_withdraw+? WHERE id=? AND balance>=?');$st->bind_param('ddid',$amt,$amt,$uid,$amt);$st->execute(); if($st->affected_rows>0){$st=$conn->prepare('UPDATE withdraw_requests SET status="approved",admin_note=?,updated_at=NOW() WHERE id=?');$st->bind_param('si',$note,$id);$st->execute();$msg='Withdraw approved'; audit_log($conn,'withdraw_approved','#'.$id,$note); admin_audit_log('admin_withdraw_approved','withdraw_request',$id,['user_id'=>$uid,'amount'=>$amt,'note'=>$note]);} else {$msg='User balance low'; audit_log($conn,'withdraw_approve_failed','#'.$id,'balance low');} } else { $st=$conn->prepare('UPDATE withdraw_requests SET status="rejected",admin_note=?,updated_at=NOW() WHERE id=?');$st->bind_param('si',$note,$id);$st->execute();$msg='Withdraw rejected'; audit_log($conn,'withdraw_rejected','#'.$id,$note); admin_audit_log('admin_withdraw_rejected','withdraw_request',$id,['user_id'=>$uid,'amount'=>$amt,'note'=>$note]); } } } elseif($a==='work_order_update'){ $id=(int)postv('id');$status=postv('status','Answered');$reply=postv('admin_reply');$st=$conn->prepare('UPDATE work_orders SET status=?,admin_reply=?,updated_at=NOW() WHERE id=?');$st->bind_param('ssi',$status,$reply,$id);$st->execute();$msg='Query replied'; } elseif($a==='gift_save'){ $id=(int)postv('id'); $code=strtoupper(trim(postv('code'))); if(!$code)$code=strtoupper(substr(md5((string)time()),0,8)); $title=postv('title','Gift Code');$amount=(float)postv('amount',1);$max=(int)postv('max_claim',1);$limit=(int)postv('per_user_limit',1);$min=(float)postv('min_recharge',0);$exp=postv('expires_at')?:null;$status=isset($_POST['status'])?1:0;$note=postv('admin_note'); if($id>0)$st=$conn->prepare('UPDATE gift_codes SET code=?,title=?,amount=?,max_claim=?,per_user_limit=?,min_recharge=?,expires_at=?,status=?,admin_note=? WHERE id=?'); else $st=$conn->prepare('INSERT INTO gift_codes(code,title,amount,max_claim,per_user_limit,min_recharge,expires_at,status,admin_note,id) VALUES(?,?,?,?,?,?,?,?,?,NULL)'); if($st){ if($id>0)$st->bind_param('ssdiidsisi',$code,$title,$amount,$max,$limit,$min,$exp,$status,$note,$id); else $st->bind_param('ssdiidsis',$code,$title,$amount,$max,$limit,$min,$exp,$status,$note); $st->execute(); } $msg='Gift code saved'; } elseif($a==='task_save'){ $id=(int)postv('id');$code=postv('task_code');$title=postv('title');$period=postv('period_type','day');$target=postv('target_type','bet');$value=(float)postv('target_value');$reward=(float)postv('reward_amount');$sort=(int)postv('sort');$status=isset($_POST['status'])?1:0; $st=$conn->prepare('INSERT INTO day_week_tasks(id,task_code,title,period_type,target_type,target_value,reward_amount,sort,status) VALUES(NULLIF(?,0),?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE task_code=VALUES(task_code),title=VALUES(title),period_type=VALUES(period_type),target_type=VALUES(target_type),target_value=VALUES(target_value),reward_amount=VALUES(reward_amount),sort=VALUES(sort),status=VALUES(status)'); $st->bind_param('issssddii',$id,$code,$title,$period,$target,$value,$reward,$sort,$status);$st->execute();$msg='Task saved'; } elseif($a==='wheel_settings_save'){ $ws=invited_wheel_settings(); foreach(['target_amount','min_withdraw_amount','cycle_hours','free_spins','invite_recharge_required','spin_per_invite','free_spin_min','free_spin_max','regular_spin_max','turnover_multiplier','max_spin_reward'] as $k){$ws[$k]=(float)postv($k,$ws[$k]??0);} $ws['enabled']=isset($_POST['enabled']); $ws['cash_to_main_wallet']=isset($_POST['cash_to_main_wallet']); $ws['show_first_box_popup']=isset($_POST['show_first_box_popup']); $ws['requireApprovedRecharge']=isset($_POST['requireApprovedRecharge']); $ws['needRechargeAmount']=(float)postv('needRechargeAmount',$ws['needRechargeAmount']??100); $ws['historyLimit']=(int)postv('historyLimit',$ws['historyLimit']??10); v12_save_setting_json($conn,'invited_wheel_settings',$ws); $rw=json_setting('recharge_wheel_config',[]); $rw['requireApprovedRecharge']=$ws['requireApprovedRecharge']; $rw['needRechargeAmount']=$ws['needRechargeAmount']; $rw['historyLimit']=$ws['historyLimit']; save_json_setting('recharge_wheel_config',$rw); $msg='Wheel settings saved'; } elseif($a==='wheel_free_prize_save' || $a==='wheel_prize_save'){ $table=$a==='wheel_free_prize_save'?'invited_wheel_free_prizes':'invited_wheel_prizes'; $id=(int)postv('id');$amount=(float)postv('amount');$prob=(float)postv('probability');$sort=(int)postv('sort');$status=isset($_POST['status'])?1:0; if($id>0)$st=$conn->prepare("UPDATE $table SET amount=?,probability=?,sort=?,status=? WHERE id=?"); else $st=$conn->prepare("INSERT INTO $table(amount,probability,sort,status) VALUES(?,?,?,?)"); if($id>0)$st->bind_param('ddiii',$amount,$prob,$sort,$status,$id); else $st->bind_param('ddii',$amount,$prob,$sort,$status); $st->execute(); $msg='Wheel prize saved'; } elseif($a==='user_status'){ $id=(int)postv('user_id');$status=(int)postv('status');$st=$conn->prepare('UPDATE users SET status=? WHERE id=?');$st->bind_param('ii',$status,$id);$st->execute();$msg='User updated'; } elseif($a==='balance'){ $id=(int)postv('user_id');$amount=(float)postv('amount');$st=$conn->prepare('UPDATE users SET balance=balance+? WHERE id=?');$st->bind_param('di',$amount,$id);$st->execute();$msg='Balance adjusted'; } elseif($a==='agent_update'){ $id=(int)postv('user_id');$is=isset($_POST['is_agent'])?1:0;$salary=(float)postv('agent_salary');$parent=(int)postv('agent_parent_id');$st=$conn->prepare('UPDATE users SET is_agent=?,agent_salary=?,agent_parent_id=NULLIF(?,0) WHERE id=?');$st->bind_param('idii',$is,$salary,$parent,$id);$st->execute();$msg='Agent saved'; } elseif($a==='lottery_setting'){ $id=(int)postv('id');$wr=(float)postv('win_rate');$fm=postv('force_mode','auto');$fr=postv('force_result');$fee=(float)postv('fee_percent');$pn=(float)postv('payout_number');$pc=(float)postv('payout_color');$pv=(float)postv('payout_violet');$pbs=(float)postv('payout_bigsmall');$pk=(float)postv('payout_k3');$p5=(float)postv('payout_5d');$pm=(float)postv('payout_moto');$st=$conn->prepare('UPDATE lottery_game_settings SET win_rate=?,force_mode=?,force_result=?,fee_percent=?,payout_number=?,payout_color=?,payout_violet=?,payout_bigsmall=?,payout_k3=?,payout_5d=?,payout_moto=? WHERE id=?');$st->bind_param('dssddddddddi',$wr,$fm,$fr,$fee,$pn,$pc,$pv,$pbs,$pk,$p5,$pm,$id);$st->execute();$msg='Lottery settings saved'; } elseif($a==='admin_create'){ $username=trim(postv('username'));$pass=postv('password','admin123'); if($username){$hash=password_hash($pass,PASSWORD_BCRYPT);$tenant=(string)(APP_TENANT_ID.rand(1000000000,9999999999));$invite=strtoupper(substr(md5($username.time()),0,6));$nick='Admin'.rand(100,999);$email='';$st=$conn->prepare('INSERT INTO users(tenant_user_id,username,mobile,email,password_hash,nickname,photo,balance,vip_level,invite_code,role,status,created_at) VALUES(?,?,?,?,?,? ,"1",0,1,?,"admin",1,NOW()) ON DUPLICATE KEY UPDATE password_hash=VALUES(password_hash),role="admin",status=1');$st->bind_param('sssssss',$tenant,$username,$username,$email,$hash,$nick,$invite);$st->execute(); $perms=json_encode($_POST['perms']??['dashboard'],JSON_UNESCAPED_SLASHES); $sp=$conn->prepare('INSERT INTO admin_permissions(admin_user,permissions,status,created_at) VALUES(?,?,1,NOW()) ON DUPLICATE KEY UPDATE permissions=VALUES(permissions),status=1,updated_at=NOW()'); if($sp){$sp->bind_param('ss',$username,$perms);$sp->execute();} $msg='Admin created';} } elseif($a==='notification_save'){ $id=(int)postv('id',0); $type=postv('type','notice'); $title=postv('title','Notice'); $content=postv('content',''); $image=postv('image_url',''); $jump=postv('jump_url',''); $status=isset($_POST['status'])?1:0; $st=$conn->prepare('INSERT INTO notifications(id,type,title,content,image_url,jump_url,status,created_at) VALUES(?,?,?,?,?,?,?,NOW()) ON DUPLICATE KEY UPDATE type=VALUES(type),title=VALUES(title),content=VALUES(content),image_url=VALUES(image_url),jump_url=VALUES(jump_url),status=VALUES(status)'); if($st){$st->bind_param('isssssi',$id,$type,$title,$content,$image,$jump,$status);$st->execute();$msg='Notification saved';} } elseif($a==='game_manage_save'){ $code=postv('game_code'); $name=postv('game_name',$code); $state=isset($_POST['state'])?1:0; $maint=isset($_POST['is_maintenance'])?1:0; $sort=(int)postv('sort',0); if($code){$st=$conn->prepare('INSERT INTO games(game_code,game_name,vendor_code,category,state,is_maintenance,sort,updated_at) VALUES(?,?,?,?,?,?,?,NOW()) ON DUPLICATE KEY UPDATE game_name=VALUES(game_name),state=VALUES(state),is_maintenance=VALUES(is_maintenance),sort=VALUES(sort),updated_at=NOW()'); $vendor='ARLottery'; $cat='Lottery'; if($st){$st->bind_param('ssssiii',$code,$name,$vendor,$cat,$state,$maint,$sort);$st->execute();$msg='Game saved';}} } elseif($a==='clear_history'){ $t=postv('target'); $map=['recharge'=>'recharge_orders','withdraw'=>'withdraw_orders','gift'=>'gift_claims','bets'=>'lottery_bets']; if(isset($map[$t])){$conn->query('TRUNCATE TABLE '.$map[$t]); $msg='History cleared: '.$t;} } elseif($a==='admin_perm_save'){ $adminUser=trim(postv('admin_user')); $perms=json_encode($_POST['perms']??[],JSON_UNESCAPED_SLASHES); $status=isset($_POST['status'])?1:0; if($adminUser){$sp=$conn->prepare('INSERT INTO admin_permissions(admin_user,permissions,status,created_at) VALUES(?,?,?,NOW()) ON DUPLICATE KEY UPDATE permissions=VALUES(permissions),status=VALUES(status),updated_at=NOW()'); if($sp){$sp->bind_param('ssi',$adminUser,$perms,$status);$sp->execute();$msg='Admin permissions saved';}} } } catch(Throwable $e){ $msg='Error: '.$e->getMessage(); } } $tab=$_GET['tab']??'dashboard'; $search=trim($_GET['q']??''); $set=site_settings(); $adminName=(string)($_SESSION['admin_user']??'admin'); if(function_exists('admin_can_access_tab') && !admin_can_access_tab($adminName,$tab)){ $tab='dashboard'; $msg='Permission denied for that module'; } $statusFilter=trim($_GET['status']??''); $dateFilter=trim($_GET['date']??''); if($dateFilter==='') $dateFilter='all'; function v22_admin_status_filter(mysqli $conn,string $alias,string $status): string { if($status==='') return ''; return " AND {$alias}.status='".$conn->real_escape_string($status)."'"; } function v22_admin_date_filter(string $alias,string $date): string { if($date==='today') return " AND DATE({$alias}.created_at)=CURDATE()"; if($date==='7days') return " AND {$alias}.created_at>=DATE_SUB(NOW(), INTERVAL 7 DAY)"; if($date==='30days') return " AND {$alias}.created_at>=DATE_SUB(NOW(), INTERVAL 30 DAY)"; return ''; } $menu=[ 'MAIN'=>[['dashboard','Dashboard','dash'],['users','Users / Bank / Same IP','users'],['user_detail','User Full View','users'],['notifications','Notifications','support']], 'PAYMENTS'=>[['deposits','Deposit Orders','wallet'],['withdraw','Withdraw Orders','wallet'],['payment','Payment / UPI','wallet'],['usdt_gateway','USDT Gateway','wallet'],['recharge_history','Recharge History','wallet'],['finance','Finance Report','wallet']], 'GROWTH'=>[['workorders','User Queries','support'],['bonus','Bonus / Gift / Notice','gift'],['tasks','Day/Week Tasks','gift'],['wheel','Invite Wheel','wheel'],['agents','Agents / Salary','users']], 'GAMES'=>[['lottery','Lottery Win/Loss','game'],['results','Result History','game'],['games_manage','Game Manage','game']], 'SYSTEM'=>[['settings','Site Settings','settings'],['owner_license','Owner License','settings'],['admins','Add Admin','settings']] ]; $stats=[ ['Users', qcount($conn,'SELECT COUNT(*) c FROM users'), 'users'], ['Total Balance', money(qsum($conn,'SELECT COALESCE(SUM(balance),0) s FROM users')), 'wallet'], ['Pending Deposit', qcount($conn,"SELECT COUNT(*) c FROM recharge_orders WHERE status IN('Wait','PendingReview')"), 'wallet'], ['Pending Withdraw', qcount($conn,"SELECT COUNT(*) c FROM withdraw_requests WHERE status='pending'"), 'wallet'], ['Open Queries', qcount($conn,"SELECT COUNT(*) c FROM work_orders WHERE status IN('Pending','Processing')"), 'support'] ]; ?><!doctype html><html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>13L Admin</title><style> :root{--bg:#050b18;--panel:#0b1220;--panel2:#111a2e;--line:#21304a;--text:#e5efff;--muted:#8ea3bf;--red:#fb3b2f;--orange:#ff7a18;--green:#22c55e;--blue:#38bdf8;--purple:#a855f7}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at top left,#3b0d18 0,#050b18 34%,#020617 100%);font-family:Inter,system-ui,Arial;color:var(--text)}svg{width:19px;height:19px;fill:currentColor}.app{display:flex;min-height:100vh}.sidebar{width:260px;background:rgba(5,11,24,.88);backdrop-filter:blur(14px);border-right:1px solid var(--line);position:sticky;top:0;height:100vh;overflow:auto;padding:18px}.brand{font-weight:1000;font-size:24px;letter-spacing:.3px}.brand b{color:var(--red)}.admin{color:var(--muted);font-size:12px;margin:8px 0 18px}.group{font-size:11px;text-transform:uppercase;color:#6b7e99;margin:18px 8px 8px}.nav a{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:16px;color:#cbd5e1;text-decoration:none;margin:4px 0;transition:.25s}.nav a:hover{background:#111a2e;transform:translateX(3px)}.nav a.active{background:linear-gradient(135deg,var(--red),var(--orange));color:#fff;box-shadow:0 10px 30px #fb3b2f44}.main{flex:1;padding:22px;min-width:0}.top{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:18px}.title h1{margin:0;font-size:26px}.title p{margin:3px 0;color:var(--muted)}.search{display:flex;gap:8px}.search input,.search button,input,select,textarea{background:#08111f;border:1px solid #2a3a57;color:#fff;border-radius:12px;padding:10px;outline:none}button,.btn{background:linear-gradient(135deg,var(--red),var(--orange));border:0;color:#fff;font-weight:900;border-radius:12px;padding:10px 16px;cursor:pointer;box-shadow:0 8px 24px #fb3b2f33}.ok{background:linear-gradient(135deg,#22c55e,#16a34a)}.bad{background:linear-gradient(135deg,#ef4444,#991b1b)}.card{background:linear-gradient(180deg,rgba(17,26,46,.92),rgba(8,17,31,.92));border:1px solid var(--line);border-radius:24px;padding:18px;box-shadow:0 20px 70px #0006;margin-bottom:18px;animation:up .35s ease both}@keyframes up{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.cards{display:grid;grid-template-columns:repeat(5,minmax(140px,1fr));gap:14px}.stat{display:flex;align-items:center;gap:12px}.stat .ico{width:42px;height:42px;border-radius:14px;display:grid;place-items:center;background:#17213a;color:#60a5fa}.stat .num{font-size:22px;font-weight:1000}.stat .lab{color:var(--muted);font-size:12px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:18px}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.scroll{overflow:auto;max-width:100%}table{width:100%;border-collapse:separate;border-spacing:0 8px;font-size:13px}th{text-align:left;color:#93b4d8;font-size:11px;text-transform:uppercase;padding:0 10px}td{background:#07101e;border-top:1px solid #20324f;border-bottom:1px solid #20324f;padding:10px}td:first-child{border-left:1px solid #20324f;border-radius:12px 0 0 12px}td:last-child{border-right:1px solid #20324f;border-radius:0 12px 12px 0}.pill{display:inline-block;padding:4px 9px;border-radius:999px;background:#17213a;color:#a7c7ff;font-size:12px}.mini{width:90px}.toggle{display:inline-flex;align-items:center;gap:10px;background:#07101e;border:1px solid var(--line);border-radius:15px;padding:10px 12px}.toggle input{display:none}.switch{width:44px;height:24px;border-radius:999px;background:#334155;position:relative;transition:.25s}.switch:after{content:"";position:absolute;left:3px;top:3px;width:18px;height:18px;border-radius:50%;background:white;transition:.25s}.toggle input:checked+.switch{background:linear-gradient(135deg,#22c55e,#16a34a)}.toggle input:checked+.switch:after{left:23px}.msg{padding:12px;border-radius:16px;background:#063b2b;color:#bbf7d0;margin-bottom:12px;border:1px solid #14532d}label{display:grid;gap:5px;color:#cbd5e1;font-size:12px}textarea{min-height:76px}.empty{color:#64748b;text-align:center;padding:35px}.danger{color:#fca5a5}.success{color:#86efac}@media(max-width:900px){.app{display:block}.sidebar{width:auto;height:auto;position:relative}.cards,.grid2,.grid3{grid-template-columns:1fr}.top{display:block}.search{margin-top:12px}.main{padding:14px}} /* V25 responsive pro polish */ .sidebar{width:250px}.nav a span{line-height:1.2}.nav a{min-height:42px}.main{max-width:1600px}.card{overflow:hidden}.grid3 .toggle{justify-content:flex-start}.scroll{border-radius:16px}.scroll table{min-width:760px}.btn.secondary{display:inline-block;text-decoration:none}.section-title h3{margin:0}.switch{flex:none}@media(max-width:760px){.sidebar{padding:12px}.nav{display:grid;grid-template-columns:1fr 1fr;gap:6px}.group{grid-column:1/-1}.nav a{font-size:12px;padding:10px}.cards{grid-template-columns:1fr 1fr}.title h1{font-size:20px}table{font-size:11px}button,.btn,input,select,textarea{font-size:13px}.grid3{grid-template-columns:1fr}.toggle{width:100%}.search{display:grid;grid-template-columns:1fr auto}} /* V26 Admin Professional UI Polish */ body{background:radial-gradient(circle at 15% 0,#14213d 0,#060a14 30%,#060a14 100%) fixed}.sidebar{background:linear-gradient(180deg,#060b16,#0b1220);border-right:1px solid #1e2c46;box-shadow:10px 0 35px #0005}.brand{letter-spacing:.5px}.brand b{background:linear-gradient(135deg,#ff3348,#ff8a1f);-webkit-background-clip:text;color:transparent}.group{margin:16px 12px 6px;color:#6f87aa;font-size:11px;text-transform:uppercase;letter-spacing:.12em}.nav a{border-radius:14px;margin:3px 10px;gap:10px;transition:.2s;position:relative}.nav a svg{width:18px;height:18px;fill:#9fb2d1}.nav a:hover{background:#12213a;transform:translateX(2px)}.nav a.active{background:linear-gradient(135deg,#fb3348,#ff7a18);box-shadow:0 12px 35px #ff4d2244;color:#fff}.nav a.active svg{fill:#fff}.top{position:sticky;top:0;z-index:5;background:linear-gradient(180deg,#060a14f2,#060a14cc);backdrop-filter:blur(10px);padding:14px 0}.card{background:linear-gradient(180deg,#0c1425,#07101d);border:1px solid #1d3351;border-radius:22px;box-shadow:0 24px 60px #0007}.card h3{font-size:18px;letter-spacing:.2px}.cards{gap:14px}.stat{display:flex;align-items:center;gap:12px}.stat .ico{width:46px;height:46px;display:grid;place-items:center;border-radius:16px;background:#0c2340}.stat .ico svg{width:22px;height:22px;fill:#6eb7ff}.lab{color:#90a4c5}.num{font-size:25px;font-weight:900}input,select,textarea{background:#06101f!important;border:1px solid #28405f!important;color:#eef6ff!important;border-radius:12px!important}.toggle{background:#06101f;border:1px solid #243954;border-radius:999px;padding:8px 12px;gap:8px}.switch{width:36px;height:20px;background:#475569;border-radius:999px;position:relative}.switch:before{content:'';position:absolute;width:14px;height:14px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.2s}input:checked+.switch{background:#16a34a}input:checked+.switch:before{left:19px}.toggle input{display:none}.btn,button{background:linear-gradient(135deg,#fb3348,#ff7a18)!important;border:0!important;border-radius:12px!important;color:#fff!important;font-weight:800!important;box-shadow:0 10px 25px #fb4b2240}.btn.secondary{background:#112039!important}.pill{display:inline-flex;align-items:center;gap:4px;border-radius:999px;background:#16233a;color:#bfd4f4;padding:5px 9px;font-size:12px}.ok{background:linear-gradient(135deg,#16a34a,#22c55e)!important}.danger{background:linear-gradient(135deg,#be123c,#ef4444)!important}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.scroll{overflow:auto}.mini{max-width:110px}table{width:100%;border-collapse:separate;border-spacing:0 8px}th{color:#8aa3c8;text-transform:uppercase;font-size:11px;text-align:left}td{background:#081425;border-top:1px solid #1d314f;border-bottom:1px solid #1d314f;padding:9px}tr td:first-child{border-left:1px solid #1d314f;border-radius:12px 0 0 12px}tr td:last-child{border-right:1px solid #1d314f;border-radius:0 12px 12px 0}@media(max-width:980px){.app{display:block}.sidebar{position:relative;width:auto;min-height:0}.nav{display:grid;grid-template-columns:repeat(2,1fr)}.main{padding:12px}.grid2,.grid3,.cards{grid-template-columns:1fr}.search{display:grid;grid-template-columns:1fr auto}.top{position:relative}.nav a{margin:3px}.group{grid-column:1/-1}.scroll table{min-width:900px}} /* V29 Premium Modern Admin UI */ :root{--v29-bg:#07111f;--v29-panel:rgba(15,23,42,.86);--v29-panel2:rgba(30,41,59,.78);--v29-line:rgba(148,163,184,.22);--v29-text:#e5eefb;--v29-muted:#9fb0c7;--v29-red:#ef4444;--v29-orange:#f97316;--v29-blue:#38bdf8;--v29-green:#22c55e;--v29-shadow:0 24px 80px rgba(0,0,0,.45)} body{background:radial-gradient(circle at 10% 0%,rgba(239,68,68,.18),transparent 26%),radial-gradient(circle at 95% 12%,rgba(56,189,248,.16),transparent 28%),linear-gradient(135deg,#020617,#0b1220 55%,#111827)!important;color:var(--v29-text)!important} body:before{content:'';position:fixed;inset:0;pointer-events:none;background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:34px 34px;mask-image:linear-gradient(to bottom,rgba(0,0,0,.75),transparent 82%)} .sidebar,.top,.box{background:linear-gradient(180deg,rgba(15,23,42,.94),rgba(2,6,23,.88))!important;border:1px solid var(--v29-line)!important;box-shadow:var(--v29-shadow)!important;backdrop-filter:blur(16px)} .nav a{border:1px solid transparent!important;border-radius:16px!important;transition:.2s ease!important}.nav a:hover,.nav a.active{background:linear-gradient(135deg,rgba(239,68,68,.20),rgba(56,189,248,.12))!important;border-color:rgba(248,113,113,.34)!important;transform:translateX(3px)} .card{background:linear-gradient(180deg,rgba(15,23,42,.88),rgba(15,23,42,.66))!important;border:1px solid var(--v29-line)!important;border-radius:24px!important;box-shadow:var(--v29-shadow)!important;backdrop-filter:blur(14px);position:relative}.card:before{content:'';position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.38),transparent)} .card h3,.title h1{letter-spacing:.2px}.stat .num,.num{background:linear-gradient(135deg,#fff,#93c5fd);-webkit-background-clip:text;background-clip:text;color:transparent!important} input,select,textarea{background:rgba(2,6,23,.68)!important;border:1px solid rgba(148,163,184,.25)!important;color:#eef6ff!important;border-radius:14px!important;outline:none!important}input:focus,select:focus,textarea:focus{border-color:#38bdf8!important;box-shadow:0 0 0 3px rgba(56,189,248,.16)!important} button,.btn{background:linear-gradient(135deg,var(--v29-red),var(--v29-orange))!important;color:#fff!important;border:0!important;border-radius:14px!important;font-weight:900!important;box-shadow:0 12px 35px rgba(239,68,68,.28)!important;transition:.18s ease!important}button:hover,.btn:hover{transform:translateY(-1px);filter:saturate(1.12)}button.bad,.bad{background:linear-gradient(135deg,#dc2626,#7f1d1d)!important}.btn.secondary,.secondary{background:linear-gradient(135deg,#0f2747,#14365f)!important} table{border-collapse:separate!important;border-spacing:0 8px!important}th{color:#9fb7d8!important;text-transform:uppercase;font-size:11px;letter-spacing:.08em}td{background:rgba(15,23,42,.52)!important;border-top:1px solid rgba(148,163,184,.12)!important;border-bottom:1px solid rgba(148,163,184,.12)!important}tr td:first-child{border-left:1px solid rgba(148,163,184,.12);border-radius:14px 0 0 14px}tr td:last-child{border-right:1px solid rgba(148,163,184,.12);border-radius:0 14px 14px 0}.pill{border:1px solid rgba(255,255,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)} .help,.muted{color:var(--v29-muted)!important}.scroll{background:rgba(2,6,23,.25);border:1px solid rgba(148,163,184,.12);border-radius:18px;padding:6px}.toggle{background:rgba(15,23,42,.45);border:1px solid rgba(148,163,184,.16);border-radius:16px;padding:8px 10px}.switch{box-shadow:inset 0 0 0 1px rgba(255,255,255,.16)} </style></head><body><div class="app"><aside class="sidebar"><div class="brand"><b>13L</b> Admin</div><div class="admin">Logged in: <?=h($_SESSION['admin_user']??'admin')?></div><nav class="nav"><?php foreach($menu as $g=>$items):?><div class="group"><?=h($g)?></div><?php foreach($items as $it):?><a class="<?=$tab===$it[0]?'active':''?>" href="?tab=<?=h($it[0])?>"><?=svg($it[2])?><span><?=h($it[1])?></span></a><?php endforeach; endforeach;?><div class="group">Account</div><a href="?action=logout"><?=svg('logout')?><span>Logout</span></a></nav></aside><main class="main"><div class="top"><div class="title"><h1>Premium Control Panel</h1><p>Deposit, withdraw, UPI, bonus, agent, queries and lottery management</p></div><form class="search"><input type="hidden" name="tab" value="<?=h($tab)?>"><input name="q" value="<?=h($search)?>" placeholder="Search user/order"><button>Search</button></form></div><?php if($msg):?><div class="msg"><?=h($msg)?></div><?php endif;?> <?php if($tab==='dashboard'):?><div class="cards"><?php foreach($stats as $s):?><div class="card stat"><div class="ico"><?=svg($s[2])?></div><div><div class="lab"><?=h($s[0])?></div><div class="num"><?=h($s[1])?></div></div></div><?php endforeach;?></div><div class="grid2"><div class="card"><h3>Recent Deposits</h3><?php $rs=$conn->query('SELECT r.*,u.username FROM recharge_orders r LEFT JOIN users u ON u.id=r.user_id ORDER BY r.id DESC LIMIT 10');?><table><tr><th>Order</th><th>User</th><th>Amount</th><th>UTR</th><th>Status</th></tr><?php while($r=$rs->fetch_assoc()):?><tr><td><?=h($r['order_no'])?></td><td><?=h($r['username'])?></td><td><?=money($r['amount'])?></td><td><?=h($r['utr']??'')?></td><td><span class="pill"><?=h($r['status'])?></span></td></tr><?php endwhile;?></table></div><div class="card"><h3>Recent Queries</h3><?php $rs=$conn->query('SELECT w.*,u.username FROM work_orders w LEFT JOIN users u ON u.id=w.user_id ORDER BY w.id DESC LIMIT 10');?><table><tr><th>Ticket</th><th>User</th><th>Title</th><th>Status</th></tr><?php while($r=$rs->fetch_assoc()):?><tr><td><?=h($r['ticket_no'])?></td><td><?=h($r['username'])?></td><td><?=h($r['title'])?></td><td><span class="pill"><?=h($r['status'])?></span></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='users'):?><div class="card"><h3>Users / Ban / Same IP</h3><?php $where=$search?"WHERE username LIKE '%".$conn->real_escape_string($search)."%' OR mobile LIKE '%".$conn->real_escape_string($search)."%' OR id='".(int)$search."'":'';$rs=$conn->query("SELECT * FROM users $where ORDER BY id DESC LIMIT 200");?><div class="scroll"><table><tr><th>ID</th><th>User</th><th>Balance</th><th>Deposit</th><th>Bet</th><th>IP flag</th><th>Status</th><th>Balance +/-</th><th>Save</th></tr><?php while($u=$rs->fetch_assoc()):?><tr><td>#<?=h($u['id'])?></td><td><?=h($u['username'])?><br><span class="pill"><?=h($u['invite_code'])?></span></td><td><?=money($u['balance'])?></td><td><?=money($u['total_deposit']??0)?></td><td><?=money($u['total_bet']??0)?></td><td><?=h($u['same_ip_flag']??0)?></td><td><form method="post" class="row"><input type="hidden" name="action" value="user_status"><input type="hidden" name="user_id" value="<?=h($u['id'])?>"><select name="status"><option value="1" <?=$u['status']?'selected':''?>>Active</option><option value="0" <?=!$u['status']?'selected':''?>>Ban</option></select><button>Save</button></form></td><td><form method="post" class="row"><input type="hidden" name="action" value="balance"><input type="hidden" name="user_id" value="<?=h($u['id'])?>"><input class="mini" name="amount" placeholder="+/-"><button>Apply</button></form></td><td><a class="btn" href="?tab=users&q=<?=h($u['id'])?>">View</a></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='deposits'||$tab==='recharge_history'): $where="WHERE 1=1"; if($search){$q=$conn->real_escape_string($search);$where.=" AND (r.order_no LIKE '%$q%' OR u.username LIKE '%$q%' OR u.mobile LIKE '%$q%')";} if($statusFilter!==''){$where.=v22_admin_status_filter($conn,'r',$statusFilter);} $where.=v22_admin_date_filter('r',$dateFilter); $todayRecharge=qsum($conn,"SELECT COALESCE(SUM(amount+gift_amount),0) s FROM recharge_orders WHERE status='Payed' AND DATE(created_at)=CURDATE()"); $pendingRecharge=qcount($conn,"SELECT COUNT(*) c FROM recharge_orders WHERE status IN('Wait','PendingReview')"); $paidRecharge=qsum($conn,"SELECT COALESCE(SUM(amount+gift_amount),0) s FROM recharge_orders WHERE status='Payed'"); $rs=$conn->query("SELECT r.*,u.username,u.mobile FROM recharge_orders r LEFT JOIN users u ON u.id=r.user_id $where ORDER BY r.id DESC LIMIT 300"); ?><div class="cards"><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Today Recharge</div><div class="num"><?=money($todayRecharge)?></div></div></div><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Pending Review</div><div class="num"><?=h($pendingRecharge)?></div></div></div><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Total Paid</div><div class="num"><?=money($paidRecharge)?></div></div></div></div> <div class="card"><h3><?= $tab==='deposits'?'Deposit Orders / UTR Review':'Recharge History / Filters' ?></h3><form class="row" method="get"><input type="hidden" name="tab" value="<?=h($tab)?>"><input name="q" value="<?=h($search)?>" placeholder="order/user/mobile"><select name="status"><option value="">All status</option><?php foreach(['Wait','PendingReview','Payed','Cancel'] as $st):?><option value="<?=h($st)?>" <?=$statusFilter===$st?'selected':''?>><?=h($st)?></option><?php endforeach;?></select><select name="date"><option value="all" <?=$dateFilter==='all'?'selected':''?>>All time</option><option value="today" <?=$dateFilter==='today'?'selected':''?>>Today</option><option value="7days" <?=$dateFilter==='7days'?'selected':''?>>7 days</option><option value="30days" <?=$dateFilter==='30days'?'selected':''?>>30 days</option></select><button>Apply Filter</button></form><div class="scroll"><table><tr><th>Order</th><th>User</th><th>Amount</th><th>Gift</th><th>Method</th><th>UTR / Time</th><th>Status</th><th>Created</th><th>Action</th></tr><?php while($r=$rs->fetch_assoc()):?><tr><td><?=h($r['order_no'])?></td><td><?=h($r['username'])?> #<?=h($r['user_id'])?><br><small><?=h($r['mobile'])?></small></td><td><?=money($r['amount'])?></td><td><?=money($r['gift_amount'])?></td><td><?=h($r['channel_name'] ?: $r['recharge_type'])?></td><td><b><?=h($r['utr']??'')?></b><br><small><?=h($r['utr_submit_at']??'')?></small></td><td><span class="pill"><?=h($r['status'])?></span></td><td><?=h($r['created_at'])?></td><td><form method="post" class="row"><input type="hidden" name="action" value="recharge_update"><input type="hidden" name="id" value="<?=h($r['id'])?>"><select name="status"><option>PendingReview</option><option>Payed</option><option>Cancel</option></select><input name="note" placeholder="approve/reject note"><button>Update</button></form></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='withdraw'): $where="WHERE 1=1"; if($search){$q=$conn->real_escape_string($search);$where.=" AND (u.username LIKE '%$q%' OR w.id='".(int)$search."')";} if($statusFilter!==''){$where.=v22_admin_status_filter($conn,'w',$statusFilter);} $where.=v22_admin_date_filter('w',$dateFilter); $todayWithdraw=qsum($conn,"SELECT COALESCE(SUM(amount),0) s FROM withdraw_requests WHERE status='approved' AND DATE(created_at)=CURDATE()"); $pendingWithdraw=qcount($conn,"SELECT COUNT(*) c FROM withdraw_requests WHERE status='pending'"); $rs=$conn->query("SELECT w.*,u.username FROM withdraw_requests w LEFT JOIN users u ON u.id=w.user_id $where ORDER BY w.id DESC LIMIT 300"); ?><div class="cards"><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Today Withdraw</div><div class="num"><?=money($todayWithdraw)?></div></div></div><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Pending Withdraw</div><div class="num"><?=h($pendingWithdraw)?></div></div></div></div><div class="card"><h3>Withdraw Orders / Filters</h3><form class="row" method="get"><input type="hidden" name="tab" value="withdraw"><input name="q" value="<?=h($search)?>" placeholder="user/order"><select name="status"><option value="">All status</option><?php foreach(['pending','approved','rejected'] as $st):?><option value="<?=h($st)?>" <?=$statusFilter===$st?'selected':''?>><?=h($st)?></option><?php endforeach;?></select><select name="date"><option value="all" <?=$dateFilter==='all'?'selected':''?>>All</option><option value="today" <?=$dateFilter==='today'?'selected':''?>>Today</option><option value="7days" <?=$dateFilter==='7days'?'selected':''?>>7 days</option><option value="30days" <?=$dateFilter==='30days'?'selected':''?>>30 days</option></select><button>Filter</button></form><div class="scroll"><table><tr><th>ID</th><th>User</th><th>Amount</th><th>Wallet</th><th>Status</th><th>Time</th><th>Action</th></tr><?php while($w=$rs->fetch_assoc()):?><tr><td>#<?=h($w['id'])?></td><td><?=h($w['username'])?> #<?=h($w['user_id'])?></td><td><?=money($w['amount'])?></td><td><small><?=h($w['wallet_info']??$w['wallet_snapshot']??$w['bank_info']??'')?></small></td><td><span class="pill"><?=h($w['status'])?></span></td><td><?=h($w['created_at'])?></td><td><form method="post" class="row"><input type="hidden" name="action" value="withdraw_update"><input type="hidden" name="id" value="<?=h($w['id'])?>"><select name="status"><option value="approved">Approve</option><option value="rejected">Reject</option></select><input name="note" placeholder="reason/note"><button>Update</button></form></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='payment'):?><div class="card"><h3>Multiple UPI / Payment Methods</h3><?php $rs=$conn->query('SELECT * FROM payment_methods ORDER BY sort DESC,id ASC');?><div class="scroll"><table><tr><th>ID</th><th>Name</th><th>Type</th><th>UPI</th><th>QR path</th><th>Min/Max</th><th>Gift%</th><th>On</th><th>Save</th></tr><?php while($m=$rs->fetch_assoc()):?><tr><form method="post"><td><input class="mini" name="id" value="<?=h($m['id'])?>"></td><td><input name="name" value="<?=h($m['name'])?>"><input name="sort" class="mini" value="<?=h($m['sort'])?>"></td><td><input name="recharge_type" value="<?=h($m['recharge_type'])?>"><input name="rate" class="mini" value="<?=h($m['rate'])?>"></td><td><input name="upi_id" value="<?=h($m['upi_id'])?>"><input name="upi_name" value="<?=h($m['upi_name'])?>"></td><td><input name="qr_image" value="<?=h($m['qr_image'])?>"><input name="icon_url" value="<?=h($m['icon_url'])?>"><input name="selected_icon_url" value="<?=h($m['selected_icon_url'])?>"></td><td><input class="mini" name="min_amount" value="<?=h($m['min_amount'])?>"><input class="mini" name="max_amount" value="<?=h($m['max_amount'])?>"></td><td><input class="mini" name="gift_ratio" value="<?=h($m['gift_ratio'])?>"><textarea name="note"><?=h($m['note'])?></textarea></td><td><label class="toggle"><input type="checkbox" name="state" <?=$m['state']?'checked':''?>><span class="switch"></span></label></td><td><input type="hidden" name="action" value="payment_method_save"><button>Save</button></td></form></tr><?php endwhile;?><tr><form method="post"><td>New<input type="hidden" name="id" value="0"></td><td><input name="name" value="UPI New"><input name="sort" class="mini" value="1"></td><td><input name="recharge_type" value="UPI"><input name="rate" class="mini" value="1"></td><td><input name="upi_id" placeholder="yourupi@bank"><input name="upi_name" value="13L GAME"></td><td><input name="qr_image" placeholder="/img/qr.webp"><input name="icon_url" placeholder="/img/icon.webp"><input name="selected_icon_url" placeholder="/img/icon-active.webp"></td><td><input class="mini" name="min_amount" value="100"><input class="mini" name="max_amount" value="50000"></td><td><input class="mini" name="gift_ratio" value="2"><textarea name="note">Pay exact amount and submit UTR.</textarea></td><td><label class="toggle"><input type="checkbox" name="state" checked><span class="switch"></span></label></td><td><input type="hidden" name="action" value="payment_method_save"><button class="ok">Add</button></td></form></tr></table></div></div><?php endif;?> <?php if($tab==='finance'): $from=$_GET['from']??date('Y-m-d'); $to=$_GET['to']??date('Y-m-d'); $fromSql=$conn->real_escape_string($from.' 00:00:00'); $toSql=$conn->real_escape_string($to.' 23:59:59'); $recharge=qsum($conn,"SELECT COALESCE(SUM(amount+gift_amount),0) s FROM recharge_orders WHERE status='Payed' AND created_at BETWEEN '$fromSql' AND '$toSql'"); $withdraw=qsum($conn,"SELECT COALESCE(SUM(amount),0) s FROM withdraw_requests WHERE status='approved' AND created_at BETWEEN '$fromSql' AND '$toSql'"); $bets=qsum($conn,"SELECT COALESCE(SUM(real_amount),0) s FROM lottery_bets WHERE created_at BETWEEN '$fromSql' AND '$toSql'"); $wins=qsum($conn,"SELECT COALESCE(SUM(win_lose_amount),0) s FROM lottery_bets WHERE state=1 AND created_at BETWEEN '$fromSql' AND '$toSql'"); ?> <div class="card"><h3>Finance Report</h3><form class="row" method="get"><input type="hidden" name="tab" value="finance"><input type="date" name="from" value="<?=h($from)?>"><input type="date" name="to" value="<?=h($to)?>"><button>Filter</button></form></div><div class="cards"><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Recharge</div><div class="num"><?=money($recharge)?></div></div></div><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Withdraw</div><div class="num"><?=money($withdraw)?></div></div></div><div class="card stat"><div class="ico"><?=svg('game')?></div><div><div class="lab">Bet Turnover</div><div class="num"><?=money($bets)?></div></div></div><div class="card stat"><div class="ico"><?=svg('game')?></div><div><div class="lab">Win Payout</div><div class="num"><?=money($wins)?></div></div></div></div> <?php endif;?> <?php if($tab==='workorders'):?><div class="card"><h3>User Query / Self Service Center</h3><?php $rs=$conn->query('SELECT w.*,u.username FROM work_orders w LEFT JOIN users u ON u.id=w.user_id ORDER BY w.id DESC LIMIT 200');?><div class="scroll"><table><tr><th>Ticket</th><th>User</th><th>Type</th><th>Content</th><th>Status</th><th>Reply</th></tr><?php while($w=$rs->fetch_assoc()):?><tr><td><?=h($w['ticket_no'])?></td><td><?=h($w['username'])?> #<?=h($w['user_id'])?></td><td><?=h($w['title'])?></td><td><small><?=h($w['content'])?></small></td><td><span class="pill"><?=h($w['status'])?></span></td><td><form method="post"><input type="hidden" name="action" value="work_order_update"><input type="hidden" name="id" value="<?=h($w['id'])?>"><select name="status"><option>Answered</option><option>Processing</option><option>Closed</option><option>Rejected</option></select><textarea name="admin_reply" placeholder="Admin reply"><?=h($w['admin_reply'])?></textarea><button>Send Reply</button></form></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='bonus'):?><div class="grid2"><div class="card"><h3>Gift Code Making</h3><form method="post" class="grid2"><input type="hidden" name="action" value="gift_save"><input type="hidden" name="id" value="0"><label>Code<input name="code" placeholder="AUTO or custom"></label><label>Title<input name="title" value="GET YOUR BONUS"></label><label>Amount<input name="amount" value="10"></label><label>Max users<input name="max_claim" value="100"></label><label>Per user<input name="per_user_limit" value="1"></label><label>Min recharge<input name="min_recharge" value="0"></label><label>Expire<input name="expires_at" type="datetime-local"></label><label class="toggle"><input type="checkbox" name="status" checked><span class="switch"></span> On</label><label>Note<input name="admin_note"></label><button>Create Gift Code</button></form></div><div class="card"><h3>Notice / Popup</h3><form method="post"><input type="hidden" name="action" value="feature_save"><?php foreach(['captcha_enabled','popup_enabled','maintenance_enabled','home_enabled','gift_enabled','bonus_enabled','vip_enabled','agent_enabled','workorder_enabled','recharge_enabled','withdraw_enabled','invite_enabled'] as $k):?><label class="toggle"><input type="checkbox" name="<?=h($k)?>" <?=!empty($set[$k])?'checked':''?>><span class="switch"></span><?=h(str_replace('_',' ',$k))?></label><?php endforeach;?><label>Common notice<textarea name="common_notice"><?=h($set['common_notice']??'')?></textarea></label><label>Telegram/support<input name="service_telegram" value="<?=h($set['service_telegram']??'')?>"></label><input type="hidden" name="min_withdraw" value="<?=h($set['min_withdraw']??110)?>"><input type="hidden" name="turnover_required" value="<?=h($set['turnover_required']??0)?>"><button>Save Switches</button></form></div></div><div class="card"><h3>Gift Codes & Claim History</h3><?php $rs=$conn->query('SELECT * FROM gift_codes ORDER BY id DESC LIMIT 100');?><div class="scroll"><table><tr><th>Code</th><th>Amount</th><th>Claim</th><th>Expire</th><th>Status</th></tr><?php while($g=$rs->fetch_assoc()):?><tr><td><?=h($g['code'])?><br><?=h($g['title']??'')?></td><td><?=money($g['amount'])?></td><td><?=h($g['claimed_count'])?> / <?=h($g['max_claim'])?></td><td><?=h($g['expires_at'])?></td><td><span class="pill"><?=h($g['status']?'On':'Off')?></span></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='tasks'):?><div class="card"><h3>Day/Week Task Manage</h3><?php $rs=$conn->query('SELECT * FROM day_week_tasks ORDER BY period_type ASC,sort DESC');?><table><tr><th>Code</th><th>Title</th><th>Period</th><th>Target</th><th>Value</th><th>Reward</th><th>On</th><th>Save</th></tr><?php while($t=$rs->fetch_assoc()):?><tr><form method="post"><td><input name="task_code" value="<?=h($t['task_code'])?>"><input type="hidden" name="id" value="<?=h($t['id'])?>"></td><td><input name="title" value="<?=h($t['title'])?>"></td><td><select name="period_type"><option <?=$t['period_type']==='day'?'selected':''?>>day</option><option <?=$t['period_type']==='week'?'selected':''?>>week</option></select></td><td><select name="target_type"><option <?=$t['target_type']==='bet'?'selected':''?>>bet</option><option <?=$t['target_type']==='recharge'?'selected':''?>>recharge</option><option <?=$t['target_type']==='invite'?'selected':''?>>invite</option></select></td><td><input class="mini" name="target_value" value="<?=h($t['target_value'])?>"><input class="mini" name="sort" value="<?=h($t['sort'])?>"></td><td><input class="mini" name="reward_amount" value="<?=h($t['reward_amount'])?>"></td><td><label class="toggle"><input type="checkbox" name="status" <?=$t['status']?'checked':''?>><span class="switch"></span></label></td><td><input type="hidden" name="action" value="task_save"><button>Save</button></td></form></tr><?php endwhile;?><tr><form method="post"><td><input name="task_code" value="daily_new"></td><td><input name="title" value="New task"></td><td><select name="period_type"><option>day</option><option>week</option></select></td><td><select name="target_type"><option>bet</option><option>recharge</option><option>invite</option></select></td><td><input class="mini" name="target_value" value="100"><input class="mini" name="sort" value="1"></td><td><input class="mini" name="reward_amount" value="1"></td><td><label class="toggle"><input type="checkbox" name="status" checked><span class="switch"></span></label></td><td><input type="hidden" name="action" value="task_save"><input type="hidden" name="id" value="0"><button class="ok">Add</button></td></form></tr></table></div><?php endif;?> <?php if($tab==='wheel'): $ws=invited_wheel_settings();?><div class="grid2"><div class="card"><h3>Invite Wheel Settings</h3><form method="post" class="grid3"><input type="hidden" name="action" value="wheel_settings_save"><label class="toggle"><input type="checkbox" name="enabled" <?=$ws['enabled']?'checked':''?>><span class="switch"></span> Enabled</label><label>Target amount<input name="target_amount" value="<?=h($ws['target_amount'])?>"></label><label>Min withdraw<input name="min_withdraw_amount" value="<?=h($ws['min_withdraw_amount'])?>"></label><label>Expiry hours<input name="cycle_hours" value="<?=h($ws['cycle_hours'])?>"></label><label>Free spins<input name="free_spins" value="<?=h($ws['free_spins'])?>"></label><label>Invite recharge<input name="invite_recharge_required" value="<?=h($ws['invite_recharge_required'])?>"></label><label>Spin / invite<input name="spin_per_invite" value="<?=h($ws['spin_per_invite'])?>"></label><label>Free min<input name="free_spin_min" value="<?=h($ws['free_spin_min']??0.10)?>"></label><label>Free max<input name="free_spin_max" value="<?=h($ws['free_spin_max']??3.00)?>"></label><label>Regular max<input name="regular_spin_max" value="<?=h($ws['regular_spin_max']??9.00)?>"></label><label>Turnover x<input name="turnover_multiplier" value="<?=h($ws['turnover_multiplier']??0)?>"></label><label>Max spin reward<input name="max_spin_reward" value="<?=h($ws['max_spin_reward']??3.00)?>"></label><label>Wheel need recharge<input name="needRechargeAmount" value="<?=h($ws['needRechargeAmount']??100)?>"></label><label>History limit<input name="historyLimit" value="<?=h($ws['historyLimit']??10)?>"></label><label class="toggle"><input type="checkbox" name="requireApprovedRecharge" <?=!empty($ws['requireApprovedRecharge'])?'checked':''?>><span class="switch"></span>Need approved recharge</label><label class="toggle"><input type="checkbox" name="cash_to_main_wallet" <?=!empty($ws['cash_to_main_wallet'])?'checked':''?>><span class="switch"></span> Cash wallet</label><label class="toggle"><input type="checkbox" name="show_first_box_popup" <?=!empty($ws['show_first_box_popup'])?'checked':''?>><span class="switch"></span> First box</label><button>Save</button></form></div><div class="card"><h3>Free Spin Prize 0.10 - 3.00</h3><?php $rs=$conn->query('SELECT * FROM invited_wheel_free_prizes ORDER BY sort DESC,id ASC');?><table><tr><th>Amount</th><th>Probability</th><th>Sort</th><th>On</th><th>Save</th></tr><?php while($p=$rs->fetch_assoc()):?><tr><form method="post"><td><input class="mini" name="amount" value="<?=h($p['amount'])?>"></td><td><input class="mini" name="probability" value="<?=h($p['probability'])?>"></td><td><input class="mini" name="sort" value="<?=h($p['sort'])?>"></td><td><label class="toggle"><input type="checkbox" name="status" <?=$p['status']?'checked':''?>><span class="switch"></span></label></td><td><input type="hidden" name="id" value="<?=h($p['id'])?>"><input type="hidden" name="action" value="wheel_free_prize_save"><button>Save</button></td></form></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='agents'):?><div class="card"><h3>Agents / Salary</h3><?php $rs=$conn->query('SELECT * FROM users ORDER BY is_agent DESC,id DESC LIMIT 200');?><table><tr><th>User</th><th>Agent</th><th>Parent ID</th><th>Salary</th><th>Team</th><th>Save</th></tr><?php while($u=$rs->fetch_assoc()):$id=(int)$u['id'];$team=qcount($conn,'SELECT COUNT(*) c FROM users WHERE agent_parent_id='.$id);?><tr><form method="post"><td>#<?=h($id)?> <?=h($u['username'])?></td><td><label class="toggle"><input type="checkbox" name="is_agent" <?=$u['is_agent']?'checked':''?>><span class="switch"></span></label></td><td><input class="mini" name="agent_parent_id" value="<?=h($u['agent_parent_id'])?>"></td><td><input class="mini" name="agent_salary" value="<?=h($u['agent_salary'])?>"></td><td><?=h($team)?></td><td><input type="hidden" name="action" value="agent_update"><input type="hidden" name="user_id" value="<?=h($id)?>"><button>Save</button></td></form></tr><?php endwhile;?></table></div><?php endif;?> <?php if($tab==='lottery'):?><div class="card"><h3>Lottery Win/Loss & Payout</h3><?php $rs=$conn->query('SELECT * FROM lottery_game_settings ORDER BY id ASC');?><div class="scroll"><table><tr><th>Game</th><th>Win%</th><th>Force</th><th>Result</th><th>Fee</th><th>Num</th><th>Color</th><th>Violet</th><th>BigSmall</th><th>K3</th><th>5D</th><th>Moto</th><th>Save</th></tr><?php while($l=$rs->fetch_assoc()):?><tr><form method="post"><td><?=h($l['game_code'])?><input type="hidden" name="id" value="<?=h($l['id'])?>"></td><td><input class="mini" name="win_rate" value="<?=h($l['win_rate'])?>"></td><td><select name="force_mode"><option value="auto" <?=$l['force_mode']==='auto'?'selected':''?>>auto</option><option value="win" <?=$l['force_mode']==='win'?'selected':''?>>win</option><option value="lose" <?=$l['force_mode']==='lose'?'selected':''?>>lose</option></select></td><td><input class="mini" name="force_result" value="<?=h($l['force_result'])?>"></td><td><input class="mini" name="fee_percent" value="<?=h($l['fee_percent'])?>"></td><td><input class="mini" name="payout_number" value="<?=h($l['payout_number'])?>"></td><td><input class="mini" name="payout_color" value="<?=h($l['payout_color'])?>"></td><td><input class="mini" name="payout_violet" value="<?=h($l['payout_violet'])?>"></td><td><input class="mini" name="payout_bigsmall" value="<?=h($l['payout_bigsmall'])?>"></td><td><input class="mini" name="payout_k3" value="<?=h($l['payout_k3'])?>"></td><td><input class="mini" name="payout_5d" value="<?=h($l['payout_5d'])?>"></td><td><input class="mini" name="payout_moto" value="<?=h($l['payout_moto'])?>"></td><td><input type="hidden" name="action" value="lottery_setting"><button>Save</button></td></form></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='results'): $game=$_GET['game']??'WinGo_30S'; $limit=max(10,min(100,(int)($_GET['limit']??10))); ?> <div class="card"><h3>Period Result History</h3><p style="color:#8ea3bf">Minimum 10 result history yaha show hoti hai. Ye same history API/game page me use hoti hai.</p><form method="get" class="row"><input type="hidden" name="tab" value="results"><select name="game"><?php foreach(['WinGo_30S','WinGo_1M','WinGo_3M','WinGo_5M','K3_1M','D5_1M','MotoRace_1M','TrxWinGo_1M'] as $gc):?><option value="<?=h($gc)?>" <?=$game===$gc?'selected':''?>><?=h(game_name_from_code($gc))?></option><?php endforeach;?></select><input name="limit" value="<?=h($limit)?>" class="mini"><button>Load</button></form><div class="scroll"><table><tr><th>#</th><th>Period</th><th>Number</th><th>Big/Small</th><th>Color</th><th>Premium</th><th>Open Time</th></tr><?php for($i=1;$i<=$limit;$i++): $issue=le_issue_by_offset($game,$i); $rr=le_result_for_issue($game,$issue,true); ?><tr><td><?=h($i)?></td><td><?=h($issue)?></td><td><b style="font-size:20px;color:#ff5f69"><?=h($rr['number'])?></b></td><td><?=h($rr['bigSmall'])?></td><td><?=h(is_array($rr['color'])?implode(',',$rr['color']):$rr['color'])?></td><td><?=h($rr['premium'])?></td><td><?=h(date('Y-m-d H:i:s', time()-$i*le_game_interval($game)))?></td></tr><?php endfor;?></table></div></div> <?php endif;?> <?php if($tab==='user_detail'): $uid=(int)($_GET['uid']??$_GET['q']??0); $urow=null; if($uid>0){$rs=$conn->query('SELECT * FROM users WHERE id='.$uid.' LIMIT 1'); $urow=$rs?$rs->fetch_assoc():null;} ?> <div class="card"><h3>User Full Information</h3><form class="row" method="get"><input type="hidden" name="tab" value="user_detail"><input name="uid" placeholder="UID / mobile" value="<?=h($uid?:'')?>"><button>Load User</button></form><?php if($urow): $refs=$conn->query('SELECT id,username,mobile,total_deposit,total_bet,created_at FROM users WHERE agent_parent_id='.(int)$urow['id'].' OR referred_by='.(int)$urow['id'].' ORDER BY id DESC LIMIT 50'); ?><div class="grid2"><div><table><tr><th>Field</th><th>Value</th></tr><?php foreach(['id','tenant_user_id','username','mobile','email','invite_code','balance','total_deposit','total_bet','vip_level','login_ip','last_login_at','status','role','created_at'] as $k):?><tr><td><?=h($k)?></td><td><?=h($urow[$k]??'')?></td></tr><?php endforeach;?></table></div><div><h3>Password / Bank / Balance</h3><p class="help">Password hash secure format me hai; reset/admin balance users tab se karo.</p><table><tr><th>Wallet</th><th>Account</th><th>Name</th><th>IFSC</th></tr><?php $wr=$conn->query('SELECT * FROM withdraw_wallets WHERE user_id='.(int)$urow['id'].' ORDER BY id DESC'); while($w=$wr->fetch_assoc()):?><tr><td><?=h($w['wallet_type'])?></td><td><?=h($w['account_no'])?></td><td><?=h($w['holder_name'])?></td><td><?=h($w['ifsc'])?></td></tr><?php endwhile;?></table></div></div><div class="card"><h3>Refers / Team</h3><table><tr><th>ID</th><th>User</th><th>Mobile</th><th>Deposit</th><th>Bet</th><th>Join</th></tr><?php if($refs) while($r=$refs->fetch_assoc()):?><tr><td>#<?=h($r['id'])?></td><td><?=h($r['username'])?></td><td><?=h($r['mobile'])?></td><td><?=money($r['total_deposit']??0)?></td><td><?=money($r['total_bet']??0)?></td><td><?=h($r['created_at'])?></td></tr><?php endwhile;?></table></div><?php endif;?></div> <?php endif;?> <?php if($tab==='notifications'):?><div class="grid2"><div class="card"><h3>Send User Notification / Banner / Popup</h3><form method="post" class="grid3"><input type="hidden" name="action" value="notification_save"><label>Type<select name="type"><option>notice</option><option>banner</option><option>popup</option></select></label><label>Title<input name="title" value="New notice"></label><label>Jump URL<input name="jump_url" placeholder="/activity"></label><label>Image path<input name="image_url" placeholder="/img/..."></label><label class="toggle"><input type="checkbox" name="status" checked><span class="switch"></span>Active</label><label>Content<textarea name="content">Welcome to 13L GAME</textarea></label><button>Save Notification</button></form></div><div class="card"><h3>Latest Notifications</h3><?php $rs=$conn->query('SELECT * FROM notifications ORDER BY id DESC LIMIT 50');?><table><tr><th>ID</th><th>Type</th><th>Title</th><th>Status</th></tr><?php while($n=$rs->fetch_assoc()):?><tr><td><?=h($n['id'])?></td><td><?=h($n['type'])?></td><td><?=h($n['title'])?></td><td><span class="pill"><?=h($n['status']?'ON':'OFF')?></span></td></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='games_manage'):?><div class="card"><h3>All Games Manage / Real-time Toggle</h3><p class="help">Yaha OFF karne par game home list se hide hoga aur API guard block karega.</p><?php $defaults=['WinGo_30S','WinGo_1M','WinGo_3M','WinGo_5M','K3_1M','K3_3M','K3_5M','D5_1M','D5_3M','D5_5M','MotoRace_1M','TrxWinGo_1M']; foreach($defaults as $gc){$conn->query("INSERT IGNORE INTO games(game_code,game_name,vendor_code,category,state,is_maintenance,sort) VALUES('".$conn->real_escape_string($gc)."','".$conn->real_escape_string(game_name_from_code($gc))."','ARLottery','Lottery',1,0,10)");} $rs=$conn->query('SELECT * FROM games ORDER BY category,sort DESC,game_code ASC');?><div class="scroll"><table><tr><th>Game</th><th>Name</th><th>On</th><th>Maintenance</th><th>Sort</th><th>Action</th></tr><?php while($g=$rs->fetch_assoc()):?><tr><form method="post"><td><?=h($g['game_code'])?><input type="hidden" name="game_code" value="<?=h($g['game_code'])?>"></td><td><input name="game_name" value="<?=h($g['game_name'])?>"></td><td><label class="toggle"><input type="checkbox" name="state" <?=$g['state']?'checked':''?>><span class="switch"></span>On</label></td><td><label class="toggle"><input type="checkbox" name="is_maintenance" <?=$g['is_maintenance']?'checked':''?>><span class="switch"></span>Maint</label></td><td><input class="mini" name="sort" value="<?=h($g['sort'])?>"></td><td><input type="hidden" name="action" value="game_manage_save"><button>Save</button></td></form></tr><?php endwhile;?></table></div></div><?php endif;?> <?php if($tab==='finance'):?><div class="cards"><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Today Recharge</div><div class="num"><?=money(qsum($conn,"SELECT COALESCE(SUM(amount+gift_amount),0) s FROM recharge_orders WHERE status='Payed' AND DATE(created_at)=CURDATE()"))?></div></div></div><div class="card stat"><div class="ico"><?=svg('wallet')?></div><div><div class="lab">Today Withdraw</div><div class="num"><?=money(qsum($conn,"SELECT COALESCE(SUM(amount),0) s FROM withdraw_orders WHERE status='Payed' AND DATE(created_at)=CURDATE()"))?></div></div></div><div class="card stat"><div class="ico"><?=svg('game')?></div><div><div class="lab">Today Bet</div><div class="num"><?=money(qsum($conn,"SELECT COALESCE(SUM(real_amount),0) s FROM lottery_bets WHERE DATE(created_at)=CURDATE()"))?></div></div></div></div><div class="card"><h3>Clean History Tools</h3><form method="post" class="row" onsubmit="return confirm('Confirm clear?')"><input type="hidden" name="action" value="clear_history"><select name="target"><option value="recharge">Recharge</option><option value="withdraw">Withdraw</option><option value="gift">Gift Claims</option><option value="bets">Bets</option></select><button class="danger">Clean Selected History</button></form></div><?php endif;?> <?php if($tab==='settings'):?> <div class="card"><div class="section-title"><h3>Site Settings / Real Toggles</h3><span class="pill">All switches are connected with API guard</span></div><p class="help">Maintenance ON karne par user APIs lock ho jayengi. Recharge/Withdraw/Gift/VIP/Agent/Lottery toggles direct API response ko block karte hain, fake UI nahi hai.</p><form method="post" class="grid3"><input type="hidden" name="action" value="feature_save"><?php foreach(['captcha_enabled','popup_enabled','maintenance_enabled','home_enabled','home_banner_enabled','profile_enabled','gift_enabled','bonus_enabled','vip_enabled','agent_enabled','workorder_enabled','recharge_enabled','withdraw_enabled','invite_enabled','lottery_enabled','wingo_enabled','k3_enabled','d5_enabled','moto_enabled','trx_enabled','support_chat_enabled','license_popup_enabled'] as $k):?><label class="toggle"><input type="checkbox" name="<?=h($k)?>" <?=!empty($set[$k])?'checked':''?>><span class="switch"></span><?=h(str_replace('_',' ',$k))?></label><?php endforeach;?><label>Min withdraw<input name="min_withdraw" value="<?=h($set['min_withdraw_amount']??$set['min_withdraw']??110)?>"></label><label>Turnover required<input name="turnover_required" value="<?=h($set['withdraw_need_bet_multiplier']??$set['turnover_required']??0)?>"></label><label>Game history page size<input name="game_history_page_size" value="<?=h($set['game_history_page_size']??10)?>"></label><label>Telegram<input name="service_telegram" value="<?=h($set['service_telegram']??$set['telegram_url']??'')?>"></label><label>Maintenance text<textarea name="maintenance_text"><?=h($set['maintenance_text']??'Site is under maintenance. Please try again later.')?></textarea></label><label>Notice<textarea name="common_notice"><?=h($set['common_notice']??'')?></textarea></label><button>Save Settings</button></form></div> <div class="grid2"><div class="card"><h3>Live Feature Status</h3><table><tr><th>Module</th><th>Status</th><th>Effect</th></tr><?php foreach(['maintenance_enabled'=>'Full site lock','recharge_enabled'=>'Deposit APIs','withdraw_enabled'=>'Withdraw APIs','lottery_enabled'=>'All lottery APIs','wingo_enabled'=>'WinGo only','k3_enabled'=>'K3 only','d5_enabled'=>'5D only','moto_enabled'=>'Moto Racing','trx_enabled'=>'TRX WinGo','workorder_enabled'=>'Support tickets'] as $k=>$label):?><tr><td><?=h($label)?></td><td><span class="pill <?=!empty($set[$k])?'badge-green':'badge-red'?>"><?=!empty($set[$k])?'ON':'OFF'?></span></td><td class="help"><?=h($k)?></td></tr><?php endforeach;?></table></div><div class="card"><h3>Recommended Controls</h3><p class="help">High traffic me maintenance ON karo. Game payout ke liye Lottery Win/Loss page use karo. Payment QR change karne ke baad new recharge order banao.</p><a class="btn secondary" href="?tab=lottery">Open Game Manage</a> <a class="btn secondary" href="?tab=payment">Open UPI Manage</a></div></div> <?php endif;?> <?php if($tab==='owner_license' && function_exists('ol_ensure')): $lc=$GLOBALS['owner_license_conn']??$conn; $lm=$lc->query('SELECT * FROM owner_license_messages WHERE id=1')->fetch_assoc(); ?> <div class="cards"><div class="card stat"><div class="ico"><?=svg('settings')?></div><div><div class="lab">Active Keys</div><div class="num"><?=qcount($lc,"SELECT COUNT(*) c FROM owner_licenses WHERE status='active'")?></div></div></div><div class="card stat"><div class="ico"><?=svg('settings')?></div><div><div class="lab">Blocked</div><div class="num"><?=qcount($lc,"SELECT COUNT(*) c FROM owner_licenses WHERE status='blocked'")?></div></div></div><div class="card stat"><div class="ico"><?=svg('settings')?></div><div><div class="lab">Whitelist</div><div class="num"><?=qcount($lc,"SELECT COUNT(*) c FROM owner_domain_whitelist WHERE status=1")?></div></div></div><div class="card stat"><div class="ico"><?=svg('support')?></div><div><div class="lab">Open Chat</div><div class="num"><?=qcount($lc,"SELECT COUNT(*) c FROM owner_license_chat WHERE status='open'")?></div></div></div></div> <div class="grid2"><div class="card"><h3>Create / Update License</h3><p class="help">Valid until ab datetime-local se MySQL format me auto save hota hai. Blank rakhoge to no-expiry/null rahega.</p><form method="post" class="grid3"><input type="hidden" name="action" value="owner_license_save"><label>License key<input name="license_key" placeholder="AUTO or custom"></label><label>Customer<input name="customer_name" placeholder="client name"></label><label>Domain<input name="domain" placeholder="domain.com"></label><label>Status<select name="status"><option>active</option><option>blocked</option><option>expired</option><option>inactive</option></select></label><label>Valid until<input name="valid_until" type="datetime-local"></label><label>Note<input name="note" placeholder="note"></label><button>Save License</button></form></div><div class="card"><h3>Domain Whitelist / Auto Key</h3><p class="help">Domain whitelist me save karte hi key auto generate hogi. Validity aap date se set karo ya Auto days se default banega.</p><form method="post" class="grid3"><input type="hidden" name="action" value="owner_whitelist_save"><label>Domain<input name="domain" placeholder="domain.com"></label><label>Optional key<input name="license_key" placeholder="blank = auto key"></label><label>Name<input name="customer_name"></label><label>Valid until<input name="valid_until" type="datetime-local"></label><label>Auto days<input name="auto_days" type="number" min="1" value="30"></label><label>Message<input name="message" placeholder="License active"></label><label class="toggle"><input type="checkbox" name="status" checked><span class="switch"></span>Active</label><button>Save Whitelist + Key</button></form></div></div> <div class="card"><h3>Licenses</h3><div class="scroll"><table><tr><th>Key</th><th>Customer / Domain</th><th>Status</th><th>Valid until / Quick Save</th><th>Block/Edit/Delete</th><th>Popup to client</th></tr><?php $rs=$lc->query('SELECT * FROM owner_licenses ORDER BY id DESC LIMIT 300'); while($r=$rs->fetch_assoc()):?><tr><td><b><?=h($r['license_key'])?></b><br><span class="help"><?=h($r['note'])?></span></td><td><?=h($r['customer_name'])?><br><?=h($r['domain'])?></td><td><span class="pill <?=($r['status']==='blocked'||$r['status']==='expired')?'badge-red':'badge-green'?>"><?=h($r['status'])?></span></td><td><form method="post" class="row"><input type="hidden" name="action" value="owner_license_validity"><input type="hidden" name="id" value="<?=h($r['id'])?>"><input class="mini" type="datetime-local" name="valid_until" value="<?=h(admin_datetime_local_value($r['valid_until']??''))?>"><select name="status"><option <?=($r['status']==='active')?'selected':''?>>active</option><option <?=($r['status']==='blocked')?'selected':''?>>blocked</option><option <?=($r['status']==='expired')?'selected':''?>>expired</option><option <?=($r['status']==='inactive')?'selected':''?>>inactive</option></select><button>Save Validity</button></form><span class="help"><?=h($r['valid_until'])?></span></td><td><form method="post" class="row"><input type="hidden" name="action" value="owner_license_status"><input type="hidden" name="id" value="<?=h($r['id'])?>"><select name="status"><option>active</option><option>blocked</option><option>expired</option><option>inactive</option></select><button>Update</button></form><form method="post" class="row" onsubmit="return confirm('Delete license?')"><input type="hidden" name="action" value="owner_license_delete"><input type="hidden" name="id" value="<?=h($r['id'])?>"><button class="bad">Delete</button></form></td><td><form method="post"><input type="hidden" name="action" value="owner_license_popup"><input type="hidden" name="id" value="<?=h($r['id'])?>"><textarea name="popup_message" placeholder="Popup message"><?=h($r['popup_message']??'')?></textarea><div class="row"><input class="mini" name="popup_duration" value="<?=h($r['popup_duration']??60)?>" placeholder="sec"><input class="mini" name="popup_minutes" value="1" placeholder="minutes"><input name="owner_telegram" value="<?=h($r['owner_telegram']??'')?>" placeholder="telegram"><button>Push Popup</button></div></form></td></tr><?php endwhile;?></table></div></div> <div class="card"><h3>Domain Whitelist</h3><div class="scroll"><table><tr><th>Domain</th><th>License Key</th><th>Name</th><th>Status</th><th>Valid until</th><th>Auto days</th><th>Message</th></tr><?php $wrs=$lc->query('SELECT * FROM owner_domain_whitelist ORDER BY id DESC LIMIT 300'); while($w=$wrs->fetch_assoc()):?><tr><td><b><?=h($w['domain'])?></b></td><td><?=h($w['license_key'])?></td><td><?=h($w['customer_name'])?></td><td><span class="pill <?=((int)$w['status'])?'badge-green':'badge-red'?>"><?=((int)$w['status'])?'active':'off'?></span></td><td><?=h($w['valid_until']??'')?></td><td><?=h($w['auto_days']??30)?></td><td><?=h($w['message']??'')?></td></tr><?php endwhile;?></table></div></div> <div class="grid2"><div class="card"><h3>Global Message / Payment</h3><form method="post"><input type="hidden" name="action" value="owner_global_message"><label>Message<textarea name="popup_message"><?=h($lm['popup_message']??'')?></textarea></label><div class="grid3"><label>Telegram<input name="telegram_url" value="<?=h($lm['telegram_url']??'') ?>"></label><label>UPI ID<input name="upi_id" value="<?=h($lm['upi_id']??'') ?>"></label><label>UPI Name<input name="upi_name" value="<?=h($lm['upi_name']??'') ?>"></label><label>QR path<input name="qr_image" value="<?=h($lm['qr_image']??'') ?>"></label></div><button>Save Message</button></form></div><div class="card"><h3>Client Chat / Renewal</h3><div class="scroll"><table><tr><th>Domain</th><th>Contact</th><th>Question</th><th>Reply</th></tr><?php $rs=$lc->query('SELECT * FROM owner_license_chat ORDER BY id DESC LIMIT 100'); while($c=$rs->fetch_assoc()):?><tr><td><?=h($c['domain'])?><br><?=h($c['license_key'])?></td><td><?=h($c['name'])?><br><?=h($c['contact'])?></td><td><?=h($c['message'])?><br><b><?=h($c['reply'])?></b></td><td><form method="post" class="row"><input type="hidden" name="action" value="owner_chat_reply"><input type="hidden" name="id" value="<?=h($c['id'])?>"><input name="reply" placeholder="reply"><button>Send</button></form></td></tr><?php endwhile;?></table></div></div></div> <?php endif;?> <?php if($tab==='usdt_gateway'): $usdtPm=null; $usdtSt=$conn->prepare("SELECT * FROM payment_methods WHERE id=? LIMIT 1"); if($usdtSt){$cid=400087;$usdtSt->bind_param("i",$cid);$usdtSt->execute();$usdtPm=$usdtSt->get_result()->fetch_assoc();} if(!$usdtPm)$usdtPm=['upi_id'=>'','upi_name'=>'TRC20','rate'=>94,'qr_image'=>'','note'=>'Transfer USDT to the address above, then submit transaction hash.','state'=>0,'min_amount'=>1,'max_amount'=>50000]; ?> <div class="grid2"> <div class="card"> <h3 style="display:flex;align-items:center;gap:10px"><span style="width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#22c55e,#16a34a);border-radius:12px;font-size:18px">₮</span> USDT Gateway Configuration</h3> <p class="help" style="margin:10px 0 18px">Configure the manual USDT deposit gateway. Users will see the address and QR code below when initiating USDT deposits. The conversion rate determines how many INR are credited per USDT deposited.</p> <form method="post" enctype="multipart/form-data" style="display:grid;grid-template-columns:1fr 1fr;gap:14px"> <input type="hidden" name="action" value="usdt_gateway_save"> <label style="grid-column:1/-1">USDT Deposit Address (Wallet)<input name="upi_id" value="<?=h($usdtPm['upi_id']??'')?>" placeholder="e.g. TXyz...abc123" style="font-family:monospace;letter-spacing:.5px;font-size:13px"></label> <label>Network Type<select name="upi_name"><?php foreach(['TRC20','ERC20','BEP20','SOL','POLYGON','ARBITRUM'] as $net):?><option value="<?=h($net)?>" <?=($usdtPm['upi_name']??'')===$net?'selected':''?>><?=h($net)?></option><?php endforeach;?></select></label> <label>Conversion Rate (₹ per 1 USDT)<input name="rate" type="number" step="0.01" value="<?=h($usdtPm['rate']??94)?>" placeholder="94.00"></label> <label>Min Deposit (USDT)<input name="min_amount" type="number" step="0.01" value="<?=h($usdtPm['min_amount']??1)?>"></label> <label>Max Deposit (USDT)<input name="max_amount" type="number" step="0.01" value="<?=h($usdtPm['max_amount']??50000)?>"></label> <label class="toggle"><input type="checkbox" name="state" <?=!empty($usdtPm['state'])?'checked':''?>><span class="switch"></span> Gateway Enabled</label> <div></div> <label style="grid-column:1/-1">Deposit Instructions / Note<textarea name="note" rows="3"><?=h($usdtPm['note']??'')?></textarea></label> <label>Upload QR Code Image<input type="file" name="qr_upload" accept="image/*" style="padding:8px"></label> <label>Or enter QR image path<input name="qr_image" value="<?=h($usdtPm['qr_image']??'')?>" placeholder="img/uploads/usdt_qr.png"></label> <div style="grid-column:1/-1"><button style="width:100%;padding:14px;font-size:15px">💾 Save USDT Gateway Settings</button></div> </form> </div> <div class="card"> <h3 style="display:flex;align-items:center;gap:10px"><span style="width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#38bdf8,#6366f1);border-radius:12px;font-size:16px">📋</span> Current USDT Settings</h3> <div style="padding:12px 0"> <table><tr><th>Setting</th><th>Value</th></tr> <tr><td>Status</td><td><span class="pill <?=!empty($usdtPm['state'])?'badge-green':'badge-red'?>"><?=!empty($usdtPm['state'])?'ACTIVE':'DISABLED'?></span></td></tr> <tr><td>Deposit Address</td><td style="word-break:break-all;font-family:monospace;font-size:12px;color:#ffdd59"><?=h($usdtPm['upi_id']?:'Not configured')?></td></tr> <tr><td>Network</td><td><span class="pill" style="background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.3)"><?=h($usdtPm['upi_name']??'TRC20')?></span></td></tr> <tr><td>Rate</td><td><b style="color:#22c55e;font-size:16px">₹<?=number_format((float)($usdtPm['rate']??94),2)?></b> <span class="help">per USDT</span></td></tr> <tr><td>Min / Max</td><td><?=number_format((float)($usdtPm['min_amount']??1),2)?> — <?=number_format((float)($usdtPm['max_amount']??50000),2)?> USDT</td></tr></table> <?php $qrPath=trim((string)($usdtPm['qr_image']??'')); if($qrPath!==''):?> <div style="text-align:center;margin-top:18px;padding:18px;background:rgba(255,255,255,.03);border-radius:18px;border:1px solid rgba(148,163,184,.15)"> <p style="color:#9fb0c7;font-size:12px;margin-bottom:10px;text-transform:uppercase;letter-spacing:.06em">Current QR Code</p> <img src="/<?=h(ltrim($qrPath,'/'))?>" style="max-width:200px;border-radius:14px;background:#fff;padding:10px;box-shadow:0 8px 24px rgba(0,0,0,.3)" alt="USDT QR"> <p style="color:#64748b;font-size:11px;margin-top:8px"><?=h($qrPath)?></p> </div> <?php endif;?> </div> <h3 style="margin-top:22px;display:flex;align-items:center;gap:10px"><span style="width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f97316,#ef4444);border-radius:12px;font-size:16px">📊</span> Recent USDT Deposits</h3> <?php $usdtOrders=$conn->query("SELECT r.*,u.username FROM recharge_orders r LEFT JOIN users u ON u.id=r.user_id WHERE r.recharge_category_id=400087 OR r.recharge_type='USDT' OR r.recharge_type='LocalUSDT' ORDER BY r.id DESC LIMIT 15");?> <div class="scroll"><table><tr><th>Order</th><th>User</th><th>USDT</th><th>INR Credit</th><th>TxID</th><th>Status</th><th>Time</th><th>Action</th></tr> <?php if($usdtOrders) while($uo=$usdtOrders->fetch_assoc()): $uoInr=(float)$uo['amount']*(float)($usdtPm['rate']??94);?> <tr><td style="font-size:11px"><?=h($uo['order_no'])?></td><td><?=h($uo['username'])?> <span class="help">#<?=h($uo['user_id'])?></span></td><td><b><?=number_format((float)$uo['amount'],2)?></b></td><td style="color:#22c55e;font-weight:700"><?=money($uoInr)?></td><td style="font-size:10px;max-width:110px;word-break:break-all;font-family:monospace"><?=h($uo['utr']??'')?></td><td><span class="pill"><?=h($uo['status'])?></span></td><td style="font-size:11px"><?=h($uo['created_at'])?></td> <td><form method="post" class="row"><input type="hidden" name="action" value="recharge_update"><input type="hidden" name="id" value="<?=h($uo['id'])?>"><select name="status"><option>PendingReview</option><option>Payed</option><option>Cancel</option></select><input name="note" placeholder="note" style="width:70px"><button>Update</button></form></td></tr> <?php endwhile;?></table></div> </div> </div> <?php endif;?> <?php if($tab==='admins'): $tabs=['dashboard'=>'Dashboard','users'=>'Users','deposits'=>'Deposit Orders','withdraw'=>'Withdraw','payment'=>'Payment/UPI','recharge_history'=>'Recharge History','finance'=>'Finance Report','workorders'=>'User Queries','bonus'=>'Bonus/Gift','tasks'=>'Tasks','wheel'=>'Invite Wheel','agents'=>'Agents','lottery'=>'Lottery','results'=>'Result History','settings'=>'Settings','owner_license'=>'Owner License','admins'=>'Admins'];?><div class="grid2"><div class="card"><h3>Add Admin + Permissions</h3><form method="post"><input type="hidden" name="action" value="admin_create"><label>Username<input name="username" placeholder="new admin username"></label><label>Password<input name="password" value="admin123"></label><div class="row"><?php foreach($tabs as $k=>$v):?><label class="toggle"><input type="checkbox" name="perms[]" value="<?=h($k)?>" checked><span class="switch"></span><?=h($v)?></label><?php endforeach;?></div><button>Create Admin</button></form></div><div class="card"><h3>Permission Tips</h3><p style="color:#8ea3bf">Admin ko sirf selected modules ka access do. Main admin username <b>admin</b> ko full access rahega.</p></div></div><div class="card"><h3>Admins</h3><?php $rs=$conn->query("SELECT u.id,u.username,u.status,u.created_at,p.permissions,p.status perm_status FROM users u LEFT JOIN admin_permissions p ON p.admin_user=u.username WHERE u.role='admin' ORDER BY u.id DESC");?><div class="scroll"><table><tr><th>ID</th><th>User</th><th>Status</th><th>Permissions</th><th>Save</th></tr><?php while($a=$rs->fetch_assoc()): $ap=json_decode((string)($a['permissions']??'[]'),true); if(!is_array($ap))$ap=[];?><tr><form method="post"><td>#<?=h($a['id'])?></td><td><?=h($a['username'])?><input type="hidden" name="admin_user" value="<?=h($a['username'])?>"></td><td><label class="toggle"><input type="checkbox" name="status" <?=((int)($a['perm_status']??1))?'checked':''?>><span class="switch"></span>Active</label></td><td><div class="row"><?php foreach($tabs as $k=>$v):?><label class="toggle"><input type="checkbox" name="perms[]" value="<?=h($k)?>" <?=(in_array('*',$ap,true)||in_array($k,$ap,true)||$a['username']==='admin')?'checked':''?>><span class="switch"></span><?=h($v)?></label><?php endforeach;?></div></td><td><input type="hidden" name="action" value="admin_perm_save"><button>Save</button></td></form></tr><?php endwhile;?></table></div></div><?php endif;?> </main></div></body></html>
💾 Save