Здесь делается вжух 🪄

Тест оформления

Объявление

Katherine
Кэтрин
лает и кусает, ответственная за беспорядки в Своре. изучает личные дела, помогает разобраться в матчасти, отвечает на вопросы о вопросах
Ruby
Руби
(временно мало доступна) маленькая рыбка с большими амбициями, может и плавником шлёпнуть и влажно чмокнуть, и объяснить что к чему, админ-универсал многозадачник
Hardy
Харди
Отвечает по вопросам Альянса. По остальным вопросам не отвечает
Robert
Робби
ответственный за фермы, шизофрению и несмешные шутки, не спит по ночам. гейм-мастер. считает деньги и нервные клетки, ответит на любой вопрос
Correy
Корри
Корри, Корица, Кориандр, Коррор. Работает за пятерых, ещё и бесплатно. Вездесущий помогатор
Jamie
Джейми
На страже флуда топового проекта и ментального состояния других членов амс
Это Джейд. И он выживает здесь один. А теперь вот с ней, с Эбботт. Слова до сих пор все еще не укладывались в голове, ведь они не знали друг о друге ничего. А выживание вместе - это не просто вместе в душ сходить, потрахаться, помыться, это даже не то же самое, что решиться завести совместный быт или семью. Это совершенно изнаночное решение - довериться.
...если я открою спальный район, он будет называться Район Госуслуг

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Тест оформления » в приборе ночного видения » слот-машина с автоотправкой


слот-машина с автоотправкой

Сообщений 1 страница 22 из 22

1

[html]<div class="slot-machine">
    <div id="slot-timer">Загрузка таймера...</div>
    <div class="slot-window">
        <div class="slot-reel"><img></div>
        <div class="slot-reel"><img></div>
        <div class="slot-reel"><img></div>
    </div>
    <button id="slot-spin">Крутить 🎰</button>
    <div id="slot-result"></div>
</div>

