enfejar-بازی-انفجار

by jnjmz

HTML

<html lang="fa" dir="rtl">
<head>
  
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ابزار اعتبارسنجی الگوریتم بازی انفجار | Enfejar.me</title>
</head>
<body>

    <div class="container">
        <header class="header">
            <h1>اثبات شفافیت الگوریتم (Provably Fair)</h1>
            <p>این ابزار جهت اعتبارسنجی کدهای هش و ضرایب بازی در سایت <strong>Enfejar.me</strong> طراحی شده است.</p>
        </header>

        <!-- بخش اعتبارسنجی دستی -->
        <div class="card">
            <h2 class="card-title">اعتبارسنجی دستی</h2>
            <div class="form-group">
                <label for="md5Input">کد MD5 راند:</label>
                <input type="text" id="md5Input" placeholder="مثال: 5df7a5d83547fd8fb4fba9183ab6b7c4">
            </div>
            <div class="form-group">
                <label for="multiInput">ضریب بازی (Crash Point):</label>
                <input type="number" id="multiInput" step="0.01" placeholder="مثال: 2.46">
            </div>
            <button class="btn" onclick="verifyManual()">محاسبه HASH</button>

            <div id="resultBox" class="result-box">
                <div class="result-label">HASH تولید شده (SHA-256):</div>
                <div id="hashOutput" style="font-family: monospace; font-size: 1.1rem; color: #fff;"></div>
            </div>
        </div>

        <!-- بخش بررسی خودکار راندهای سایت -->
        <div class="card">
            <h2 class="card-title">بررسی زنده از سایت رسمی</h2>
            <p style="color: var(--text-muted); font-size: 0.9rem; margin-bottom: 20px;">با استفاده از دکمه زیر، ۱۰ راند آخر مستقیماً از سرورهای Enfejar.me دریافت شده و اعتبار الگوریتم آنها در مرورگر شما بررسی می‌شود.</p>
            
            <button class="btn btn-secondary" onclick="fetchLatestRounds()">دریافت ۱۰ راند آخر و اعتبارسنجی</button>

            <div id="tableContainer" class="table-responsive"...

CSS

:root {
            --bg-dark: #121212;
            --card-bg: #1e1e24;
            --primary: #e68927;
            --primary-hover: #c77520;
            --success: #2e7d32;
            --danger: #d32f2f;
            --text-light: #ffffff;
            --text-muted: #a0a0a0;
            --border-color: #333;
        }

        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
            font-family: Tahoma, 'Segoe UI', sans-serif;
        }

        body {
         
            background-color: var(--bg-dark);
            color: var(--text-light);
            line-height: 1.6;
            padding: 20px;
        }

        .container {
            max-width: 900px;
            margin: 0 auto;
        }

        .header {
            text-align: center;
            margin-bottom: 40px;
            padding-bottom: 20px;
            border-bottom: 1px solid var(--border-color);
        }

        .header h1 {
            color: var(--primary);
            margin-bottom: 10px;
        }

        .header p {
            color: var(--text-muted);
            font-size: 0.95rem;
        }

        .card {
            background: var(--card-bg);
            border-radius: 12px;
            padding: 25px;
            margin-bottom: 30px;
            box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
            border: 1px solid var(--border-color);
        }

        .card-title {
            color: var(--primary);
            margin-bottom: 20px;
            font-size: 1.2rem;
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .form-group {
            margin-bottom: 20px;
        }

        label {
            display: block;
            margin-bottom: 8px;
            font-size: 0.9rem;
            color: var(--text-muted);
        }

        input[type="text"], input[type="number"] {
            width: 100%;
 ...

JavaScript

async function generateSHA256(text) {
            const msgBuffer = new TextEncoder().encode(text);
            const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
            const hashArray = Array.from(new Uint8Array(hashBuffer));
            return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
        }

        async function verifyManual() {
            const md5 = document.getElementById('md5Input').value.trim();
            const multi = document.getElementById('multiInput').value.trim();

            if (!md5 || !multi) {
                alert('لطفاً هم کد MD5 و هم ضریب را وارد کنید.');
                return;
            }

            const formattedMulti = parseFloat(multi).toFixed(2);
            const combinedString = md5 + formattedMulti;
            
            const hash = await generateSHA256(combinedString);

            document.getElementById('hashOutput').innerText = hash;
            document.getElementById('resultBox').classList.add('show');
        }

        async function fetchLatestRounds() {
            const tbody = document.getElementById('historyBody');
            tbody.innerHTML = '<tr><td colspan="4" style="text-align:center; padding: 20px;">در حال دریافت اطلاعات...</td></tr>';
            document.getElementById('tableContainer').style.display = 'block';

            try {
                // تلاش برای دریافت فایل history.json از سایت
                const response = await fetch('https://enfejar.me/history.json', { cache: "no-store" });
                
                if (!response.ok) {
                    throw new Error('عدم دسترسی به سرور');
                }

                const data = await response.json();
                const latest10 = data.slice(0, 10);
                
                tbody.innerHTML = '';

                for (const round of latest10) {
                    // محاسبه هش در مرورگر کاربر
                    const...