Download mo.html from Hosdroid/Aplood: direct link, hf CLI and curl.
- Browser
- Download file 19.1 kB
-
https://huggingface.co/spaces/Hosdroid/Aplood/resolve/main/mo.html
- Command line
-
hf download hf://spaces/Hosdroid/Aplood/mo.html
-
curl -L -o mo.html https://huggingface.co/spaces/Hosdroid/Aplood/resolve/main/mo.html
19.1 kB
| <html lang="fa" dir="rtl"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>🎮 کنترل زمان تانک استارز</title> | |
| <style> | |
| /* Reset & Base */ | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| body { | |
| font-family: 'Vazir', 'Tahoma', sans-serif; | |
| min-height: 100vh; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| background: linear-gradient(145deg, #0b1120 0%, #1a253a 100%); | |
| color: #fff; | |
| padding: 1rem; | |
| } | |
| .container { | |
| max-width: 700px; | |
| width: 100%; | |
| background: rgba(255, 255, 255, 0.06); | |
| backdrop-filter: blur(12px); | |
| -webkit-backdrop-filter: blur(12px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| border-radius: 50px; | |
| padding: 2.5rem 2rem; | |
| box-shadow: 0 30px 60px rgba(0, 0, 0, 0.6); | |
| text-align: center; | |
| transition: all 0.3s ease; | |
| } | |
| /* Header */ | |
| .logo { | |
| font-size: 3.5rem; | |
| margin-bottom: 0.2rem; | |
| } | |
| h1 { | |
| font-size: 2.2rem; | |
| font-weight: 800; | |
| background: linear-gradient(135deg, #f6d365, #fda085); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| margin-bottom: 0.5rem; | |
| } | |
| .sub { | |
| color: #aab4ce; | |
| font-size: 1rem; | |
| border-bottom: 1px solid rgba(255, 255, 255, 0.05); | |
| padding-bottom: 1.2rem; | |
| margin-bottom: 1.8rem; | |
| } | |
| /* Timer Box */ | |
| .timer-box { | |
| background: rgba(0, 0, 0, 0.35); | |
| border-radius: 30px; | |
| padding: 1.8rem 1rem; | |
| margin-bottom: 2rem; | |
| border: 1px solid rgba(255, 255, 255, 0.05); | |
| } | |
| .timer-label { | |
| font-size: 0.9rem; | |
| color: #8d99c4; | |
| letter-spacing: 1px; | |
| } | |
| #countdown { | |
| font-size: 4.2rem; | |
| font-weight: 700; | |
| font-family: 'Courier New', monospace; | |
| background: linear-gradient(135deg, #00dbde, #fc00ff); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| line-height: 1.3; | |
| direction: ltr; | |
| } | |
| .used-time { | |
| color: #8d99c4; | |
| font-size: 0.95rem; | |
| margin-top: 0.2rem; | |
| } | |
| /* Buttons */ | |
| .btn { | |
| display: inline-block; | |
| padding: 1rem 2.8rem; | |
| border: none; | |
| border-radius: 60px; | |
| font-size: 1.4rem; | |
| font-weight: 700; | |
| cursor: pointer; | |
| transition: all 0.25s ease; | |
| text-decoration: none; | |
| color: #fff; | |
| background: linear-gradient(135deg, #f093fb, #f5576c); | |
| box-shadow: 0 8px 25px rgba(245, 87, 108, 0.35); | |
| margin: 0.3rem; | |
| } | |
| .btn:hover { | |
| transform: translateY(-3px) scale(1.02); | |
| box-shadow: 0 12px 35px rgba(245, 87, 108, 0.5); | |
| } | |
| .btn:active { | |
| transform: scale(0.96); | |
| } | |
| .btn-secondary { | |
| background: linear-gradient(135deg, #4facfe, #00f2fe); | |
| box-shadow: 0 8px 25px rgba(79, 172, 254, 0.3); | |
| } | |
| .btn-secondary:hover { | |
| box-shadow: 0 12px 35px rgba(79, 172, 254, 0.5); | |
| } | |
| .btn:disabled { | |
| opacity: 0.4; | |
| cursor: not-allowed; | |
| transform: none ; | |
| box-shadow: none ; | |
| } | |
| /* Blocked State */ | |
| .blocked-icon { | |
| font-size: 5rem; | |
| display: block; | |
| margin-bottom: 0.5rem; | |
| } | |
| .blocked-title { | |
| font-size: 3rem; | |
| font-weight: 800; | |
| color: #fda085; | |
| margin-bottom: 0.2rem; | |
| } | |
| .blocked-msg { | |
| font-size: 1.6rem; | |
| color: #e0e7ff; | |
| } | |
| .blocked-sub { | |
| font-size: 1rem; | |
| color: #8d99c4; | |
| margin-top: 1.5rem; | |
| border-top: 1px solid rgba(255, 255, 255, 0.08); | |
| padding-top: 1.5rem; | |
| } | |
| .hidden { | |
| display: none ; | |
| } | |
| /* Reset / Danger */ | |
| .reset-btn { | |
| margin-top: 2rem; | |
| background: transparent; | |
| border: 1px solid #4a5568; | |
| color: #a0aec0; | |
| padding: 0.5rem 1.5rem; | |
| border-radius: 40px; | |
| font-size: 0.8rem; | |
| cursor: pointer; | |
| transition: 0.2s; | |
| } | |
| .reset-btn:hover { | |
| background: #2d3748; | |
| border-color: #fc8181; | |
| color: #fc8181; | |
| } | |
| /* Responsive */ | |
| @media (max-width: 500px) { | |
| .container { | |
| padding: 1.5rem 1rem; | |
| border-radius: 30px; | |
| } | |
| #countdown { | |
| font-size: 3rem; | |
| } | |
| h1 { | |
| font-size: 1.8rem; | |
| } | |
| .btn { | |
| font-size: 1.1rem; | |
| padding: 0.8rem 1.8rem; | |
| } | |
| .blocked-title { | |
| font-size: 2.2rem; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container" id="app"> | |
| <!-- ========== وضعیت: بازی مجاز است ========== --> | |
| <div id="state-play"> | |
| <div class="logo">🎯</div> | |
| <h1>تانک استارز</h1> | |
| <div class="sub">⏳ زمان مجاز روزانه: ۱ ساعت</div> | |
| <div class="timer-box"> | |
| <div class="timer-label">⌛ زمان باقیمانده</div> | |
| <div id="countdown">01:00:00</div> | |
| <div class="used-time" id="usedDisplay">استفادهشده: ۰ دقیقه</div> | |
| </div> | |
| <!-- دکمهی باز کردن بازی (در تب جدید) --> | |
| <button class="btn" id="playBtn">🔥 شروع بازی</button> | |
| <br /><br /> | |
| <small style="color:#6b7a9f; font-size:0.8rem;"> | |
| ⚡ با کلیک، بازی در پنجرهی جدید باز میشود. <br /> | |
| این صفحه را باز بگذارید تا زمانسنج کار کند! | |
| </small> | |
| <br /> | |
| <button class="reset-btn" id="forceResetBtn">🔄 ریست دستی (فقط برای تست)</button> | |
| </div> | |
| <!-- ========== وضعیت: زمان تمام شد ========== --> | |
| <div id="state-blocked" class="hidden"> | |
| <span class="blocked-icon">⏰</span> | |
| <div class="blocked-title">بسه بچه جون !😁</div> | |
| <div class="blocked-msg">دیگه زمان بازی تموم شد!</div> | |
| <div class="blocked-msg" style="font-size:1.8rem; margin-top:0.5rem;">برو بعداً بیا !!</div> | |
| <div class="blocked-sub"> | |
| ⭐ امروز ۱ ساعت کامل بازی کردی. <br /> | |
| فردا دوباره خوش اومدی! روز نو، بازی نو. | |
| </div> | |
| <br /> | |
| <button class="reset-btn" id="resetBtnAdmin">🔑 ریست اجباری (فقط مدیر)</button> | |
| </div> | |
| </div> | |
| <script> | |
| // ------------------------------------------------ | |
| // 🧠 ابر الگوریتم کنترل زمان (به زبان ساده ولی قدرتمند) | |
| // ------------------------------------------------ | |
| (function() { | |
| // ---------- ثابتها ---------- | |
| const LIMIT_MS = 60 * 60 * 1000; // ۱ ساعت | |
| const STORAGE_KEY = 'tank_stars_data'; | |
| const GAME_URL = 'https://www.crazygames.com/game/tank-stars-online'; | |
| // ---------- عناصر DOM ---------- | |
| const statePlay = document.getElementById('state-play'); | |
| const stateBlocked = document.getElementById('state-blocked'); | |
| const countdownEl = document.getElementById('countdown'); | |
| const usedDisplay = document.getElementById('usedDisplay'); | |
| const playBtn = document.getElementById('playBtn'); | |
| const resetBtnAdmin = document.getElementById('resetBtnAdmin'); | |
| const forceResetBtn = document.getElementById('forceResetBtn'); | |
| // ---------- متغیرهای وضعیت ---------- | |
| let timerInterval = null; | |
| let currentUsed = 0; // میلیثانیه مصرفشده امروز | |
| let isTimerRunning = false; | |
| // ---------- توابع کمکی ---------- | |
| function formatTime(ms) { | |
| if (ms < 0) ms = 0; | |
| const totalSec = Math.floor(ms / 1000); | |
| const h = Math.floor(totalSec / 3600); | |
| const m = Math.floor((totalSec % 3600) / 60); | |
| const s = totalSec % 60; | |
| if (h > 0) { | |
| return String(h).padStart(2, '0') + ':' + String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0'); | |
| } | |
| return String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0'); | |
| } | |
| function formatMinutes(ms) { | |
| const min = Math.floor(ms / 60000); | |
| return min + ' دقیقه'; | |
| } | |
| // ---------- بارگذاری داده از localStorage ---------- | |
| function loadData() { | |
| const raw = localStorage.getItem(STORAGE_KEY); | |
| if (!raw) { | |
| // روز جدید یا اولین بار | |
| return { | |
| date: new Date().toDateString(), | |
| used: 0, | |
| isBlocked: false | |
| }; | |
| } | |
| try { | |
| const data = JSON.parse(raw); | |
| const today = new Date().toDateString(); | |
| // اگر روز عوض شده، ریست کن | |
| if (data.date !== today) { | |
| return { | |
| date: today, | |
| used: 0, | |
| isBlocked: false | |
| }; | |
| } | |
| return data; | |
| } catch (e) { | |
| return { | |
| date: new Date().toDateString(), | |
| used: 0, | |
| isBlocked: false | |
| }; | |
| } | |
| } | |
| // ---------- ذخیره داده در localStorage ---------- | |
| function saveData(data) { | |
| localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); | |
| } | |
| // ---------- بروزرسانی UI و چک کردن وضعیت ---------- | |
| function updateUI() { | |
| const data = loadData(); | |
| currentUsed = data.used || 0; | |
| const remaining = LIMIT_MS - currentUsed; | |
| // نمایش زمان باقیمانده | |
| if (remaining > 0) { | |
| countdownEl.textContent = formatTime(remaining); | |
| usedDisplay.textContent = 'استفادهشده: ' + formatMinutes(currentUsed); | |
| } else { | |
| countdownEl.textContent = '00:00:00'; | |
| usedDisplay.textContent = 'استفادهشده: ۱ ساعت (تمام)'; | |
| } | |
| // مدیریت وضعیت قفل | |
| if (remaining <= 0) { | |
| // مسدود کن | |
| statePlay.classList.add('hidden'); | |
| stateBlocked.classList.remove('hidden'); | |
| if (timerInterval) { | |
| clearInterval(timerInterval); | |
| timerInterval = null; | |
| isTimerRunning = false; | |
| } | |
| // ذخیره وضعیت بلاک | |
| const d = loadData(); | |
| if (!d.isBlocked) { | |
| d.isBlocked = true; | |
| saveData(d); | |
| } | |
| // غیرفعال کردن دکمهی بازی | |
| playBtn.disabled = true; | |
| } else { | |
| // مجاز | |
| statePlay.classList.remove('hidden'); | |
| stateBlocked.classList.add('hidden'); | |
| playBtn.disabled = false; | |
| // اگر تایمر اجرا نیست، شروع کن | |
| if (!timerInterval) { | |
| startTimer(); | |
| } | |
| } | |
| } | |
| // ---------- تایمر ثانیهای (افزایش زمان مصرفشده) ---------- | |
| function startTimer() { | |
| if (timerInterval) { | |
| clearInterval(timerInterval); | |
| timerInterval = null; | |
| } | |
| isTimerRunning = true; | |
| timerInterval = setInterval(() => { | |
| // فقط اگر صفحه قابل مشاهده باشد (اختیاری) ولی برای دقت همیشه بروز کن | |
| const data = loadData(); | |
| let newUsed = (data.used || 0) + 1000; // +1 ثانیه | |
| if (newUsed >= LIMIT_MS) { | |
| newUsed = LIMIT_MS; | |
| // ذخیره و توقف | |
| data.used = newUsed; | |
| data.isBlocked = true; | |
| saveData(data); | |
| // بروزرسانی UI و توقف تایمر | |
| updateUI(); | |
| if (timerInterval) { | |
| clearInterval(timerInterval); | |
| timerInterval = null; | |
| isTimerRunning = false; | |
| } | |
| return; | |
| } | |
| // بهروزرسانی مقدار | |
| data.used = newUsed; | |
| data.isBlocked = false; | |
| saveData(data); | |
| // بروزرسانی نمایشگر | |
| currentUsed = newUsed; | |
| const remaining = LIMIT_MS - currentUsed; | |
| countdownEl.textContent = formatTime(remaining); | |
| usedDisplay.textContent = 'استفادهشده: ' + formatMinutes(currentUsed); | |
| }, 1000); | |
| } | |
| // ---------- باز کردن بازی ---------- | |
| function openGame() { | |
| const data = loadData(); | |
| if (data.isBlocked || (data.used || 0) >= LIMIT_MS) { | |
| alert('⛔ وقت بازی تموم شده! صفحه رو رفرش کن تا پیام رو ببینی.'); | |
| updateUI(); | |
| return; | |
| } | |
| // باز کردن در تب جدید | |
| window.open(GAME_URL, '_blank'); | |
| // یک اعلان کوچک | |
| console.log('🎮 بازی باز شد، زمان در حال شمارش است...'); | |
| } | |
| // ---------- ریست دستی (فقط برای مدیر) ---------- | |
| function forceReset() { | |
| if (confirm('🔥 آیا مطمئنی میخوای زمان رو ریست کنی؟ (فقط برای تست)')) { | |
| const today = new Date().toDateString(); | |
| const newData = { | |
| date: today, | |
| used: 0, | |
| isBlocked: false | |
| }; | |
| saveData(newData); | |
| // ریست تایمر | |
| if (timerInterval) { | |
| clearInterval(timerInterval); | |
| timerInterval = null; | |
| isTimerRunning = false; | |
| } | |
| updateUI(); | |
| startTimer(); | |
| alert('✅ زمان ریست شد!'); | |
| } | |
| } | |
| // ---------- مقداردهی اولیه ---------- | |
| function init() { | |
| // بارگذاری داده و اعتبارسنجی | |
| const data = loadData(); | |
| // اگر بلاک شده ولی زمان کمتر از حد مجاز است (احتمالاً باگ)، تصحیح کن | |
| if (data.isBlocked && (data.used || 0) < LIMIT_MS) { | |
| data.isBlocked = false; | |
| saveData(data); | |
| } | |
| // اگر زمان به حد رسیده، بلاک کن | |
| if ((data.used || 0) >= LIMIT_MS) { | |
| data.isBlocked = true; | |
| saveData(data); | |
| } | |
| updateUI(); | |
| // اتصال رویدادها | |
| playBtn.addEventListener('click', openGame); | |
| resetBtnAdmin.addEventListener('click', forceReset); | |
| forceResetBtn.addEventListener('click', forceReset); | |
| // اگر صفحه بسته شود، تایمر را پاک کن (اما داده ذخیره میشود) | |
| window.addEventListener('beforeunload', function() { | |
| if (timerInterval) { | |
| clearInterval(timerInterval); | |
| timerInterval = null; | |
| isTimerRunning = false; | |
| } | |
| }); | |
| // اگر صفحه دوباره فعال شد، چک کن | |
| document.addEventListener('visibilitychange', function() { | |
| if (!document.hidden) { | |
| // وقتی کاربر به برگه برمیگردد، وضعیت را رفرش کن | |
| updateUI(); | |
| // اگر تایمر نیست و هنوز وقت باقی است، شروع کن | |
| if (!timerInterval && !document.getElementById('state-blocked').classList.contains('hidden') === | |
| false) { | |
| const data2 = loadData(); | |
| if ((data2.used || 0) < LIMIT_MS) { | |
| startTimer(); | |
| } | |
| } | |
| } | |
| }); | |
| console.log('🧠 ابر الگوریتم کنترل زمان با موفقیت بارگذاری شد!'); | |
| } | |
| // اجرا | |
| init(); | |
| })(); | |
| </script> | |
| </body> | |
| </html> |