game.dusays.com自动云端存档

支持game.dusays.com平台挂机放置小游戏自动云端存档

目前为 2022-12-04 提交的版本。查看 最新版本

// ==UserScript==
// @name         game.dusays.com自动云端存档
// @namespace    http://bmqy.net/
// @version      1.0.2
// @description  支持game.dusays.com平台挂机放置小游戏自动云端存档
// @author       bmqy
// @match        https://game.dusays.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=dusays.com
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';
    GM_addStyle('.c-tooltip-content .Backpack{width:60px;}.c-tooltip-content .Backpack img{vertical-align:middle;}');

    // Your code here...
    const AutoSync = {
        // 自动保存倒计时:秒
        interval: 10,
        githubName: '',
        githubToken: '',
        gistName: 'dusays.com',
        gistFileName: 'game.dusays.com',
        // 自动保存
        bindAutoSave(){
            window.onload = function(){
                // 保存进度按钮增加倒计时显示
                let $btn = document.querySelectorAll('.c-tooltip-content .Backpack')[4];
                let old = $btn.innerHTML;
                let t = AutoSync.interval;
                // 计时为0时执行存档
                setInterval(() => {
                    if(t === 0){
                        !$btn.click() && AutoSync.saveToCloud();
                        t = AutoSync.interval;
                    }
                    $btn.innerHTML = old + ' ('+ t +')';
                    t--;
                }, 1000);
            }
        },

        // 保存本地存档到云端
        saveToCloud(){
            let local = localStorage.getItem('_sd')
            if(local){
                AutoSync.gist(local);
                console.log('存档已保存到云端')
            }
        },
        // 加载云端存档
        async loadSaveForCloud(){
            let cloud = await AutoSync.gist();
            let local = localStorage.getItem('_sd')
            if(cloud && cloud!='hello' && local!=cloud){
                if(confirm('检测到云端存档,是否需要恢复?')){
                    localStorage.setItem('_sd', cloud)
                    console.log('已恢复为云端存档');
                }
            }
        },

        // 获取云端存档
        async gist(newContent){
            let outContent = '';
            let gists = await AutoSync.http(`https://api.github.com/users/${AutoSync.githubName}/gists`);
            
            for (let i = 0; i < gists.length; i++) {
                let theGist = gists[i];
                let files = theGist.files;
                for (const key in files) {
                    if(key == AutoSync.gistFileName){
                        if(newContent != ''){
                            AutoSync.updateGist(theGist.id, newContent);
                        }

                        outContent = await AutoSync.getGist(theGist.url);
                        break;
                    }
                }
            }
            if(outContent == ''){
                AutoSync.updateGist(null, '');
            }

            return outContent;
        },
        async getGist(url){
            let gist = await AutoSync.http(url);
            return gist.files[AutoSync.gistFileName].content;
        },
        updateGist(id, content){
            let data = {
                "description":AutoSync.gistName,
                "files": {},
            };
            if(id && content){
                data.files[AutoSync.gistFileName] = {};
                data.files[AutoSync.gistFileName].content = content;
                AutoSync.http(`https://api.github.com/gists/${id}`, data, 'post')
            } else {
                data.public = false;
                data.files[`${AutoSync.gistFileName}`] = {
                    content: 'hello'
                };
                AutoSync.http('https://api.github.com/gists', data, 'post')
            }
        },


        http(url, data, method){
            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                method: method=='post' ? 'POST' : 'GET',
                headers: {
                    Accept: 'application/vnd.github+json',
                    Authorization: `Bearer ${AutoSync.githubToken}`
                },
                url: url,
                data: data ? JSON.stringify(data) : '',
                onload(responses){
                    if(responses.response){
                        resolve(JSON.parse(responses.response))
                    } else {
                        resolve(responses)
                    }
                },
                onerror(error){
                    reject(error)
                }
            })
            })
        },

        // 初始化
        init(){
            console.log('已加载自动云端存档...');
            this.loadSaveForCloud();
            this.bindAutoSave();
        },
    }

    AutoSync.init();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址