Greasy Fork is available in English.

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);
    })();