SangTacViet Full Reading Page & Auto Collect Items

Thiết lập đọc full màn hình, tự động nhặt bảo trên sangtacviet

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         SangTacViet Full Reading Page & Auto Collect Items
// @namespace    http://tampermonkey.net/
// @version      0.17
// @description  Thiết lập đọc full màn hình, tự động nhặt bảo trên sangtacviet
// @author       Yuusei
// @match        *sangtacviet.pro/truyen/*
// @match        *sangtacvietfpt.com/truyen/*
// @match        *sangtacviet.com/truyen/*
// @match        *sangtacviet.me/truyen/*
// @match        *sangtacviet.vip/truyen/*
// @match        *14.225.254.182/truyen/*
// @icon         http://14.225.254.182/favicon.png
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    // CONFIG - Tùy chỉnh cấu hình ở đây
    const CONFIG = {
        // Thời gian chờ tối thiểu và tối đa (ms) trước khi tự động nhặt bảo vật (giả lập hành động người dùng)
        minWaitTime: 1000,
        maxWaitTime: 1000,
        // Khoảng thời gian kiểm tra bảo vật mới (ms)
        checkInterval: 1000,
        // Thời gian hiển thị thông báo sau khi nhặt bảo vật (giây)
        countdownDuration: 3, 
    };

    let count = 0;
    let waitTime = 0;
    let countdownTimer = null;

    const handleItemCollection = async () => {
        try {
            const itemInfo = await collectItem();
            console.log("STVAuto: ------------------------");
            console.log(`STVAuto: Tìm thấy ${itemInfo.name}`);
            console.log(`%c${itemInfo.name}, Level: ${itemInfo.level}, ${itemInfo.info}`, 'color:red;font-size:16px;font-weight:bold;');

            await sleep();
            await submitItem(itemInfo.type);

            showNotification(itemInfo);
            console.log("STVAuto: ------------------------");
        } catch (error) {
            console.error('Error during item collection:', error);
        }
    };

    const collectItem = async () => {
        const response = await fetch('/index.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'ngmar=collect&ajax=collect' });
        if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
        const itemInfo = await response.json();
        updateItemInfo(itemInfo);
        return itemInfo;
    };

    const submitItem = async (cType) => {
        try {
            let params = "ajax=fcollect&c=137";
            if (cType === 3 || cType === 4) {
                const nname = document.getElementById("cName").innerText;
                if (nname.length > 80) {
                    alert("Tên công pháp/vũ kỹ quá dài.");
                    return;
                }
                params += `&newname=${encodeURIComponent(nname)}&newinfo=${encodeURIComponent(document.getElementById("cInfo").innerText)}`;
            }
            const response = await fetch('/index.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params });
            if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
            const data = await response.json();
            handleSubmitResponse(data);
        } catch (error) {
            console.error('Error submitting item:', error);
        }
    };

    const randomFn = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
    const sleep = (time = randomFn(500, 3000)) => new Promise(resolve => setTimeout(resolve, time));

    const updateItemInfo = (itemInfo) => {
        document.getElementById("cInfo").innerHTML = itemInfo.info;
        document.getElementById("cName").innerHTML = itemInfo.name;
        document.getElementById("cLevel").innerHTML = itemInfo.level;
        itemInfo.message = `Tên: <b style="color:red">${itemInfo.name}</b><br/>Cấp: ${itemInfo.level}<br/>Thông tin: ${itemInfo.info}`;
    };

    const setupEditableFields = () => {
        ["cInfo", "cName"].forEach(id => {
            const element = document.getElementById(id);
            element.contentEditable = true;
            element.style.border = "1px solid black";
        });
        document.getElementById("addInfo").innerHTML = "Bạn vừa đạt được công pháp/vũ kỹ, hãy đặt tên và nội dung nào.<br>";
    };

    const handleSubmitResponse = (data) => {
        if (data.code === 1) {
            window.ui.notif("Thành công");
        } else {
            window.ui.alert(data.err.includes("không nhặt được gì") ? "Thật đáng tiếc, kỳ ngộ đã không cánh mà bay, có duyên gặp lại ah." : data.err);
        }
    };


    const showNotification = (item) => {
        let remainingTime = CONFIG.countdownDuration;
        clearInterval(countdownTimer); // Clear any existing timer

        const updateNotification = () => {
            window.ui.notif(`Nhặt thành công (${remainingTime}s)<br/>${item.message}<br/>Sử dụng ngay <b><a href="/user/0/" target="_blank">tại đây</a></b>`);
            if (--remainingTime < 0) clearInterval(countdownTimer);
        };

        updateNotification();
        countdownTimer = setInterval(updateNotification, 1000);
    };

    const adjustLayout = () => {
        const contentContainer = document.getElementById('content-container');
        if (contentContainer) {
            contentContainer.style.margin = "0";
            contentContainer.style.maxWidth = "100%";
            contentContainer.style.padding = "0";
        }
    };


    const main = () => {
        adjustLayout();
        const btn = document.querySelector('.contentbox .btn.btn-info[id]');
        if (btn) {
            if (++count === 1) {
                waitTime = randomFn(CONFIG.minWaitTime, CONFIG.maxWaitTime);
                window.ui.notif(`Phát hiện bảo vật (${count}) - Chờ trong ${waitTime} ms sẽ tự động nhặt vật phẩm`);
                console.log(`STVAuto: Phát hiện bảo vật... ${count}`);
                setTimeout(() => {
                    handleItemCollection();
                    btn.style.fontSize = '270px';
                    btn.style.filter = 'none';
                    btn.remove();
                }, waitTime);
            }
        } else {
            count = 0;
        }
    };

    setInterval(main, CONFIG.checkInterval);
    })();