<style>
.slot-machine { width:300px; padding:15px; background:#222; border-radius:10px; text-align:center; margin:20px auto; color:#fff; border:2px solid #555; font-family:Arial; }
.slot-window { display:flex; justify-content:space-between; margin-bottom:10px; }
.slot-reel { width:80px; height:80px; overflow:hidden; border-radius:8px; background:#000; border:2px solid #555; position:relative; }
.slot-reel img { width:100%; height:100%; object-fit:contain; top:0; transition:top 0.15s linear; }
#slot-spin { padding:10px 20px; width:100%; background:#4CAF50; color:#fff; border:none; border-radius:8px; font-size:18px; cursor:pointer; margin-bottom:10px; }
#slot-timer { font-size:14px; margin-bottom:10px; color:#ffdd8a; }
#slot-result { font-size:16px; font-weight:bold; min-height:24px; margin-top:5px; color:#ffd700; }
</style>

<script>
(function(){
    const TIMER_HOURS = 0;
    const TIMER_MINUTES = 0;
    const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;

    const symbols = [
        {name:"Tikva",  url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
        {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
        {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
        {name:"Blood",  url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
        {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
    ];

    const winningCombos = {
        "Tikva,Tikva,Tikva": 100,
        "Cherep,Cherep,Cherep": 150,
        "Zombie,Blood,Potion": 500
    };

    const reels = document.querySelectorAll(".slot-reel img");
    const spinBtn = document.getElementById("slot-spin");
    const timerEl = document.getElementById("slot-timer");
    const resultEl = document.getElementById("slot-result");

    let lastSpin = localStorage.getItem("slotLastSpin") || 0;

    function updateTimer() {
        let diff = COOLDOWN - (Date.now() - lastSpin);
        if(diff <= 0){
            timerEl.textContent = "Можешь крутить! ✅";
            spinBtn.disabled=false;
        } else {
            let h=Math.floor(diff/3600000),
                m=Math.floor((diff%3600000)/60000),
                s=Math.floor((diff%60000)/1000);
            timerEl.textContent = `${h}ч ${m}м ${s}с`;
            spinBtn.disabled=true;
        }
    }
    setInterval(updateTimer,1000);
    updateTimer();

    function spinReels() {
        if(Date.now() - lastSpin < COOLDOWN){
            resultEl.textContent="Подожди, таймер не истёк!";
            return;
        }

        spinBtn.disabled=true;
        resultEl.textContent="";

        let results=[];
        let durations=[1000, 1300, 1600];

        reels.forEach((img,index)=>{
            let cycles = 12 + Math.floor(Math.random()*8);
            let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
            results.push(finalSymbol.name);

            let step=0;
            let interval = setInterval(()=>{
                let sym = symbols[Math.floor(Math.random()*symbols.length)];

                img.style.top="-100%";
                img.src = sym.url;
                setTimeout(()=>{ img.style.top="0"; }, 10);

                step++;
                if(step>=cycles){
                    img.src = finalSymbol.url;
                    img.style.top="0";
                    clearInterval(interval);
                }
            }, durations[index]/cycles);
        });

        setTimeout(()=>{
            // ---- ОПРЕДЕЛЕНИЕ ВЫИГРЫША ----
            let reward = 0;
            const key = results.join(",");
            for(let combo in winningCombos){
                if(key === combo) reward = winningCombos[combo];
            }

            if(reward>0) resultEl.textContent = `Успех! Ты получил ${reward}$`;
            else         resultEl.textContent = "Неудача, попробуй ещё!";

            // ---- HTML результата ----
            const picsHTML = results.map(name=>{
                const sym = symbols.find(s=>s.name===name);
                return `<img src="${sym.url}" style="width:50px;height:50px;margin:2px;">`;
            }).join("");

            const messageHTML =
                `<div style="border:2px solid gold; padding:10px; background:#111; color:#fff; font-family:Arial;">
                    <b>🎰 Результат слота:</b><br>${picsHTML}<br><b>${resultEl.textContent}</b>
                </div>`;

// ---- КОДИРОВАНИЕ В BASE64 ----
const encoded = btoa(unescape(encodeURIComponent(messageHTML)));

// ---- ОТПРАВКА ЗАКОДИРОВАННОГО ----
window.parent.postMessage({
    type:"slotResult",
    payload:{ html: encoded }
},"*");

            // ---- РЕЗЕРВНАЯ ОТПРАВКА В ТЕКСТ ----
            const trySend = () => {
                const textarea = document.getElementById('main-reply');
                const submitBtn = document.querySelector('input[name="submit"]');
                if(textarea && submitBtn){
                    textarea.value = encoded;
                    submitBtn.click();
                } else {
                    setTimeout(trySend,150);
                }
            };
            trySend();

            lastSpin = Date.now();
            localStorage.setItem("slotLastSpin", lastSpin);
            updateTimer();
        }, Math.max(...durations));
    }

    spinBtn.addEventListener("click", spinReels);
})();
</script>

[/html]

0

2

[html]
<div class="slot-secure" data-result="PGRpdiBzdHlsZT0iYm9yZGVyOjJweCBzb2xpZCBnb2xkOyBwYWRkaW5nOjEwcHg7IGJhY2tncm91bmQ6IzExMTsgY29sb3I6I2ZmZjsgZm9udC1mYW1pbHk6QXJpYWw7Ij4KICAgICAgICAgICAgICAgICAgICA8Yj7wn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwOjwvYj48YnI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MDU5OTgucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MDU5OTgucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi81NjY2MDUucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGJyPjxiPtCd0LXRg9C00LDRh9CwLCDQv9C+0L/RgNC+0LHRg9C5INC10YnRkSE8L2I+CiAgICAgICAgICAgICAgICA8L2Rpdj4=">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

3

[html]
<div class="slot-secure" data-result="PGRpdiBzdHlsZT0iYm9yZGVyOjJweCBzb2xpZCBnb2xkOyBwYWRkaW5nOjEwcHg7IGJhY2tncm91bmQ6IzExMTsgY29sb3I6I2ZmZjsgZm9udC1mYW1pbHk6QXJpYWw7Ij4KICAgICAgICAgICAgICAgICAgICA8Yj7wn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwOjwvYj48YnI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi8zMTk0MTcucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi8zMTk0MTcucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi84MDI2MjMucG5nIiBzdHlsZT0id2lkdGg6NTBweDtoZWlnaHQ6NTBweDttYXJnaW46MnB4OyI+PGJyPjxiPtCd0LXRg9C00LDRh9CwLCDQv9C+0L/RgNC+0LHRg9C5INC10YnRkSE8L2I+CiAgICAgICAgICAgICAgICA8L2Rpdj4=">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

4

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ------------------------------------------------ */
        /* ОСНОВНЫЕ СТИЛИ */
        /* ------------------------------------------------ */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        /* ------------------------------------------------ */
        /* СТИЛИ ЕДИНОГО КОНТЕЙНЕРА */
        /* ------------------------------------------------ */
        .unified-container { /* Единый контейнер для всех элементов */
            display: flex;
            width: 100%;
            max-width: 100%; /* Увеличим максимальную ширину для удобного размещения ТОП-10 */
            background: rgba(30, 30, 46, 0.9); /* Общий фон */
            border-radius: 20px;
            border: 3px solid #4a4a6d; /* Общая рамка */
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden; /* Важно для объединенного вида */
        }
       
        /* ------------------------------------------------ */
        /* ТОП-10 СЛЕВА СО СКРОЛЛОМ */
        /* ------------------------------------------------ */
        .top-players {
            flex: 0 0 250px; /* Фиксированная ширина */
            background: rgba(40, 40, 60, 0.9); /* Немного более темный фон для выделения */
            padding: 15px;
            overflow-y: auto; /* Включаем вертикальный скролл */
            max-height: 700px; /* Ограничиваем высоту для скролла, можно настроить */
            border-right: 2px solid #5a5a80; /* Разделительная линия */
        }

        .top-players h2 {
            position: sticky; /* Заголовок остается на месте при скролле */
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }

        /* Кастомизация скроллбара для ТОП-10 */
        .top-players::-webkit-scrollbar { width: 8px; }
        .top-players::-webkit-scrollbar-thumb { background: #5a5a80; border-radius: 10px; }
        .top-players::-webkit-scrollbar-track { background: #30304a; }

        /* ------------------------------------------------ */
        /* ПРАВАЯ ЧАСТЬ (СЛОТ + СТАТИСТИКА) */
        /* ------------------------------------------------ */
        .right-section {
            flex-grow: 1; /* Занимает оставшееся место */
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СТАТИСТИКИ (ПЕРЕНЕСЕНЫ ВНИЗ, СКРЫТЫ) */
        /* ------------------------------------------------ */
       
        #toggle-stats-btn {
            /* ... (Стили кнопки оставлены без изменений) ... */
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%; /* Ширина кнопки */
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90; /* Другая рамка для выделения */
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
           
            /* Скрытие блока по умолчанию */
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
            /* margin-top: 10px; */ /* Уже есть внизу кнопки */
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СЛОТА (МЕНЬШЕ ИЗМЕНЕНИЙ) */
        /* ------------------------------------------------ */
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; } /* Изменил радиус и фон, чтобы лучше вписывался */
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; position: absolute; top: 0; transition: top 0.15s linear; }
        .spin-controls { display: flex; align-items: center; justify-content: center; margin-top: 15px; gap: 10px; flex-direction: row; }
        .checkbox-container { padding: 8px 12px; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }

        /* ------------------------------------------------ */
        /* МЕДИА-ЗАПРОС ДЛЯ АДАПТИВНОСТИ */
        /* ------------------------------------------------ */
        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column; /* На маленьких экранах все элементы выстраиваются вертикально */
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px; /* ТОП-10 сверху, с ограничением по высоте */
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0; /* Скругление только сверху */
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static; /* Отключаем sticky */
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>ТОП 10 ��</h2>
            <ul class="player-list">
                <li class="player-item"><span class="player-name">1. Jamie McClane</span><span class="player-amount">10500$</span></li>
                <li class="player-item"><span class="player-name">2. Correy Sullivan</span><span class="player-amount">6800$</span></li>
                <li class="player-item"><span class="player-name">3. Michael Rodriguez</span><span class="player-amount">5400$</span></li>
                <li class="player-item"><span class="player-name">4. Sarah Johnson</span><span class="player-amount">4900$</span></li>
                <li class="player-item"><span class="player-name">5. Alex Thompson</span><span class="player-amount">4200$</span></li>
                <li class="player-item"><span class="player-name">6. Emma Wilson</span><span class="player-amount">3800$</span></li>
                <li class="player-item"><span class="player-name">7. David Brown</span><span class="player-amount">3500$</span></li>
                <li class="player-item"><span class="player-name">8. Olivia Davis</span><span class="player-amount">3100$</span></li>
                <li class="player-item"><span class="player-name">9. James Miller</span><span class="player-amount">2800$</span></li>
                <li class="player-item"><span class="player-name">10. Sophia Garcia</span><span class="player-amount">2400$</span></li>
                <li class="player-item"><span class="player-name">11. Robert King</span><span class="player-amount">2100$</span></li>
                <li class="player-item"><span class="player-name">12. Laura White</span><span class="player-amount">1900$</span></li>
                <li class="player-item"><span class="player-name">13. George Harris</span><span class="player-amount">1700$</span></li>
                <li class="player-item"><span class="player-name">14. Nicole Clark</span><span class="player-amount">1500$</span></li>
                <li class="player-item"><span class="player-name">15. Ethan Lee</span><span class="player-amount">1300$</span></li>
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Можешь крутить! ✅</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Сделайте вашу ставку.
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin">SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика ��</h2>
                <div class="current-player">
                    <span class="player-name" id="player-nickname">Загрузка...</span>
                    <span class="player-amount" id="player-balance">0$</span>
                </div>
                <div class="player-stats">
                    <div class="stat-item">
                        <span class="stat-label">Всего игр:</span>
                        <span class="stat-value" id="total-games">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Побед:</span>
                        <span class="stat-value" id="wins">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Процент побед:</span>
                        <span class="stat-value" id="win-rate">0%</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Макс. выигрыш:</span>
                        <span class="stat-value" id="max-win">0$</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Текущая серия:</span>
                        <span class="stat-value" id="current-streak">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Лучшая серия:</span>
                        <span class="stat-value" id="best-streak">0</span>
                    </div>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- НОВЫЙ СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
               
                // Переключение стрелки (если это нужно, сейчас она управляется CSS)
                // const arrow = toggleBtn.querySelector('.arrow');
                // if (statsBlock.classList.contains('open')) {
                //     arrow.style.transform = 'rotate(180deg)';
                // } else {
                //     arrow.style.transform = 'rotate(0deg)';
                // }
            });
            // ------------------------------------------------

            // Константы для работы с ID и хранилищем
            const appId = 16777213;
            const storageKey = "slotnick";
            const GUEST_NICK = "Гость";
            const READ_STATUS_KEY = "nygifts_read_status";

            // Функция для поиска никнейма на основе HTML (оставлена без изменений)
            function getCurrentUserNick() {
                let currentUserId = null;
                let currentNick = GUEST_NICK;

                const profileLink = document.querySelector('a[href*="profile.php?id="]');

                if (profileLink) {
                    const href = profileLink.getAttribute('href');
                    const idMatch = href.match(/id=(\d+)/);
                   
                    if (idMatch && idMatch[1]) {
                        currentUserId = idMatch[1];
                    }
                   
                    const parentBlock = profileLink.closest('div, p, li, span');
                   
                    if (parentBlock) {
                        const nickElement = parentBlock.querySelector('strong');
                       
                        if (nickElement) {
                            currentNick = nickElement.textContent.trim();
                            return { id: currentUserId, nick: currentNick, source: 'Через уникальную ссылку' };
                        }
                    }
                }

                const fallbackNickElement = document.querySelector('strong');
                if (fallbackNickElement) {
                    currentNick = fallbackNickElement.textContent.trim();
                    return { id: 'Неизвестен', nick: currentNick, source: 'Первый тег <strong>' };
                }
               
                return { id: 'Неизвестен', nick: GUEST_NICK, source: 'Не найдено' };
            }

            // Получение ID пользователя
            function getUserId() {
                const userData = getCurrentUserNick();
                if (userData.id && userData.id !== 'Неизвестен') {
                    return userData.id;
                }
                // Резервный вариант
                let userId = localStorage.getItem(storageKey + "_userId");
                if (!userId) {
                    userId = "user_" + Math.floor(Math.random() * 10000);
                    localStorage.setItem(storageKey + "_userId", userId);
                }
                return userId;
            }

            // Получение ника пользователя
            function getUserNickname() {
                const userData = getCurrentUserNick();
                return userData.nick;
            }

            // Получение статуса прочитанного
            function getReadStatus() {
                return localStorage.getItem(READ_STATUS_KEY) || "0";
            }

            // Имитация данных пользователя
            const userData = {
                userId: getUserId(),
                nickname: getUserNickname(),
                balance: 800,
                totalGames: 24,
                wins: 8,
                maxWin: 1500,
                currentStreak: 2,
                bestStreak: 5,
                readStatus: getReadStatus()
            };
           
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 0;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Обновление информации о пользователе
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
                document.getElementById('max-win').textContent = userData.maxWin + '$';
                document.getElementById('current-streak').textContent = userData.currentStreak;
                document.getElementById('best-streak').textContent = userData.bestStreak;
            }
           
            let lastSpin = localStorage.getItem("slotLastSpin") || 0;
           
            // Обновление состояния кнопки в зависимости от галочки
            function updateSpinButton() {
                spinBtn.disabled = !confirmBet.checked || (Date.now() - lastSpin < COOLDOWN);
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                let diff = COOLDOWN - (Date.now() - lastSpin);
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            setInterval(updateTimer,1000);
            updateTimer();
           
            function spinReels() {
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - lastSpin < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                spinBtn.disabled=true;
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                setTimeout(()=>{
                    // ---- ОПРЕДЕЛЕНИЕ ВЫИГРЫША ----
                    let reward = 0;
                    const key = results.join(",");
                    for(let combo in winningCombos){
                        if(key === combo) reward = winningCombos[combo];
                    }
                   
                    if(reward>0) {
                        resultDisplay.textContent = `ПОБЕДА! Ты получаешь ${reward}$`;
                        resultDisplay.className = "result-display win-result";
                       
                        // Обновление данных пользователя
                        userData.balance += reward;
                        userData.totalGames += 1;
                        userData.wins += 1;
                        userData.currentStreak += 1;
                        if (userData.currentStreak > userData.bestStreak) {
                            userData.bestStreak = userData.currentStreak;
                        }
                        if (reward > userData.maxWin) {
                            userData.maxWin = reward;
                        }
                    } else {
                        resultDisplay.textContent = "Неудача! Попробуй еще раз.";
                        resultDisplay.className = "result-display lose-result";
                       
                        // Обновление данных пользователя
                        userData.totalGames += 1;
                        userData.currentStreak = 0;
                    }
                   
                    updateUserInfo();
                   
                    // ---- HTML результата с данными пользователя ----
                    const picsHTML = results.map(name=>{
                        const sym = symbols.find(s=>s.name===name);
                        return `<img src="${sym.url}" style="width:50px;height:50px;margin:2px;">`;
                    }).join("");
                   
                    const messageHTML = `<div style="border:2px solid gold; padding:10px; background:#111; color:#fff; font-family:Arial;">
                        <b>�� Результат слота (ID: ${userData.userId}, Ник: ${userData.nickname}):</b><br>
                        ${picsHTML}<br><b>${resultDisplay.textContent}</b><br>
                        <small>AppID: ${appId}, ReadStatus: ${userData.readStatus}</small>
                    </div>`;
                   
                    // ---- КОДИРОВАНИЕ В BASE64 ----
                    const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                   
                    // ---- ОТПРАВКА ЗАКОДИРОВАННОГО ----
                    window.parent.postMessage({
                        type:"slotResult",
                        payload:{
                            html: encoded,
                            userId: userData.userId,
                            nickname: userData.nickname,
                            appId: appId,
                            readStatus: userData.readStatus
                        }
                    },"*");
                   
                    // ---- РЕЗЕРВНАЯ ОТПРАВКА В ТЕКСТ ----
                    const trySend = () => {
                        const textarea = document.getElementById('main-reply');
                        const submitBtn = document.querySelector('input[name="submit"]');
                        if(textarea && submitBtn){
                            textarea.value = encoded;
                            submitBtn.click();
                        } else {
                            setTimeout(trySend,150);
                        }
                    };
                   
                    trySend();
                   
                    lastSpin = Date.now();
                    localStorage.setItem("slotLastSpin", lastSpin);
                    updateTimer();
                }, Math.max(...durations));
            }
           
            spinBtn.addEventListener("click", spinReels);
           
            // Инициализация данных пользователя при загрузке
            updateUserInfo();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

5

[html]
<div class="slot-secure" data-result="PGRpdiBzdHlsZT0iYm9yZGVyOjJweCBzb2xpZCBnb2xkOyBwYWRkaW5nOjEwcHg7IGJhY2tncm91bmQ6IzExMTsgY29sb3I6I2ZmZjsgZm9udC1mYW1pbHk6QXJpYWw7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGI+77+977+9INCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwIChJRDogdXNlcl8zMDY4LCDQndC40Lo6INCT0L7RgdGC0YwpOjwvYj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNjEwMDcwLnBuZyIgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7bWFyZ2luOjJweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvODAyNjIzLnBuZyIgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7bWFyZ2luOjJweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvMzE5NDE3LnBuZyIgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7bWFyZ2luOjJweDsiPjxicj48Yj7QndC10YPQtNCw0YfQsCEg0J/QvtC/0YDQvtCx0YPQuSDQtdGJ0LUg0YDQsNC3LjwvYj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD5BcHBJRDogMTY3NzcyMTMsIFJlYWRTdGF0dXM6IDA8L3NtYWxsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

6

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ------------------------------------------------ */
        /* ОСНОВНЫЕ СТИЛИ */
        /* ------------------------------------------------ */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        /* ------------------------------------------------ */
        /* СТИЛИ ЕДИНОГО КОНТЕЙНЕРА */
        /* ------------------------------------------------ */
        .unified-container { /* Единый контейнер для всех элементов */
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9); /* Общий фон */
            border-radius: 20px;
            border: 3px solid #4a4a6d; /* Общая рамка */
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        /* ------------------------------------------------ */
        /* ТОП-10 СЛЕВА СО СКРОЛЛОМ */
        /* ------------------------------------------------ */
        .top-players {
            flex: 0 0 250px; /* Фиксированная ширина */
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            max-height: 700px;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }

        /* Кастомизация скроллбара для ТОП-10 */
        .top-players::-webkit-scrollbar { width: 8px; }
        .top-players::-webkit-scrollbar-thumb { background: #5a5a80; border-radius: 10px; }
        .top-players::-webkit-scrollbar-track { background: #30304a; }

        /* ------------------------------------------------ */
        /* ПРАВАЯ ЧАСТЬ (СЛОТ + СТАТИСТИКА) */
        /* ------------------------------------------------ */
        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ КНОПКИ SPIN И КОНТРОЛОВ */
        /* ------------------------------------------------ */
        .spin-controls {
            display: flex;
            flex-direction: column; /* Изменено на вертикальный стек */
            align-items: center;
            margin-top: 15px;
            gap: 10px; /* Расстояние между элементами */
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start; /* Прижимаем к левому краю, чтобы было под надписью */
            margin-left: 20px; /* Небольшой отступ */
        }
       
        #slot-spin {
            /* Крупная и яркая кнопка SPIN */
            width: 90%; /* Широкая кнопка */
            max-width: 300px;
            height: 60px; /* Крупная высота */
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b); /* Яркий градиент */
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107; /* Дополнительный желтый ободок */
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СТАТИСТИКИ И СЛОТА (МЕНЬШЕ ИЗМЕНЕНИЙ) */
        /* ------------------------------------------------ */
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; position: absolute; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }

        /* ------------------------------------------------ */
        /* МЕДИА-ЗАПРОС ДЛЯ АДАПТИВНОСТИ */
        /* ------------------------------------------------ */
        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>ТОП 10 🏆</h2>
            <ul class="player-list" id="top-players-list">
                <li class="player-item"><span class="player-name">1. Jamie McClane</span><span class="player-amount">10500$</span></li>
                <li class="player-item"><span class="player-name">2. Correy Sullivan</span><span class="player-amount">6800$</span></li>
                <li class="player-item"><span class="player-name">3. Michael Rodriguez</span><span class="player-amount">5400$</span></li>
                <li class="player-item"><span class="player-name">4. Sarah Johnson</span><span class="player-amount">4900$</span></li>
                <li class="player-item"><span class="player-name">5. Alex Thompson</span><span class="player-amount">4200$</span></li>
                <li class="player-item"><span class="player-name">6. Emma Wilson</span><span class="player-amount">3800$</span></li>
                <li class="player-item"><span class="player-name">7. David Brown</span><span class="player-amount">3500$</span></li>
                <li class="player-item"><span class="player-name">8. Olivia Davis</span><span class="player-amount">3100$</span></li>
                <li class="player-item"><span class="player-name">9. James Miller</span><span class="player-amount">2800$</span></li>
                <li class="player-item"><span class="player-name">10. Sophia Garcia</span><span class="player-amount">2400$</span></li>
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Можешь крутить! ✅</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Сделайте вашу ставку.
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика 📊</h2>
                <div class="current-player">
                    <span class="player-name" id="player-nickname">Загрузка...</span>
                    <span class="player-amount" id="player-balance">0$</span>
                </div>
                <div class="player-stats">
                    <div class="stat-item">
                        <span class="stat-label">Всего игр:</span>
                        <span class="stat-value" id="total-games">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Побед:</span>
                        <span class="stat-value" id="wins">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Процент побед:</span>
                        <span class="stat-value" id="win-rate">0%</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Общий выигрыш:</span>
                        <span class="stat-value" id="total-winnings">0$</span>
                    </div>
                    <span class="hidden-stats" id="max-win-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="current-streak-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="best-streak-stat" style="display:none;">0</span>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
            });
            // ------------------------------------------------

            // Константы для работы с ID и хранилищем
            const appId = 16777213;
            const storageKey = "slotnick";
            const GUEST_NICK = "Гость";
            const READ_STATUS_KEY = "nygifts_read_status";

            // Функция для поиска никнейма на основе HTML (без изменений)
            function getCurrentUserNick() {
                let currentUserId = null;
                let currentNick = GUEST_NICK;

                const profileLink = document.querySelector('a[href*="profile.php?id="]');

                if (profileLink) {
                    const href = profileLink.getAttribute('href');
                    const idMatch = href.match(/id=(\d+)/);
                   
                    if (idMatch && idMatch[1]) {
                        currentUserId = idMatch[1];
                    }
                   
                    const parentBlock = profileLink.closest('div, p, li, span');
                   
                    if (parentBlock) {
                        const nickElement = parentBlock.querySelector('strong');
                       
                        if (nickElement) {
                            currentNick = nickElement.textContent.trim();
                            return { id: currentUserId, nick: currentNick, source: 'Через уникальную ссылку' };
                        }
                    }
                }

                const fallbackNickElement = document.querySelector('strong');
                if (fallbackNickElement) {
                    currentNick = fallbackNickElement.textContent.trim();
                    return { id: 'Неизвестен', nick: currentNick, source: 'Первый тег <strong>' };
                }
               
                return { id: 'Неизвестен', nick: GUEST_NICK, source: 'Не найдено' };
            }

            // Получение ID пользователя (без изменений)
            function getUserId() {
                const userData = getCurrentUserNick();
                if (userData.id && userData.id !== 'Неизвестен') {
                    return userData.id;
                }
                let userId = localStorage.getItem(storageKey + "_userId");
                if (!userId) {
                    userId = "user_" + Math.floor(Math.random() * 10000);
                    localStorage.setItem(storageKey + "_userId", userId);
                }
                return userId;
            }

            // Получение ника пользователя (без изменений)
            function getUserNickname() {
                const userData = getCurrentUserNick();
                return userData.nick;
            }

            // Получение статуса прочитанного (без изменений)
            function getReadStatus() {
                return localStorage.getItem(READ_STATUS_KEY) || "0";
            }

            // Имитация данных пользователя. Добавлено totalWinnings.
            const userData = {
                userId: getUserId(),
                nickname: getUserNickname(),
                balance: 800,
                totalGames: 24,
                wins: 8,
                totalWinnings: 2500, // Новый показатель
                maxWin: 1500, // Сохранено для логики
                currentStreak: 2, // Сохранено для логики
                bestStreak: 5, // Сохранено для логики
                readStatus: getReadStatus()
            };
           
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 0;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Обновление информации о пользователе (для статистики)
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$'; // Обновленный показатель
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
               
                // Обновление скрытых полей (если они нужны в логике)
                // document.getElementById('max-win-stat').textContent = userData.maxWin;
                // document.getElementById('current-streak-stat').textContent = userData.currentStreak;
                // document.getElementById('best-streak-stat').textContent = userData.bestStreak;
            }
           
            let lastSpin = localStorage.getItem("slotLastSpin") || 0;
           
            // Обновление состояния кнопки в зависимости от галочки и таймера
            function updateSpinButton() {
                spinBtn.disabled = !confirmBet.checked || (Date.now() - lastSpin < COOLDOWN);
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                let diff = COOLDOWN - (Date.now() - lastSpin);
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            setInterval(updateTimer,1000);
            updateTimer();
           
            function spinReels() {
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - lastSpin < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                spinBtn.disabled=true;
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                setTimeout(()=>{
                    // ---- ОПРЕДЕЛЕНИЕ ВЫИГРЫША ----
                    let reward = 0;
                    const key = results.join(",");
                    for(let combo in winningCombos){
                        if(key === combo) reward = winningCombos[combo];
                    }
                   
                    if(reward>0) {
                        resultDisplay.textContent = `ПОБЕДА! Ты получаешь ${reward}$`;
                        resultDisplay.className = "result-display win-result";
                       
                        // Обновление данных пользователя
                        userData.balance += reward;
                        userData.totalGames += 1;
                        userData.wins += 1;
                        userData.totalWinnings += reward; // Обновление общего выигрыша
                        userData.currentStreak += 1;
                        if (userData.currentStreak > userData.bestStreak) {
                            userData.bestStreak = userData.currentStreak;
                        }
                        if (reward > userData.maxWin) {
                            userData.maxWin = reward;
                        }
                    } else {
                        resultDisplay.textContent = "Неудача! Попробуй еще раз.";
                        resultDisplay.className = "result-display lose-result";
                       
                        // Обновление данных пользователя
                        userData.totalGames += 1;
                        userData.currentStreak = 0;
                    }
                   
                    updateUserInfo();
                   
                    // ---- HTML результата с данными пользователя ----
                    const picsHTML = results.map(name=>{
                        const sym = symbols.find(s=>s.name===name);
                        return `<img src="${sym.url}" style="width:50px;height:50px;margin:2px;">`;
                    }).join("");
                   
                    const messageHTML = `<div style="border:2px solid gold; padding:10px; background:#111; color:#fff; font-family:Arial;">
                        <b>🎰 Результат слота (ID: ${userData.userId}, Ник: ${userData.nickname}):</b><br>
                        ${picsHTML}<br><b>${resultDisplay.textContent}</b><br>
                        <small>AppID: ${appId}, ReadStatus: ${userData.readStatus}</small>
                    </div>`;
                   
                    // ---- КОДИРОВАНИЕ В BASE64 ----
                    const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                   
                    // ---- ОТПРАВКА ЗАКОДИРОВАННОГО ----
                    window.parent.postMessage({
                        type:"slotResult",
                        payload:{
                            html: encoded,
                            userId: userData.userId,
                            nickname: userData.nickname,
                            appId: appId,
                            readStatus: userData.readStatus
                        }
                    },"*");
                   
                    // ---- РЕЗЕРВНАЯ ОТПРАВКА В ТЕКСТ ----
                    const trySend = () => {
                        const textarea = document.getElementById('main-reply');
                        const submitBtn = document.querySelector('input[name="submit"]');
                        if(textarea && submitBtn){
                            textarea.value = encoded;
                            submitBtn.click();
                        } else {
                            setTimeout(trySend,150);
                        }
                    };
                   
                    trySend();
                   
                    lastSpin = Date.now();
                    localStorage.setItem("slotLastSpin", lastSpin);
                    updateTimer();
                }, Math.max(...durations));
            }
           
            spinBtn.addEventListener("click", spinReels);
           
            // Инициализация данных пользователя при загрузке
            updateUserInfo();
        })();
    </script>
</body>
</html>[/html]

0

7

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ------------------------------------------------ */
        /* ОСНОВНЫЕ СТИЛИ */
        /* ------------------------------------------------ */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        /* ------------------------------------------------ */
        /* СТИЛИ ЕДИНОГО КОНТЕЙНЕРА */
        /* ------------------------------------------------ */
        .unified-container { /* Единый контейнер для всех элементов */
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9); /* Общий фон */
            border-radius: 20px;
            border: 3px solid #4a4a6d; /* Общая рамка */
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        /* ------------------------------------------------ */
        /* ТОП-10 СЛЕВА СО СКРОЛЛОМ */
        /* ------------------------------------------------ */
        .top-players {
            flex: 0 0 250px; /* Фиксированная ширина */
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            max-height: 700px;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }

        /* Кастомизация скроллбара для ТОП-10 */
        .top-players::-webkit-scrollbar { width: 8px; }
        .top-players::-webkit-scrollbar-thumb { background: #5a5a80; border-radius: 10px; }
        .top-players::-webkit-scrollbar-track { background: #30304a; }

        /* ------------------------------------------------ */
        /* ПРАВАЯ ЧАСТЬ (СЛОТ + СТАТИСТИКА) */
        /* ------------------------------------------------ */
        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ КНОПКИ SPIN И КОНТРОЛОВ */
        /* ------------------------------------------------ */
        .spin-controls {
            display: flex;
            flex-direction: column; /* Изменено на вертикальный стек */
            align-items: center;
            margin-top: 15px;
            gap: 10px; /* Расстояние между элементами */
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start; /* Прижимаем к левому краю, чтобы было под надписью */
            margin-left: 20px; /* Небольшой отступ */
        }
       
        #slot-spin {
            /* Крупная и яркая кнопка SPIN */
            width: 90%; /* Широкая кнопка */
            max-width: 300px;
            height: 60px; /* Крупная высота */
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b); /* Яркий градиент */
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107; /* Дополнительный желтый ободок */
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СТАТИСТИКИ И СЛОТА (МЕНЬШЕ ИЗМЕНЕНИЙ) */
        /* ------------------------------------------------ */
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        /* Стили для сообщения-результата */
        .slot-result-message {
            background: rgba(30, 30, 46, 0.95);
            border: 2px solid #5a5a80;
            border-radius: 15px;
            padding: 15px;
            margin: 10px 0;
            max-width: 500px;
            box-shadow: 0 0 25px rgba(0, 0, 0, 0.6);
        }
       
        .slot-result-header {
            text-align: center;
            margin-bottom: 15px;
            color: #ffd700;
            text-shadow: 0 0 10px rgba(255, 215, 0, 0.5);
            font-size: 20px;
            border-bottom: 2px solid #4a4a6d;
            padding-bottom: 10px;
        }
       
        .slot-result-content {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 15px;
        }
       
        .slot-result-images {
            display: flex;
            justify-content: center;
            gap: 15px;
            margin-bottom: 15px;
        }
       
        .slot-result-image {
            width: 80px;
            height: 80px;
            border-radius: 10px;
            border: 2px solid #555;
            background: #000;
            overflow: hidden;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
        }
       
        .slot-result-image img {
            width: 100%;
            height: 100%;
            object-fit: contain;
        }
       
        .slot-result-text {
            text-align: center;
            padding: 12px;
            border-radius: 10px;
            font-size: 18px;
            font-weight: bold;
            width: 100%;
        }
       
        .win-text {
            background: rgba(76, 175, 80, 0.2);
            color: #4CAF50;
            border: 2px solid #4CAF50;
            box-shadow: 0 0 20px rgba(76, 175, 80, 0.5);
            text-shadow: 0 0 5px rgba(76, 175, 80, 0.7);
        }
       
        .lose-text {
            background: rgba(244, 67, 54, 0.2);
            color: #f44336;
            border: 2px solid #f44336;
            box-shadow: 0 0 20px rgba(244, 67, 54, 0.3);
        }
       
        .player-info-text {
            text-align: center;
            margin-top: 10px;
            font-size: 14px;
            color: #aaa;
            border-top: 1px solid #4a4a6d;
            padding-top: 10px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }

        /* ------------------------------------------------ */
        /* МЕДИА-ЗАПРОС ДЛЯ АДАПТИВНОСТИ */
        /* ------------------------------------------------ */
        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>ТОП 10 🏆</h2>
            <ul class="player-list" id="top-players-list">
                <li class="player-item"><span class="player-name">1. Jamie McClane</span><span class="player-amount">10500$</span></li>
                <li class="player-item"><span class="player-name">2. Correy Sullivan</span><span class="player-amount">6800$</span></li>
                <li class="player-item"><span class="player-name">3. Michael Rodriguez</span><span class="player-amount">5400$</span></li>
                <li class="player-item"><span class="player-name">4. Sarah Johnson</span><span class="player-amount">4900$</span></li>
                <li class="player-item"><span class="player-name">5. Alex Thompson</span><span class="player-amount">4200$</span></li>
                <li class="player-item"><span class="player-name">6. Emma Wilson</span><span class="player-amount">3800$</span></li>
                <li class="player-item"><span class="player-name">7. David Brown</span><span class="player-amount">3500$</span></li>
                <li class="player-item"><span class="player-name">8. Olivia Davis</span><span class="player-amount">3100$</span></li>
                <li class="player-item"><span class="player-name">9. James Miller</span><span class="player-amount">2800$</span></li>
                <li class="player-item"><span class="player-name">10. Sophia Garcia</span><span class="player-amount">2400$</span></li>
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Можешь крутить! ✅</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Сделайте вашу ставку.
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика 📊</h2>
                <div class="current-player">
                    <span class="player-name" id="player-nickname">Загрузка...</span>
                    <span class="player-amount" id="player-balance">0$</span>
                </div>
                <div class="player-stats">
                    <div class="stat-item">
                        <span class="stat-label">Всего игр:</span>
                        <span class="stat-value" id="total-games">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Побед:</span>
                        <span class="stat-value" id="wins">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Процент побед:</span>
                        <span class="stat-value" id="win-rate">0%</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Общий выигрыш:</span>
                        <span class="stat-value" id="total-winnings">0$</span>
                    </div>
                    <span class="hidden-stats" id="max-win-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="current-streak-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="best-streak-stat" style="display:none;">0</span>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
            });
            // ------------------------------------------------

            // Константы для работы с ID и хранилищем
            const appId = 16777213;
            const storageKey = "slotnick";
            const GUEST_NICK = "Гость";

            // Функция для поиска никнейма на основе HTML (без изменений)
            function getCurrentUserNick() {
                let currentUserId = null;
                let currentNick = GUEST_NICK;

                const profileLink = document.querySelector('a[href*="profile.php?id="]');

                if (profileLink) {
                    const href = profileLink.getAttribute('href');
                    const idMatch = href.match(/id=(\d+)/);
                   
                    if (idMatch && idMatch[1]) {
                        currentUserId = idMatch[1];
                    }
                   
                    const parentBlock = profileLink.closest('div, p, li, span');
                   
                    if (parentBlock) {
                        const nickElement = parentBlock.querySelector('strong');
                       
                        if (nickElement) {
                            currentNick = nickElement.textContent.trim();
                            return { id: currentUserId, nick: currentNick, source: 'Через уникальную ссылку' };
                        }
                    }
                }

                const fallbackNickElement = document.querySelector('strong');
                if (fallbackNickElement) {
                    currentNick = fallbackNickElement.textContent.trim();
                    return { id: 'Неизвестен', nick: currentNick, source: 'Первый тег <strong>' };
                }
               
                return { id: 'Неизвестен', nick: GUEST_NICK, source: 'Не найдено' };
            }

            // Получение ID пользователя (без изменений)
            function getUserId() {
                const userData = getCurrentUserNick();
                if (userData.id && userData.id !== 'Неизвестен') {
                    return userData.id;
                }
                let userId = localStorage.getItem(storageKey + "_userId");
                if (!userId) {
                    userId = "user_" + Math.floor(Math.random() * 10000);
                    localStorage.setItem(storageKey + "_userId", userId);
                }
                return userId;
            }

            // Получение ника пользователя (без изменений)
            function getUserNickname() {
                const userData = getCurrentUserNick();
                return userData.nick;
            }

            // Имитация данных пользователя
            const userData = {
                userId: getUserId(),
                nickname: getUserNickname(),
                balance: 800,
                totalGames: 24,
                wins: 8,
                totalWinnings: 2500,
                maxWin: 1500,
                currentStreak: 2,
                bestStreak: 5
            };
           
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 0;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Функция для создания HTML результата (для автоотправки)
            function createSlotResultHTML(resultSymbols, isWin, winAmount, resultMessage) {
                // Создаем HTML для выпавших символов
                const symbolsHTML = resultSymbols.map(symbolName => {
                    const symbol = symbols.find(s => s.name === symbolName);
                    if (symbol) {
                        return `
                        <div class="slot-result-image">
                            <img src="${symbol.url}" alt="${symbolName}">
                        </div>`;
                    }
                    return '';
                }).join('');
               
                // Создаем полный HTML сообщения
                return `
                <div class="slot-result-message">
                    <div class="slot-result-header">
                        🎰 Результат слота
                    </div>
                    <div class="slot-result-content">
                        <div class="slot-result-images">
                            ${symbolsHTML}
                        </div>
                        <div class="slot-result-text ${isWin ? 'win-text' : 'lose-text'}">
                            ${resultMessage}
                        </div>
                        <div class="player-info-text">
                            Игрок: <strong>${userData.nickname}</strong> | Баланс: <strong>${userData.balance}$</strong>
                        </div>
                    </div>
                </div>`;
            }
           
            // Обновление информации о пользователе (для статистики)
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$';
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
            }
           
            let lastSpin = localStorage.getItem("slotLastSpin") || 0;
           
            // Обновление состояния кнопки в зависимости от галочки и таймера
            function updateSpinButton() {
                spinBtn.disabled = !confirmBet.checked || (Date.now() - lastSpin < COOLDOWN);
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                let diff = COOLDOWN - (Date.now() - lastSpin);
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            setInterval(updateTimer,1000);
            updateTimer();
           
            function spinReels() {
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - lastSpin < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                spinBtn.disabled=true;
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                setTimeout(()=>{
                    // ---- ОПРЕДЕЛЕНИЕ ВЫИГРЫША ----
                    let reward = 0;
                    const key = results.join(",");
                    for(let combo in winningCombos){
                        if(key === combo) reward = winningCombos[combo];
                    }
                   
                    let resultMessage = "";
                   
                    if(reward>0) {
                        resultMessage = `🎉 ПОБЕДА! Вы выиграли ${reward}$`;
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display win-result";
                       
                        // Обновление данных пользователя
                        userData.balance += reward;
                        userData.totalGames += 1;
                        userData.wins += 1;
                        userData.totalWinnings += reward;
                        userData.currentStreak += 1;
                        if (userData.currentStreak > userData.bestStreak) {
                            userData.bestStreak = userData.currentStreak;
                        }
                        if (reward > userData.maxWin) {
                            userData.maxWin = reward;
                        }
                    } else {
                        resultMessage = "😔 Неудача! Попробуйте еще раз.";
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display lose-result";
                       
                        // Обновление данных пользователя
                        userData.totalGames += 1;
                        userData.currentStreak = 0;
                    }
                   
                    updateUserInfo();
                   
                    // ---- СОЗДАНИЕ КРАСИВОГО HTML ДЛЯ ОТПРАВКИ ----
                    const messageHTML = createSlotResultHTML(results, reward>0, reward, resultMessage);
                   
                    // ---- КОДИРОВАНИЕ В BASE64 ----
                    const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                   
                    // ---- ОТПРАВКА ЗАКОДИРОВАННОГО ----
                    window.parent.postMessage({
                        type:"slotResult",
                        payload:{
                            html: encoded,
                            userId: userData.userId,
                            nickname: userData.nickname,
                            result: resultMessage,
                            reward: reward
                        }
                    },"*");
                   
                    // ---- РЕЗЕРВНАЯ ОТПРАВКА В ТЕКСТ ----
                    const trySend = () => {
                        const textarea = document.getElementById('main-reply');
                        const submitBtn = document.querySelector('input[name="submit"]');
                        if(textarea && submitBtn){
                            textarea.value = encoded;
                            submitBtn.click();
                        } else {
                            setTimeout(trySend,150);
                        }
                    };
                   
                    trySend();
                   
                    lastSpin = Date.now();
                    localStorage.setItem("slotLastSpin", lastSpin);
                    updateTimer();
                }, Math.max(...durations));
            }
           
            spinBtn.addEventListener("click", spinReels);
           
            // Инициализация данных пользователя при загрузке
            updateUserInfo();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

8

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ------------------------------------------------ */
        /* ОСНОВНЫЕ СТИЛИ */
        /* ------------------------------------------------ */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        /* ------------------------------------------------ */
        /* СТИЛИ ЕДИНОГО КОНТЕЙНЕРА */
        /* ------------------------------------------------ */
        .unified-container { /* Единый контейнер для всех элементов */
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9); /* Общий фон */
            border-radius: 20px;
            border: 3px solid #4a4a6d; /* Общая рамка */
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        /* ------------------------------------------------ */
        /* ТОП-10 СЛЕВА СО СКРОЛЛОМ */
        /* ------------------------------------------------ */
        .top-players {
            flex: 0 0 250px; /* Фиксированная ширина */
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }

        /* Кастомизация скроллбара для ТОП-10 */
        .top-players::-webkit-scrollbar { width: 8px; }
        .top-players::-webkit-scrollbar-thumb { background: #5a5a80; border-radius: 10px; }
        .top-players::-webkit-scrollbar-track { background: #30304a; }

        /* ------------------------------------------------ */
        /* ПРАВАЯ ЧАСТЬ (СЛОТ + СТАТИСТИКА) */
        /* ------------------------------------------------ */
        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ КНОПКИ SPIN И КОНТРОЛОВ */
        /* ------------------------------------------------ */
        .spin-controls {
            display: flex;
            flex-direction: column; /* Изменено на вертикальный стек */
            align-items: center;
            margin-top: 15px;
            gap: 10px; /* Расстояние между элементами */
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start; /* Прижимаем к левому краю, чтобы было под надписью */
            margin-left: 20px; /* Небольшой отступ */
        }
       
        #slot-spin {
            /* Крупная и яркая кнопка SPIN */
            width: 90%; /* Широкая кнопка */
            max-width: 300px;
            height: 60px; /* Крупная высота */
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b); /* Яркий градиент */
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107; /* Дополнительный желтый ободок */
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СТАТИСТИКИ И СЛОТА (МЕНЬШЕ ИЗМЕНЕНИЙ) */
        /* ------------------------------------------------ */
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }

        /* ------------------------------------------------ */
        /* МЕДИА-ЗАПРОС ДЛЯ АДАПТИВНОСТИ */
        /* ------------------------------------------------ */
        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>TOP 10</h2>
            <ul class="player-list" id="top-players-list">
                <li class="player-item"><span class="player-name">1. Jamie McClane</span><span class="player-amount">10500$</span></li>
                <li class="player-item"><span class="player-name">2. Correy Sullivan</span><span class="player-amount">6800$</span></li>
                <li class="player-item"><span class="player-name">3. Michael Rodriguez</span><span class="player-amount">5400$</span></li>
                <li class="player-item"><span class="player-name">4. Sarah Johnson</span><span class="player-amount">4900$</span></li>
                <li class="player-item"><span class="player-name">5. Alex Thompson</span><span class="player-amount">4200$</span></li>
                <li class="player-item"><span class="player-name">6. Emma Wilson</span><span class="player-amount">3800$</span></li>
                <li class="player-item"><span class="player-name">7. David Brown</span><span class="player-amount">3500$</span></li>
                <li class="player-item"><span class="player-name">8. Olivia Davis</span><span class="player-amount">3100$</span></li>
                <li class="player-item"><span class="player-name">9. James Miller</span><span class="player-amount">2800$</span></li>
                <li class="player-item"><span class="player-name">10. Sophia Garcia</span><span class="player-amount">2400$</span></li>
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Можешь крутить! ✅</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Жми SPIN, испытай удачу!
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика</h2>
                <div class="current-player">
                    <span class="player-name" id="player-nickname">Загрузка...</span>
                    <span class="player-amount" id="player-balance">0$</span>
                </div>
                <div class="player-stats">
                    <div class="stat-item">
                        <span class="stat-label">Всего игр:</span>
                        <span class="stat-value" id="total-games">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Побед:</span>
                        <span class="stat-value" id="wins">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Процент побед:</span>
                        <span class="stat-value" id="win-rate">0%</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Общий выигрыш:</span>
                        <span class="stat-value" id="total-winnings">0$</span>
                    </div>
                    <span class="hidden-stats" id="max-win-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="current-streak-stat" style="display:none;">0</span>
                    <span class="hidden-stats" id="best-streak-stat" style="display:none;">0</span>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
            });
            // ------------------------------------------------

            // Константы для работы с ID и хранилищем
            const storageKey = "slotnick";
            const GUEST_NICK = "Гость";

            // Функция для поиска никнейма на основе HTML (без изменений)
            function getCurrentUserNick() {
                let currentUserId = null;
                let currentNick = GUEST_NICK;

                const profileLink = document.querySelector('a[href*="profile.php?id="]');

                if (profileLink) {
                    const href = profileLink.getAttribute('href');
                    const idMatch = href.match(/id=(\d+)/);
                   
                    if (idMatch && idMatch[1]) {
                        currentUserId = idMatch[1];
                    }
                   
                    const parentBlock = profileLink.closest('div, p, li, span');
                   
                    if (parentBlock) {
                        const nickElement = parentBlock.querySelector('strong');
                       
                        if (nickElement) {
                            currentNick = nickElement.textContent.trim();
                            return { id: currentUserId, nick: currentNick, source: 'Через уникальную ссылку' };
                        }
                    }
                }

                const fallbackNickElement = document.querySelector('strong');
                if (fallbackNickElement) {
                    currentNick = fallbackNickElement.textContent.trim();
                    return { id: 'Неизвестен', nick: currentNick, source: 'Первый тег <strong>' };
                }
               
                return { id: 'Неизвестен', nick: GUEST_NICK, source: 'Не найдено' };
            }

            // Получение ID пользователя (без изменений)
            function getUserId() {
                const userData = getCurrentUserNick();
                if (userData.id && userData.id !== 'Неизвестен') {
                    return userData.id;
                }
                let userId = localStorage.getItem(storageKey + "_userId");
                if (!userId) {
                    userId = "user_" + Math.floor(Math.random() * 10000);
                    localStorage.setItem(storageKey + "_userId", userId);
                }
                return userId;
            }

            // Получение ника пользователя (без изменений)
            function getUserNickname() {
                const userData = getCurrentUserNick();
                return userData.nick;
            }

            // Имитация данных пользователя
            const userData = {
                userId: getUserId(),
                nickname: getUserNickname(),
                balance: 800,
                totalGames: 24,
                wins: 8,
                totalWinnings: 2500,
                maxWin: 1500,
                currentStreak: 2,
                bestStreak: 5
            };
           
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 1;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Функция для создания HTML результата (для автоотправки) с inline-стилями
            function createSlotResultHTML(resultSymbols, isWin, winAmount, resultMessage) {
                // Создаем HTML для выпавших символов с inline-стилями
                const symbolsHTML = resultSymbols.map(symbolName => {
                    const symbol = symbols.find(s => s.name === symbolName);
                    if (symbol) {
                        return `<div style="width:80px;height:80px;border-radius:10px;border:2px solid #555;background:#000;overflow:hidden;box-shadow:0 0 10px rgba(0,0,0,0.5);margin:0 5px;"><img src="${symbol.url}" alt="${symbolName}" style="width:100%;height:100%;object-fit:contain;"></div>`;
                    }
                    return '';
                }).join('');
               
                // Стили для победы/проигрыша
                const winStyle = isWin ?
                    "background:rgba(76,175,80,0.2);color:#4CAF50;border:2px solid #4CAF50;box-shadow:0 0 20px rgba(76,175,80,0.5);text-shadow:0 0 5px rgba(76,175,80,0.7)" :
                    "background:rgba(244,67,54,0.2);color:#f44336;border:2px solid #f44336;box-shadow:0 0 20px rgba(244,67,54,0.3)";
               
                // Полный HTML сообщения со всеми inline-стилями
                return `
                <div style="background:rgba(30,30,46,0.95);border:2px solid #5a5a80;border-radius:15px;padding:15px;margin:10px 0;max-width:500px;box-shadow:0 0 25px rgba(0,0,0,0.6);">
                    <div style="text-align:center;margin-bottom:15px;color:#ffd700;text-shadow:0 0 10px rgba(255,215,0,0.5);font-size:20px;border-bottom:2px solid #4a4a6d;padding-bottom:10px;">
                        �� Результат слота
                    </div>
                    <div style="display:flex;flex-direction:column;align-items:center;gap:15px;">
                        <div style="display:flex;justify-content:center;gap:15px;margin-bottom:15px;">
                            ${symbolsHTML}
                        </div>
                        <div style="text-align:center;padding:12px;border-radius:10px;font-size:18px;font-weight:bold;width:100%;${winStyle}">
                            ${resultMessage}
                        </div>
                        <div style="text-align:center;margin-top:10px;font-size:14px;color:#aaa;border-top:1px solid #4a4a6d;padding-top:10px;">
                            Игрок: <strong style="color:#ffd700;">${userData.nickname}</strong> | Баланс: <strong style="color:#4CAF50;">${userData.balance}$</strong>
                        </div>
                    </div>
                </div>`;
            }
           
            // Обновление информации о пользователе (для статистики)
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$';
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
            }
           
            let lastSpin = localStorage.getItem("slotLastSpin") || 0;
           
            // Обновление состояния кнопки в зависимости от галочки и таймера
            function updateSpinButton() {
                spinBtn.disabled = !confirmBet.checked || (Date.now() - lastSpin < COOLDOWN);
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                let diff = COOLDOWN - (Date.now() - lastSpin);
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            setInterval(updateTimer,1000);
            updateTimer();
           
            function spinReels() {
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - lastSpin < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                spinBtn.disabled=true;
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                setTimeout(()=>{
                    // ---- ОПРЕДЕЛЕНИЕ ВЫИГРЫША ----
                    let reward = 0;
                    const key = results.join(",");
                    for(let combo in winningCombos){
                        if(key === combo) reward = winningCombos[combo];
                    }
                   
                    let resultMessage = "";
                   
                    if(reward>0) {
                        resultMessage = `ПОБЕДА! Ты выиграл ${reward}$`;
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display win-result";
                       
                        // Обновление данных пользователя
                        userData.balance += reward;
                        userData.totalGames += 1;
                        userData.wins += 1;
                        userData.totalWinnings += reward;
                        userData.currentStreak += 1;
                        if (userData.currentStreak > userData.bestStreak) {
                            userData.bestStreak = userData.currentStreak;
                        }
                        if (reward > userData.maxWin) {
                            userData.maxWin = reward;
                        }
                    } else {
                        resultMessage = "Неудача! Попробуй еще раз.";
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display lose-result";
                       
                        // Обновление данных пользователя
                        userData.totalGames += 1;
                        userData.currentStreak = 0;
                    }
                   
                    updateUserInfo();
                   
                    // ---- СОЗДАНИЕ КРАСИВОГО HTML ДЛЯ ОТПРАВКИ ----
                    const messageHTML = createSlotResultHTML(results, reward>0, reward, resultMessage);
                   
                    // ---- КОДИРОВАНИЕ В BASE64 ----
                    const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                   
                    // ---- ОТПРАВКА ЗАКОДИРОВАННОГО В РОДИТЕЛЬСКОЕ ОКНО ----
                    window.parent.postMessage({
                        type:"slotResult",
                        payload:{
                            html: encoded,
                            userId: userData.userId,
                            nickname: userData.nickname,
                            result: resultMessage,
                            reward: reward
                        }
                    },"*");
                   
                    // ---- РЕЗЕРВНАЯ ОТПРАВКА В ТЕКСТ ----
                    const trySend = () => {
                        const textarea = document.getElementById('main-reply');
                        const submitBtn = document.querySelector('input[name="submit"]');
                        if(textarea && submitBtn){
                            textarea.value = encoded;
                            submitBtn.click();
                        } else {
                            setTimeout(trySend,150);
                        }
                    };
                   
                    trySend();
                   
                    lastSpin = Date.now();
                    localStorage.setItem("slotLastSpin", lastSpin);
                    updateTimer();
                }, Math.max(...durations));
            }
           
            spinBtn.addEventListener("click", spinReels);
           
            // Инициализация данных пользователя при загрузке
            updateUserInfo();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

9

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzU2NjYwNS5wbmciIGFsdD0iQmxvb2QiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PjxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNTY2NjA1LnBuZyIgYWx0PSJCbG9vZCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+PGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi84MDI2MjMucG5nIiBhbHQ9IlpvbWJpZSIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LDAuMik7Y29sb3I6I2Y0NDMzNjtib3JkZXI6MnB4IHNvbGlkICNmNDQzMzY7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDI0NCw2Nyw1NCwwLjMpIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfmJQg0J3QtdGD0LTQsNGH0LAhINCf0L7Qv9GA0L7QsdGD0LnRgtC1INC10YnQtSDRgNCw0LcuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2FhYTtib3JkZXItdG9wOjFweCBzb2xpZCAjNGE0YTZkO3BhZGRpbmctdG9wOjEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgINCY0LPRgNC+0Lo6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiNmZmQ3MDA7Ij7Qk9C+0YHRgtGMPC9zdHJvbmc+IHwg0JHQsNC70LDQvdGBOiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojNENBRjUwOyI+ODAwJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

10

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDvv73vv70g0KDQtdC30YPQu9GM0YLQsNGCINGB0LvQvtGC0LAKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTVweDttYXJnaW4tYm90dG9tOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNTY2NjA1LnBuZyIgYWx0PSJCbG9vZCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+PGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi81NjY2MDUucG5nIiBhbHQ9IkJsb29kIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzU2NjYwNS5wbmciIGFsdD0iQmxvb2QiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMnB4O2JvcmRlci1yYWRpdXM6MTBweDtmb250LXNpemU6MThweDtmb250LXdlaWdodDpib2xkO3dpZHRoOjEwMCU7YmFja2dyb3VuZDpyZ2JhKDc2LDE3NSw4MCwwLjIpO2NvbG9yOiM0Q0FGNTA7Ym9yZGVyOjJweCBzb2xpZCAjNENBRjUwO2JveC1zaGFkb3c6MCAwIDIwcHggcmdiYSg3NiwxNzUsODAsMC41KTt0ZXh0LXNoYWRvdzowIDAgNXB4IHJnYmEoNzYsMTc1LDgwLDAuNykiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg77+977+9INCf0J7QkdCV0JTQkCEg0JLRiyDQstGL0LjQs9GA0LDQu9C4IDI1MCQKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCDQkdCw0LvQsNC90YE6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiM0Q0FGNTA7Ij4xMDUwJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

11

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDvv73vv70g0KDQtdC30YPQu9GM0YLQsNGCINGB0LvQvtGC0LAKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTVweDttYXJnaW4tYm90dG9tOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvODAyNjIzLnBuZyIgYWx0PSJab21iaWUiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PjxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNTY2NjA1LnBuZyIgYWx0PSJCbG9vZCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+PGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi8zMTk0MTcucG5nIiBhbHQ9IkNoZXJlcCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LDAuMik7Y29sb3I6I2Y0NDMzNjtib3JkZXI6MnB4IHNvbGlkICNmNDQzMzY7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDI0NCw2Nyw1NCwwLjMpIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIO+/ve+/vSDQndC10YPQtNCw0YfQsCEg0J/QvtC/0YDQvtCx0YPQudGC0LUg0LXRidC1INGA0LDQty4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCDQkdCw0LvQsNC90YE6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiM0Q0FGNTA7Ij44MDAkPC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

12

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ------------------------------------------------ */
        /* ОСНОВНЫЕ СТИЛИ */
        /* ------------------------------------------------ */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        /* ------------------------------------------------ */
        /* СТИЛИ ЕДИНОГО КОНТЕЙНЕРА */
        /* ------------------------------------------------ */
        .unified-container {
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9);
            border-radius: 20px;
            border: 3px solid #4a4a6d;
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        /* ------------------------------------------------ */
        /* ТОП-10 СЛЕВА СО СКРОЛЛОМ */
        /* ------------------------------------------------ */
        .top-players {
            flex: 0 0 250px;
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }
        .player-item.user-highlight { border-left: 3px solid #4CAF50; background: rgba(76, 175, 80, 0.1); }

        .top-players::-webkit-scrollbar { width: 8px; }
        .top-players::-webkit-scrollbar-thumb { background: #5a5a80; border-radius: 10px; }
        .top-players::-webkit-scrollbar-track { background: #30304a; }

        /* ------------------------------------------------ */
        /* ПРАВАЯ ЧАСТЬ (СЛОТ + СТАТИСТИКА) */
        /* ------------------------------------------------ */
        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ КНОПКИ SPIN И КОНТРОЛОВ */
        /* ------------------------------------------------ */
        .spin-controls {
            display: flex;
            flex-direction: column;
            align-items: center;
            margin-top: 15px;
            gap: 10px;
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start;
            margin-left: 20px;
        }
       
        #slot-spin {
            width: 90%;
            max-width: 300px;
            height: 60px;
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b);
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107;
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        /* ------------------------------------------------ */
        /* СТИЛИ СТАТИСТИКИ И СЛОТА */
        /* ------------------------------------------------ */
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }
        .last-spin-result {
            background: rgba(90, 90, 128, 0.3);
            border: 1px solid #6a6a90;
            border-radius: 8px;
            padding: 10px;
            margin-bottom: 10px;
            font-size: 14px;
        }
        .last-spin-win { color: #4CAF50; border-color: #4CAF50; background: rgba(76, 175, 80, 0.1); }
        .last-spin-lose { color: #f44336; border-color: #f44336; background: rgba(244, 67, 54, 0.1); }

        /* ------------------------------------------------ */
        /* МЕДИА-ЗАПРОС ДЛЯ АДАПТИВНОСТИ */
        /* ------------------------------------------------ */
        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>ТОП ИГРОКОВ</h2>
            <ul class="player-list" id="top-players-list">
                <!-- Список будет заполняться динамически -->
                <li class="player-item"><span class="player-name">Загрузка...</span><span class="player-amount">0$</span></li>
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Можешь крутить! ✅</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Жми SPIN, испытай удачу!
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика</h2>
                <div class="current-player">
                    <span class="player-name" id="player-nickname">Загрузка...</span>
                    <span class="player-amount" id="player-balance">0$</span>
                </div>
               
                <!-- Блок последнего спина -->
                <div class="last-spin-result" id="last-spin-result">
                    Последний спин: не было
                </div>
               
                <div class="player-stats">
                    <div class="stat-item">
                        <span class="stat-label">Всего игр:</span>
                        <span class="stat-value" id="total-games">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Побед:</span>
                        <span class="stat-value" id="wins">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Процент побед:</span>
                        <span class="stat-value" id="win-rate">0%</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Общий выигрыш:</span>
                        <span class="stat-value" id="total-winnings">0$</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Текущая серия:</span>
                        <span class="stat-value" id="current-streak">0</span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">Лучшая серия:</span>
                        <span class="stat-value" id="best-streak">0</span>
                    </div>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
            });
            // ------------------------------------------------

            // Константы для работы с mybb хранилищем
            const appId = 16777213;
            const storageKey = "slotbank";
            const GUEST_NICK = "Гость";

            // Функция для работы с mybb хранилищем
            async function mybbStorage(action, key, value = null) {
                try {
                    if (typeof mybb === 'undefined' || !mybb.storage) {
                        console.warn('MyBB хранилище недоступно, используем localStorage');
                        return localFallback(action, key, value);
                    }
                   
                    const fullKey = `${storageKey}_${key}`;
                   
                    switch(action) {
                        case 'get':
                            return await mybb.storage.get(appId, fullKey);
                        case 'set':
                            return await mybb.storage.set(appId, fullKey, value);
                        case 'getAll':
                            return await mybb.storage.getAll(appId);
                        default:
                            return null;
                    }
                } catch (error) {
                    console.error('Ошибка mybb хранилища:', error);
                    return localFallback(action, key, value);
                }
            }

            // Фолбэк на localStorage
            function localFallback(action, key, value = null) {
                const fullKey = `${storageKey}_${key}`;
               
                switch(action) {
                    case 'get':
                        const item = localStorage.getItem(fullKey);
                        return item ? JSON.parse(item) : null;
                    case 'set':
                        localStorage.setItem(fullKey, JSON.stringify(value));
                        return true;
                    case 'getAll':
                        const allData = {};
                        for (let i = 0; i < localStorage.length; i++) {
                            const k = localStorage.key(i);
                            if (k.startsWith(storageKey)) {
                                try {
                                    allData[k.replace(`${storageKey}_`, '')] = JSON.parse(localStorage.getItem(k));
                                } catch (e) {
                                    console.error('Ошибка парсинга:', e);
                                }
                            }
                        }
                        return allData;
                    default:
                        return null;
                }
            }

            // Функция для поиска никнейма
            function getCurrentUserNick() {
                let currentUserId = null;
                let currentNick = GUEST_NICK;

                const profileLink = document.querySelector('a[href*="profile.php?id="]');

                if (profileLink) {
                    const href = profileLink.getAttribute('href');
                    const idMatch = href.match(/id=(\d+)/);
                   
                    if (idMatch && idMatch[1]) {
                        currentUserId = idMatch[1];
                    }
                   
                    const parentBlock = profileLink.closest('div, p, li, span');
                   
                    if (parentBlock) {
                        const nickElement = parentBlock.querySelector('strong');
                       
                        if (nickElement) {
                            currentNick = nickElement.textContent.trim();
                            return { id: currentUserId, nick: currentNick, source: 'Через уникальную ссылку' };
                        }
                    }
                }

                const fallbackNickElement = document.querySelector('strong');
                if (fallbackNickElement) {
                    currentNick = fallbackNickElement.textContent.trim();
                    return { id: 'Неизвестен', nick: currentNick, source: 'Первый тег <strong>' };
                }
               
                return { id: 'Неизвестен', nick: GUEST_NICK, source: 'Не найдено' };
            }

            // Получение ID пользователя
            async function getUserId() {
                const userData = getCurrentUserNick();
                if (userData.id && userData.id !== 'Неизвестен') {
                    return userData.id;
                }
               
                let userId = await mybbStorage('get', 'userId');
                if (!userId) {
                    userId = "user_" + Math.floor(Math.random() * 10000);
                    await mybbStorage('set', 'userId', userId);
                }
                return userId;
            }

            // Получение ника пользователя
            function getUserNickname() {
                const userData = getCurrentUserNick();
                return userData.nick;
            }

            // Загрузка данных пользователя из хранилища
            async function loadUserData() {
                const userId = await getUserId();
                const nickname = getUserNickname();
               
                let userData = await mybbStorage('get', `user_${userId}`);
               
                if (!userData) {
                    userData = {
                        userId: userId,
                        nickname: nickname,
                        balance: 1000,
                        totalGames: 0,
                        wins: 0,
                        totalWinnings: 0,
                        maxWin: 0,
                        currentStreak: 0,
                        bestStreak: 0,
                        lastSpin: null,
                        lastSpinResult: null
                    };
                    await mybbStorage('set', `user_${userId}`, userData);
                } else {
                    // Обновляем никнейм, если он изменился
                    userData.nickname = nickname;
                }
               
                return userData;
            }

            // Сохранение данных пользователя
            async function saveUserData(userData) {
                await mybbStorage('set', `user_${userData.userId}`, userData);
            }

            // Загрузка топа игроков
            async function loadTopPlayers() {
                const allData = await mybbStorage('getAll');
                const players = [];
               
                for (const key in allData) {
                    if (key.startsWith('user_') && allData[key] && allData[key].totalWinnings > 0) {
                        players.push(allData[key]);
                    }
                }
               
                // Сортируем по общему выигрышу (по убыванию)
                players.sort((a, b) => b.totalWinnings - a.totalWinnings);
               
                return players.slice(0, 10); // Только топ-10
            }

            // Обновление топа игроков
            async function updateTopPlayers() {
                const topPlayers = await loadTopPlayers();
                const topList = document.getElementById('top-players-list');
                const currentUserId = await getUserId();
               
                topList.innerHTML = '';
               
                if (topPlayers.length === 0) {
                    topList.innerHTML = '<li class="player-item"><span class="player-name">Нет данных</span><span class="player-amount">0$</span></li>';
                    return;
                }
               
                topPlayers.forEach((player, index) => {
                    const li = document.createElement('li');
                    li.className = 'player-item';
                   
                    if (player.userId === currentUserId) {
                        li.classList.add('user-highlight');
                    }
                   
                    li.innerHTML = `
                        <span class="player-name">${index + 1}. ${player.nickname}</span>
                        <span class="player-amount">${player.totalWinnings}$</span>
                    `;
                   
                    topList.appendChild(li);
                });
            }

            // Игровые константы
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 1;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Основной объект пользователя
            let userData = null;
           
            // Функция для создания HTML результата
            function createSlotResultHTML(resultSymbols, isWin, winAmount, resultMessage) {
                const symbolsHTML = resultSymbols.map(symbolName => {
                    const symbol = symbols.find(s => s.name === symbolName);
                    if (symbol) {
                        return `<div style="width:80px;height:80px;border-radius:10px;border:2px solid #555;background:#000;overflow:hidden;box-shadow:0 0 10px rgba(0,0,0,0.5);margin:0 5px;"><img src="${symbol.url}" alt="${symbolName}" style="width:100%;height:100%;object-fit:contain;"></div>`;
                    }
                    return '';
                }).join('');
               
                const winStyle = isWin ?
                    "background:rgba(76,175,80,0.2);color:#4CAF50;border:2px solid #4CAF50;box-shadow:0 0 20px rgba(76,175,80,0.5);text-shadow:0 0 5px rgba(76,175,80,0.7)" :
                    "background:rgba(244,67,54,0.2);color:#f44336;border:2px solid #f44336;box-shadow:0 0 20px rgba(244,67,54,0.3)";
               
                return `
                <div style="background:rgba(30,30,46,0.95);border:2px solid #5a5a80;border-radius:15px;padding:15px;margin:10px 0;max-width:500px;box-shadow:0 0 25px rgba(0,0,0,0.6);">
                    <div style="text-align:center;margin-bottom:15px;color:#ffd700;text-shadow:0 0 10px rgba(255,215,0,0.5);font-size:20px;border-bottom:2px solid #4a4a6d;padding-bottom:10px;">
                        �� Результат слота
                    </div>
                    <div style="display:flex;flex-direction:column;align-items:center;gap:15px;">
                        <div style="display:flex;justify-content:center;gap:15px;margin-bottom:15px;">
                            ${symbolsHTML}
                        </div>
                        <div style="text-align:center;padding:12px;border-radius:10px;font-size:18px;font-weight:bold;width:100%;${winStyle}">
                            ${resultMessage}
                        </div>
                        <div style="text-align:center;margin-top:10px;font-size:14px;color:#aaa;border-top:1px solid #4a4a6d;padding-top:10px;">
                            Игрок: <strong style="color:#ffd700;">${userData.nickname}</strong> | Баланс: <strong style="color:#4CAF50;">${userData.balance}$</strong>
                        </div>
                    </div>
                </div>`;
            }
           
            // Обновление информации о пользователе
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$';
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
                document.getElementById('current-streak').textContent = userData.currentStreak;
                document.getElementById('best-streak').textContent = userData.bestStreak;
               
                // Обновление информации о последнем спине
                const lastSpinEl = document.getElementById('last-spin-result');
                if (userData.lastSpinResult) {
                    lastSpinEl.textContent = `Последний спин: ${userData.lastSpinResult}`;
                    lastSpinEl.className = userData.lastSpinResult.includes('ПОБЕДА') ?
                        'last-spin-result last-spin-win' : 'last-spin-result last-spin-lose';
                } else {
                    lastSpinEl.textContent = 'Последний спин: не было';
                    lastSpinEl.className = 'last-spin-result';
                }
            }
           
            // Обновление состояния кнопки
            function updateSpinButton() {
                spinBtn.disabled = !confirmBet.checked || (Date.now() - (userData.lastSpin || 0) < COOLDOWN);
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                let diff = COOLDOWN - (Date.now() - (userData.lastSpin || 0));
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            async function spinReels() {
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - (userData.lastSpin || 0) < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                spinBtn.disabled=true;
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                setTimeout(async () => {
                    let reward = 0;
                    const key = results.join(",");
                    for(let combo in winningCombos){
                        if(key === combo) reward = winningCombos[combo];
                    }
                   
                    let resultMessage = "";
                    let isWin = false;
                   
                    if(reward > 0) {
                        isWin = true;
                        resultMessage = `ПОБЕДА! Ты выиграл ${reward}$`;
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display win-result";
                       
                        userData.balance += reward;
                        userData.totalGames += 1;
                        userData.wins += 1;
                        userData.totalWinnings += reward;
                        userData.currentStreak += 1;
                        if (userData.currentStreak > userData.bestStreak) {
                            userData.bestStreak = userData.currentStreak;
                        }
                        if (reward > userData.maxWin) {
                            userData.maxWin = reward;
                        }
                    } else {
                        resultMessage = "Неудача! Попробуй еще раз.";
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = "result-display lose-result";
                       
                        userData.totalGames += 1;
                        userData.currentStreak = 0;
                    }
                   
                    userData.lastSpin = Date.now();
                    userData.lastSpinResult = resultMessage;
                   
                    await saveUserData(userData);
                    updateUserInfo();
                    await updateTopPlayers();
                   
                    const messageHTML = createSlotResultHTML(results, isWin, reward, resultMessage);
                    const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                   
                    window.parent.postMessage({
                        type:"slotResult",
                        payload:{
                            html: encoded,
                            userId: userData.userId,
                            nickname: userData.nickname,
                            result: resultMessage,
                            reward: reward
                        }
                    },"*");
                   
                    const trySend = () => {
                        const textarea = document.getElementById('main-reply');
                        const submitBtn = document.querySelector('input[name="submit"]');
                        if(textarea && submitBtn){
                            textarea.value = encoded;
                            submitBtn.click();
                        } else {
                            setTimeout(trySend,150);
                        }
                    };
                   
                    trySend();
                   
                    updateTimer();
                }, Math.max(...durations));
            }
           
            // Инициализация
            async function init() {
                userData = await loadUserData();
                updateUserInfo();
                await updateTopPlayers();
                updateSpinButton();
               
                const timerInterval = setInterval(updateTimer, 1000);
                spinBtn.addEventListener("click", spinReels);
               
                // Обновляем список игроков каждые 30 секунд
                setInterval(async () => {
                    await updateTopPlayers();
                }, 30000);
            }
           
            // Запуск инициализации
            init();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

13

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzMxOTQxNy5wbmciIGFsdD0iQ2hlcmVwIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzMxOTQxNy5wbmciIGFsdD0iQ2hlcmVwIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzYxMDA3MC5wbmciIGFsdD0iUG90aW9uIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6Ym9sZDt3aWR0aDoxMDAlO2JhY2tncm91bmQ6cmdiYSgyNDQsNjcsNTQsMC4yKTtjb2xvcjojZjQ0MzM2O2JvcmRlcjoycHggc29saWQgI2Y0NDMzNjtib3gtc2hhZG93OjAgMCAyMHB4IHJnYmEoMjQ0LDY3LDU0LDAuMykiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0J3QtdGD0LTQsNGH0LAhINCf0L7Qv9GA0L7QsdGD0Lkg0LXRidC1INGA0LDQty4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCDQkdCw0LvQsNC90YE6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiM0Q0FGNTA7Ij4xMDAwJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

14

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDvv73vv70g0KDQtdC30YPQu9GM0YLQsNGCINGB0LvQvtGC0LAKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6MTVweDttYXJnaW4tYm90dG9tOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNjEwMDcwLnBuZyIgYWx0PSJQb3Rpb24iIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PjxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNTY2NjA1LnBuZyIgYWx0PSJCbG9vZCIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+PGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MDU5OTgucG5nIiBhbHQ9IlRpa3ZhIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6Ym9sZDt3aWR0aDoxMDAlO2JhY2tncm91bmQ6cmdiYSgyNDQsNjcsNTQsMC4yKTtjb2xvcjojZjQ0MzM2O2JvcmRlcjoycHggc29saWQgI2Y0NDMzNjtib3gtc2hhZG93OjAgMCAyMHB4IHJnYmEoMjQ0LDY3LDU0LDAuMykiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0J3QtdGD0LTQsNGH0LAhINCf0L7Qv9GA0L7QsdGD0Lkg0LXRidC1INGA0LDQty4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCDQkdCw0LvQsNC90YE6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiM0Q0FGNTA7Ij4xMDAwJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

15

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ... (все CSS стили остаются такими же как в предыдущем примере) ... */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        .unified-container {
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9);
            border-radius: 20px;
            border: 3px solid #4a4a6d;
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        .top-players {
            flex: 0 0 250px;
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }
        .player-item.user-highlight { border-left: 3px solid #4CAF50; background: rgba(76, 175, 80, 0.1); }

        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        .spin-controls {
            display: flex;
            flex-direction: column;
            align-items: center;
            margin-top: 15px;
            gap: 10px;
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start;
            margin-left: 20px;
        }
       
        #slot-spin {
            width: 90%;
            max-width: 300px;
            height: 60px;
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b);
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107;
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }
        .last-spin-result {
            background: rgba(90, 90, 128, 0.3);
            border: 1px solid #6a6a90;
            border-radius: 8px;
            padding: 10px;
            margin-bottom: 10px;
            font-size: 14px;
        }
        .last-spin-win { color: #4CAF50; border-color: #4CAF50; background: rgba(76, 175, 80, 0.1); }
        .last-spin-lose { color: #f44336; border-color: #f44336; background: rgba(244, 67, 54, 0.1); }

        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
       
        .loading {
            opacity: 0.6;
            pointer-events: none;
        }
       
        .error-message {
            background: rgba(244, 67, 54, 0.2);
            color: #f44336;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
            text-align: center;
            border: 1px solid #f44336;
        }
    </style>
</head>
<body>
    <div class="unified-container">

        <div class="top-players">
            <h2>ТОП ИГРОКОВ</h2>
            <div id="top-players-loading">Загрузка рейтинга...</div>
            <ul class="player-list" id="top-players-list" style="display:none;">
                <!-- Список будет заполняться динамически -->
            </ul>
        </div>

        <div class="right-section">

            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Загрузка таймера...</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Загрузка данных...
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика</h2>
                <div id="stats-loading">Загрузка статистики...</div>
                <div id="stats-content" style="display:none;">
                    <div class="current-player">
                        <span class="player-name" id="player-nickname">Игрок</span>
                        <span class="player-amount" id="player-balance">0$</span>
                    </div>
                   
                    <!-- Блок последнего спина -->
                    <div class="last-spin-result" id="last-spin-result">
                        Последний спин: не было
                    </div>
                   
                    <div class="player-stats">
                        <div class="stat-item">
                            <span class="stat-label">Всего игр:</span>
                            <span class="stat-value" id="total-games">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Побед:</span>
                            <span class="stat-value" id="wins">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Процент побед:</span>
                            <span class="stat-value" id="win-rate">0%</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Общий выигрыш:</span>
                            <span class="stat-value" id="total-winnings">0$</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Текущая серия:</span>
                            <span class="stat-value" id="current-streak">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Лучшая серия:</span>
                            <span class="stat-value" id="best-streak">0</span>
                        </div>
                    </div>
                </div>
            </div>

        </div>

    </div>

    <script>
        (function(){
            // --- СКРИПТ ДЛЯ ПЕРЕКЛЮЧЕНИЯ СТАТИСТИКИ ---
            const statsBlock = document.getElementById('player-stats-block');
            const toggleBtn = document.getElementById('toggle-stats-btn');

            toggleBtn.addEventListener('click', () => {
                statsBlock.classList.toggle('open');
            });
           
            // Константы для работы с mybb хранилищем
            const appId = 16777213;
            const storageKey = "slotbank";
            const GUEST_NICK = "Гость";
           
            // Глобальное хранилище данных (серверное через mybb)
            class GlobalStorage {
                constructor() {
                    this.baseUrl = window.location.origin;
                    this.isMybbAvailable = typeof mybb !== 'undefined';
                }
               
                // Получение реального ID пользователя с форума
                async getForumUserId() {
                    try {
                        // Пытаемся получить ID из ссылки профиля
                        const profileLink = document.querySelector('a[href*="profile.php?id="]');
                        if (profileLink) {
                            const href = profileLink.getAttribute('href');
                            const idMatch = href.match(/id=(\d+)/);
                            if (idMatch && idMatch[1]) {
                                return idMatch[1];
                            }
                        }
                       
                        // Если есть mybb, используем его API
                        if (this.isMybbAvailable && mybb.userId) {
                            return mybb.userId;
                        }
                       
                        // Проверяем наличие куки mybb
                        const cookies = document.cookie.split(';');
                        for (let cookie of cookies) {
                            const [name, value] = cookie.trim().split('=');
                            if (name === 'mybbuser') {
                                const parts = value.split('_');
                                if (parts.length > 0) {
                                    return parts[0];
                                }
                            }
                        }
                       
                        return null;
                    } catch (error) {
                        console.error('Ошибка получения ID пользователя:', error);
                        return null;
                    }
                }
               
                // Генерация уникального ID для гостей
                generateGuestId() {
                    const guestId = localStorage.getItem('slot_guest_id');
                    if (guestId) return guestId;
                   
                    const newId = 'guest_' + Math.random().toString(36).substr(2, 9);
                    localStorage.setItem('slot_guest_id', newId);
                    return newId;
                }
               
                // Получение текущего пользователя
                async getCurrentUser() {
                    const forumId = await this.getForumUserId();
                   
                    if (forumId) {
                        return {
                            id: forumId,
                            type: 'forum_user',
                            source: 'forum'
                        };
                    }
                   
                    return {
                        id: this.generateGuestId(),
                        type: 'guest',
                        source: 'local'
                    };
                }
               
                // Получение ника пользователя
                getCurrentUserNick() {
                    try {
                        const profileLink = document.querySelector('a[href*="profile.php?id="]');
                       
                        if (profileLink) {
                            const parentBlock = profileLink.closest('div, p, li, span');
                            if (parentBlock) {
                                const nickElement = parentBlock.querySelector('strong');
                                if (nickElement) {
                                    return nickElement.textContent.trim();
                                }
                            }
                        }
                       
                        const fallbackNickElement = document.querySelector('strong');
                        if (fallbackNickElement) {
                            return fallbackNickElement.textContent.trim();
                        }
                       
                        const fallbackNickElement2 = document.querySelector('.username');
                        if (fallbackNickElement2) {
                            return fallbackNickElement2.textContent.trim();
                        }
                       
                        return GUEST_NICK;
                    } catch (error) {
                        console.error('Ошибка получения ника:', error);
                        return GUEST_NICK;
                    }
                }
               
                // Работа с серверным хранилищем через AJAX
                async callStorageAPI(action, data = {}) {
                    try {
                        // Если есть доступ к mybb API, используем его
                        if (this.isMybbAvailable && mybb.storage) {
                            return await this.useMybbAPI(action, data);
                        }
                       
                        // Иначе используем AJAX запросы к серверу
                        return await this.useAjaxAPI(action, data);
                    } catch (error) {
                        console.error('Ошибка API хранилища:', error);
                        throw error;
                    }
                }
               
                // Использование встроенного mybb API (если доступно)
                async useMybbAPI(action, data) {
                    const fullKey = `${storageKey}_${data.key || ''}`;
                   
                    switch(action) {
                        case 'get':
                            return await mybb.storage.get(appId, fullKey);
                        case 'set':
                            return await mybb.storage.set(appId, fullKey, data.value);
                        case 'getAll':
                            return await mybb.storage.getAll(appId);
                        case 'increment':
                            // Для mybb нужно получить, обновить и сохранить
                            const current = await mybb.storage.get(appId, fullKey);
                            const newValue = (current || 0) + data.value;
                            await mybb.storage.set(appId, fullKey, newValue);
                            return newValue;
                        default:
                            throw new Error(`Неизвестное действие: ${action}`);
                    }
                }
               
                // Использование AJAX API (фолбэк)
                async useAjaxAPI(action, data) {
                    // Эмуляция серверного API - в реальности нужно реализовать endpoint
                    // Для демо используем localStorage с общим пространством
                    const fullKey = `${storageKey}_${data.key || ''}`;
                    const globalKey = `global_${fullKey}`;
                   
                    switch(action) {
                        case 'get':
                            const item = localStorage.getItem(globalKey);
                            return item ? JSON.parse(item) : null;
                        case 'set':
                            localStorage.setItem(globalKey, JSON.stringify(data.value));
                            return true;
                        case 'getAll':
                            const allData = {};
                            for (let i = 0; i < localStorage.length; i++) {
                                const key = localStorage.key(i);
                                if (key.startsWith(`global_${storageKey}_user_`)) {
                                    try {
                                        const userKey = key.replace(`global_${storageKey}_`, '');
                                        allData[userKey] = JSON.parse(localStorage.getItem(key));
                                    } catch (e) {
                                        console.error('Ошибка парсинга:', e);
                                    }
                                }
                            }
                            return allData;
                        case 'increment':
                            const current = JSON.parse(localStorage.getItem(globalKey) || '0');
                            const newValue = current + data.value;
                            localStorage.setItem(globalKey, JSON.stringify(newValue));
                            return newValue;
                        default:
                            throw new Error(`Неизвестное действие: ${action}`);
                    }
                }
               
                // Загрузка данных пользователя
                async loadUserData() {
                    try {
                        const user = await this.getCurrentUser();
                        const nickname = this.getCurrentUserNick();
                       
                        // Получаем данные из глобального хранилища
                        const userData = await this.callStorageAPI('get', {
                            key: `user_${user.id}`
                        });
                       
                        if (!userData) {
                            // Создаем нового пользователя
                            const newUserData = {
                                userId: user.id,
                                userType: user.type,
                                nickname: nickname,
                                balance: 1000,
                                totalGames: 0,
                                wins: 0,
                                totalWinnings: 0,
                                maxWin: 0,
                                currentStreak: 0,
                                bestStreak: 0,
                                lastSpin: null,
                                lastSpinResult: null,
                                createdAt: Date.now(),
                                updatedAt: Date.now()
                            };
                           
                            await this.callStorageAPI('set', {
                                key: `user_${user.id}`,
                                value: newUserData
                            });
                           
                            return newUserData;
                        }
                       
                        // Обновляем никнейм, если он изменился
                        if (userData.nickname !== nickname) {
                            userData.nickname = nickname;
                            userData.updatedAt = Date.now();
                            await this.callStorageAPI('set', {
                                key: `user_${user.id}`,
                                value: userData
                            });
                        }
                       
                        return userData;
                    } catch (error) {
                        console.error('Ошибка загрузки данных пользователя:', error);
                        return this.createFallbackUserData();
                    }
                }
               
                // Сохранение данных пользователя
                async saveUserData(userData) {
                    try {
                        userData.updatedAt = Date.now();
                        await this.callStorageAPI('set', {
                            key: `user_${userData.userId}`,
                            value: userData
                        });
                        return true;
                    } catch (error) {
                        console.error('Ошибка сохранения данных пользователя:', error);
                        return false;
                    }
                }
               
                // Получение топа игроков
                async getTopPlayers() {
                    try {
                        const allData = await this.callStorageAPI('getAll');
                        const players = [];
                       
                        for (const key in allData) {
                            if (key.startsWith('user_') && allData[key] && allData[key].totalWinnings > 0) {
                                players.push(allData[key]);
                            }
                        }
                       
                        // Сортируем по общему выигрышу
                        players.sort((a, b) => b.totalWinnings - a.totalWinnings);
                       
                        return players.slice(0, 10);
                    } catch (error) {
                        console.error('Ошибка получения топа игроков:', error);
                        return [];
                    }
                }
               
                // Обновление общего рейтинга
                async updateGlobalStats() {
                    try {
                        const currentStats = await this.callStorageAPI('get', { key: 'global_stats' }) || {
                            totalSpins: 0,
                            totalWins: 0,
                            totalPayout: 0,
                            lastUpdate: Date.now()
                        };
                       
                        currentStats.lastUpdate = Date.now();
                        await this.callStorageAPI('set', { key: 'global_stats', value: currentStats });
                    } catch (error) {
                        console.error('Ошибка обновления глобальной статистики:', error);
                    }
                }
               
                // Фолбэк данные пользователя
                createFallbackUserData() {
                    const user = {
                        id: this.generateGuestId(),
                        type: 'guest',
                        source: 'local'
                    };
                   
                    return {
                        userId: user.id,
                        userType: user.type,
                        nickname: this.getCurrentUserNick(),
                        balance: 1000,
                        totalGames: 0,
                        wins: 0,
                        totalWinnings: 0,
                        maxWin: 0,
                        currentStreak: 0,
                        bestStreak: 0,
                        lastSpin: null,
                        lastSpinResult: null,
                        createdAt: Date.now(),
                        updatedAt: Date.now()
                    };
                }
            }
           
            // Инициализация глобального хранилища
            const globalStorage = new GlobalStorage();
           
            // Игровые константы
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 1;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Основной объект пользователя
            let userData = null;
            let isLoading = false;
           
            // Функция для создания HTML результата
            function createSlotResultHTML(resultSymbols, isWin, winAmount, resultMessage) {
                const symbolsHTML = resultSymbols.map(symbolName => {
                    const symbol = symbols.find(s => s.name === symbolName);
                    if (symbol) {
                        return `<div style="width:80px;height:80px;border-radius:10px;border:2px solid #555;background:#000;overflow:hidden;box-shadow:0 0 10px rgba(0,0,0,0.5);margin:0 5px;"><img src="${symbol.url}" alt="${symbolName}" style="width:100%;height:100%;object-fit:contain;"></div>`;
                    }
                    return '';
                }).join('');
               
                const winStyle = isWin ?
                    "background:rgba(76,175,80,0.2);color:#4CAF50;border:2px solid #4CAF50;box-shadow:0 0 20px rgba(76,175,80,0.5);text-shadow:0 0 5px rgba(76,175,80,0.7)" :
                    "background:rgba(244,67,54,0.2);color:#f44336;border:2px solid #f44336;box-shadow:0 0 20px rgba(244,67,54,0.3)";
               
                return `
                <div style="background:rgba(30,30,46,0.95);border:2px solid #5a5a80;border-radius:15px;padding:15px;margin:10px 0;max-width:500px;box-shadow:0 0 25px rgba(0,0,0,0.6);">
                    <div style="text-align:center;margin-bottom:15px;color:#ffd700;text-shadow:0 0 10px rgba(255,215,0,0.5);font-size:20px;border-bottom:2px solid #4a4a6d;padding-bottom:10px;">
                        🎰 Результат слота
                    </div>
                    <div style="display:flex;flex-direction:column;align-items:center;gap:15px;">
                        <div style="display:flex;justify-content:center;gap:15px;margin-bottom:15px;">
                            ${symbolsHTML}
                        </div>
                        <div style="text-align:center;padding:12px;border-radius:10px;font-size:18px;font-weight:bold;width:100%;${winStyle}">
                            ${resultMessage}
                        </div>
                        <div style="text-align:center;margin-top:10px;font-size:14px;color:#aaa;border-top:1px solid #4a4a6d;padding-top:10px;">
                            Игрок: <strong style="color:#ffd700;">${userData.nickname}</strong> | Баланс: <strong style="color:#4CAF50;">${userData.balance}$</strong>
                        </div>
                    </div>
                </div>`;
            }
           
            // Обновление информации о пользователе
            function updateUserInfo() {
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$';
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
                document.getElementById('current-streak').textContent = userData.currentStreak;
                document.getElementById('best-streak').textContent = userData.bestStreak;
               
                // Обновление информации о последнем спине
                const lastSpinEl = document.getElementById('last-spin-result');
                if (userData.lastSpinResult) {
                    lastSpinEl.textContent = `Последний спин: ${userData.lastSpinResult}`;
                    lastSpinEl.className = userData.lastSpinResult.includes('ПОБЕДА') ?
                        'last-spin-result last-spin-win' : 'last-spin-result last-spin-lose';
                } else {
                    lastSpinEl.textContent = 'Последний спин: не было';
                    lastSpinEl.className = 'last-spin-result';
                }
               
                // Показываем контент статистики
                document.getElementById('stats-loading').style.display = 'none';
                document.getElementById('stats-content').style.display = 'block';
            }
           
            // Обновление топа игроков
            async function updateTopPlayers() {
                try {
                    const topPlayers = await globalStorage.getTopPlayers();
                    const topList = document.getElementById('top-players-list');
                    const loadingElement = document.getElementById('top-players-loading');
                   
                    loadingElement.style.display = 'none';
                    topList.style.display = 'block';
                    topList.innerHTML = '';
                   
                    if (topPlayers.length === 0) {
                        topList.innerHTML = '<li class="player-item"><span class="player-name">Нет данных</span><span class="player-amount">0$</span></li>';
                        return;
                    }
                   
                    topPlayers.forEach((player, index) => {
                        const li = document.createElement('li');
                        li.className = 'player-item';
                       
                        // Подсвечиваем текущего пользователя
                        if (userData && player.userId === userData.userId) {
                            li.classList.add('user-highlight');
                        }
                       
                        const place = index + 1;
                        const placeIcon = place === 1 ? '🥇' : place === 2 ? '🥈' : place === 3 ? '🥉' : `${place}.`;
                       
                        li.innerHTML = `
                            <span class="player-name">${placeIcon} ${player.nickname}</span>
                            <span class="player-amount">${player.totalWinnings}$</span>
                        `;
                       
                        topList.appendChild(li);
                    });
                } catch (error) {
                    console.error('Ошибка обновления топа игроков:', error);
                }
            }
           
            // Обновление состояния кнопки
            function updateSpinButton() {
                if (!userData) {
                    spinBtn.disabled = true;
                    return;
                }
               
                const isReady = confirmBet.checked && (Date.now() - (userData.lastSpin || 0) >= COOLDOWN);
                spinBtn.disabled = !isReady;
               
                if (isReady) {
                    spinBtn.textContent = "SPIN";
                }
            }
           
            confirmBet.addEventListener("change", updateSpinButton);
           
            function updateTimer() {
                if (!userData) {
                    timerEl.textContent = "Загрузка...";
                    return;
                }
               
                let diff = COOLDOWN - (Date.now() - (userData.lastSpin || 0));
                if(diff <= 0){
                    timerEl.textContent = "Можешь крутить! ✅";
                    updateSpinButton();
                } else {
                    let h=Math.floor(diff/3600000),
                        m=Math.floor((diff%3600000)/60000),
                        s=Math.floor((diff%60000)/1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    updateSpinButton();
                }
            }
           
            // Функция вращения барабанов
            async function spinReels() {
                if(isLoading) return;
               
                if(!confirmBet.checked) {
                    resultDisplay.textContent = "Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                if(Date.now() - (userData.lastSpin || 0) < COOLDOWN){
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                isLoading = true;
                spinBtn.disabled = true;
                spinBtn.textContent = "КРУТИМ...";
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                let results=[];
                let durations=[1000, 1300, 1600];
               
                // Анимация вращения барабанов
                reels.forEach((img,index)=>{
                    let cycles = 12 + Math.floor(Math.random()*8);
                    let finalSymbol = symbols[Math.floor(Math.random()*symbols.length)];
                    results.push(finalSymbol.name);
                   
                    let step=0;
                    let interval = setInterval(()=>{
                        let sym = symbols[Math.floor(Math.random()*symbols.length)];
                        img.style.top="-100%";
                        img.src = sym.url;
                       
                        setTimeout(()=>{
                            img.style.top="0";
                        }, 10);
                       
                        step++;
                        if(step>=cycles){
                            img.src = finalSymbol.url;
                            img.style.top="0";
                            clearInterval(interval);
                        }
                    }, durations[index]/cycles);
                });
               
                // Обработка результата после анимации
                setTimeout(async () => {
                    try {
                        let reward = 0;
                        const key = results.join(",");
                        for(let combo in winningCombos){
                            if(key === combo) reward = winningCombos[combo];
                        }
                       
                        let resultMessage = "";
                        let isWin = false;
                       
                        if(reward > 0) {
                            isWin = true;
                            resultMessage = `ПОБЕДА! Ты выиграл ${reward}$`;
                            resultDisplay.textContent = resultMessage;
                            resultDisplay.className = "result-display win-result";
                           
                            // Обновление данных пользователя
                            userData.balance += reward;
                            userData.totalGames += 1;
                            userData.wins += 1;
                            userData.totalWinnings += reward;
                            userData.currentStreak += 1;
                            if (userData.currentStreak > userData.bestStreak) {
                                userData.bestStreak = userData.currentStreak;
                            }
                            if (reward > userData.maxWin) {
                                userData.maxWin = reward;
                            }
                        } else {
                            resultMessage = "Неудача! Попробуй еще раз.";
                            resultDisplay.textContent = resultMessage;
                            resultDisplay.className = "result-display lose-result";
                           
                            userData.totalGames += 1;
                            userData.currentStreak = 0;
                        }
                       
                        userData.lastSpin = Date.now();
                        userData.lastSpinResult = resultMessage;
                       
                        // Сохраняем в глобальное хранилище
                        const saveSuccess = await globalStorage.saveUserData(userData);
                       
                        if (!saveSuccess) {
                            throw new Error('Ошибка сохранения данных');
                        }
                       
                        // Обновляем интерфейс
                        updateUserInfo();
                        await updateTopPlayers();
                        await globalStorage.updateGlobalStats();
                       
                        // Создаем HTML для отправки
                        const messageHTML = createSlotResultHTML(results, isWin, reward, resultMessage);
                        const encoded = btoa(unescape(encodeURIComponent(messageHTML)));
                       
                        // Отправляем результат в родительское окно (админку)
                        window.parent.postMessage({
                            type:"slotResult",
                            payload:{
                                html: encoded,
                                userId: userData.userId,
                                nickname: userData.nickname,
                                result: resultMessage,
                                reward: reward,
                                timestamp: Date.now()
                            }
                        },"*");
                       
                        // Резервная отправка через текстовое поле
                        const trySend = () => {
                            const textarea = document.getElementById('main-reply');
                            const submitBtn = document.querySelector('input[name="submit"]');
                            if(textarea && submitBtn){
                                textarea.value = encoded;
                                submitBtn.click();
                            } else {
                                setTimeout(trySend,150);
                            }
                        };
                       
                        trySend();
                       
                    } catch (error) {
                        console.error('Ошибка обработки спина:', error);
                        resultDisplay.textContent = "Ошибка сохранения результата";
                        resultDisplay.className = "result-display lose-result";
                    } finally {
                        isLoading = false;
                        updateSpinButton();
                        updateTimer();
                    }
                }, Math.max(...durations));
            }
           
            // Инициализация игры
            async function init() {
                try {
                    // Показываем состояние загрузки
                    document.body.classList.add('loading');
                   
                    // Загружаем данные пользователя
                    userData = await globalStorage.loadUserData();
                   
                    // Обновляем интерфейс
                    updateUserInfo();
                    await updateTopPlayers();
                    updateSpinButton();
                    updateTimer();
                   
                    // Запускаем таймер
                    const timerInterval = setInterval(updateTimer, 1000);
                   
                    // Вешаем обработчик на кнопку
                    spinBtn.addEventListener("click", spinReels);
                   
                    // Обновляем топ игроков каждые 30 секунд
                    setInterval(async () => {
                        await updateTopPlayers();
                    }, 30000);
                   
                    // Обновляем данные пользователя каждую минуту (на случай изменений с другого устройства)
                    setInterval(async () => {
                        const freshData = await globalStorage.loadUserData();
                        if (freshData.userId === userData.userId) {
                            userData = freshData;
                            updateUserInfo();
                            updateSpinButton();
                            updateTimer();
                        }
                    }, 60000);
                   
                    // Скрываем состояние загрузки
                    document.body.classList.remove('loading');
                   
                    // Показываем приветственное сообщение
                    resultDisplay.textContent = "Добро пожаловать! Жми SPIN, испытай удачу!";
                   
                } catch (error) {
                    console.error('Ошибка инициализации игры:', error);
                    resultDisplay.textContent = "Ошибка загрузки игры";
                    resultDisplay.className = "result-display lose-result";
                   
                    // Показываем сообщение об ошибке
                    const errorDiv = document.createElement('div');
                    errorDiv.className = 'error-message';
                    errorDiv.textContent = 'Не удалось загрузить данные. Попробуйте обновить страницу.';
                    document.querySelector('.slot-machine').appendChild(errorDiv);
                }
            }
           
            // Запуск инициализации
            init();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

16

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzU2NjYwNS5wbmciIGFsdD0iQmxvb2QiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PjxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNjA1OTk4LnBuZyIgYWx0PSJUaWt2YSIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+PGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+PGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi81NjY2MDUucG5nIiBhbHQ9IkJsb29kIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6Ym9sZDt3aWR0aDoxMDAlO2JhY2tncm91bmQ6cmdiYSgyNDQsNjcsNTQsMC4yKTtjb2xvcjojZjQ0MzM2O2JvcmRlcjoycHggc29saWQgI2Y0NDMzNjtib3gtc2hhZG93OjAgMCAyMHB4IHJnYmEoMjQ0LDY3LDU0LDAuMykiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0J3QtdGD0LTQsNGH0LAhINCf0L7Qv9GA0L7QsdGD0Lkg0LXRidC1INGA0LDQty4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCDQkdCw0LvQsNC90YE6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiM0Q0FGNTA7Ij4xMDAwJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

17

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzgwMjYyMy5wbmciIGFsdD0iWm9tYmllIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzYwNTk5OC5wbmciIGFsdD0iVGlrdmEiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PjxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPjxpbWcgc3JjPSJodHRwczovL3VwZm9ybWUucnUvdXBsb2Fkcy8wMDFjLzUyL2I2LzIvNjA1OTk4LnBuZyIgYWx0PSJUaWt2YSIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LDAuMik7Y29sb3I6I2Y0NDMzNjtib3JkZXI6MnB4IHNvbGlkICNmNDQzMzY7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDI0NCw2Nyw1NCwwLjMpIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgINCd0LXRg9C00LDRh9CwISDQn9C+0L/RgNC+0LHRg9C5INC10YnQtSDRgNCw0LcuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2FhYTtib3JkZXItdG9wOjFweCBzb2xpZCAjNGE0YTZkO3BhZGRpbmctdG9wOjEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgINCY0LPRgNC+0Lo6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiNmZmQ3MDA7Ij7Qk9C+0YHRgtGMPC9zdHJvbmc+IHwg0JHQsNC70LDQvdGBOiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojNENBRjUwOyI+MTAwMCQ8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4=">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

18

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC70L7RgtCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzgwMjYyMy5wbmciIGFsdD0iWm9tYmllIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzYxMDA3MC5wbmciIGFsdD0iUG90aW9uIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij48L2Rpdj48ZGl2IHN0eWxlPSJ3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MnB4IHNvbGlkICM1NTU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC41KTttYXJnaW46MCA1cHg7Ij48aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzU2NjYwNS5wbmciIGFsdD0iQmxvb2QiIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbjsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMnB4O2JvcmRlci1yYWRpdXM6MTBweDtmb250LXNpemU6MThweDtmb250LXdlaWdodDpib2xkO3dpZHRoOjEwMCU7YmFja2dyb3VuZDpyZ2JhKDI0NCw2Nyw1NCwwLjIpO2NvbG9yOiNmNDQzMzY7Ym9yZGVyOjJweCBzb2xpZCAjZjQ0MzM2O2JveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgyNDQsNjcsNTQsMC4zKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQndC10YPQtNCw0YfQsCEg0J/QvtC/0YDQvtCx0YPQuSDQtdGJ0LUg0YDQsNC3LgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiNhYWE7Ym9yZGVyLXRvcDoxcHggc29saWQgIzRhNGE2ZDtwYWRkaW5nLXRvcDoxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQmNCz0YDQvtC6OiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojZmZkNzAwOyI+0JPQvtGB0YLRjDwvc3Ryb25nPiB8INCR0LDQu9Cw0L3RgTogPHN0cm9uZyBzdHlsZT0iY29sb3I6IzRDQUY1MDsiPjEwMDAkPC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

19

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ... (CSS стили остаются без изменений) ... */
    </style>
</head>
<body>
    <div class="unified-container">
        <!-- ... (HTML структура остается без изменений) ... -->
    </div>

    <script>
        (function(){
            // === ДИАГНОСТИКА ===
            console.log('=== ДИАГНОСТИКА MyBB ===');
            console.log('MyBB доступен:', typeof mybb !== 'undefined');
            if (typeof mybb !== 'undefined') {
                console.log('MyBB.userId:', mybb.userId);
                console.log('MyBB.username:', mybb.username);
                console.log('MyBB.storage доступен:', typeof mybb.storage !== 'undefined');
                console.log('MyBB.storage.get:', typeof mybb.storage.get);
                console.log('MyBB.storage.set:', typeof mybb.storage.set);
            }
           
            // Константы
            const appId = 16777213;
            const storageKey = "slotbank";
            const GUEST_NICK = "Гость";
           
            // Упрощенный класс для работы с хранилищем
            class SlotStorage {
                constructor() {
                    this.debug = true;
                    this.mybbAvailable = typeof mybb !== 'undefined' &&
                                         typeof mybb.storage !== 'undefined' &&
                                         typeof mybb.storage.get === 'function';
                   
                    if (this.debug) {
                        console.log('MyBB Storage доступен:', this.mybbAvailable);
                    }
                }
               
                // Получение ID пользователя
                getUserId() {
                    // 1. Пробуем получить из mybb
                    if (typeof mybb !== 'undefined' && mybb.userId) {
                        if (this.debug) console.log('ID из mybb:', mybb.userId);
                        return String(mybb.userId);
                    }
                   
                    // 2. Ищем в ссылке профиля
                    const profileLink = document.querySelector('a[href*="profile.php?id="]');
                    if (profileLink) {
                        const href = profileLink.getAttribute('href');
                        const match = href.match(/id=(\d+)/);
                        if (match && match[1]) {
                            if (this.debug) console.log('ID из ссылки профиля:', match[1]);
                            return match[1];
                        }
                    }
                   
                    // 3. Генерация ID для гостя
                    let guestId = localStorage.getItem('slot_guest_id');
                    if (!guestId) {
                        guestId = 'guest_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
                        localStorage.setItem('slot_guest_id', guestId);
                    }
                    if (this.debug) console.log('Гостевой ID:', guestId);
                    return guestId;
                }
               
                // Получение ника
                getNickname() {
                    if (typeof mybb !== 'undefined' && mybb.username) {
                        return mybb.username;
                    }
                   
                    // Поиск ника в разных местах
                    const selectors = [
                        'strong:first-child',
                        '.username',
                        'a[href*="profile.php"] strong',
                        'b:first-child',
                        '#panel strong'
                    ];
                   
                    for (const selector of selectors) {
                        const el = document.querySelector(selector);
                        if (el && el.textContent && el.textContent.trim()) {
                            return el.textContent.trim();
                        }
                    }
                   
                    return GUEST_NICK;
                }
               
                // Тестовая функция для проверки хранилища
                async testStorage() {
                    if (!this.mybbAvailable) {
                        console.warn('MyBB storage НЕ доступен!');
                        return false;
                    }
                   
                    try {
                        const testKey = `${storageKey}_test`;
                        const testValue = {test: Date.now(), message: 'Тест mybb storage'};
                       
                        console.log('Тестируем запись в mybb storage...');
                        await mybb.storage.set(appId, testKey, testValue);
                       
                        console.log('Тестируем чтение из mybb storage...');
                        const readValue = await mybb.storage.get(appId, testKey);
                       
                        console.log('Результат теста:', readValue);
                        return readValue && readValue.test === testValue.test;
                    } catch (error) {
                        console.error('Ошибка теста хранилища:', error);
                        return false;
                    }
                }
               
                // Получение данных пользователя
                async getUserData(userId) {
                    const fullKey = `${storageKey}_user_${userId}`;
                   
                    if (this.debug) console.log('Запрос данных по ключу:', fullKey);
                   
                    if (this.mybbAvailable) {
                        try {
                            const data = await mybb.storage.get(appId, fullKey);
                            if (this.debug) console.log('Данные из mybb storage:', data);
                            return data;
                        } catch (error) {
                            console.error('Ошибка чтения из mybb storage:', error);
                            return null;
                        }
                    } else {
                        // Fallback на localStorage
                        const data = localStorage.getItem(fullKey);
                        if (this.debug) console.log('Данные из localStorage:', data);
                        return data ? JSON.parse(data) : null;
                    }
                }
               
                // Сохранение данных пользователя
                async saveUserData(userId, data) {
                    const fullKey = `${storageKey}_user_${userId}`;
                   
                    if (this.debug) {
                        console.log('Сохранение данных:');
                        console.log('Ключ:', fullKey);
                        console.log('Данные:', data);
                    }
                   
                    if (this.mybbAvailable) {
                        try {
                            await mybb.storage.set(appId, fullKey, data);
                            if (this.debug) console.log('✅ Данные сохранены в mybb storage');
                            return true;
                        } catch (error) {
                            console.error('❌ Ошибка сохранения в mybb storage:', error);
                            return false;
                        }
                    } else {
                        // Fallback на localStorage
                        try {
                            localStorage.setItem(fullKey, JSON.stringify(data));
                            if (this.debug) console.log('✅ Данные сохранены в localStorage');
                            return true;
                        } catch (error) {
                            console.error('❌ Ошибка сохранения в localStorage:', error);
                            return false;
                        }
                    }
                }
               
                // Получение всех данных (для топа)
                async getAllUserData() {
                    if (this.mybbAvailable) {
                        try {
                            const allData = await mybb.storage.getAll(appId);
                            const users = {};
                           
                            // Фильтруем только пользователей
                            for (const [key, value] of Object.entries(allData)) {
                                if (key.startsWith(`${storageKey}_user_`) && value) {
                                    const userId = key.replace(`${storageKey}_user_`, '');
                                    users[userId] = value;
                                }
                            }
                           
                            if (this.debug) console.log('Все пользователи из mybb:', users);
                            return users;
                        } catch (error) {
                            console.error('Ошибка получения всех данных:', error);
                            return {};
                        }
                    } else {
                        // Fallback на localStorage
                        const users = {};
                        for (let i = 0; i < localStorage.length; i++) {
                            const key = localStorage.key(i);
                            if (key.startsWith(`${storageKey}_user_`)) {
                                try {
                                    const userId = key.replace(`${storageKey}_user_`, '');
                                    users[userId] = JSON.parse(localStorage.getItem(key));
                                } catch (e) {
                                    console.error('Ошибка парсинга:', e);
                                }
                            }
                        }
                        return users;
                    }
                }
            }
           
            // Инициализация хранилища
            const storage = new SlotStorage();
           
            // Проверка хранилища
            storage.testStorage().then(result => {
                console.log('Тест хранилища пройден:', result);
            });
           
            // Игровые константы
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 1;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            // Основные элементы
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
           
            // Глобальные переменные
            let userData = null;
            let isLoading = false;
           
            // Загрузка данных пользователя
            async function loadUserData() {
                try {
                    const userId = storage.getUserId();
                    const nickname = storage.getNickname();
                   
                    console.log('Загрузка данных для пользователя:', {userId, nickname});
                   
                    let data = await storage.getUserData(userId);
                   
                    if (!data) {
                        // Создаем нового пользователя
                        data = {
                            userId: userId,
                            nickname: nickname,
                            balance: 1000,
                            totalGames: 0,
                            wins: 0,
                            totalWinnings: 0,
                            maxWin: 0,
                            currentStreak: 0,
                            bestStreak: 0,
                            lastSpin: null,
                            lastSpinResult: null,
                            createdAt: Date.now(),
                            updatedAt: Date.now()
                        };
                       
                        console.log('Создан новый пользователь:', data);
                    } else {
                        // Обновляем никнейм
                        data.nickname = nickname;
                        data.updatedAt = Date.now();
                        console.log('Загружен существующий пользователь:', data);
                    }
                   
                    return data;
                } catch (error) {
                    console.error('Ошибка загрузки данных:', error);
                    return null;
                }
            }
           
            // Сохранение данных пользователя
            async function saveUserData() {
                if (!userData) return false;
               
                console.log('Сохранение данных пользователя...');
                userData.updatedAt = Date.now();
               
                const success = await storage.saveUserData(userData.userId, userData);
               
                if (success) {
                    console.log('✅ Данные успешно сохранены');
                } else {
                    console.log('❌ Ошибка сохранения данных');
                }
               
                return success;
            }
           
            // Обновление интерфейса
            function updateUI() {
                if (!userData) return;
               
                // Обновляем статистику
                document.getElementById('player-nickname').textContent = userData.nickname;
                document.getElementById('player-balance').textContent = userData.balance + '$';
                document.getElementById('total-games').textContent = userData.totalGames;
                document.getElementById('wins').textContent = userData.wins;
                document.getElementById('total-winnings').textContent = userData.totalWinnings + '$';
                document.getElementById('win-rate').textContent = userData.totalGames > 0 ?
                    Math.round((userData.wins / userData.totalGames) * 100) + '%' : '0%';
                document.getElementById('current-streak').textContent = userData.currentStreak;
                document.getElementById('best-streak').textContent = userData.bestStreak;
               
                // Последний спин
                const lastSpinEl = document.getElementById('last-spin-result');
                if (userData.lastSpinResult) {
                    lastSpinEl.textContent = `Последний спин: ${userData.lastSpinResult}`;
                    lastSpinEl.className = userData.lastSpinResult.includes('ПОБЕДА') ?
                        'last-spin-result last-spin-win' : 'last-spin-result last-spin-lose';
                } else {
                    lastSpinEl.textContent = 'Последний спин: не было';
                    lastSpinEl.className = 'last-spin-result';
                }
               
                // Показываем контент
                document.getElementById('stats-loading').style.display = 'none';
                document.getElementById('stats-content').style.display = 'block';
            }
           
            // Обновление топа игроков
            async function updateTopPlayers() {
                try {
                    const allUsers = await storage.getAllUserData();
                    const players = Object.values(allUsers).filter(u => u.totalWinnings > 0);
                   
                    // Сортируем по выигрышу
                    players.sort((a, b) => b.totalWinnings - a.totalWinnings);
                    const top10 = players.slice(0, 10);
                   
                    const topList = document.getElementById('top-players-list');
                    const loadingElement = document.getElementById('top-players-loading');
                   
                    loadingElement.style.display = 'none';
                    topList.style.display = 'block';
                   
                    if (top10.length === 0) {
                        topList.innerHTML = '<li class="player-item"><span class="player-name">Нет данных</span><span class="player-amount">0$</span></li>';
                        return;
                    }
                   
                    topList.innerHTML = '';
                    top10.forEach((player, index) => {
                        const li = document.createElement('li');
                        li.className = 'player-item';
                       
                        if (userData && player.userId === userData.userId) {
                            li.classList.add('user-highlight');
                        }
                       
                        const place = index + 1;
                        const placeIcon = place === 1 ? '��' : place === 2 ? '��' : place === 3 ? '��' : `${place}.`;
                       
                        li.innerHTML = `
                            <span class="player-name">${placeIcon} ${player.nickname}</span>
                            <span class="player-amount">${player.totalWinnings}$</span>
                        `;
                       
                        topList.appendChild(li);
                    });
                   
                    console.log('Топ игроков обновлен:', top10.length, 'игроков');
                } catch (error) {
                    console.error('Ошибка обновления топа:', error);
                }
            }
           
            // Обновление таймера и кнопки
            function updateTimerAndButton() {
                if (!userData) {
                    timerEl.textContent = "Загрузка...";
                    spinBtn.disabled = true;
                    return;
                }
               
                const diff = COOLDOWN - (Date.now() - (userData.lastSpin || 0));
               
                if (diff <= 0) {
                    timerEl.textContent = "Можешь крутить! ✅";
                    spinBtn.disabled = !confirmBet.checked;
                } else {
                    const h = Math.floor(diff / 3600000);
                    const m = Math.floor((diff % 3600000) / 60000);
                    const s = Math.floor((diff % 60000) / 1000);
                    timerEl.textContent = `${h}ч ${m}м ${s}с`;
                    spinBtn.disabled = true;
                }
            }
           
            // Обработчик спина
            async function handleSpin() {
                if (isLoading || !confirmBet.checked) return;
               
                // Проверка таймера
                if (Date.now() - (userData.lastSpin || 0) < COOLDOWN) {
                    resultDisplay.textContent = "Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    return;
                }
               
                // Начинаем спин
                isLoading = true;
                spinBtn.disabled = true;
                spinBtn.textContent = "КРУТИМ...";
                resultDisplay.textContent = "Крутим...";
                resultDisplay.className = "result-display";
               
                // Генерация результатов
                const results = [
                    symbols[Math.floor(Math.random() * symbols.length)].name,
                    symbols[Math.floor(Math.random() * symbols.length)].name,
                    symbols[Math.floor(Math.random() * symbols.length)].name
                ];
               
                // Анимация (упрощенная)
                const durations = [800, 1000, 1200];
                reels.forEach((reel, index) => {
                    let pos = 0;
                    const interval = setInterval(() => {
                        const randomSymbol = symbols[Math.floor(Math.random() * symbols.length)];
                        reel.src = randomSymbol.url;
                        pos++;
                        if (pos > 15) {
                            clearInterval(interval);
                            const finalSymbol = symbols.find(s => s.name === results[index]);
                            reel.src = finalSymbol.url;
                        }
                    }, durations[index] / 15);
                });
               
                // Обработка результата
                setTimeout(async () => {
                    try {
                        const key = results.join(",");
                        let reward = 0;
                        let resultMessage = "";
                        let isWin = false;
                       
                        // Проверка выигрышной комбинации
                        if (winningCombos[key]) {
                            reward = winningCombos[key];
                            isWin = true;
                            resultMessage = `ПОБЕДА! Ты выиграл ${reward}$`;
                           
                            // Обновляем статистику
                            userData.balance += reward;
                            userData.totalGames++;
                            userData.wins++;
                            userData.totalWinnings += reward;
                            userData.currentStreak++;
                            userData.bestStreak = Math.max(userData.bestStreak, userData.currentStreak);
                            userData.maxWin = Math.max(userData.maxWin, reward);
                        } else {
                            resultMessage = "Неудача! Попробуй еще раз.";
                            userData.totalGames++;
                            userData.currentStreak = 0;
                        }
                       
                        userData.lastSpin = Date.now();
                        userData.lastSpinResult = resultMessage;
                       
                        // Сохраняем данные
                        const saved = await saveUserData();
                       
                        if (!saved) {
                            throw new Error('Не удалось сохранить результат');
                        }
                       
                        // Обновляем интерфейс
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = isWin ? "result-display win-result" : "result-display lose-result";
                        updateUI();
                        await updateTopPlayers();
                       
                        // Отправляем результат в админку
                        const html = `
                            <div style="background:#1e1e2e;padding:20px;border-radius:10px;text-align:center">
                                <h3 style="color:#ffd700">�� Результат спина</h3>
                                <p>Игрок: <strong>${userData.nickname}</strong></p>
                                <p>Результат: <strong style="color:${isWin ? '#4CAF50' : '#f44336'}">${resultMessage}</strong></p>
                                <p>Баланс: <strong>${userData.balance}$</strong></p>
                            </div>
                        `;
                       
                        const encoded = btoa(unescape(encodeURIComponent(html)));
                        window.parent.postMessage({
                            type: "slotResult",
                            payload: { html: encoded }
                        }, "*");
                       
                        console.log('✅ Спин завершен:', resultMessage);
                       
                    } catch (error) {
                        console.error('❌ Ошибка обработки спина:', error);
                        resultDisplay.textContent = "Ошибка сохранения результата";
                        resultDisplay.className = "result-display lose-result";
                    } finally {
                        isLoading = false;
                        spinBtn.textContent = "SPIN";
                        updateTimerAndButton();
                    }
                }, 1200);
            }
           
            // Инициализация
            async function init() {
                try {
                    console.log('=== ИНИЦИАЛИЗАЦИЯ ИГРЫ ===');
                   
                    // Загружаем данные пользователя
                    userData = await loadUserData();
                   
                    if (!userData) {
                        throw new Error('Не удалось загрузить данные пользователя');
                    }
                   
                    console.log('Данные пользователя загружены:', userData);
                   
                    // Обновляем интерфейс
                    updateUI();
                    await updateTopPlayers();
                    updateTimerAndButton();
                   
                    // Настройка интервалов
                    setInterval(updateTimerAndButton, 1000);
                    setInterval(async () => {
                        await updateTopPlayers();
                    }, 30000);
                   
                    // Настройка обработчиков
                    confirmBet.addEventListener('change', updateTimerAndButton);
                    spinBtn.addEventListener('click', handleSpin);
                   
                    // Показываем готовность
                    resultDisplay.textContent = "Готов к игре! Жми SPIN!";
                    console.log('=== ИГРА ГОТОВА ===');
                   
                } catch (error) {
                    console.error('Ошибка инициализации:', error);
                    resultDisplay.textContent = "Ошибка загрузки игры";
                    resultDisplay.className = "result-display lose-result";
                }
            }
           
            // Запуск
            init();
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

20

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Игровой автомат</title>
    <style>
        /* ... (все CSS стили остаются такими же) ... */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
            color: #fff;
        }

        .unified-container {
            display: flex;
            width: 100%;
            max-width: 1200px;
            background: rgba(30, 30, 46, 0.9);
            border-radius: 20px;
            border: 3px solid #4a4a6d;
            box-shadow: 0 0 40px rgba(0, 0, 0, 0.7);
            overflow: hidden;
        }
       
        .top-players {
            flex: 0 0 250px;
            background: rgba(40, 40, 60, 0.9);
            padding: 15px;
            overflow-y: auto;
            border-right: 2px solid #5a5a80;
        }

        .top-players h2 {
            position: sticky;
            top: 0;
            background: rgba(40, 40, 60, 0.95);
            padding-bottom: 10px;
            z-index: 10;
        }

        .player-list { list-style: none; padding-top: 5px; }
        .player-item { display: flex; justify-content: space-between; padding: 10px 5px; margin-bottom: 5px; background: rgba(50, 50, 70, 0.6); border-radius: 6px; border-left: 3px solid #ffd700; font-size: 14px; transition: background 0.2s; }
        .player-item:hover { background: rgba(60, 60, 80, 0.7); }
        .player-item.user-highlight { border-left: 3px solid #4CAF50; background: rgba(76, 175, 80, 0.1); }

        .right-section {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
            padding: 20px;
            align-items: center;
        }

        .slot-machine-container {
            width: 100%;
            max-width: 500px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
       
        .spin-controls {
            display: flex;
            flex-direction: column;
            align-items: center;
            margin-top: 15px;
            gap: 10px;
        }

        .checkbox-container {
            padding: 8px 12px;
            align-self: flex-start;
            margin-left: 20px;
        }
       
        #slot-spin {
            width: 90%;
            max-width: 300px;
            height: 60px;
            font-size: 28px;
            font-weight: bold;
            color: #fff;
            background: linear-gradient(145deg, #ff416c, #ff4b2b);
            border: none;
            border-radius: 12px;
            cursor: pointer;
            box-shadow: 0 10px 20px rgba(255, 75, 43, 0.6), 0 0 0 4px #ffc107;
            transition: all 0.2s ease;
            text-transform: uppercase;
        }
       
        #slot-spin:hover:not(:disabled) {
            background: linear-gradient(145deg, #ff4b2b, #ff416c);
            transform: scale(1.03);
            box-shadow: 0 12px 25px rgba(255, 75, 43, 0.8), 0 0 0 6px #ffd700;
        }
       
        #slot-spin:disabled {
            background: #4a4a6d;
            cursor: not-allowed;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            opacity: 0.7;
        }
       
        #toggle-stats-btn {
            background: linear-gradient(to right, #4a4a6d, #5a5a80);
            color: #fff;
            border: none;
            border-radius: 8px;
            padding: 10px 15px;
            font-size: 14px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
            transition: background 0.3s ease, transform 0.2s ease;
            margin-top: 20px;
            display: flex;
            align-items: center;
            gap: 8px;
            width: 90%;
            max-width: 500px;
            justify-content: center;
        }

        #toggle-stats-btn:hover {
            background: linear-gradient(to right, #5a5a80, #6a6a90);
            transform: translateY(-2px);
        }

        .player-info {
            background: rgba(30, 30, 46, 0.8);
            border-radius: 15px;
            padding: 15px;
            border: 2px solid #6a6a90;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
            width: 90%;
            max-width: 500px;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            padding-top: 0;
            padding-bottom: 0;
            margin-top: 10px;
            transition: max-height 0.5s ease-in-out, opacity 0.4s ease, padding 0.5s ease;
        }

        .player-info.open {
            max-height: 500px;
            opacity: 1;
            padding-top: 15px;
            padding-bottom: 15px;
        }
       
        .top-players h2, .player-info h2 {
            text-align: center; margin-bottom: 15px; color: #ffd700; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); font-size: 20px;
        }
        .player-name { font-weight: bold; }
        .player-amount { color: #4CAF50; font-weight: bold; }
        .timer-container { background: rgba(30, 30, 46, 0.8); padding: 10px 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #4a4a6d; box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); align-self: flex-end; }
        #slot-timer { font-size: 16px; color: #ffdd8a; font-weight: bold; text-shadow: 0 0 5px rgba(255, 221, 138, 0.7); }
        .slot-machine { width: 100%; padding: 15px; background: rgba(40, 40, 60, 0.9); border-radius: 10px; text-align: center; color: #fff; border: 2px solid #5a5a80; box-shadow: 0 0 25px rgba(0, 0, 0, 0.4); position: relative; }
        .result-display { padding: 10px; margin-bottom: 15px; font-size: 16px; min-height: 50px; display: flex; align-items: center; justify-content: center; transition: all 0.5s ease; }
        .win-result { background: rgba(76, 175, 80, 0.2); color: #4CAF50; border: 2px solid #4CAF50; box-shadow: 0 0 15px rgba(76, 175, 80, 0.5); text-shadow: 0 0 5px rgba(76, 175, 80, 0.7); }
        .lose-result { background: rgba(244, 67, 54, 0.2); color: #f44336; border: 2px solid #f44336; box-shadow: 0 0 15px rgba(244, 67, 54, 0.3); }
        .slot-window { display: flex; justify-content: space-around; margin-bottom: 15px; padding: 10px; border-radius: 10px; border: 2px solid #555; background: rgba(20, 20, 35, 0.8);}
        .slot-reel { width: 80px; height: 80px; overflow: hidden; border-radius: 8px; background: #000; border: 2px solid #555; position: relative; box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.7); }
        .slot-reel img { width: 100%; height: 100%; object-fit: contain; top: 0; transition: top 0.15s linear; }
        .current-player { display: flex; justify-content: space-between; padding: 15px; background: rgba(40, 40, 60, 0.7); border-radius: 10px; border-left: 4px solid #4CAF50; margin-bottom: 15px; }
        .player-stats { display: flex; flex-direction: column; gap: 10px; }
        .stat-item { display: flex; justify-content: space-between; padding: 10px 12px; background: rgba(50, 50, 70, 0.5); border-radius: 6px; }
        .stat-label { color: #ccc; }
        .stat-value { color: #ffd700; font-weight: bold; }
        .last-spin-result {
            background: rgba(90, 90, 128, 0.3);
            border: 1px solid #6a6a90;
            border-radius: 8px;
            padding: 10px;
            margin-bottom: 10px;
            font-size: 14px;
        }
        .last-spin-win { color: #4CAF50; border-color: #4CAF50; background: rgba(76, 175, 80, 0.1); }
        .last-spin-lose { color: #f44336; border-color: #f44336; background: rgba(244, 67, 54, 0.1); }

        @media (max-width: 850px) {
            .unified-container {
                flex-direction: column;
                max-width: 550px;
            }

            .top-players {
                flex: none;
                width: 100%;
                max-height: 250px;
                border-right: none;
                border-bottom: 2px solid #5a5a80;
                border-radius: 20px 20px 0 0;
            }

            .right-section {
                padding: 15px;
            }

            .top-players h2 {
                position: static;
                background: none;
            }
           
            .slot-machine-container {
                max-width: none;
            }

            .player-info {
                max-width: none;
            }

            #toggle-stats-btn {
                max-width: none;
            }
        }
       
        .loading { opacity: 0.6; pointer-events: none; }
        .error-message {
            background: rgba(244, 67, 54, 0.2);
            color: #f44336;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
            text-align: center;
            border: 1px solid #f44336;
        }
        .success-message {
            background: rgba(76, 175, 80, 0.2);
            color: #4CAF50;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
            text-align: center;
            border: 1px solid #4CAF50;
        }
       
        .debug-info {
            position: fixed;
            top: 10px;
            right: 10px;
            background: rgba(0,0,0,0.8);
            color: #fff;
            padding: 10px;
            border-radius: 5px;
            font-size: 12px;
            z-index: 9999;
            display: none;
        }
    </style>
</head>
<body>
    <div class="debug-info" id="debugInfo"></div>
   
    <div class="unified-container">
        <div class="top-players">
            <h2>ТОП ИГРОКОВ</h2>
            <div id="top-players-loading">Загрузка рейтинга...</div>
            <ul class="player-list" id="top-players-list" style="display:none;"></ul>
        </div>

        <div class="right-section">
            <div class="slot-machine-container">
                <div class="timer-container">
                    <div id="slot-timer">Загрузка таймера...</div>
                </div>
               
                <div class="slot-machine">
                    <div id="result-display" class="result-display">
                        Добро пожаловать! Загрузка данных...
                    </div>
                   
                    <div class="slot-window">
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/605998.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/319417.png" alt="Symbol"></div>
                        <div class="slot-reel"><img src="https://upforme.ru/uploads/001c/52/b6/2/802623.png" alt="Symbol"></div>
                    </div>
                   
                    <div class="spin-controls">
                        <div class="checkbox-container">
                            <input type="checkbox" id="confirm-bet">
                            <label for="confirm-bet">подтверждаю стоимость ставки</label>
                        </div>
                        <button id="slot-spin" disabled>SPIN</button>
                    </div>
                </div>
            </div>
           
            <button id="toggle-stats-btn">
                <span>Показать/Скрыть статистику игрока</span>
                <span class="arrow">▼</span>
            </button>

            <div class="player-info" id="player-stats-block">
                <h2>Ваша статистика</h2>
                <div id="stats-loading">Загрузка статистики...</div>
                <div id="stats-content" style="display:none;">
                    <div class="current-player">
                        <span class="player-name" id="player-nickname">Игрок</span>
                        <span class="player-amount" id="player-balance">0$</span>
                    </div>
                   
                    <div class="last-spin-result" id="last-spin-result">
                        Последний спин: не было
                    </div>
                   
                    <div class="player-stats">
                        <div class="stat-item">
                            <span class="stat-label">Всего игр:</span>
                            <span class="stat-value" id="total-games">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Побед:</span>
                            <span class="stat-value" id="wins">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Процент побед:</span>
                            <span class="stat-value" id="win-rate">0%</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Общий выигрыш:</span>
                            <span class="stat-value" id="total-winnings">0$</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Текущая серия:</span>
                            <span class="stat-value" id="current-streak">0</span>
                        </div>
                        <div class="stat-item">
                            <span class="stat-label">Лучшая серия:</span>
                            <span class="stat-value" id="best-streak">0</span>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        (function(){
            // === КОНФИГУРАЦИЯ ===
            const appId = 16777213;
            const storageKey = "slotbank";
            const TIMER_KEY = "slotbank_timers";
            const GUEST_NICK = "Гость";
           
            // Игровые константы
            const TIMER_HOURS = 0;
            const TIMER_MINUTES = 1;
            const COOLDOWN = (TIMER_HOURS*60 + TIMER_MINUTES)*60*1000;
           
            const symbols = [
                {name:"Tikva", url:"https://upforme.ru/uploads/001c/52/b6/2/605998.png"},
                {name:"Cherep", url:"https://upforme.ru/uploads/001c/52/b6/2/319417.png"},
                {name:"Zombie", url:"https://upforme.ru/uploads/001c/52/b6/2/802623.png"},
                {name:"Blood", url:"https://upforme.ru/uploads/001c/52/b6/2/566605.png"},
                {name:"Potion", url:"https://upforme.ru/uploads/001c/52/b6/2/610070.png"}
            ];
           
            const winningCombos = {
                "Tikva,Tikva,Tikva": 100,
                "Cherep,Cherep,Cherep": 150,
                "Zombie,Zombie,Zombie": 200,
                "Blood,Blood,Blood": 250,
                "Potion,Potion,Potion": 300,
                "Zombie,Blood,Potion": 500
            };
           
            // === ЭЛЕМЕНТЫ ДОМ ===
            const reels = document.querySelectorAll(".slot-reel img");
            const spinBtn = document.getElementById("slot-spin");
            const timerEl = document.getElementById("slot-timer");
            const resultDisplay = document.getElementById("result-display");
            const confirmBet = document.getElementById("confirm-bet");
            const debugInfo = document.getElementById("debugInfo");
           
            // === ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ===
            let currentUser = {
                id: null,
                nickname: GUEST_NICK,
                data: null
            };
            let isLoading = false;
            let gameData = { users: {}, timers: {} };
            let intervalId = null;
           
            // === ДЕБАГ ИНФОРМАЦИЯ ===
            function updateDebugInfo(message) {
                if (debugInfo) {
                    debugInfo.innerHTML = message;
                    debugInfo.style.display = 'block';
                    console.log('DEBUG:', message);
                }
            }
           
            // === ПОЛУЧЕНИЕ ДАННЫХ ПОЛЬЗОВАТЕЛЯ ===
            function getUserInfo() {
                updateDebugInfo('Получение информации о пользователе...');
               
                let userId = null;
                let nickname = GUEST_NICK;
               
                // 1. Пробуем получить из глобальных переменных
                if (typeof UserID !== 'undefined' && UserID > 0) {
                    userId = String(UserID);
                    nickname = typeof UserLogin !== 'undefined' ? UserLogin : GUEST_NICK;
                    updateDebugInfo(`Найден UserID: ${userId}, ник: ${nickname}`);
                } else {
                    // 2. Пробуем получить из тега strong (как в примере)
                    const nickElements = document.querySelectorAll('strong');
                    for (let el of nickElements) {
                        const text = el.textContent.trim();
                        if (text && text !== 'Гость' && text.length > 2 && !text.includes('http')) {
                            nickname = text;
                            break;
                        }
                    }
                   
                    // 3. Для гостей генерируем ID
                    let guestId = localStorage.getItem('slot_guest_id');
                    if (!guestId) {
                        guestId = 'guest_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
                        localStorage.setItem('slot_guest_id', guestId);
                    }
                    userId = guestId;
                }
               
                return {
                    id: userId,
                    nickname: nickname,
                    type: userId.startsWith('guest_') ? 'guest' : 'registered'
                };
            }
           
            // === ХРАНИЛИЩЕ MYBB API ===
            const storage = {
                async getInfo(keys = [storageKey, TIMER_KEY]) {
                    updateDebugInfo(`Запрос данных из хранилища: ${keys.join(', ')}`);
                   
                    return new Promise((resolve) => {
                        // Проверяем наличие jQuery и ForumAPITicket
                        if (typeof $ === 'undefined') {
                            updateDebugInfo('jQuery не загружен!');
                            const result = {};
                            for (const key of keys) {
                                const data = localStorage.getItem(`slot_${key}`);
                                result[key] = data ? JSON.parse(data) : (key === storageKey ? { users: {} } : {});
                            }
                            return resolve(result);
                        }
                       
                        if (typeof ForumAPITicket === "undefined") {
                            updateDebugInfo("ForumAPITicket не найден. Используем localStorage.");
                            const result = {};
                            for (const key of keys) {
                                const data = localStorage.getItem(`slot_${key}`);
                                result[key] = data ? JSON.parse(data) : (key === storageKey ? { users: {} } : {});
                            }
                            return resolve(result);
                        }
                       
                        $.ajax({
                            url: "/api.php",
                            type: "GET",
                            data: {
                                token: ForumAPITicket,
                                method: "storage.get",
                                app_id: appId,
                                key: keys
                            },
                            dataType: "json",
                            success: function(resp) {
                                updateDebugInfo('Получен ответ от API');
                                const result = {};
                                if (resp?.response?.storage?.data) {
                                    for (const key of keys) {
                                        const rawData = resp.response.storage.data[key];
                                        if (rawData) {
                                            try {
                                                result[key] = JSON.parse(rawData);
                                            } catch (e) {
                                                console.error(`Ошибка парсинга ключа ${key}:`, e);
                                                result[key] = (key === storageKey) ? { users: {} } : {};
                                            }
                                        } else {
                                            result[key] = (key === storageKey) ? { users: {} } : {};
                                        }
                                    }
                                } else {
                                    updateDebugInfo('Нет данных в ответе API');
                                    for (const key of keys) {
                                        result[key] = (key === storageKey) ? { users: {} } : {};
                                    }
                                }
                                resolve(result);
                            },
                            error: function(jqXHR, textStatus, errorThrown) {
                                updateDebugInfo(`Ошибка API: ${textStatus}. Используем localStorage.`);
                                const result = {};
                                for (const key of keys) {
                                    const data = localStorage.getItem(`slot_${key}`);
                                    result[key] = data ? JSON.parse(data) : (key === storageKey ? { users: {} } : {});
                                }
                                resolve(result);
                            }
                        });
                    });
                },
               
                async setInfo(key, data) {
                    updateDebugInfo(`Сохранение данных в ключ: ${key}`);
                   
                    return new Promise((resolve) => {
                        if (typeof $ === 'undefined' || typeof ForumAPITicket === "undefined") {
                            localStorage.setItem(`slot_${key}`, JSON.stringify(data));
                            updateDebugInfo(`Сохранено в localStorage: ${key}`);
                            return resolve({ success: true });
                        }
                       
                        $.ajax({
                            url: "/api.php",
                            type: "POST",
                            data: {
                                token: ForumAPITicket,
                                method: "storage.set",
                                app_id: appId,
                                key: key,
                                value: JSON.stringify(data)
                            },
                            dataType: "json",
                            success: function(resp) {
                                updateDebugInfo(`Успешно сохранено в API: ${key}`);
                                resolve(resp);
                            },
                            error: function() {
                                localStorage.setItem(`slot_${key}`, JSON.stringify(data));
                                updateDebugInfo(`Сохранено в localStorage (ошибка API): ${key}`);
                                resolve({ success: true });
                            }
                        });
                    });
                }
            };
           
            // === ЗАГРУЗКА ДАННЫХ ПОЛЬЗОВАТЕЛЯ ===
            async function loadUserData() {
                try {
                    updateDebugInfo('Начало загрузки данных пользователя...');
                   
                    // Получаем информацию о пользователе
                    currentUser = getUserInfo();
                    updateDebugInfo(`Пользователь: ${currentUser.nickname} (${currentUser.id})`);
                   
                    // Загружаем все данные из хранилища
                    const storedData = await storage.getInfo();
                    gameData = {
                        users: storedData[storageKey]?.users || {},
                        timers: storedData[TIMER_KEY] || {}
                    };
                   
                    updateDebugInfo(`Загружено пользователей: ${Object.keys(gameData.users).length}`);
                   
                    // Получаем данные текущего пользователя
                    let userData = gameData.users[currentUser.id];
                   
                    if (!userData) {
                        updateDebugInfo('Создание нового пользователя...');
                        // Создаем нового пользователя
                        userData = {
                            userId: currentUser.id,
                            nickname: currentUser.nickname,
                            userType: currentUser.type,
                            balance: 1000,
                            totalGames: 0,
                            wins: 0,
                            totalWinnings: 0,
                            maxWin: 0,
                            currentStreak: 0,
                            bestStreak: 0,
                            lastSpin: null,
                            lastSpinResult: null,
                            createdAt: Date.now(),
                            updatedAt: Date.now()
                        };
                       
                        // Сохраняем нового пользователя
                        gameData.users[currentUser.id] = userData;
                        await storage.setInfo(storageKey, { users: gameData.users });
                       
                        updateDebugInfo('Новый пользователь создан и сохранен');
                    } else {
                        updateDebugInfo('Пользователь найден, обновление ника...');
                        // Обновляем никнейм, если он изменился
                        if (userData.nickname !== currentUser.nickname) {
                            userData.nickname = currentUser.nickname;
                            userData.updatedAt = Date.now();
                            gameData.users[currentUser.id] = userData;
                            await storage.setInfo(storageKey, { users: gameData.users });
                        }
                    }
                   
                    currentUser.data = userData;
                    updateDebugInfo('Данные пользователя загружены успешно');
                    return userData;
                   
                } catch (error) {
                    updateDebugInfo(`Ошибка загрузки данных: ${error.message}`);
                    console.error('Ошибка загрузки данных:', error);
                   
                    // Создаем временные данные
                    currentUser.data = {
                        userId: currentUser.id,
                        nickname: currentUser.nickname,
                        userType: currentUser.type,
                        balance: 1000,
                        totalGames: 0,
                        wins: 0,
                        totalWinnings: 0,
                        maxWin: 0,
                        currentStreak: 0,
                        bestStreak: 0,
                        lastSpin: null,
                        lastSpinResult: null,
                        createdAt: Date.now(),
                        updatedAt: Date.now()
                    };
                    return currentUser.data;
                }
            }
           
            // === СОХРАНЕНИЕ ДАННЫХ ПОЛЬЗОВАТЕЛЯ ===
            async function saveUserData() {
                if (!currentUser.data) {
                    updateDebugInfo('Нет данных для сохранения');
                    return false;
                }
               
                try {
                    currentUser.data.updatedAt = Date.now();
                    gameData.users[currentUser.id] = currentUser.data;
                   
                    await storage.setInfo(storageKey, { users: gameData.users });
                    updateDebugInfo('✅ Данные пользователя сохранены');
                    return true;
                } catch (error) {
                    updateDebugInfo(`❌ Ошибка сохранения: ${error.message}`);
                    console.error('❌ Ошибка сохранения:', error);
                    return false;
                }
            }
           
            // === СОХРАНЕНИЕ ТАЙМЕРА ===
            async function saveTimer() {
                try {
                    gameData.timers[currentUser.id] = {
                        lastSpin: currentUser.data.lastSpin,
                        nickname: currentUser.nickname,
                        updatedAt: Date.now()
                    };
                   
                    await storage.setInfo(TIMER_KEY, gameData.timers);
                    updateDebugInfo('✅ Таймер сохранен');
                    return true;
                } catch (error) {
                    updateDebugInfo(`❌ Ошибка сохранения таймера: ${error.message}`);
                    console.error('❌ Ошибка сохранения таймера:', error);
                    return false;
                }
            }
           
            // === ОБНОВЛЕНИЕ ИНТЕРФЕЙСА ===
            function updateUserInterface() {
                if (!currentUser.data) {
                    updateDebugInfo('Нет данных для обновления интерфейса');
                    return;
                }
               
                const user = currentUser.data;
                updateDebugInfo(`Обновление интерфейса для: ${user.nickname}`);
               
                // Основная информация
                document.getElementById('player-nickname').textContent = user.nickname;
                document.getElementById('player-balance').textContent = user.balance + '$';
               
                // Статистика
                document.getElementById('total-games').textContent = user.totalGames;
                document.getElementById('wins').textContent = user.wins;
                document.getElementById('total-winnings').textContent = user.totalWinnings + '$';
               
                const winRate = user.totalGames > 0 ?
                    Math.round((user.wins / user.totalGames) * 100) : 0;
                document.getElementById('win-rate').textContent = winRate + '%';
               
                document.getElementById('current-streak').textContent = user.currentStreak;
                document.getElementById('best-streak').textContent = user.bestStreak;
               
                // Последний спин
                const lastSpinEl = document.getElementById('last-spin-result');
                if (user.lastSpinResult) {
                    lastSpinEl.textContent = `Последний спин: ${user.lastSpinResult}`;
                    lastSpinEl.className = user.lastSpinResult.includes('ПОБЕДА') ?
                        'last-spin-result last-spin-win' : 'last-spin-result last-spin-lose';
                } else {
                    lastSpinEl.textContent = 'Последний спин: не было';
                    lastSpinEl.className = 'last-spin-result';
                }
               
                // Показываем контент
                document.getElementById('stats-loading').style.display = 'none';
                document.getElementById('stats-content').style.display = 'block';
               
                updateDebugInfo('Интерфейс обновлен');
            }
           
            // === ОБНОВЛЕНИЕ ТОПА ИГРОКОВ ===
            async function updateTopPlayers() {
                try {
                    updateDebugInfo('Обновление топа игроков...');
                   
                    const users = gameData.users;
                    const players = Object.values(users)
                        .filter(user => user.totalWinnings > 0)
                        .sort((a, b) => b.totalWinnings - a.totalWinnings)
                        .slice(0, 10);
                   
                    const topList = document.getElementById('top-players-list');
                    const loadingElement = document.getElementById('top-players-loading');
                   
                    loadingElement.style.display = 'none';
                    topList.style.display = 'block';
                    topList.innerHTML = '';
                   
                    if (players.length === 0) {
                        topList.innerHTML = '<li class="player-item"><span class="player-name">Нет игроков</span><span class="player-amount">0$</span></li>';
                        updateDebugInfo('Нет данных для топа');
                        return;
                    }
                   
                    players.forEach((player, index) => {
                        const li = document.createElement('li');
                        li.className = 'player-item';
                       
                        // Подсветка текущего пользователя
                        if (currentUser.data && player.userId === currentUser.data.userId) {
                            li.classList.add('user-highlight');
                        }
                       
                        const place = index + 1;
                        const placeIcon = place === 1 ? '🥇' : place === 2 ? '🥈' : place === 3 ? '🥉' : `${place}.`;
                       
                        li.innerHTML = `
                            <span class="player-name">${placeIcon} ${player.nickname}</span>
                            <span class="player-amount">${player.totalWinnings}$</span>
                        `;
                       
                        topList.appendChild(li);
                    });
                   
                    updateDebugInfo(`Топ обновлен, игроков: ${players.length}`);
                } catch (error) {
                    updateDebugInfo(`Ошибка обновления топа: ${error.message}`);
                    console.error('Ошибка обновления топа:', error);
                }
            }
           
            // === ОБНОВЛЕНИЕ УПРАВЛЕНИЯ ИГРОЙ ===
            function updateGameControls() {
                if (!currentUser.data) {
                    timerEl.textContent = "Загрузка...";
                    spinBtn.disabled = true;
                    updateDebugInfo('Нет данных пользователя, кнопка заблокирована');
                    return;
                }
               
                const timeSinceLastSpin = Date.now() - (currentUser.data.lastSpin || 0);
                const timeLeft = COOLDOWN - timeSinceLastSpin;
               
                if (timeLeft <= 0) {
                    timerEl.textContent = "Можешь крутить! ✅";
                    spinBtn.disabled = !confirmBet.checked;
                    spinBtn.textContent = "SPIN";
                    updateDebugInfo('Таймер готов, кнопка: ' + (confirmBet.checked ? 'разблокирована' : 'заблокирована (нет галочки)'));
                } else {
                    const hours = Math.floor(timeLeft / 3600000);
                    const minutes = Math.floor((timeLeft % 3600000) / 60000);
                    const seconds = Math.floor((timeLeft % 60000) / 1000);
                   
                    timerEl.textContent = `${hours}ч ${minutes}м ${seconds}с`;
                    spinBtn.disabled = true;
                    spinBtn.textContent = "ЖДИ ТАЙМЕР";
                    updateDebugInfo(`Таймер: ${hours}ч ${minutes}м ${seconds}с осталось`);
                }
            }
           
            // === СОЗДАНИЕ HTML ДЛЯ ОТПРАВКИ ===
            function createResultHTML(results, isWin, reward, resultMessage) {
                const symbolsHTML = results.map(symbolName => {
                    const symbol = symbols.find(s => s.name === symbolName);
                    return symbol ? `
                        <div style="width:80px;height:80px;border-radius:10px;border:2px solid #555;background:#000;overflow:hidden;box-shadow:0 0 10px rgba(0,0,0,0.5);margin:0 5px;">
                            <img src="${symbol.url}" alt="${symbolName}" style="width:100%;height:100%;object-fit:contain;">
                        </div>
                    ` : '';
                }).join('');
               
                const winStyle = isWin ?
                    "background:rgba(76,175,80,0.2);color:#4CAF50;border:2px solid #4CAF50;box-shadow:0 0 20px rgba(76,175,80,0.5);text-shadow:0 0 5px rgba(76,175,80,0.7)" :
                    "background:rgba(244,67,54,0.2);color:#f44336;border:2px solid #f44336;box-shadow:0 0 20px rgba(244,67,54,0.3)";
               
                return `
                <div style="background:rgba(30,30,46,0.95);border:2px solid #5a5a80;border-radius:15px;padding:15px;margin:10px 0;max-width:500px;box-shadow:0 0 25px rgba(0,0,0,0.6);">
                    <div style="text-align:center;margin-bottom:15px;color:#ffd700;text-shadow:0 0 10px rgba(255,215,0,0.5);font-size:20px;border-bottom:2px solid #4a4a6d;padding-bottom:10px;">
                        🎰 Результат спина
                    </div>
                    <div style="display:flex;flex-direction:column;align-items:center;gap:15px;">
                        <div style="display:flex;justify-content:center;gap:15px;margin-bottom:15px;">
                            ${symbolsHTML}
                        </div>
                        <div style="text-align:center;padding:12px;border-radius:10px;font-size:18px;font-weight:bold;width:100%;${winStyle}">
                            ${resultMessage}
                        </div>
                        <div style="text-align:center;margin-top:10px;font-size:14px;color:#aaa;border-top:1px solid #4a4a6d;padding-top:10px;">
                            Игрок: <strong style="color:#ffd700;">${currentUser.data.nickname}</strong> |
                            Баланс: <strong style="color:#4CAF50;">${currentUser.data.balance}$</strong> |
                            Общий выигрыш: <strong style="color:#ffd700;">${currentUser.data.totalWinnings}$</strong>
                        </div>
                    </div>
                </div>`;
            }
           
            // === ОБРАБОТЧИК СПИНА ===
            async function handleSpin() {
                if (isLoading) {
                    updateDebugInfo('Спин уже выполняется');
                    return;
                }
               
                if (!confirmBet.checked) {
                    resultDisplay.textContent = "❌ Подтвердите стоимость ставки!";
                    resultDisplay.className = "result-display lose-result";
                    updateDebugInfo('Нет подтверждения ставки');
                    return;
                }
               
                const timeSinceLastSpin = Date.now() - (currentUser.data.lastSpin || 0);
                if (timeSinceLastSpin < COOLDOWN) {
                    resultDisplay.textContent = "⏳ Подожди, таймер не истёк!";
                    resultDisplay.className = "result-display lose-result";
                    updateDebugInfo('Таймер не истек');
                    return;
                }
               
                // Начинаем спин
                isLoading = true;
                spinBtn.disabled = true;
                spinBtn.textContent = "КРУТИМ...";
                resultDisplay.textContent = "🎰 Крутим барабаны...";
                resultDisplay.className = "result-display";
                updateDebugInfo('Начало спина');
               
                // Генерируем результаты
                const results = [
                    symbols[Math.floor(Math.random() * symbols.length)].name,
                    symbols[Math.floor(Math.random() * symbols.length)].name,
                    symbols[Math.floor(Math.random() * symbols.length)].name
                ];
               
                updateDebugInfo(`Результаты спина: ${results.join(', ')}`);
               
                // Анимация барабанов
                const durations = [800, 1000, 1200];
                reels.forEach((reel, index) => {
                    let frame = 0;
                    const interval = setInterval(() => {
                        const randomSymbol = symbols[Math.floor(Math.random() * symbols.length)];
                        reel.src = randomSymbol.url;
                        frame++;
                       
                        if (frame > 15) {
                            clearInterval(interval);
                            const finalSymbol = symbols.find(s => s.name === results[index]);
                            reel.src = finalSymbol.url;
                        }
                    }, durations[index] / 15);
                });
               
                // Обработка результата после анимации
                setTimeout(async () => {
                    try {
                        // Проверка выигрыша
                        const resultKey = results.join(",");
                        let reward = winningCombos[resultKey] || 0;
                        let isWin = reward > 0;
                        let resultMessage = '';
                       
                        updateDebugInfo(`Проверка комбинации: ${resultKey}, выигрыш: ${reward}`);
                       
                        // Обновление статистики
                        if (isWin) {
                            resultMessage = `🎉 ПОБЕДА! Выигрыш: ${reward}$`;
                            currentUser.data.balance += reward;
                            currentUser.data.wins += 1;
                            currentUser.data.totalWinnings += reward;
                            currentUser.data.currentStreak += 1;
                            currentUser.data.bestStreak = Math.max(currentUser.data.bestStreak, currentUser.data.currentStreak);
                            currentUser.data.maxWin = Math.max(currentUser.data.maxWin, reward);
                        } else {
                            resultMessage = "😢 Неудача! Попробуй еще раз";
                            currentUser.data.currentStreak = 0;
                        }
                       
                        currentUser.data.totalGames += 1;
                        currentUser.data.lastSpin = Date.now();
                        currentUser.data.lastSpinResult = resultMessage;
                        currentUser.data.updatedAt = Date.now();
                       
                        // Сохранение данных
                        const saveSuccess = await saveUserData();
                        const timerSuccess = await saveTimer();
                       
                        if (!saveSuccess || !timerSuccess) {
                            throw new Error('Не удалось сохранить результат');
                        }
                       
                        // Обновление интерфейса
                        resultDisplay.textContent = resultMessage;
                        resultDisplay.className = isWin ? "result-display win-result" : "result-display lose-result";
                       
                        updateUserInterface();
                        await updateTopPlayers();
                       
                        // Отправка результата в тему
                        const html = createResultHTML(results, isWin, reward, resultMessage);
                        const encoded = btoa(unescape(encodeURIComponent(html)));
                       
                        if (window.parent) {
                            window.parent.postMessage({
                                type: "slotResult",
                                payload: {
                                    html: encoded,
                                    userId: currentUser.data.userId,
                                    nickname: currentUser.data.nickname,
                                    result: resultMessage,
                                    reward: reward,
                                    balance: currentUser.data.balance,
                                    totalWinnings: currentUser.data.totalWinnings,
                                    timestamp: Date.now()
                                }
                            }, "*");
                        }
                       
                        updateDebugInfo(`✅ Спин завершен: ${resultMessage}`);
                       
                    } catch (error) {
                        updateDebugInfo(`❌ Ошибка обработки спина: ${error.message}`);
                        console.error('❌ Ошибка обработки спина:', error);
                        resultDisplay.textContent = "⚠️ Ошибка сохранения результата";
                        resultDisplay.className = "result-display lose-result";
                    } finally {
                        isLoading = false;
                        updateGameControls();
                    }
                }, 1200);
            }
           
            // === ИНИЦИАЛИЗАЦИЯ ИГРЫ ===
            async function initGame() {
                try {
                    updateDebugInfo('=== ЗАПУСК ИГРЫ ===');
                   
                    // Инициализация переключателя статистики
                    const statsBlock = document.getElementById('player-stats-block');
                    const toggleBtn = document.getElementById('toggle-stats-btn');
                    toggleBtn.addEventListener('click', () => {
                        statsBlock.classList.toggle('open');
                    });
                   
                    // Обработчик чекбокса
                    confirmBet.addEventListener('change', updateGameControls);
                   
                    // Обработчик кнопки спина
                    spinBtn.addEventListener('click', handleSpin);
                   
                    updateDebugInfo('Обработчики событий установлены');
                   
                    // Загрузка данных пользователя
                    await loadUserData();
                   
                    if (!currentUser.data) {
                        throw new Error('Не удалось загрузить данные пользователя');
                    }
                   
                    updateDebugInfo(`Пользователь: ${currentUser.data.nickname}, баланс: ${currentUser.data.balance}$`);
                   
                    // Обновление интерфейса
                    updateUserInterface();
                    updateGameControls();
                   
                    // Загрузка топа
                    await updateTopPlayers();
                   
                    // Настройка интервалов
                    if (intervalId) clearInterval(intervalId);
                    intervalId = setInterval(updateGameControls, 1000);
                   
                    // Автообновление данных каждые 30 секунд
                    setInterval(async () => {
                        try {
                            await updateTopPlayers();
                            // Обновляем данные пользователя
                            const storedData = await storage.getInfo([storageKey]);
                            gameData.users = storedData[storageKey]?.users || {};
                            if (currentUser.id && gameData.users[currentUser.id]) {
                                currentUser.data = gameData.users[currentUser.id];
                                updateUserInterface();
                                updateGameControls();
                            }
                        } catch (error) {
                            console.error('Ошибка автообновления:', error);
                        }
                    }, 30000);
                   
                    // Готовность
                    resultDisplay.textContent = "✅ Готово! Жми SPIN!";
                    updateDebugInfo('=== ИГРА ГОТОВА ===');
                   
                    // Скрываем дебаг инфо через 10 секунд
                    setTimeout(() => {
                        if (debugInfo) debugInfo.style.display = 'none';
                    }, 10000);
                   
                } catch (error) {
                    updateDebugInfo(`❌ Ошибка инициализации: ${error.message}`);
                    console.error('Ошибка инициализации:', error);
                    resultDisplay.textContent = "❌ Ошибка загрузки игры";
                    resultDisplay.className = "result-display lose-result";
                   
                    const errorDiv = document.createElement('div');
                    errorDiv.className = 'error-message';
                    errorDiv.textContent = 'Не удалось загрузить игру. Попробуйте обновить страницу.';
                    document.querySelector('.slot-machine').appendChild(errorDiv);
                }
            }
           
            // Запуск игры при загрузке страницы
            if (document.readyState === 'loading') {
                document.addEventListener('DOMContentLoaded', initGame);
            } else {
                initGame();
            }
           
        })();
    </script>
</body>
</html>[/html]

[hideprofile]

0

21

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC/0LjQvdCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzMxOTQxNy5wbmciIGFsdD0iQ2hlcmVwIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MDU5OTgucG5nIiBhbHQ9IlRpa3ZhIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi81NjY2MDUucG5nIiBhbHQ9IkJsb29kIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LDAuMik7Y29sb3I6I2Y0NDMzNjtib3JkZXI6MnB4IHNvbGlkICNmNDQzMzY7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDI0NCw2Nyw1NCwwLjMpIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfmKIg0J3QtdGD0LTQsNGH0LAhINCf0L7Qv9GA0L7QsdGD0Lkg0LXRidC1INGA0LDQtwogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiNhYWE7Ym9yZGVyLXRvcDoxcHggc29saWQgIzRhNGE2ZDtwYWRkaW5nLXRvcDoxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQmNCz0YDQvtC6OiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojZmZkNzAwOyI+0JPQvtGB0YLRjDwvc3Ryb25nPiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JHQsNC70LDQvdGBOiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojNENBRjUwOyI+MTAwMCQ8L3N0cm9uZz4gfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgINCe0LHRidC40Lkg0LLRi9C40LPRgNGL0Yg6IDxzdHJvbmcgc3R5bGU9ImNvbG9yOiNmZmQ3MDA7Ij4wJDwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pg==">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

22

[html]
<div class="slot-secure" data-result="CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsNDYsMC45NSk7Ym9yZGVyOjJweCBzb2xpZCAjNWE1YTgwO2JvcmRlci1yYWRpdXM6MTVweDtwYWRkaW5nOjE1cHg7bWFyZ2luOjEwcHggMDttYXgtd2lkdGg6NTAwcHg7Ym94LXNoYWRvdzowIDAgMjVweCByZ2JhKDAsMCwwLDAuNik7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjE1cHg7Y29sb3I6I2ZmZDcwMDt0ZXh0LXNoYWRvdzowIDAgMTBweCByZ2JhKDI1NSwyMTUsMCwwLjUpO2ZvbnQtc2l6ZToyMHB4O2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy1ib3R0b206MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICDwn46wINCg0LXQt9GD0LvRjNGC0LDRgiDRgdC/0LjQvdCwCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjE1cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjNTU1O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNSk7bWFyZ2luOjAgNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly91cGZvcm1lLnJ1L3VwbG9hZHMvMDAxYy81Mi9iNi8yLzYxMDA3MC5wbmciIGFsdD0iUG90aW9uIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MDU5OTgucG5nIiBhbHQ9IlRpa3ZhIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoycHggc29saWQgIzU1NTtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwwLjUpO21hcmdpbjowIDVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdXBmb3JtZS5ydS91cGxvYWRzLzAwMWMvNTIvYjYvMi82MTAwNzAucG5nIiBhbHQ9IlBvdGlvbiIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b2JqZWN0LWZpdDpjb250YWluOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMnB4O2JvcmRlci1yYWRpdXM6MTBweDtmb250LXNpemU6MThweDtmb250LXdlaWdodDpib2xkO3dpZHRoOjEwMCU7YmFja2dyb3VuZDpyZ2JhKDI0NCw2Nyw1NCwwLjIpO2NvbG9yOiNmNDQzMzY7Ym9yZGVyOjJweCBzb2xpZCAjZjQ0MzM2O2JveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgyNDQsNjcsNTQsMC4zKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5iiINCd0LXRg9C00LDRh9CwISDQn9C+0L/RgNC+0LHRg9C5INC10YnQtSDRgNCw0LcKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTRweDtjb2xvcjojYWFhO2JvcmRlci10b3A6MXB4IHNvbGlkICM0YTRhNmQ7cGFkZGluZy10b3A6MTBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjQs9GA0L7QujogPHN0cm9uZyBzdHlsZT0iY29sb3I6I2ZmZDcwMDsiPtCT0L7RgdGC0Yw8L3N0cm9uZz4gfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgINCR0LDQu9Cw0L3RgTogPHN0cm9uZyBzdHlsZT0iY29sb3I6IzRDQUY1MDsiPjEwMDAkPC9zdHJvbmc+IHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQntCx0YnQuNC5INCy0YvQuNCz0YDRi9GIOiA8c3Ryb25nIHN0eWxlPSJjb2xvcjojZmZkNzAwOyI+MCQ8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4=">
Загрузка результата...
</div>

<script>
(function(){
    try {
        var encoded = document.querySelector(".slot-secure").getAttribute("data-result");
        var html = decodeURIComponent(escape(atob(encoded)));
        document.querySelector(".slot-secure").innerHTML = html;
    } catch(e){
        document.querySelector(".slot-secure").innerHTML = "<b>Ошибка результата</b>";
    }
})();
</script>
[/html]

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Тест оформления » в приборе ночного видения » слот-машина с автоотправкой


Рейтинг форумов | Создать форум бесплатно