WarSoul Daily Tasks

自动完成每日祈福和每日挑战

// ==UserScript==
// @name         WarSoul Daily Tasks
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  自动完成每日祈福和每日挑战
// @author       Lunaris
// @match        https://aring.cc/awakening-of-war-soul-ol/
// @icon         https://aring.cc/awakening-of-war-soul-ol/favicon.ico
// @grant        none
// @license MIT
// ==/UserScript==


(function() {
    'use strict';

    // ============================================
    // 🔧 配置区域 - 修改此处可恢复面板显示
    // 将下面的 true 改为 false 可以恢复面板显示
    let AUTO_MODE_ENABLED = false;
    try {
        AUTO_MODE_ENABLED = GM_getValue('autoModeEnabled', false);
    } catch (e) {
        // 如果GM_getValue不可用,使用localStorage
        AUTO_MODE_ENABLED = localStorage.getItem('autoModeEnabled') === 'true';
    }
    // ============================================

    // 安全的存储函数
    function saveAutoMode(value) {
        try {
            GM_setValue('autoModeEnabled', value);
        } catch (e) {
            localStorage.setItem('autoModeEnabled', value);
        }
    }

    // 任务状态
    let taskStatus = {
        completed: false,
        blessing: false,
        challenges: false
    };

    // 创建浮动面板
    function createPanel() {
        const panel = document.createElement('div');
        panel.id = 'daily-task-panel';
        panel.style.cssText = `
            position: fixed;
            top: 20px;
            right: 20px;
            width: 250px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 10px;
            padding: 15px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.3);
            z-index: 10000;
            font-family: Arial, sans-serif;
            color: white;
        `;

        panel.innerHTML = `
            <div style="font-size: 16px; font-weight: bold; margin-bottom: 10px;">每日任务助手</div>
            <div id="task-status" style="font-size: 12px; margin-bottom: 10px; opacity: 0.9;">等待执行...</div>
            <button id="start-daily-task" style="
                width: 100%;
                padding: 10px;
                background: white;
                color: #667eea;
                border: none;
                border-radius: 5px;
                font-size: 14px;
                font-weight: bold;
                cursor: pointer;
                transition: all 0.3s;
                margin-bottom: 8px;
            ">一键完成每日任务</button>
            <button id="enable-auto-mode" style="
                width: 100%;
                padding: 8px;
                background: rgba(255, 255, 255, 0.2);
                color: white;
                border: 1px solid white;
                border-radius: 5px;
                font-size: 12px;
                cursor: pointer;
                transition: all 0.3s;
            ">🤖 启用永久后台执行</button>
        `;

        document.body.appendChild(panel);

        // 按钮悬停效果
        const btn = document.getElementById('start-daily-task');
        btn.onmouseover = () => btn.style.transform = 'scale(1.05)';
        btn.onmouseout = () => btn.style.transform = 'scale(1)';
        btn.onclick = executeDailyTasks;

        // 后台模式按钮
        const autoBtn = document.getElementById('enable-auto-mode');
        autoBtn.onmouseover = () => autoBtn.style.background = 'rgba(255, 255, 255, 0.3)';
        autoBtn.onmouseout = () => autoBtn.style.background = 'rgba(255, 255, 255, 0.2)';
        autoBtn.onclick = enableAutoMode;

        return panel;
    }

    // 启用永久后台执行模式
    function enableAutoMode() {
        const confirmed = confirm(
            '⚠️ 警告:启用永久后台执行模式\n\n' +
            '启用后脚本将:\n' +
            '✓ 自动在后台完成每日任务\n' +
            '✓ 不再显示任何面板提示\n' +
            '✓ 每次打开页面自动执行\n\n' +
            '如需恢复面板显示,需要:\n' +
            '1. 打开Tampermonkey脚本编辑器\n' +
            '2. 找到脚本顶部配置区域\n' +
            '3. 修改AUTO_MODE_ENABLED为false \n\n' +
            '确定要启用永久后台执行吗?'
        );

        if (confirmed) {
            saveAutoMode(true);
            AUTO_MODE_ENABLED = true;
            updateStatus('✓ 后台模式已启用');
            setTimeout(() => {
                alert('✓ 后台执行模式已启用!\n\n从下次打开页面开始,脚本将自动在后台完成任务。\n\n如需关闭,请将脚本代码修改为AUTO_MODE_ENABLED为false');
                const panel = document.getElementById('daily-task-panel');
                if (panel) {
                    panel.style.transition = 'opacity 0.5s';
                    panel.style.opacity = '0';
                    setTimeout(() => panel.remove(), 500);
                }
            }, 500);
        }
    }

    // 更新状态显示
    function updateStatus(message) {
        const statusDiv = document.getElementById('task-status');
        if (statusDiv) {
            statusDiv.textContent = message;
        }
    }

    // 延迟函数
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 点击确认对话框
    async function clickConfirmDialog(keyword) {
        await sleep(800); // 等待对话框出现

        const messageBoxes = document.querySelectorAll('.el-message-box');
        for (let box of messageBoxes) {
            const messageText = box.querySelector('.el-message-box__message');
            if (messageText && messageText.textContent.includes(keyword)) {
                const confirmBtn = Array.from(box.querySelectorAll('.el-message-box__btns button')).find(btn =>
                    btn.textContent.includes('确定') && btn.classList.contains('el-button--primary')
                );
                if (confirmBtn) {
                    confirmBtn.click();
                    await sleep(500);
                    return true;
                }
            }
        }
        return false;
    }

    // 执行祈福
    async function doBlessing() {
        updateStatus('正在尝试祈福...');
        await sleep(500);

        const blessingBtn = Array.from(document.querySelectorAll('button')).find(btn =>
            btn.textContent.includes('免费祈福')
        );

        if (blessingBtn && !blessingBtn.disabled) {
            blessingBtn.click();
            updateStatus('等待祈福确认...');

            // 点击确认对话框
            const confirmed = await clickConfirmDialog('确定进行祈福吗');
            if (confirmed) {
                updateStatus('祈福完成!');
                taskStatus.blessing = true;
                await sleep(1000);
                return true;
            } else {
                updateStatus('祈福确认失败');
                return false;
            }
        } else {
            updateStatus('祈福已完成或不可用');
            taskStatus.blessing = true;
            return false;
        }
    }

    // 执行每日挑战
    async function doChallenges() {
        updateStatus('检查每日挑战...');
        await sleep(500);

        // 找到"每日挑战"的区域
        const dungeonElements = document.querySelectorAll('.dungeon.affix');
        let dailyChallengeSection = null;

        for (let elem of dungeonElements) {
            const title = elem.querySelector('.title h2');
            if (title && title.textContent.includes('每日挑战')) {
                dailyChallengeSection = elem;
                break;
            }
        }

        if (!dailyChallengeSection) {
            updateStatus('未找到每日挑战区域');
            taskStatus.challenges = true;
            return false;
        }

        // 检查三个挑战的次数
        const challengeBoxes = dailyChallengeSection.querySelectorAll('.daily-challenge');
        let hasAvailableChallenge = false;

        for (let box of challengeBoxes) {
            const text = box.textContent;
            const match = text.match(/次数:(\d+)/);
            if (match && parseInt(match[1]) > 0) {
                hasAvailableChallenge = true;
                break;
            }
        }

        if (hasAvailableChallenge) {
            updateStatus('发现可用挑战,执行扫荡...');
            await sleep(500);

            // 点击"一键扫荡"按钮
            const sweepBtn = dailyChallengeSection.querySelector('button');
            if (sweepBtn && sweepBtn.textContent.includes('一键扫荡')) {
                sweepBtn.click();
                updateStatus('等待扫荡确认...');

                // 点击确认对话框
                const confirmed = await clickConfirmDialog('确认以当前最高通过难度等级清空每日挑战的剩余次数吗');
                if (confirmed) {
                    updateStatus('挑战扫荡完成!');
                    taskStatus.challenges = true;
                    await sleep(1500);
                    return true;
                } else {
                    updateStatus('扫荡确认失败');
                    return false;
                }
            }
        } else {
            updateStatus('所有挑战次数已用完');
            taskStatus.challenges = true;
        }

        return false;
    }

    // 执行所有每日任务
    async function executeDailyTasks() {
        if (taskStatus.completed) {
            updateStatus('今日任务已完成!');
            return;
        }

        const btn = document.getElementById('start-daily-task');
        btn.disabled = true;
        btn.style.opacity = '0.6';
        btn.style.cursor = 'not-allowed';

        try {
            // 执行祈福
            await doBlessing();
            await sleep(1000);

            // 执行挑战
            await doChallenges();
            await sleep(1000);

            // 标记完成
            taskStatus.completed = true;
            updateStatus('✓ 每日任务已完成!');
            btn.textContent = '今日任务已完成';
            btn.style.background = '#4ade80';
            btn.style.color = 'white';

            // 3秒后隐藏面板
            setTimeout(() => {
                const panel = document.getElementById('daily-task-panel');
                if (panel) {
                    panel.style.transition = 'opacity 0.5s';
                    panel.style.opacity = '0';
                    setTimeout(() => panel.remove(), 500);
                }
            }, 3000);

        } catch (error) {
            updateStatus('执行出错:' + error.message);
            btn.disabled = false;
            btn.style.opacity = '1';
            btn.style.cursor = 'pointer';
        }
    }

    // 后台自动执行任务(无面板)
    async function executeDailyTasksBackground() {
        if (taskStatus.completed) {
            console.log('[每日任务] 任务已完成,跳过执行');
            return;
        }

        try {
            console.log('[每日任务] 🤖 后台模式 - 开始执行任务');

            // 执行祈福
            console.log('[每日任务] 执行祈福...');
            await doBlessing();
            await sleep(1000);

            // 执行挑战
            console.log('[每日任务] 执行挑战扫荡...');
            await doChallenges();
            await sleep(1000);

            // 标记完成
            taskStatus.completed = true;
            console.log('[每日任务] ✓ 所有任务执行完成!');

        } catch (error) {
            console.error('[每日任务] 执行出错:', error.message);
        }
    }

    // 检查是否有未完成任务
    function checkUnfinishedTasks() {
        let hasUnfinishedTask = false;

        // 检查祈福按钮
        const blessingBtn = Array.from(document.querySelectorAll('button')).find(btn =>
            btn.textContent.includes('免费祈福')
        );
        if (blessingBtn && !blessingBtn.disabled) {
            hasUnfinishedTask = true;
        }

        // 检查挑战次数
        const dungeonElements = document.querySelectorAll('.dungeon.affix');
        for (let elem of dungeonElements) {
            const title = elem.querySelector('.title h2');
            if (title && title.textContent.includes('每日挑战')) {
                const challengeBoxes = elem.querySelectorAll('.daily-challenge');
                for (let box of challengeBoxes) {
                    const text = box.textContent;
                    const match = text.match(/次数:(\d+)/);
                    if (match && parseInt(match[1]) > 0) {
                        hasUnfinishedTask = true;
                        break;
                    }
                }
            }
        }

        return hasUnfinishedTask;
    }

    // 检查游戏是否加载完成
    function isGameLoaded() {
        const resourceDiv = document.querySelector('div[data-v-ab3b4a1b][style*="font-size: 12px"]');
        if (!resourceDiv) {
            return false;
        }

        const spans = resourceDiv.querySelectorAll('span[data-v-ab3b4a1b]');
        for (let span of spans) {
            const text = span.textContent.trim();
            // 检查是否包含非0数字
            const match = text.match(/[\d.]+/);
            if (match && parseFloat(match[0].replace(/万/, '0000')) > 0) {
                return true;
            }
        }
        return false;
    }

    // 持续检测并显示面板
    function startDetection() {
        let checkCount = 0;
        const maxChecks = 12; // 1分钟,每5秒检测一次
        let panelCreated = false;
        let taskExecuted = false;

        const detectionInterval = setInterval(() => {
            checkCount++;

            // 先检查游戏是否加载
            if (!isGameLoaded()) {
                console.log(`[每日任务] 第 ${checkCount} 次检测 - 游戏数据未加载...`);
            } else {
                console.log(`[每日任务] 第 ${checkCount} 次检测 - 游戏已加载,检查任务状态`);

                // 检查是否有未完成任务
                if (checkUnfinishedTasks()) {
                    if (AUTO_MODE_ENABLED && !taskExecuted) {
                        // 后台自动执行模式
                        console.log('[每日任务] 后台自动执行模式 - 开始执行任务');
                        taskExecuted = true;
                        executeDailyTasksBackground();
                        clearInterval(detectionInterval);
                    } else if (!AUTO_MODE_ENABLED && !panelCreated) {
                        // 显示面板模式
                        console.log('[每日任务] 检测到未完成任务,显示面板');
                        createPanel();
                        panelCreated = true;
                        clearInterval(detectionInterval);
                    }
                    return;
                } else if (!panelCreated && !taskExecuted) {
                    console.log('[每日任务] 所有每日任务已完成');
                    clearInterval(detectionInterval);
                    return;
                }
            }

            // 超过1分钟停止检测
            if (checkCount >= maxChecks) {
                console.log('[每日任务] 检测超时,停止检测');
                if (!panelCreated && !taskExecuted) {
                    console.log('[每日任务] 游戏未加载或所有任务已完成');
                }
                clearInterval(detectionInterval);
            }
        }, 5000); // 每5秒检测一次

        // 立即执行第一次检测
        console.log('[每日任务] 开始检测...');
        if (AUTO_MODE_ENABLED) {
            console.log('[每日任务] 当前模式:后台自动执行');
        } else {
            console.log('[每日任务] 当前模式:面板手动执行');
        }

        if (isGameLoaded()) {
            console.log('[每日任务] 游戏已加载,检查任务状态');
            if (checkUnfinishedTasks()) {
                if (AUTO_MODE_ENABLED && !taskExecuted) {
                    // 后台自动执行模式
                    console.log('[每日任务] 后台自动执行模式 - 开始执行任务');
                    taskExecuted = true;
                    executeDailyTasksBackground();
                    clearInterval(detectionInterval);
                } else if (!AUTO_MODE_ENABLED && !panelCreated) {
                    // 显示面板模式
                    console.log('[每日任务] 检测到未完成任务,显示面板');
                    createPanel();
                    panelCreated = true;
                    clearInterval(detectionInterval);
                }
            } else {
                console.log('[每日任务] 所有每日任务已完成');
                clearInterval(detectionInterval);
            }
        } else {
            console.log('[每日任务] 第 0 次检测 - 游戏数据未加载...');
        }
    }

    // 启动脚本
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            setTimeout(startDetection, 2000); // 等待2秒后开始检测
        });
    } else {
        setTimeout(startDetection, 2000); // 等待2秒后开始检测
    }
})();