自动任务

自动完成赠key站任务

目前为 2020-01-13 提交的版本。查看 最新版本

// ==UserScript==
// @name         自动任务
// @namespace    auto-task
// @version      2.0.0
// @description  自动完成赠key站任务
// @author       HCLonely
// @license      MIT
// @iconURL      https://js.hclonely.com/favicon.ico
// @homepage     https://blog.hclonely.com/forums/topic/255
// @supportURL   https://ask.hclonely.com/question/create
// @include      *://giveaway.su/giveaway/view/*
// @include      *://marvelousga.com/*
// @include      *://dupedornot.com/*
// @include      *://www.grabfreegame.com/giveaway/*
// @include      *://www.bananagiveaway.com/giveaway/*
// @include      *://gamecode.win/*
// @include      /https?:\/\/gamehag.com/.*?giveaway\/.*/
// @include      *://prys.revadike.com/giveaway/?id=*
// @include      *://www.indiedb.com/giveaways*
// @include      *://www.opiumpulses.com/giveaways
// @include      *://gkey.fun/distribution/*
// @include      *://givekey.ru/distribution/*
// @include      *://chubkeys.com/giveaway/*
// @include      *://giveawayhopper.com/giveaway/*
// @include      *://*freegamelottery.com*
// @include      *://gleam.io/*
// @include      *://www.spoune.com/index.php*
// @exclude      *googleads*
// @include      https://js.hclonely.com/auto-task/setting.html
// @include      https://js.hclonely.com/auto-task/announcement.html
// @require      https://cdn.bootcss.com/vue/2.6.10/vue.min.js
// @require      https://cdn.bootcss.com/element-ui/2.12.0/index.js
// @require      https://gf.qytechs.cn/scripts/388035-$jQuery/code/$jQuery.js?version=736625
// @resource     css https://gf.qytechs.cn/scripts/394214-css-for-autotask/code/css%20for%20autoTask.user.css?ver=2.0.0
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_listValues
// @grant        GM_deleteValue
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @grant        GM_getResourceText
// @grant        GM_registerMenuCommand
// @grant        GM_info
// @grant        GM_openInTab
// @grant        GM_download
// @connect      *
// @run-at       document-end
// @compatible   chrome >=58 没有测试其他浏览器的兼容性
// ==/UserScript==

(function($) {
    'use strict';

    GM_addStyle(GM_getResourceText('css'));
    $('body').append('<div v-cloak id="vue-ui"></div>');
    let vueUi = new Vue({
        el: "#vue-ui"
    });
    Vue.config.errorHandler = function(err, vm, info) {
        setTimeout(() => {
            vueUi.$message({
                type: "error",
                duration: 0,
                message: "脚本执行出错,详细信息请查看控制台(红色背景部分)!",
                showClose: true
            });
        }, 500);
        console.log("%c%s", "color:white;background:red", "Info:" + info + "\nError:" + err.stack);
    }
    $(document).ajaxError(function(event, xhr, options, exc) {
        vueUi.$message({
            type: "error",
            duration: 0,
            message: "脚本执行出错,详细信息请查看控制台(红色背景部分)!",
            showClose: true
        });
        console.log("%c%s", "color:white;background:red", "Ajax请求出错:");
        console.log("Event:", event);
        console.log("XMLHttpRequest :", xhr);
        console.log("Options:", options);
        console.log("JavaScript exception:", exc);
    });

    try {

        const steamInfo = GM_getValue('steamInfo') || {
            userName: '',
            steam64Id: '',
            communitySessionID: '',
            storeSessionID: '',
            updateTime: 0
        };
        const defaultConf = {
            fuck: {
                group: 1,
                curator: 1,
                developer: 1,
                publisher: 1,
                announcement: 1,
                wishlist: 1,
                followGame: 1,
                visit: 1,
                verify: 1
            },
            verify: {
                verify: 1
            },
            join: {
                group: 1,
                curator: 1,
                developer: 1,
                publisher: 1,
                announcement: 1,
                wishlist: 1,
                followGame: 1,
                visit: 1
            },
            remove: {
                group: 1,
                curator: 1,
                developer: 1,
                publisher: 1,
                wishlist: 1,
                followGame: 1
            },
            other: {
                showLogs: 1,
                showDetails: 0,
                checkLogin: 1,
                checkLeft: 1,
                autoOpen: 0
            },
            announcement: ""
        };
        let globalConf = (GM_getValue('conf') && GM_getValue('conf').global) ? GM_getValue('conf').global : defaultConf;
        let debug = !!globalConf.other.showDetails;
        const fuc = {
            httpRequest: function(e) {
                let requestObj = {};
                requestObj.url = e.url;
                requestObj.method = e.method.toUpperCase();
                requestObj.timeout = e.timeout || 30000;
                if (e.dataType) requestObj.responseType = e.dataType;
                if (e.headers) requestObj.headers = e.headers;
                if (e.data) requestObj.data = e.data;
                if (e.onload) requestObj.onload = e.onload;
                requestObj.ontimeout = e.ontimeout || function(data) {
                    if (debug) console.log(data);
                    if (e.status) e.status.error('Error:Timeout(0)');
                    if (e.r) e.r({
                        result: 'error',
                        statusText: 'Timeout',
                        status: 0,
                        option: e
                    });
                };
                requestObj.onabort = e.onabort || function(data) {
                    if (debug) console.log(data);
                    if (e.status) e.status.error('Error:Aborted(0)');
                    if (e.r) e.r({
                        result: 'error',
                        statusText: 'Aborted',
                        status: 0,
                        option: e
                    });
                };
                requestObj.onerror = e.onerror || function(data) {
                    if (debug) console.log(data);
                    if (e.status) e.status.error('Error:Error(0)');
                    if (e.r) e.r({
                        result: 'error',
                        statusText: 'Error',
                        status: 0,
                        option: e
                    });
                };
                if (debug) {
                    console.log('发送请求:');
                    console.log(requestObj);
                }
                GM_xmlhttpRequest(requestObj);
            },
            updateSteamInfo: function(r, type = "all") {
                if (new Date().getTime() - steamInfo.updateTime > 10 * 60 * 1000) {
                    let pro = [];
                    if (type === "community" || type === "all") {
                        pro.push(new Promise(r => {
                            let status = this.echoLog({
                                type: 'updateSteamCommunity'
                            });
                            this.httpRequest({
                                url: 'https://steamcommunity.com/my',
                                method: "GET",
                                onload: (response) => {
                                    if (debug) console.log(response);
                                    if (response.status === 200) {
                                        let steam64Id = response.responseText.match(/g_steamID = \"(.+?)\";/);
                                        let communitySessionID = response.responseText.match(/g_sessionID = \"(.+?)\";/);
                                        let userName = response.responseText.match(/steamcommunity.com\/id\/(.+?)\/friends\//);
                                        if (steam64Id) steamInfo.steam64Id = steam64Id[1];
                                        if (communitySessionID) steamInfo.communitySessionID = communitySessionID[1];
                                        if (userName) steamInfo.userName = userName[1];
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.error('Error:' + response.statusText + '(' + response.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                },
                                r,
                                status
                            });
                        }));
                    }
                    if (type === "store" || type === "all") {
                        pro.push(new Promise(r => {
                            let status = this.echoLog({
                                type: 'updateSteamStore'
                            });

                            this.httpRequest({
                                url: 'https://store.steampowered.com/',
                                method: "GET",
                                onload: (response) => {
                                    if (debug) console.log(response);
                                    if (response.status === 200) {
                                        let storeSessionID = response.responseText.match(/g_sessionID = \"(.+?)\";/);
                                        if (storeSessionID) steamInfo.storeSessionID = storeSessionID[1];
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.error('Error:' + response.statusText + '(' + response.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                },
                                r,
                                status
                            });
                        }));
                    }
                    Promise.all(pro).then(data => {
                        steamInfo.updateTime = new Date().getTime();
                        GM_setValue('steamInfo', steamInfo);
                        r(1);
                    });
                } else {
                    r(1);
                }
            },
            joinSteamGroup: function(r, group) {
                let status = this.echoLog({
                    type: 'joinSteamGroup',
                    text: group
                });

                this.httpRequest({
                    url: 'https://steamcommunity.com/groups/' + group,
                    method: "POST",
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                    },
                    data: $.param({
                        action: "join",
                        sessionID: steamInfo.communitySessionID
                    }),
                    onload: (response) => {
                        if (debug) console.log(response);
                        if (response.status === 200 && !response.responseText.includes('grouppage_join_area')) {
                            status.success();
                            r({
                                result: 'success',
                                statusText: response.statusText,
                                status: response.status
                            });
                        } else {
                            status.error('Error:' + response.statusText + '(' + response.status + ')');
                            r({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            });
                        }
                    },
                    r,
                    status
                });
            },
            getGroupID: function(groupName, callback) {
                let status = this.echoLog({
                    type: 'getGroupId',
                    text: groupName
                });
                let groupNameToId = GM_getValue('groupNameToId') || {};
                if (groupNameToId[groupName]) {
                    status.success();
                    callback(groupName, groupNameToId[groupName]);
                } else {
                    let pro = new Promise(resolve => {
                        this.httpRequest({
                            url: "https://steamcommunity.com/groups/" + groupName,
                            method: "GET",
                            headers: {
                                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                            },
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    let groupId = response.responseText.match(/OpenGroupChat\( \'([0-9]+)\'/);
                                    if (groupId === null) {
                                        status.error('Error:' + response.statusText + '(' + response.status + ')');
                                        resolve('err');
                                    } else {
                                        status.success();
                                        groupNameToId[groupName] = groupId[1];
                                        GM_setValue('groupNameToId', groupNameToId);
                                        resolve(groupId[1]);
                                    }
                                } else {
                                    status.error('Error:' + response.statusText + '(' + response.status + ')');
                                    resolve('err');
                                }
                            },
                            status,
                            r: () => {
                                resolve('err');
                            }
                        });
                    });
                    pro.then(function(groupId) {
                        if (groupId !== 'err' && callback) {
                            callback(groupName, groupId);
                        }
                    });
                }
            },
            leaveSteamGroup: function(r, groupName) {
                this.getGroupID(groupName, (groupName, groupId) => {
                    let status = this.echoLog({
                        type: 'leaveSteamGroup',
                        text: groupName
                    });

                    this.httpRequest({
                        url: 'https://steamcommunity.com/id/' + steamInfo.userName + '/home_process',
                        method: "POST",
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                        },
                        data: $.param({
                            sessionID: steamInfo.communitySessionID,
                            action: "leaveGroup",
                            groupId: groupId
                        }),
                        onload: (response) => {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.finalUrl.includes('groups') && $(response.responseText.toLowerCase()).find(`a[href='https://steamcommunity.com/groups/${groupName.toLowerCase()}']`).length === 0) {
                                status.success();
                                r({
                                    result: 'success',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            } else {
                                status.error('Error:' + response.statusText + '(' + response.status + ')');
                                r({
                                    result: 'error',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            }
                        },
                        r,
                        status
                    });
                });
            },
            followCurator: function(r, curatorId, follow = '1', status = '') {
                status = status || this.echoLog({
                    type: follow === '1' ? 'followCurator' : 'unfollowCurator',
                    text: curatorId
                });

                this.httpRequest({
                    url: 'https://store.steampowered.com/curators/ajaxfollow',
                    method: "POST",
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                    },
                    data: $.param({
                        clanid: curatorId,
                        sessionid: steamInfo.storeSessionID,
                        follow: follow
                    }),
                    dataType: 'json',
                    onload: (response) => {
                        if (debug) console.log(response);
                        if (response.status === 200 && response.response && response.response.success && response.response.success.success === 1) {
                            status.success();
                            r({
                                result: 'success',
                                statusText: response.statusText,
                                status: response.status
                            });
                        } else {
                            status.error(`Error:${response.response.msg||response.statusText}(${response.response.success||response.status})`);
                            r({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            });
                        }
                    },
                    r,
                    status
                });
            },
            unfollowCurator: function(r, curatorId) {
                this.followCurator(r, curatorId, '0');
            },
            getCuratorID: function(developerName, callback, isPublisher = 0) {
                let status = this.echoLog({
                    type: isPublisher ? 'getPublisherId' : 'getDeveloperId',
                    text: developerName
                });
                let developerNameToId = GM_getValue('developerNameToId') || {};
                if (developerNameToId[developerName]) {
                    status.success();
                    callback(developerName, developerNameToId[developerName]);
                } else {
                    let pro = new Promise(resolve => {
                        this.httpRequest({
                            url: `https://store.steampowered.com/${isPublisher?"publisher":"developer"}/${developerName}`,
                            method: "GET",
                            headers: {
                                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                            },
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    let developerId = response.responseText.match(/g_pagingData.*?"clanid":([\d]+)/);
                                    if (developerId === null) {
                                        status.error('Error:' + response.statusText + '(' + response.status + ')');
                                        resolve('err');
                                    } else {
                                        status.success();
                                        developerNameToId[developerName] = developerId[1];
                                        GM_setValue('developerNameToId', developerNameToId);
                                        resolve(developerId[1]);
                                    }
                                } else {
                                    status.error('Error:' + response.statusText + '(' + response.status + ')');
                                    resolve('err');
                                }
                            },
                            status,
                            r: () => {
                                resolve('err');
                            }
                        });
                    });
                    pro.then(function(curatorId) {
                        if (curatorId !== 'err' && callback) {
                            callback(developerName, curatorId);
                        }
                    });
                }
            },
            followDeveloper: function(r, developerName, isPublisher = 0) {
                this.getCuratorID(developerName, (developerName, curatorId) => {
                    let status = this.echoLog({
                        type: isPublisher ? 'followPublisher' : 'followDeveloper',
                        text: developerName
                    });
                    this.followCurator(r, curatorId, '1', status);
                }, isPublisher);

            },
            unfollowDeveloper: function(r, developerName, isPublisher = 0) {
                this.getCuratorID(developerName, (developerName, curatorId) => {
                    let status = this.echoLog({
                        type: isPublisher ? 'unfollowPublisher' : 'unfollowDeveloper',
                        text: developerName
                    });
                    this.followCurator(r, curatorId, '0', status);
                }, isPublisher);

            },
            followPublisher: function(r, publisherName) {
                this.followDeveloper(r, publisherName, 1);
            },
            unfollowPublisher: function(r, publisherName) {
                this.unfollowDeveloper(r, publisherName, 1);
            },
            addWishlist: function(r, gameId) {
                let status = this.echoLog({
                    type: 'addWishlist',
                    text: gameId
                });
                new Promise(resolve => {
                    this.httpRequest({
                        url: "https://store.steampowered.com/api/addtowishlist",
                        method: "POST",
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                        },
                        data: $.param({
                            sessionid: steamInfo.storeSessionID,
                            appid: gameId
                        }),
                        dataType: 'json',
                        onload: function(response) {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.response && response.response.success === true) {
                                status.success();
                                resolve({
                                    result: 'success',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            } else {
                                resolve({
                                    result: 'error',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            }
                        },
                        onabort: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        onerror: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        ontimeout: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        r: resolve,
                        status
                    });
                }).then(result => {
                    if (result.result === 'success') {
                        r(result);
                    } else {
                        this.httpRequest({
                            url: "https://store.steampowered.com/app/" + gameId,
                            method: "GET",
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    if (response.responseText.includes(`class="queue_actions_ctn"`) && response.responseText.includes('已在库中')) {
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else if ((response.responseText.includes(`class="queue_actions_ctn"`) && response.responseText.includes('添加至您的愿望单')) || !response.responseText.includes(`class="queue_actions_ctn"`)) {
                                        status.error('Error:' + result.statusText + '(' + result.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                } else {
                                    status.error('Error:' + result.statusText + '(' + result.status + ')');
                                    r({
                                        result: 'error',
                                        statusText: response.statusText,
                                        status: response.status
                                    });
                                }
                            },
                            r,
                            status
                        });
                    }
                });
            },
            removeWishlist: function(r, gameId) {
                let status = this.echoLog({
                    type: 'removeWishlist',
                    text: gameId
                });
                new Promise(resolve => {
                    this.httpRequest({
                        url: "https://store.steampowered.com/api/removefromwishlist",
                        method: "POST",
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                        },
                        data: $.param({
                            sessionid: steamInfo.storeSessionID,
                            appid: gameId
                        }),
                        dataType: 'json',
                        onload: function(response) {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.response && response.response.success === true) {
                                status.success();
                                resolve({
                                    result: 'success',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            } else {
                                resolve({
                                    result: 'error',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            }
                        },
                        onabort: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        onerror: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        ontimeout: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        r: resolve,
                        status
                    });
                }).then(result => {
                    if (result.result === 'success') {
                        r(result);
                    } else {
                        this.httpRequest({
                            url: "https://store.steampowered.com/app/" + gameId,
                            method: "GET",
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    if (response.responseText.includes(`class="queue_actions_ctn"`) && (response.responseText.includes('已在库中') || response.responseText.includes('添加至您的愿望单'))) {
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.error('Error:' + result.statusText + '(' + result.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                } else {
                                    status.error('Error:' + result.statusText + '(' + result.status + ')');
                                    r({
                                        result: 'error',
                                        statusText: response.statusText,
                                        status: response.status
                                    });
                                }
                            },
                            r,
                            status
                        });
                    }
                });
            },
            followGame: function(r, gameId) {
                let status = this.echoLog({
                    type: 'followGame',
                    text: gameId
                });
                new Promise(resolve => {
                    this.httpRequest({
                        url: "https://store.steampowered.com/explore/followgame/",
                        method: "POST",
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                        },
                        data: $.param({
                            sessionid: steamInfo.storeSessionID,
                            appid: gameId
                        }),
                        onload: function(response) {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.responseText === 'true') {
                                status.success();
                                resolve({
                                    result: 'success',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            } else {
                                resolve({
                                    result: 'error',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            }
                        },
                        onabort: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        onerror: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        ontimeout: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        r: resolve,
                        status
                    });
                }).then(result => {
                    if (result.result === 'success') {
                        r(result);
                    } else {
                        this.httpRequest({
                            url: "https://store.steampowered.com/app/" + gameId,
                            method: "GET",
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    if (response.responseText.includes(`class="queue_actions_ctn"`) && response.responseText.includes(`class="btnv6_blue_hoverfade btn_medium queue_btn_active" style="">`)) {
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.error('Error:' + result.statusText + '(' + result.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                } else {
                                    status.error('Error:' + result.statusText + '(' + result.status + ')');
                                    r({
                                        result: 'error',
                                        statusText: response.statusText,
                                        status: response.status
                                    });
                                }
                            },
                            r,
                            status
                        });
                    }
                });
            },
            unfollowGame: function(r, gameId) {
                let status = this.echoLog({
                    type: 'unfollowGame',
                    text: gameId
                });
                new Promise(resolve => {
                    this.httpRequest({
                        url: "https://store.steampowered.com/explore/followgame/",
                        method: "POST",
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                        },
                        data: $.param({
                            sessionid: steamInfo.storeSessionID,
                            appid: gameId,
                            unfollow: '1'
                        }),
                        onload: function(response) {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.responseText === 'true') {
                                status.success();
                                resolve({
                                    result: 'success',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            } else {
                                resolve({
                                    result: 'error',
                                    statusText: response.statusText,
                                    status: response.status
                                });
                            }
                        },
                        onabort: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        onerror: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        ontimeout: (response) => {
                            resolve({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            })
                        },
                        r: resolve,
                        status
                    });
                }).then(result => {
                    if (result.result === 'success') {
                        r(result);
                    } else {
                        this.httpRequest({
                            url: "https://store.steampowered.com/app/" + gameId,
                            method: "GET",
                            onload: function(response) {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    if (response.responseText.includes(`class="queue_actions_ctn"`) && response.responseText.includes(`class="btnv6_blue_hoverfade btn_medium queue_btn_active" style="">`)) {
                                        status.error('Error:' + result.statusText + '(' + result.status + ')');
                                        r({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    } else {
                                        status.success();
                                        r({
                                            result: 'success',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                } else {
                                    status.error('Error:' + result.statusText + '(' + result.status + ')');
                                    r({
                                        result: 'error',
                                        statusText: response.statusText,
                                        status: response.status
                                    });
                                }
                            },
                            r,
                            status
                        });
                    }
                });
            },
            likeAnnouncements: function(r, url, id) {
                let status = this.echoLog({
                    type: 'likeAnnouncements',
                    url,
                    id
                });

                this.httpRequest({
                    url: url.replace('/detail/', '/rate/'),
                    method: "POST",
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                    },
                    data: $.param({
                        sessionid: steamInfo.communitySessionID,
                        voteup: true
                    }),
                    dataType: 'json',
                    onload: (response) => {
                        if (debug) console.log(response);
                        if (response.status === 200 && response.response && response.response.success === 1) {
                            status.success();
                            r({
                                result: 'success',
                                statusText: response.statusText,
                                status: response.status
                            });
                        } else {
                            status.error(`Error:${response.response.msg||response.statusText}(${response.response.success||response.status})`);
                            r({
                                result: 'error',
                                statusText: response.statusText,
                                status: response.status
                            });
                        }
                    },
                    r,
                    status
                });
            },
            getFinalUrl: function(r, url, options = {}) {
                let conf = {
                    url: options.url || url,
                    method: options.method || "GET",
                    onload: (response) => {
                        r({
                            result: 'success',
                            finalUrl: response.finalUrl,
                            url
                        });
                    },
                    r
                };
                if (options.headers) conf.headers = options.headers;
                if (options.data) conf.data = options.data;
                this.httpRequest(conf);
            },
            visitLink: function(r, url, options = {}) {
                let status = this.echoLog({
                    type: 'visitLink',
                    text: url
                });
                new Promise(resolve => {
                    this.getFinalUrl(resolve, url, options);
                }).then(() => {
                    status.warning('Complete');
                    r(1);
                })
            },
            forOrder: function({
                arr,
                callback,
                i = 0,
                time = 0,
                complete = false
            }) {
                if (complete) {
                    if (i < arr.length) {
                        callback({
                            arr,
                            i,
                            end: false
                        });
                    } else {
                        callback({
                            end: true
                        });
                    }
                } else {
                    if (i < arr.length) {
                        callback({
                            e: arr[i],
                            end: false
                        });
                        setTimeout(function() {
                            fuc.forOrder({
                                arr,
                                callback,
                                i: ++i,
                                time,
                                complete
                            })
                        }, time);
                    } else {
                        callback({
                            end: true
                        });
                    }
                }
            },
            checkUpdate: function(v, s = false) {
                v.icon = "el-icon-loading";
                let status = false;
                if (s) status = this.echoLog({
                    type: 'custom',
                    text: `<li>正在检测更新...<font></font></li>`
                });
                this.httpRequest({
                    url: "https://js.hclonely.com/auto-task/version?t=" + new Date().getTime(),
                    method: "get",
                    dataType: "json",
                    onload: (response) => {
                        if (debug) console.log(response);
                        if (response.response && response.response.version === GM_info.script.version) {
                            v.icon = "el-icon-refresh";
                            v.title = "检查更新";
                            if (s) status.success("当前脚本为最新版本!");
                            v.hidden = true;
                        } else if (response.response) {
                            v.icon = "el-icon-download";
                            v.title = "立即更新至" + response.response.version;
                            v.checkUpdate = function() {
                                window.open("https://js.hclonely.com/auto-task/auto-task.user.js", "_blank")
                            };
                            if (s) status.success("检测到新版本:" + response.response.version);
                            v.hidden = false;
                        } else {
                            v.icon = "el-icon-refresh";
                            v.title = "检查更新";
                            if (s) status.error("Error:" + (response.statusText || response.status));
                        }
                        let conf = GM_getValue("conf") || defaultConf;
                        if (response.response && response.response.time !== conf.announcement) {
                            v.announcementHidden = false;
                            conf.announcement = response.response.time;
                            GM_setValue("conf", conf);
                        }
                    },
                    ontimeout: (response) => {
                        if (debug) console.log(response);
                        v.icon = "el-icon-refresh";
                        v.title = "检查更新";
                        if (s) status.error("Error:Timeout(0)");
                    },
                    onabort: (response) => {
                        if (debug) console.log(response);
                        v.icon = "el-icon-refresh";
                        v.title = "检查更新";
                        if (s) status.error("Error:Abort(0)");
                    },
                    onerror: (response) => {
                        if (debug) console.log(response);
                        v.icon = "el-icon-refresh";
                        v.title = "检查更新";
                        if (s) status.error("Error:Error(0)");
                    },
                    status
                });
            },
            getAnnouncement: function(v) {
                v.announcementIcon = "el-icon-loading";
                let status = this.echoLog({
                    type: 'custom',
                    text: `<li>正在获取更新公告...<font></font></li>`
                });
                this.httpRequest({
                    url: "https://js.hclonely.com/auto-task/new.json?t=" + new Date().getTime(),
                    method: "get",
                    dataType: "json",
                    onload: (response) => {
                        if (debug) console.log(response);
                        if (response.responseText && response.response) {
                            status.success();
                            let data = response.response;
                            let conf = GM_getValue("conf") || defaultConf;
                            conf.announcement = data.time;
                            GM_setValue("conf", conf);
                            v.announcementHidden = true;
                            const h = vueUi.$createElement;
                            let hArr = [];
                            for (let index in data.text) {
                                hArr.push(h('p', null, `${parseInt(index)+1}.${data.text[index]}`));
                            }
                            vueUi.$msgbox({
                                title: `V${data.version}(${fuc.dateFormat("YYYY-mm-dd HH:MM",new Date(data.time))})`,
                                message: h('div', null, hArr),
                                showCancelButton: true,
                                confirmButtonText: '查看历史更新内容',
                                cancelButtonText: '关闭'
                            }).then(() => {
                                window.open("https://js.hclonely.com/auto-task/announcement.html", "_blank");
                            })
                        } else {
                            status.error("Error:" + (response.statusText || response.status));
                        }
                        v.announcementIcon = "el-icon-document";
                    },
                    ontimeout: (response) => {
                        if (debug) console.log(response);
                        v.announcementIcon = "el-icon-document";
                        status.error("Error:Timeout(0)");
                    },
                    onabort: (response) => {
                        if (debug) console.log(response);
                        v.announcementIcon = "el-icon-document";
                        status.error("Error:Abort(0)");
                    },
                    onerror: (response) => {
                        if (debug) console.log(response);
                        v.announcementIcon = "el-icon-document";
                        status.error("Error:Error(0)");
                    },
                    status
                });
            },
            newTabBlock: function() {
                let d = new Date();
                let cookiename = "haveVisited1";
                document.cookie = cookiename + "=1; path=/";
                document.cookie = cookiename + "=" + (d.getUTCMonth() + 1) + "/" + d.getUTCDate() + "/" + d.getUTCFullYear() + "; path=/";
            },
            creatSetting: function(settingName, header, fuckOptions, checkedFucks, removeOptions, checkedRemoves) {
                new Vue({
                    el: `#${settingName}`,
                    data: {
                        header: `${header}网站设置`,
                        checked: GM_getValue('conf') ? GM_getValue('conf')[settingName] ? (!!GM_getValue('conf')[settingName].load) : false : false,
                        fuck: {
                            checkAll: fuckOptions.length === checkedFucks.length,
                            checkedFucks: checkedFucks,
                            fucks: fuckOptions,
                            isIndeterminate: fuckOptions.length !== checkedFucks.length,
                        },
                        remove: {
                            checkAll: removeOptions.length === checkedRemoves.length,
                            checkedRemoves: checkedRemoves,
                            removes: removeOptions,
                            isIndeterminate: removeOptions.length !== checkedRemoves.length,
                        },
                        openDelay: 100,
                        rowType: "flex",
                        rowAlign: "middle",
                        verify: "1"
                    },
                    methods: {
                        fuckHandleCheckAllChange(val) {
                            this.fuck.checkedFucks = val ? fuckOptions.map(e => e.name) : [];
                            this.fuck.isIndeterminate = false;
                        },
                        handleCheckedFucksChange(value) {
                            let checkedCount = value.length;
                            this.fuck.checkAll = checkedCount === this.fuck.fucks.length;
                            this.fuck.isIndeterminate = checkedCount > 0 && checkedCount < this.fuck.fucks.length;
                        },
                        removeHandleCheckAllChange(val) {
                            this.remove.checkedRemoves = val ? removeOptions.map(e => e.name) : [];
                            this.remove.isIndeterminate = false;
                        },
                        handleCheckedRemovesChange(value) {
                            let checkedCount = value.length;
                            this.remove.checkAll = checkedCount === this.remove.removes.length;
                            this.remove.isIndeterminate = checkedCount > 0 && checkedCount < this.remove.removes.length;
                        }
                    }
                });
            },
            creatConf: function() {
                let confs = {};
                for (let div of $('div.setting')) {
                    let id = $(div).attr('id');
                    let conf = {};
                    for (let form of $(div).find('form')) {
                        let name = $(form).attr('name');
                        let setting = {};
                        for (let data of $(form).serializeArray()) {
                            setting[data.name] = 1;
                        }
                        conf[name] = setting;
                    }
                    confs[id] = conf;
                }
                for (let checkbox of $('.non-global input')) {
                    if ($(checkbox).is(":checked")) confs[$(checkbox).attr('name')].load = 1
                }
                let lotteryUserInfo = GM_getValue('conf') ? GM_getValue('conf').lotteryUserInfo : false;
                if (lotteryUserInfo) confs.lotteryUserInfo = lotteryUserInfo;
                let announcement = GM_getValue('conf') ? GM_getValue('conf').announcement : false;
                if (announcement) confs.announcement = announcement;
                return confs;
            },
            echoLog: function(e) {
                let ele = '';
                switch (e.type) {
                    case 'updateSteamCommunity':
                        ele = $(`<li>正在更新Steam社区SessionID(用于加组退组)...<font></font></li>`);
                        break;
                    case 'updateSteamStore':
                        ele = $(`<li>正在更新Steam商店SessionID(用于添加愿望单、关注游戏、关注鉴赏家等)...<font></font></li>`);
                        break;
                    case 'joinSteamGroup':
                        ele = $(`<li>正在加入Steam组<a href="https://steamcommunity.com/groups/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'getGroupId':
                        ele = $(`<li>正在获取Steam组ID<a href="https://steamcommunity.com/groups/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'leaveSteamGroup':
                        ele = $(`<li>正在退出Steam组<a href="https://steamcommunity.com/groups/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'followCurator':
                        ele = $(`<li>正在关注鉴赏家<a href="https://store.steampowered.com/curator/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'unfollowCurator':
                        ele = $(`<li>正在取关鉴赏家<a href="https://store.steampowered.com/curator/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'getDeveloperId':
                        ele = $(`<li>正在获取开发商ID<a href="https://store.steampowered.com/developer/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'followDeveloper':
                        ele = $(`<li>正在关注开发商<a href="https://store.steampowered.com/developer/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'unfollowDeveloper':
                        ele = $(`<li>正在取关开发商<a href="https://store.steampowered.com/developer/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'getPublisherId':
                        ele = $(`<li>正在获取发行商ID<a href="https://store.steampowered.com/publisher/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'followPublisher':
                        ele = $(`<li>正在关注发行商<a href="https://store.steampowered.com/publisher/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'unfollowPublisher':
                        ele = $(`<li>正在取关发行商<a href="https://store.steampowered.com/publisher/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'addWishlist':
                        ele = $(`<li>正在添加愿望单<a href="https://store.steampowered.com/app/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'removeWishlist':
                        ele = $(`<li>正在移除愿望单<a href="https://store.steampowered.com/app/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'followGame':
                        ele = $(`<li>正在关注游戏<a href="https://store.steampowered.com/app/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'unfollowGame':
                        ele = $(`<li>正在取关游戏<a href="https://store.steampowered.com/app/${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'likeAnnouncements':
                        ele = $(`<li>正在点赞通知<a href="${e.url}" target="_blank">${e.id}</a>...<font></font></li>`);
                        break;
                    case 'visitLink':
                        ele = $(`<li>正在浏览页面<a href="${e.text}" target="_blank">${e.text}</a>...<font></font></li>`);
                        break;
                    case 'custom':
                        ele = $(e.text);
                        break;
                    default:
                        ele = $(`<li>未知操作...<font></font></li>`);
                        break;
                }
                $('.fuck-task-logs .el-notification__content').append(ele);
                ele[0].scrollIntoView();
                let font = ele.find('font');
                const status = {
                    font,
                    success: function(text = "Success") {
                        this.font.attr("class", "").addClass("success");
                        this.font.text(text);
                    },
                    error: function(text = "Error") {
                        this.font.attr("class", "").addClass("error");
                        this.font.text(text);
                    },
                    warning: function(text = "Warning") {
                        this.font.attr("class", "").addClass("warning");
                        this.font.text(text);
                    },
                    info: function(text = "Info") {
                        this.font.attr("class", "").addClass("info");
                        this.font.text(text);
                    },
                };
                return status;
            },
            unique: e => [...new Set(e)],
            getUrlQuery: function(url) {
                let q = {};
                if (url) {
                    if (url.includes("?")) {
                        url.split("?")[1].replace(/([^?&=]+)=([^&]+)/g, (_, k, v) => q[k] = v);
                    }
                } else {
                    location.search.replace(/([^?&=]+)=([^&]+)/g, (_, k, v) => q[k] = v);
                }
                return q;
            },
            dateFormat: function(fmt, date) {
                let ret;
                let opt = {
                    "Y+": date.getFullYear().toString(), // 年
                    "m+": (date.getMonth() + 1).toString(), // 月
                    "d+": date.getDate().toString(), // 日
                    "H+": date.getHours().toString(), // 时
                    "M+": date.getMinutes().toString(), // 分
                    "S+": date.getSeconds().toString() // 秒
                    // 有其他格式化字符需求可以继续添加,必须转化成字符串
                };
                for (let k in opt) {
                    ret = new RegExp("(" + k + ")").exec(fmt);
                    if (ret) {
                        fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
                    }
                }
                return fmt;
            }
        };

        const giveawaysu = {
            get_tasks: function(e) {
                //获取任务信息
                let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                if (taskInfo) {
                    this.taskInfo = taskInfo;
                    e === "doTask" ? this.do_task('join') : this.do_task('remove');
                } else {
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在获取任务信息...<font></font></li>`
                    });
                    let tasks = $('#actions tr');
                    for (let task of tasks) {
                        let taskDes = $(task).find('td').eq(1).find('a:not([data-trigger="link"])');
                        let taskInfo = this.which_task(taskDes);
                        for (let info of taskInfo) {
                            if (info.name !== 'nonSteam' && this.taskInfo[info.name + 's']) {
                                this.taskInfo[info.name + 's'].push(info.link);
                                this.taskInfo.links.push(info.link);
                            }
                        }
                    }
                    status.success();
                    this.getFinalUrl(e);
                }
            },
            which_task: function(taskDes) {
                let taskInfo = [];
                let taskName = taskDes.text().trim();
                let link = taskDes.attr('href');
                if (/disable adblock|on facebook/gim.test(taskName)) {
                    return [{
                        name: 'nonSteam'
                    }];
                } else if (/join.*group/gim.test(taskName)) {
                    taskInfo.push({
                        name: 'group',
                        link
                    });
                    this.community = 1;
                } else if (/like.*announcement/gim.test(taskName)) {
                    taskInfo.push({
                        name: 'announcement',
                        link
                    });
                    this.community = 1;
                } else if (/follow.*publisher/gim.test(taskName)) {
                    taskInfo.push({
                        name: 'publisher',
                        link
                    });
                    this.store = 1;
                } else if (/follow.*developer/gim.test(taskName)) {
                    taskInfo.push({
                        name: 'developer',
                        link
                    });
                    this.store = 1;
                } else if (/follow.*curator|subscribe.*curator/gim.test(taskName)) {
                    taskInfo.push({
                        name: 'curator',
                        link
                    });
                    this.store = 1;
                } else {
                    if (/(Subscribe.*YouTube)|(Like.*YouTube)|(Follow.*Instagram)|(on twitter)/gim.test(taskName)) {
                        this.links.push(link);
                    } else {
                        if (/wishlist.*game|add.*wishlist/gim.test(taskName)) {
                            taskInfo.push({
                                name: 'wGame',
                                link
                            });
                            this.store = 1;
                        }
                        if (/follow.*button/gim.test(taskName)) {
                            taskInfo.push({
                                name: 'fGame',
                                link
                            });
                            this.store = 1;
                        }
                    }
                    if (taskInfo.length === 0) return [{
                        name: 'nonSteam'
                    }];
                }
                return taskInfo;
            },
            getFinalUrl: function(e) {
                //处理任务链接
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在处理任务链接...<font></font></li>`
                });
                let pro = [];
                for (let link of this.taskInfo.links) {
                    pro.push(new Promise(resolve => {
                        if (this.taskInfo.toFinalUrl[link]) {
                            resolve({
                                result: 'success'
                            });
                        } else {
                            fuc.getFinalUrl(resolve, link);
                        }
                    }));
                }
                Promise.all(pro).finally(data => {
                    for (let r of data) {
                        if (r.finalUrl) {
                            this.taskInfo.toFinalUrl[r.url] = r.finalUrl;
                        }
                    }
                    //任务链接处理完成
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    status.success();
                    if (debug) console.log(this);
                    e === "doTask" ? this.do_task('join') : this.do_task('remove');
                })
            },
            do_task: function(act) {
                if (globalConf.other.autoOpen && act === 'join' && this.links.length > 0) {
                    for (let link of fuc.unique(this.links)) {
                        window.open(link, "_blank");
                    }
                }
                if ($("div.bind-discord").is(":visible")) $("div.bind-discord a")[0].click();
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0 || this.taskInfo.announcements.length > 0) {
                        if (this.taskInfo.curators.length > 0 || this.taskInfo.publishers.length > 0 || this.taskInfo.developers.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wGames.length > 0) {
                            fuc.updateSteamInfo(resolve, "all");
                        } else {
                            fuc.updateSteamInfo(resolve, "community");
                        }
                    } else if (this.taskInfo.curators.length > 0 || this.taskInfo.publishers.length > 0 || this.taskInfo.developers.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wGames.length > 0) {
                        fuc.updateSteamInfo(resolve, "store");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        let pro = [];
                        for (let group of fuc.unique(this.taskInfo.groups)) {
                            if (this.taskInfo.toFinalUrl[group]) {
                                let groupName = this.taskInfo.toFinalUrl[group].match(/groups\/(.+)\/?/);
                                if (groupName) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.group) {
                                            fuc.joinSteamGroup(resolve, groupName[1]);
                                        } else if (act === 'remove' && this.conf.remove.group) {
                                            fuc.leaveSteamGroup(resolve, groupName[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let curator of fuc.unique(this.taskInfo.curators)) {
                            if (this.taskInfo.toFinalUrl[curator]) {
                                let curatorId = this.taskInfo.toFinalUrl[curator].match(/curator\/([\d]+)/);
                                if (curatorId) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.curator) {
                                            fuc.followCurator(resolve, curatorId[1]);
                                        } else if (act === 'remove' && this.conf.remove.curator) {
                                            fuc.unfollowCurator(resolve, curatorId[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let publisher of fuc.unique(this.taskInfo.publishers)) {
                            if (this.taskInfo.toFinalUrl[publisher]) {
                                let publisherName = this.taskInfo.toFinalUrl[publisher].includes('publisher') ? this.taskInfo.toFinalUrl[publisher].match(/publisher\/(.+)\/?/) : this.taskInfo.toFinalUrl[publisher].match(/pub\/(.+)\/?/);
                                if (publisherName) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.publisher) {
                                            fuc.followPublisher(resolve, publisherName[1]);
                                        } else if (act === 'remove' && this.conf.remove.publisher) {
                                            fuc.unfollowPublisher(resolve, publisherName[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let developer of fuc.unique(this.taskInfo.developers)) {
                            if (this.taskInfo.toFinalUrl[developer]) {
                                let developerName = this.taskInfo.toFinalUrl[developer].includes('developer') ? this.taskInfo.toFinalUrl[developer].match(/developer\/(.+)\/?/) : this.taskInfo.toFinalUrl[developer].match(/dev\/(.+)\/?/);
                                if (developerName) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.developer) {
                                            fuc.followDeveloper(resolve, developerName[1]);
                                        } else if (act === 'remove' && this.conf.remove.developer) {
                                            fuc.unfollowDeveloper(resolve, developerName[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let game of fuc.unique(this.taskInfo.fGames)) {
                            if (this.taskInfo.toFinalUrl[game]) {
                                let gameId = this.taskInfo.toFinalUrl[game].match(/app\/([\d]+)/);
                                if (gameId) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.followGame) {
                                            fuc.followGame(resolve, gameId[1]);
                                        } else if (act === 'remove' && this.conf.remove.unfollowGame) {
                                            fuc.unfollowGame(resolve, gameId[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let game of fuc.unique(this.taskInfo.wGames)) {
                            if (this.taskInfo.toFinalUrl[game]) {
                                let gameId = this.taskInfo.toFinalUrl[game].match(/app\/([\d]+)/);
                                if (gameId) {
                                    pro.push(new Promise(resolve => {
                                        if (act === 'join' && this.conf.join.wishlist) {
                                            fuc.addWishlist(resolve, gameId[1]);
                                        } else if (act === 'remove' && this.conf.remove.wishlist) {
                                            fuc.removeWishlist(resolve, gameId[1]);
                                        } else {
                                            resolve(1);
                                        }
                                    }));
                                }
                            }
                        }
                        for (let announcement of fuc.unique(this.taskInfo.announcements)) {
                            if (this.taskInfo.toFinalUrl[announcement]) {
                                let announcementUrl = this.taskInfo.toFinalUrl[announcement];
                                let announcementId = announcementUrl.match(/announcements\/detail\/([\d]+)/);
                                if (announcementId) {
                                    if (act === 'join' && this.conf.join.announcement) {
                                        pro.push(new Promise(resolve => {
                                            fuc.likeAnnouncements(resolve, announcementUrl, announcementId[1]);
                                        }));
                                    }
                                }
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务执行完成!</font></li>`
                            });
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="warning">建议关闭脚本管理器和广告屏蔽插件再获取key!</font></li>`
                            });
                        });

                    }
                });
            },
            fuck: function() {},
            verify: function() {},
            join: function() {
                this.get_tasks("doTask");
            },
            remove: function() {
                this.get_tasks("remove");
            },
            get_giveawayId: function() {
                let id = location.href.match(/view\/([\d]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            checkLogin: function() {
                if ($("a.steam-login").length > 0) window.open("/steam/redirect", "_self");
            },
            checkLeft: function(ui) {
                if ($(".giveaway-ended").length > 0) {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            community: 0,
            store: 0,
            links: [], //非steam任务
            taskInfo: {
                groups: [], //任务需要加的组
                curators: [], //任务需要关注的鉴赏家
                publishers: [], //任务需要关注的发行商
                developers: [], //任务需要关注的开发商
                fGames: [], //任务需要关注的游戏
                wGames: [], //任务需要加愿望单的游戏
                announcements: [], //任务需要点赞的通知
                links: [], //原始链接
                toFinalUrl: {}, //链接转换
            },
            setting: {
                'fuck': false,
                'verify': false,
                'join': true,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').giveawaysu && GM_getValue('conf').giveawaysu.load) ? GM_getValue('conf').giveawaysu : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const marvelousga = {
            fuck: function() {
                this.get_tasks('do_task');
            },
            get_tasks: function(callback = 'do_task') {
                let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                if (callback === 'remove' && taskInfo && taskInfo !== '{"groups":[],"curators":[]}') {
                    this.taskInfo = taskInfo;
                    this.remove(true);
                } else {
                    this.tasks = [];
                    this.groups = [];
                    this.curators = [];
                    this.links = [];
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在获取任务信息...<font></font></li>`
                    });

                    let tasksContainer = $('.container_task');
                    for (let task of tasksContainer) { //遍历任务信息
                        let taskDes = $(task).find('.card-body p.card-text.monospace');
                        let verifyBtn = $(task).find('button[id^=task_]:not(:contains(VERIFIED))');
                        if (/join[\w\W]*?steamcommunity.com\/groups/gim.test(taskDes.html())) { //加组任务
                            let groupName = taskDes.find('a[href*="steamcommunity.com/groups"]').attr("href").match(/steamcommunity.com\/groups\/([\w\d\-_]*)/)[1];
                            if (verifyBtn.length > 0) {
                                this.groups.push(groupName);
                            }
                            this.taskInfo.groups.push(groupName);
                        }
                        if (/follow[\w\W]*?store.steampowered.com\/curator/gim.test(taskDes.html())) { //关注鉴赏家任务
                            let curatorName = taskDes.find('a[href*="store.steampowered.com/curator"]').attr("href").match(/store.steampowered.com\/curator\/([\d]*)/)[1];
                            if (verifyBtn.length > 0) {
                                this.curators.push(curatorName);
                            }
                            this.taskInfo.curators.push(curatorName);
                        }
                        if (/visit.*?this.*?page/gim.test(taskDes.text()) && verifyBtn.length > 0) { //浏览页面任务
                            let pageUrl = taskDes.find('a[id^="task_webpage_clickedLink"]').attr("href");
                            this.links.push({
                                pageUrl: pageUrl,
                                taskId: verifyBtn.attr('id').split('_')[3]
                            });
                        }
                        if (verifyBtn.length > 0) { //任务验证信息
                            let provider = verifyBtn.attr('id').split('_')[1];
                            let taskRoute = verifyBtn.attr('id').split('_')[2];
                            let taskId = verifyBtn.attr('id').split('_')[3];
                            this.tasks.push({
                                provider,
                                taskRoute,
                                taskId,
                                taskDes: taskDes.html()
                            });
                        }
                    }
                    this.groups = fuc.unique(this.groups);
                    this.curators = fuc.unique(this.curators);
                    this.links = fuc.unique(this.links);
                    this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                    this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                    this.tasks = fuc.unique(this.tasks);
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    status.success();
                    if (debug) console.log(this);
                    if (callback === 'do_task') {
                        if (this.tasks.length === 0) {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                            if (this.conf.fuck.verify) this.verify();
                        } else {
                            this.do_task();
                        }
                    } else if (callback === 'verify') {
                        this.tasks.length > 0 ? this.verify(true) : fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font></li>`
                        });
                    } else {
                        JSON.stringify(this.taskInfo) !== '{"groups":[],"curators":[]}' ? this.remove(true) : fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="warning">没有可以移除的任务!</font></li>`
                        });;
                    }
                }
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    let curators = fuc.unique(this.curators);
                    let links = fuc.unique(this.links);
                    if (this.conf.fuck.group) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    if (this.conf.fuck.curator) {
                        for (let curator of curators) {
                            pro.push(new Promise((resolve) => {
                                fuc.followCurator(resolve, curator);
                            }));
                        }
                    }
                    if (this.conf.fuck.visit) {
                        for (let link of links) {
                            pro.push(new Promise((resolve) => {
                                fuc.visitLink(resolve, link.pageUrl, {
                                    url: "/ajax/verifyTasks/webpage/clickedLink",
                                    method: 'POST',
                                    headers: {
                                        'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                        'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                    },
                                    data: $.param({
                                        giveaway_slug: this.get_giveawayId(),
                                        giveaway_task_id: link.taskId
                                    })
                                });
                            }));
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    });
                })
            },
            verify: function(verify = false) {
                if (verify) {
                    let pro = [];
                    for (let task of fuc.unique(this.tasks)) {
                        let status = fuc.echoLog({
                            type: 'custom',
                            text: `<li>正在验证任务${task.taskDes}...<font></font></li>`
                        });
                        pro.push(new Promise((resolve) => {
                            fuc.httpRequest({
                                url: '/ajax/verifyTasks/' + task.provider + '/' + task.taskRoute,
                                method: 'POST',
                                dataType: 'json',
                                headers: {
                                    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                    'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                },
                                data: $.param({
                                    giveaway_slug: this.get_giveawayId(),
                                    giveaway_task_id: task.taskId
                                }),
                                onload: function(response) {
                                    if (debug) console.log(response);
                                    if (response.status === 200) {
                                        if (response.response.status === 1) {
                                            $(`#task_${task.provider}_${task.taskRoute}_${task.taskId}`).text("VERIFIED");
                                            status.success(response.response.percentageNanoBar.toFixed(2) + "%");
                                            resolve({
                                                result: 'success',
                                                statusText: response.statusText,
                                                status: response.status
                                            });
                                        } else {
                                            status.error('Error:' + (response.response.message || 'error'));
                                            if (globalConf.other.autoOpen) window.open($(task.taskDes).find("a").attr("href"), "_blank");
                                            resolve({
                                                result: 'error',
                                                statusText: response.statusText,
                                                status: response.status
                                            });
                                        }
                                    } else {
                                        status.error('Error:' + (response.response.message || response.statusText || response.status));
                                        if (globalConf.other.autoOpen) window.open($(task.taskDes).find("a").attr("href"), "_blank");
                                        resolve({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                },
                                r: resolve,
                                status
                            });
                        }));
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font><font class="warning">请手动完成<a id="google" href="javascript:void(0)" target="_self">谷歌验证</a>获取key!</font></li>`
                        });
                        $("#get_key_container").show();
                        $("#google").click(() => {
                            $("#get_key_container")[0].scrollIntoView()
                        });
                    });
                } else {
                    this.get_tasks('verify');
                }
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        if (this.conf.remove.curator) {
                            for (let curator of fuc.unique(this.taskInfo.curators)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowCurator(resolve, curator);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            get_giveawayId: function() {
                let id = $("#giveawaySlug").val() || location.href;
                return id;
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        if (this.taskInfo.curators.length > 0) {
                            fuc.updateSteamInfo(resolve, "all");
                        } else {
                            fuc.updateSteamInfo(resolve, "community");
                        }
                    } else if (this.taskInfo.curators.length > 0) {
                        fuc.updateSteamInfo(resolve, "store");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {
                if ($("a[href*=login]").length > 0) window.open("/login", "_self");
            },
            checkLeft: function(ui) {
                if ($("h3.text-danger:contains(this giveaway is closed)").length > 0) {
                    $("#link_to_click").remove();
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            curators: [], //任务需要关注的鉴赏家
            links: [], //需要浏览的页面链接
            taskInfo: {
                groups: [], //所有任务需要加的组
                curators: [], //所有任务需要关注的鉴赏家
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').marvelousga && GM_getValue('conf').marvelousga.load) ? GM_getValue('conf').marvelousga : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const banana = {
            fuck: function(vue) {
                let needBanana = $("p:contains('Collect'):contains('banana')");
                let needPoints = $("p:contains('Collect'):contains('point')");
                let msg = '';
                if (needBanana.length > 0) msg = "此key需要收集" + needBanana.text().match(/[\d]+/gim)[0] + "个香蕉!, 是否继续?";
                if (needPoints.length > 0) msg = "此key需要收集" + needPoints.text().replace(/Collect/gi, "") + ", 是否继续?";
                if (needPoints.length > 0 || needBanana.length > 0) {
                    vue.$confirm(msg, '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        this.get_tasks('do_task');
                    }).catch(() => {});
                } else {
                    this.get_tasks('do_task');
                }
            },
            get_tasks: function(callback = 'do_task') {
                let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                if (callback === 'remove' && taskInfo && taskInfo !== '{"groups":[],"curators":[],"wishlists":[],"fGames":[]}') {
                    this.taskInfo = taskInfo;
                    this.remove(true);
                } else {
                    this.tasks = [];
                    this.links = [];
                    this.groups = [];
                    this.curators = [];
                    this.wishlists = [];
                    this.fGames = [];
                    this.taskIds = [];

                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在处理任务信息...<font></font></li>`
                    });

                    let tasksUl = $('ul.tasks li:not(:contains(Completed))');
                    let pro = [];
                    for (let task of tasksUl) { //遍历任务信息
                        let taskDes = $(task).find('p');
                        let verifyBtn = $(task).find('button:contains(Verify)');
                        let taskId = verifyBtn.length > 0 ? verifyBtn.attr('onclick').match(/\?verify=([\d]+)/) : '';
                        if (taskId) {
                            this.tasks.push({
                                taskId: taskId[1],
                                taskDes: taskDes.text()
                            });
                            if (/join.*?steam.*?group/gim.test(taskDes.text())) {
                                pro.push(new Promise(res => {
                                    new Promise(resolve => {
                                        fuc.getFinalUrl(resolve, location.origin + location.pathname + '?q=' + taskId[1]);
                                    }).then(r => {
                                        if (r.result === 'success') {
                                            let groupName = r.finalUrl.match(/groups\/(.+)\/?/);
                                            if (groupName) {
                                                this.groups.push(groupName[1]);
                                                this.taskInfo.groups.push(groupName[1]);
                                            } else {
                                                this.taskIds.push(taskId[1]);
                                            }
                                        } else {
                                            this.taskIds.push(taskId[1]);
                                        }
                                        res(1);
                                    });
                                }));
                            } else if (/follow.*?curator/gim.test(taskDes.text())) {
                                pro.push(new Promise(res => {
                                    new Promise(resolve => {
                                        fuc.getFinalUrl(resolve, location.origin + location.pathname + '?q=' + taskId[1]);
                                    }).then(r => {
                                        if (r.result === 'success') {
                                            let curatorId = r.finalUrl.match(/curator\/([\d]+)/);
                                            if (curatorId) {
                                                this.curators.push(curatorId[1]);
                                                this.taskInfo.curators.push(curatorId[1]);
                                            } else {
                                                this.taskIds.push(taskId[1]);
                                            }
                                        } else {
                                            this.taskIds.push(taskId[1]);
                                        }
                                        res(1);
                                    });
                                }));
                            } else if (/wishlist/gim.test(taskDes.text())) {
                                pro.push(new Promise(res => {
                                    new Promise(resolve => {
                                        fuc.getFinalUrl(resolve, location.origin + location.pathname + '?q=' + taskId[1]);
                                    }).then(r => {
                                        if (r.result === 'success') {
                                            let appId = r.finalUrl.match(/store.steampowered.com\/app\/([\d]+)/);
                                            if (appId) {
                                                this.wishlists.push(appId[1]);
                                                this.taskInfo.wishlists.push(appId[1]);
                                            } else {
                                                this.taskIds.push(taskId[1]);
                                            }
                                        } else {
                                            this.taskIds.push(taskId[1]);
                                        }
                                        res(1);
                                    });
                                }));
                            } else {
                                if (/(Subscribe.*channel)|(Retweet)|(Twitter)/gim.test(taskDes.text())) {
                                    if (!this.verifyBtn) this.verifyBtn = taskDes.find("button:first");
                                    if (callback === 'do_task' && globalConf.other.autoOpen) {
                                        taskDes.find("button")[0].click();
                                    }
                                }
                                pro.push(new Promise(res => {
                                    this.links.push(location.origin + location.pathname + '?q=' + taskId[1]);
                                    this.taskIds.push(taskId[1]);
                                    res(1);
                                }));
                            }
                        }
                    }
                    Promise.all(pro).finally(data => {
                        this.links = fuc.unique(this.links);
                        this.groups = fuc.unique(this.groups);
                        this.curators = fuc.unique(this.curators);
                        this.wishlists = fuc.unique(this.wishlists);
                        this.fGames = fuc.unique(this.fGames);
                        this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                        this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                        this.taskInfo.wishlists = fuc.unique(this.taskInfo.wishlists);
                        this.taskInfo.fGames = fuc.unique(this.taskInfo.fGames);
                        this.taskIds = fuc.unique(this.taskIds);
                        this.tasks = fuc.unique(this.tasks);
                        GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                        status.success();
                        if (debug) console.log(this);
                        if (callback === 'do_task') {
                            this.do_task();
                        } else if (callback === 'verify') {
                            this.tasks.length > 0 ? this.verify(true) : fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        } else {
                            JSON.stringify(this.taskInfo) !== '{"groups":[],"curators":[],"wishlists":[],"fGames":[]}' ? this.remove(true) : fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="warning">没有可以移除的任务!</font></li>`
                            });;
                        }
                    });
                }
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    let curators = fuc.unique(this.curators);
                    let wishlists = fuc.unique(this.wishlists);
                    let fGames = fuc.unique(this.fGames);
                    let links = fuc.unique(this.links);
                    if (this.conf.fuck.group) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    if (this.conf.fuck.curator) {
                        for (let curator of curators) {
                            pro.push(new Promise((resolve) => {
                                fuc.followCurator(resolve, curator);
                            }));
                        }
                    }
                    if (this.conf.fuck.wishlist) {
                        for (let gameId of wishlists) {
                            pro.push(new Promise((resolve) => {
                                fuc.addWishlist(resolve, gameId);
                            }));
                        }
                    }
                    if (this.conf.fuck.followGame) {
                        for (let gameId of fGames) {
                            pro.push(new Promise((resolve) => {
                                fuc.followGame(resolve, gameId);
                            }));
                        }
                    }
                    if (this.conf.fuck.visit) {
                        for (let link of links) {
                            pro.push(new Promise((resolve) => {
                                fuc.visitLink(resolve, link);
                            }));
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    });
                });
            },
            verify: function(verify = false) {
                if (verify) {
                    let pro = [];
                    for (let task of fuc.unique(this.tasks)) {
                        let status = fuc.echoLog({
                            type: 'custom',
                            text: `<li>正在验证任务${task.taskDes}...<font></font></li>`
                        });
                        pro.push(new Promise((resolve) => {
                            fuc.httpRequest({
                                url: location.origin + location.pathname + '?verify=' + task.taskId,
                                method: 'GET',
                                onload: function(response) {
                                    if (debug) console.log(response);
                                    status.warning('Complete');
                                    resolve({
                                        result: 'success',
                                        statusText: response.statusText,
                                        status: response.status
                                    });
                                },
                                r: resolve,
                                status
                            });
                        }));
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font></li>`
                        });
                        if (this.verifyBtn) {
                            this.verifyBtn.removeAttr("disabled")[0].click();
                        } else {
                            location.reload(true);
                        }
                    });
                } else {
                    this.get_tasks('verify');
                }
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        if (this.conf.remove.curator) {
                            for (let curator of fuc.unique(this.taskInfo.curators)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowCurator(resolve, curator);
                                }));
                            }
                        }
                        if (this.conf.remove.wishlist) {
                            for (let gameId of fuc.unique(this.taskInfo.wishlists)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.removeWishlist(resolve, gameId);
                                }));
                            }
                        }
                        if (this.conf.remove.unfollowGame) {
                            for (let gameId of fuc.unique(this.taskInfo.fGames)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowGame(resolve, gameId);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            get_giveawayId: function() {
                let id = location.href.match(/\/giveaway\/([\w\d\-]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        if (this.taskInfo.curators.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wishlists.length > 0) {
                            fuc.updateSteamInfo(resolve, "all");
                        } else {
                            fuc.updateSteamInfo(resolve, "community");
                        }
                    } else if (this.taskInfo.curators.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wishlists.length > 0) {
                        fuc.updateSteamInfo(resolve, "store");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {
                if ($("a.steam[title*=team]").length > 0) window.open("/giveaway/steam/", "_self");
            },
            checkLeft: function(ui) {
                if ($(".left b").text() === "0") {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            verifyBtn: 0,
            links: [], //需要浏览的页面链接
            groups: [], //所有任务需要加的组
            curators: [], //所有任务需要关注的鉴赏家
            wishlists: [], //所有务需要添加愿望单的游戏
            fGames: [], //所有任务需要关注的的游戏
            taskIds: [], //处理失败的任务
            taskInfo: {
                groups: [], //任务需要加的组
                curators: [], //任务需要关注的鉴赏家
                wishlists: [], //任务需要添加愿望单的游戏
                fGames: [], //任务需要关注的的游戏
            },
            tasks: [], //所有任务ID
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').banana && GM_getValue('conf').banana.load) ? GM_getValue('conf').banana : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const gamecode = {
            fuck: function() {
                this.get_tasks('do_task');
            },
            get_tasks: function(callback = 'do_task') {
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在获取任务信息...<font></font></li>`
                });
                let verifyBtns = $("[id^=listOfTasks_btnVerify]:not(:contains(VERIFIED))");
                let allVerifyBtns = $("[id^=listOfTasks_btnVerify]");
                if (callback === 'do_task') {
                    let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                    if (taskInfo && taskInfo !== '{"groups":[]}') this.taskInfo = taskInfo;
                    this.groups = [];
                    for (let btn of verifyBtns) {
                        if ($(btn).attr('id').split('_')[4] === "joinGroup") {
                            let link = $(btn).parent().find("a[href*='steamcommunity.com/groups/']").attr("href");
                            let groupName = link.match(/groups\/(.+)\/?/);
                            if (groupName) {
                                this.groups.push(groupName[1]);
                            }
                        }
                    }
                    for (let btn of allVerifyBtns) {
                        if ($(btn).attr('id').split('_')[4] === "joinGroup") {
                            let link = $(btn).parent().find("a[href*='steamcommunity.com/groups/']").attr("href");
                            let groupName = link.match(/groups\/(.+)\/?/);
                            if (groupName) {
                                this.taskInfo.groups.push(groupName[1]);
                            }
                        }
                    }
                    this.groups = fuc.unique(this.groups);
                    this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    if (this.groups.length > 0) {
                        this.do_task();
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    }
                } else if (callback === "verify") {
                    this.tasks = [];
                    for (let btn of verifyBtns) {
                        let id = $(btn).attr('id');
                        let index = id.split('_')[2];
                        switch (id.split('_')[3]) {
                            case 't':
                                if (id.split('_')[4] === 'followUser') {
                                    this.tasks.push({
                                        url: '/ajax/social/twitter/followUser',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'post') {
                                    this.tasks.push({
                                        url: '/ajax/social/twitter/postCheck',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else {
                                    this.tasks.push({
                                        url: getUrlTwitter($(btn)).replace("..", ""),
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                }
                                break;
                            case 'others':
                                this.tasks.push({
                                    url: '/ajax/social/others/clicked',
                                    id: $("#task_id_" + index).val(),
                                    taskDes: $(btn).parent().find(".card-title").html()
                                });
                                break;
                            case 'w':
                                if (id.split('_')[4] === 'followChannel') {
                                    this.tasks.push({
                                        url: '/ajax/social/twitch/followCheck',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else {
                                    this.tasks.push({
                                        url: getUrlTwitch($(btn)).replace("..", ""),
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                }
                                break;
                            case 'f':
                                if (id.split('_')[4] === 'like') {
                                    this.tasks.push({
                                        url: '/ajax/social/facebook/likePage',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'share') {
                                    this.tasks.push({
                                        url: '/ajax/social/facebook/shareContent',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'shareGiveaway') {
                                    this.tasks.push({
                                        url: '/ajax/social/facebook/shareThisGiveaway',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else {
                                    this.tasks.push({
                                        url: getUrlFacebook($(btn)).replace("..", ""),
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                }
                                break;
                            case 's':
                                if (id.split('_')[4] === 'joinGroup') {
                                    this.tasks.push({
                                        url: '/ajax/social/steam/followGroup',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'playGame') {
                                    this.tasks.push({
                                        url: '/ajax/social/steam/playGame',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'gameLibrary') {
                                    this.tasks.push({
                                        url: '/ajax/social/steam/gameLibrary',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else {
                                    this.tasks.push({
                                        url: getUrlSteam($(btn)).replace("..", ""),
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                }
                                break;
                            case 'y':
                                if (id.split('_')[4] === 'subscribeChannel') {
                                    this.tasks.push({
                                        url: '/ajax/social/youtube/subscribeChannel',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else if (id.split('_')[4] === 'likeVideo') {
                                    this.tasks.push({
                                        url: '/ajax/social/youtube/likeVideo',
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                } else {
                                    this.tasks.push({
                                        url: getUrlYoutube($(btn)).replace("..", ""),
                                        id: $("#task_id_" + index).val(),
                                        taskDes: $(btn).parent().find(".card-title").html()
                                    });
                                }
                                break;
                            default:
                                this.tasks.push({
                                    url: 'unknown',
                                    id: $("#task_id_" + index).val(),
                                    taskDes: $(btn).parent().find(".card-title").html()
                                });
                        }
                    }
                    this.tasks = fuc.unique(this.tasks);
                    if (this.tasks.length > 0) {
                        this.verify(true);
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font></li>`
                        });
                    }
                } else if (callback === "remove") {
                    let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                    if (taskInfo && taskInfo !== '{"groups":[]}') {
                        this.taskInfo = taskInfo;
                        this.remove(true);
                    } else {
                        for (let btn of allVerifyBtns) {
                            if ($(btn).attr('id').split('_')[4] === "joinGroup") {
                                let link = $(btn).parent().find("a[href*='steamcommunity.com/groups/']").attr("href");
                                let groupName = link.match(/groups\/(.+)\/?/);
                                if (groupName) {
                                    this.taskInfo.groups.push(groupName[1]);
                                }
                            }
                        }
                        this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                        GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                        if (this.taskInfo.groups.length > 0) {
                            this.remove(true);
                        } else {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">没有可以移除的任务!</font></li>`
                            });
                        }
                    }
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">未知操作!</font></li>`
                    });
                }
                status.success();
                if (debug) console.log(this);
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    if (this.conf.fuck.group) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    });
                });
            },
            verify: function(verify = false) {
                if (verify) {
                    let pro = [];
                    for (let task of fuc.unique(this.tasks)) {
                        let status = fuc.echoLog({
                            type: 'custom',
                            text: `<li>正在验证任务${task.taskDes}...<font></font></li>`
                        });
                        pro.push(new Promise((resolve) => {
                            fuc.httpRequest({
                                url: task.url,
                                method: 'POST',
                                dataType: 'json',
                                headers: {
                                    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                    'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                },
                                data: $.param({
                                    giveawayID: this.get_giveawayId(),
                                    taskID: task.id
                                }),
                                onload: function(response) {
                                    if (debug) console.log(response);
                                    if (response.status === 200) {
                                        if (response.response.status === 1) {
                                            $(`input[value=${task.id}]`).parent().find("button[id^=listOfTasks_btnVerify_]").text("VERIFIED");
                                            status.success((parseInt(response.response.nDoneTasks) / parseInt(totalTasks) * 100).toFixed(2) + "%");
                                            resolve({
                                                result: 'success',
                                                statusText: response.statusText,
                                                status: response.status
                                            });
                                        } else {
                                            status.error('Error:' + (response.response.message || 'error'));
                                            if (globalConf.other.autoOpen) window.open(task.url, "_blank");
                                            resolve({
                                                result: 'error',
                                                statusText: response.statusText,
                                                status: response.status
                                            });
                                        }
                                    } else {
                                        status.error('Error:' + (response.response.message || response.statusText || response.status));
                                        if (globalConf.other.autoOpen) window.open(task.url, "_blank");
                                        resolve({
                                            result: 'error',
                                            statusText: response.statusText,
                                            status: response.status
                                        });
                                    }
                                },
                                r: resolve,
                                status
                            });
                        }));
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font><font class="warning">请手动完成<a id="google" href="javascript:void(0)" target="_self">谷歌验证</a>获取key!</font></li>`
                        });
                        $("#google").click(() => {
                            $("#captcha")[0].scrollIntoView()
                        });
                    });
                } else {
                    this.get_tasks('verify');
                }
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            get_giveawayId: function() {
                let id = $("#giveawayID").val() || location.href;
                return id;
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        fuc.updateSteamInfo(resolve, "community");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {
                if ($("a.steam[title*=team]").length > 0) window.open("/login", "_self");
            },
            checkLeft: function(ui) {
                if ($(".text-danger:contains(this giveaway is closed)").length > 0) {
                    $("#link_to_click").remove();
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            taskInfo: {
                groups: [], //所有任务需要加的组
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').gamecode && GM_getValue('conf').gamecode.load) ? GM_getValue('conf').gamecode : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const gamehag = {
            fuck: function() {
                this.get_tasks('do_task');
            },
            get_tasks: function(callback = 'do_task') {
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在获取任务信息...<font></font></li>`
                });
                let verifyBtns = $("button[data-id]");
                if (callback === 'do_task') {
                    let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                    if (taskInfo && taskInfo !== '{"groups":[]}') this.taskInfo = taskInfo;
                    this.groups = [];
                    this.tasks = [];
                    for (let btn of verifyBtns) {
                        let taskId = $(btn).attr("data-id");
                        let taskDes = $(btn).parent().prev().text();
                        if ($(btn).parents(".task-content").next().text().includes("+1")) this.tasks.push({
                            taskId,
                            taskDes
                        });
                    }
                    if ($("a.giveaway-survey").length > 0) {
                        let taskId = $("a.giveaway-survey").attr("data-task_id");
                        let taskDes = "Complete the survey";
                        this.tasks.push({
                            taskId,
                            taskDes
                        });
                    }
                    this.groups = fuc.unique(this.groups);
                    this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                    this.tasks = fuc.unique(this.tasks);
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    if (this.tasks.length > 0) {
                        this.do_task();
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    }
                } else if (callback === "verify") {
                    this.tasks = [];
                    for (let btn of verifyBtns) {
                        let taskId = $(btn).attr("data-id");
                        let taskDes = $(btn).parent().prev().text();
                        if ($(btn).parents(".task-content").next().text().includes("+1")) this.tasks.push({
                            taskId,
                            taskDes
                        });
                    }
                    this.tasks = fuc.unique(this.tasks);
                    if (this.tasks.length > 0) {
                        this.verify(true);
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成!</font></li>`
                        });
                    }
                } else if (callback === "remove") {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="success">没有可以移除的任务!</font></li>`
                    });
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">未知操作!</font></li>`
                    });
                }
                status.success();
                if (debug) console.log(this);
            },
            do_task: function() {
                let pro = [];
                let tasks = fuc.unique(this.tasks);
                fuc.forOrder({
                    arr: tasks,
                    time: 500,
                    callback: ({
                        e,
                        end
                    }) => {
                        if (!end) {
                            let task = e;
                            pro.push(new Promise((resolve) => {
                                fuc.visitLink(resolve, "/giveaway/click/" + task.taskId, {
                                    headers: {
                                        'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                    }
                                });
                            }));
                            if (/play.*?games/gim.test(task.taskDes)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.visitLink(resolve, "/games", {
                                        headers: {
                                            'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                        }
                                    });
                                }));
                                pro.push(new Promise((resolve) => {
                                    fuc.visitLink(resolve, "/games/war-thunder/play", {
                                        headers: {
                                            'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                        }
                                    });
                                }));
                            }
                        } else {
                            Promise.all(pro).finally(resolve => {
                                fuc.echoLog({
                                    type: 'custom',
                                    text: `<li><font class="success">所有任务已完成!</font></li>`
                                });
                                if (this.conf.fuck.verify) this.verify();
                            });
                        }
                    }
                });
            },
            verify: function(verify = false) {
                if (verify) {
                    let pro = [];
                    fuc.forOrder({
                        arr: fuc.unique(this.tasks),
                        time: 500,
                        callback: ({
                            e,
                            end
                        }) => {
                            if (!end) {
                                let task = e;
                                let status = fuc.echoLog({
                                    type: 'custom',
                                    text: `<li>正在验证任务<a href="/giveaway/click/${task.taskId}" target="_blank">${task.taskDes.trim()}</a>...<font></font></li>`
                                });
                                pro.push(new Promise((resolve) => {
                                    fuc.httpRequest({
                                        url: '/api/v1/giveaway/sendtask',
                                        method: 'POST',
                                        dataType: 'json',
                                        headers: {
                                            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                            'x-csrf-token': $('meta[name="csrf-token"]').attr('content')
                                        },
                                        data: 'task_id=' + task.taskId,
                                        onload: function(response) {
                                            if (debug) console.log(response);
                                            if (response.response) {
                                                if (response.response.status === "success") {
                                                    status.success();
                                                    $(`div.task-reward[href="#task-${task.taskId}-collapse"]`).html(`<svg class="nc-icon nc-align-to-text grid-24 glyph"><use xlink:href="/icons/nci-fill.svg#nc-icon-check-simple" /></svg>`);
                                                    resolve({
                                                        result: 'success',
                                                        statusText: response.statusText,
                                                        status: response.status
                                                    });
                                                } else {
                                                    status.error('Error:' + (response.response.message || response.statusText || response.status || 'error'));
                                                    if (globalConf.other.autoOpen) window.open(`/giveaway/click/${task.taskId}`, "_blank");
                                                    resolve({
                                                        result: 'error',
                                                        statusText: response.statusText,
                                                        status: response.status
                                                    });
                                                }
                                            } else {
                                                status.error('Error:' + response.statusText);
                                                resolve({
                                                    result: 'error',
                                                    statusText: response.statusText,
                                                    status: response.status
                                                });
                                            }
                                        },
                                        r: resolve,
                                        status
                                    });
                                }));
                            } else {
                                Promise.all(pro).finally(resolve => {
                                    fuc.echoLog({
                                        type: 'custom',
                                        text: `<li><font class="success">所有任务验证完成!</font></li>`
                                    });
                                });
                            }
                        }
                    });
                } else {
                    this.get_tasks('verify');
                }
            },
            remove: function(remove = false) {
                fuc.echoLog({
                    type: 'custom',
                    text: `<li><font class="success">没有可以移除的任务!</font></li>`
                });
            },
            get_giveawayId: function() {
                let id = location.href.match(/\/giveaway\/([\d]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            checkLogin: function() {},
            checkLeft: function(ui) {
                if ($(".giveaway-counter:first .strong").text() === "0") {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            taskInfo: {
                groups: [], //所有任务需要加的组
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').gamehag && GM_getValue('conf').gamehag.load) ? GM_getValue('conf').gamehag : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const prys = {
            fuck: function() {
                this.get_tasks('do_task');
            },
            get_tasks: function(callback = 'do_task') {
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在获取任务信息...<font></font></li>`
                });
                let steps = $("#steps tbody tr");
                for (let i = 0; i < steps.length; i++) {
                    if (steps.eq(i).find("span:contains(Success)").length === 0) checkClick(i);
                }
                if (callback === 'do_task') {
                    let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                    if (taskInfo && taskInfo !== '{"groups":[],"curators":[]}') this.taskInfo = taskInfo;
                    this.groups = [];
                    this.curators = [];
                    let pro = [];
                    for (let step of steps) {
                        if ($(step).find("span:contains(Success)").length === 0) {
                            if ($(step).find("a[href*='store.steampowered.com/curator/']").length > 0) {
                                let link = $(step).find("a[href*='store.steampowered.com/curator/']").attr('href');
                                let curatorId = link.match(/curator\/([\d]+)/);
                                if (curatorId) {
                                    this.curators.push(curatorId[1]);
                                    this.taskInfo.curators.push(curatorId[1]);
                                }
                            } else if ($(step).find("a[href*='steampowered.com/groups/']").length > 0) {
                                let link = $(step).find("a[href*='steampowered.com/groups/']").attr('href');
                                let groupName = link.match(/groups\/(.+)\/?/);
                                if (groupName) {
                                    this.groups.push(groupName[1]);
                                    this.taskInfo.groups.push(groupName[1]);
                                }
                            } else if ($(step).find("a[href*='steamcommunity.com/gid']").length > 0) {
                                let link = $(step).find("a[href*='steamcommunity.com/gid']").attr('href');
                                pro.push(new Promise(r => {
                                    new Promise(resolve => {
                                        fuc.getFinalUrl(resolve, link);
                                    }).then(data => {
                                        if (data.result === 'success') {
                                            let groupName = data.finalUrl.match(/groups\/(.+)\/?/);
                                            if (groupName) {
                                                this.groups.push(groupName[1]);
                                                this.taskInfo.groups.push(groupName[1]);
                                            }
                                        }
                                        r(1);
                                    });
                                }));
                            }
                        }
                    }
                    if (pro.length > 0) {
                        Promise.all(pro).finally(data => {
                            this.groups = fuc.unique(this.groups);
                            this.curators = fuc.unique(this.curators);
                            this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                            this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                            GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                            if (this.groups.length > 0 || this.curators.length > 0) {
                                this.do_task();
                            } else {
                                fuc.echoLog({
                                    type: 'custom',
                                    text: `<li><font class="success">所有任务已完成!</font></li>`
                                });
                                if (this.conf.fuck.verify) this.verify();
                            }
                        });
                    } else {
                        this.groups = fuc.unique(this.groups);
                        this.curators = fuc.unique(this.curators);
                        this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                        this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                        GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                        if (this.groups.length > 0 || this.curators.length > 0) {
                            this.do_task();
                        } else {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                            if (this.conf.fuck.verify) this.verify();
                        }
                    }
                } else if (callback === "verify") {
                    this.tasks = [];
                    let checks = $("#steps tbody a[id^=check]");
                    if (checks.length > 0) {
                        for (let check of checks) {
                            let id = $(check).attr('id').match(/[\d]+/);
                            if (id) this.tasks.push({
                                id: id[0],
                                taskDes: $(check).parent().prev().html().trim()
                            })
                        }
                        this.verify(true);
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成,请手动完成人机验证获取key!</font></li>`
                        });
                        //fuc.echoLog({type: 'custom', text: `<li><font class="warning">如果没有显示人机验证,说明有的任务显示成功实际上没完成,请刷新页面查看并手动完成!</font></li>`});
                    }
                } else if (callback === "remove") {
                    let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                    if (taskInfo && taskInfo !== '{"groups":[],"curators":[]}') {
                        this.taskInfo = taskInfo;
                        this.remove(true);
                    } else {
                        let pro = [];
                        for (let step of steps) {
                            if ($(step).find("a[href*='store.steampowered.com/curator/']").length > 0) {
                                let link = $(step).find("a[href*='store.steampowered.com/curator/']").attr('href');
                                let curatorId = link.match(/curator\/([\d]+)/);
                                if (curatorId) {
                                    this.taskInfo.curators.push(curatorId[1]);
                                }
                            } else if ($(step).find("a[href*='steampowered.com/groups/']").length > 0) {
                                let link = $(step).find("a[href*='steampowered.com/groups/']").attr('href');
                                let groupName = link.match(/groups\/(.+)\/?/);
                                if (groupName) {
                                    this.taskInfo.groups.push(groupName[1]);
                                }
                            } else if ($(step).find("a[href*='steamcommunity.com/gid']").length > 0) {
                                let link = $(step).find("a[href*='steamcommunity.com/gid']").attr('href');
                                pro.push(new Promise(r => {
                                    new Promise(resolve => {
                                        fuc.getFinalUrl(resolve, link);
                                    }).then(data => {
                                        if (data.result === 'success') {
                                            let groupName = data.finalUrl.match(/groups\/(.+)\/?/);
                                            if (groupName) {
                                                this.taskInfo.groups.push(groupName[1]);
                                            }
                                        }
                                        r(1);
                                    });
                                }));
                            }
                        }
                        if (pro.length > 0) {
                            Promise.all(pro).finally(data => {
                                this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                                this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                                GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                                if (this.taskInfo.groups.length > 0 || this.taskInfo.curators.length > 0) {
                                    this.remove(true);
                                } else {
                                    fuc.echoLog({
                                        type: 'custom',
                                        text: `<li><font class="success">没有可以移除的任务!</font></li>`
                                    });
                                }
                            });
                        } else {
                            this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                            this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                            GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                            if (this.taskInfo.groups.length > 0 || this.taskInfo.curators.length > 0) {
                                this.remove(true);
                            } else {
                                fuc.echoLog({
                                    type: 'custom',
                                    text: `<li><font class="success">没有可以移除的任务!</font></li>`
                                });
                            }
                        }
                    }
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">未知操作!</font></li>`
                    });
                }
                status.success();
                if (debug) console.log(this);
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    let curators = fuc.unique(this.curators);
                    if (this.conf.fuck.group) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    if (this.conf.fuck.curator) {
                        for (let curator of curators) {
                            pro.push(new Promise((resolve) => {
                                fuc.followCurator(resolve, curator);
                            }));
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify();
                    });
                });
            },
            verify: function(verify = false) {
                if (verify) {
                    let pro = [];
                    for (let task of fuc.unique(this.tasks)) {
                        let status = fuc.echoLog({
                            type: 'custom',
                            text: `<li>正在验证任务${task.taskDes}...<font></font></li>`
                        });
                        pro.push(new Promise((resolve) => {
                            this.checkStep(task.id, resolve, status);
                        }));
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务验证完成,请手动完成人机验证获取key!</font></li>`
                        });
                        //fuc.echoLog({type: 'custom', text: `<li><font class="warning">如果没有显示人机验证,说明有的任务显示成功实际上没完成,请刷新页面查看并手动完成!</font></li>`});
                    });
                } else {
                    this.get_tasks('verify');
                }
            },
            checkStep: function(step, r, status, captcha) {
                if (!captcha) captcha = null;
                if (step !== "captcha") $("#check" + step).replaceWith('<span id="check' + step +
                    '"><i class="fa fa-refresh fa-spin fa-fw"></i> Checking...</span>');
                $.post("/api/check_step", {
                    step: step,
                    id: getURLParameter("id"),
                    "g-recaptcha-response": captcha
                }, function(json) {
                    r(1);
                    if (json.success && step !== "captcha") {
                        $("#check" + step).replaceWith('<span class="text-success" id="check' + step +
                            '"><i class="fa fa-check"></i> Success</span>');
                        status.success();
                    } else if (step !== "captcha") {
                        $("#check" + step).replaceWith('<a id="check' + step + '" href="javascript:checkStep(' + step +
                            ')"><i class="fa fa-question"></i> Check</a>');
                        status.error((json.response ? json.response.error ? json.response.error : 'Error' : 'Error'));
                    }
                    if (json.response) {
                        if (json.response.captcha && json.success) {
                            showAlert("info", json.response.captcha);
                            captchaCheck();
                        } else if (json.response.captcha) {
                            showAlert("warning", json.response.captcha);
                            captchaCheck();
                        }
                        if (json.response.prize) {
                            showAlert("success",
                                'Here is your prize:<h1 role="button" align="middle" style="word-wrap: break-word;">' +
                                json.response.prize + '</h2>');
                        }
                    }
                }).fail(function() {
                    r(1);
                    $("#check" + step).replaceWith('<a id="check' + step + '" href="javascript:checkStep(' + step +
                        ')"><i class="fa fa-question"></i> Check</a>');
                    status.error('Error:0');
                });
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        if (this.conf.remove.curator) {
                            for (let curator of fuc.unique(this.taskInfo.curators)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowCurator(resolve, curator);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            get_giveawayId: function() {
                let id = location.search.match(/id=([\d]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        if (this.taskInfo.curators.length > 0) {
                            fuc.updateSteamInfo(resolve, "all");
                        } else {
                            fuc.updateSteamInfo(resolve, "community");
                        }
                    } else if (this.taskInfo.curators.length > 0) {
                        fuc.updateSteamInfo(resolve, "store");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {},
            checkLeft: function(ui) {
                let left = $("#header").text().match(/([\d]+).*?prize.*?left/);
                if (!(left.length > 0 && left[1] !== "0")) {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            curators: [], //任务需要关注的鉴赏家
            taskInfo: {
                groups: [], //所有任务需要加的组
                curators: [], //所有任务需要关注的鉴赏家
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').prys && GM_getValue('conf').prys.load) ? GM_getValue('conf').prys : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const indiedb = {
            fuck: function() {
                if ($("a.buttonenter:contains(Register to join)").length > 0) fuc.echoLog({
                    type: 'custom',
                    text: `<li><font class="error">请先登录(不可用)!</font></li>`
                });
                let currentoption = $("a.buttonenter.buttongiveaway");
                if (/join giveaway/gim.test(currentoption.text())) {
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在加入赠key...<font></font></li>`
                    });
                    let do_task = this.do_task;
                    fuc.httpRequest({
                        url: currentoption.attr('href'),
                        method: 'POST',
                        data: 'ajax=t',
                        dataType: 'json',
                        headers: {
                            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                            'accept': 'application/json, text/javascript, */*; q=0.01'
                        },
                        onload: function(response) {
                            if (debug) console.log(response);
                            if (response.status === 200 && response.response) {
                                if (response.response.success) {
                                    currentoption.addClass("buttonentered").text("Success - Giveaway joined");
                                    $("#giveawaysjoined").slideDown();
                                    $("#giveawaysrecommend").slideDown();
                                    status.success("Success" + (response.response.text ? (":" + response.response.text) : ""));
                                    do_task();
                                } else {
                                    status.error("Error" + (response.response.text ? (":" + response.response.text) : ""));
                                }
                            } else {
                                status.error("Error:" + (response.statusText || response.status));
                            }
                        }
                    });
                } else if (/success/gim.test($("a.buttonenter.buttongiveaway").text())) {
                    this.do_task();
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">请检查是否已加入此赠key!</font></li>`
                    });
                }
            },
            do_task: function() {
                let id = $("script").map(function(i, e) {
                    if (/\$\(document\)/gim.test(e.innerHTML)) {
                        let optionId = e.innerHTML.match(/"\/newsletter\/ajax\/subscribeprofile\/optin\/[\d]+"/gim)[0].match(/[\d]+/)[0];
                        let taskId = e.innerHTML.match(/"\/[\d]+"/gim)[0].match(/[\d]+/)[0];
                        return [taskId, optionId];
                    }
                });
                if (id.length === 2) {
                    let tasks = $("#giveawaysjoined a[class*=promo]");
                    let pro = [];
                    for (let task of tasks) {
                        let promo = $(task);
                        if (!promo.hasClass("buttonentered")) {
                            let status = fuc.echoLog({
                                type: 'custom',
                                text: `<li>正在做任务:${promo.parents("p").text()}...<font></font></li>`
                            });
                            if (/facebookpromo|twitterpromo|visitpromo/gim.test(task.className)) {
                                pro.push(new Promise(resolve => {
                                    $.ajax({
                                        type: "POST",
                                        url: urlPath("/giveaways/ajax/" + (promo.hasClass("facebookpromo") ? "facebookpromo" : (promo.hasClass("twitterpromo") ? "twitterpromo" : "visitpromo")) + "/" + id[0]),
                                        timeout: 60000,
                                        dataType: "json",
                                        data: {
                                            ajax: "t"
                                        },
                                        error: function(response, error, exception) {
                                            if (debug) console.log({
                                                response,
                                                error,
                                                exception
                                            });
                                            status.error("Error:An error has occurred performing the action requested. Please try again shortly.");
                                            resolve(0);
                                        },
                                        success: function(response) {
                                            if (debug) console.log(response);
                                            if (response["success"]) {
                                                status.success("Success:" + response["text"]);
                                                promo.addClass("buttonentered").closest("p").html(promo.closest("p").find("span").html());
                                                resolve(1);
                                            } else {
                                                status.error("Error:" + response["text"]);
                                                resolve(0);
                                            }
                                        }
                                    });
                                }));
                            } else if (promo.hasClass("emailoptinpromo")) {
                                pro.push(new Promise(resolve => {
                                    $.ajax({
                                        type: "POST",
                                        url: urlPath("/newsletter/ajax/subscribeprofile/optin/" + id[1]),
                                        timeout: 60000,
                                        dataType: "json",
                                        data: {
                                            ajax: "t",
                                            emailsystoggle: 4
                                        },
                                        error: function(response, error, exception) {
                                            if (debug) console.log({
                                                response,
                                                error,
                                                exception
                                            });
                                            status.error("Error:An error has occurred performing the action requested. Please try again shortly.");
                                            resolve(0);
                                        },
                                        success: function(response) {
                                            if (debug) console.log(response);
                                            if (response["success"]) {
                                                status.success("Success:" + response["text"]);
                                                promo.toggleClass("buttonentered").closest("p").html(promo.closest("p").find("span").html());
                                                resolve(1);
                                            } else {
                                                status.error("Error:" + response["text"]);
                                                resolve(0);
                                            }
                                        }
                                    });
                                }));
                            } else if (promo.hasClass("watchingpromo")) {
                                pro.push(new Promise(resolve => {
                                    let data = fuc.getUrlQuery(promo.attr("href"));
                                    data.ajax = "t";
                                    $.ajax({
                                        type: "POST",
                                        url: urlPath(promo.attr("href").split(/[?#]/)[0]),
                                        timeout: 60000,
                                        dataType: "json",
                                        data: data,
                                        error: function(response, error, exception) {
                                            if (debug) console.log({
                                                response,
                                                error,
                                                exception
                                            });
                                            status.error("Error:An error has occurred performing the action requested. Please try again shortly.");
                                            resolve(0);
                                        },
                                        success: function(response) {
                                            if (debug) console.log(response);
                                            if (response["success"]) {
                                                status.success("Success:" + response["text"]);
                                                promo.toggleClass("buttonentered").closest("p").html(promo.closest("p").find("span").html());
                                                resolve(1);
                                            } else {
                                                status.error("Error:" + response["text"]);
                                                resolve(0);
                                            }
                                        }
                                    });
                                }));
                            } else if (!/the-challenge-of-adblock/gim.test(promo.attr("href"))) {
                                pro.push(new Promise(resolve => {
                                    $.ajax({
                                        type: "POST",
                                        url: urlPath(promo.attr("href")),
                                        timeout: 60000,
                                        dataType: "json",
                                        data: {
                                            ajax: "t"
                                        },
                                        error: function(response, error, exception) {
                                            if (debug) console.log({
                                                response,
                                                error,
                                                exception
                                            });
                                            status.error("Error:An error has occurred performing the action requested. Please try again shortly.");
                                            resolve(0);
                                        },
                                        success: function(response) {
                                            if (debug) console.log(response);
                                            if (response["success"]) {
                                                status.success("Success:" + response["text"]);
                                                promo.toggleClass("buttonentered").closest("p").html(promo.closest("p").find("span").html());
                                                resolve(1);
                                            } else {
                                                status.error("Error:" + response["text"]);
                                                resolve(0);
                                            }
                                        }
                                    });
                                }));
                            } else {
                                status.error("Error:未知任务类型");
                            }
                        }
                    }
                    Promise.all(pro).finally(() => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="warning">所有任务已完成!</font></li>`
                        });
                    });
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">获取任务id失败!</font></li>`
                    });
                }
            },
            verify: function() {},
            remove: function() {},
            checkLogin: function() {
                if ($("a.buttonenter:contains(Register to join)").length > 0) window.open("/members/login", "_self");
            },
            checkLeft: function(ui) {},
            setting: {
                'fuck': true,
                'verify': false,
                'join': false,
                'remove': false
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').indiedb && GM_getValue('conf').indiedb.load) ? GM_getValue('conf').indiedb : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const opiumpulses = {
            fuck: function() {
                this.get_tasks('FREE');
            },
            get_tasks: function(type = 'FREE') {
                let items = $(`.giveaways-page-item:contains('${type}'):not(:contains('ENTERED'))`);
                let myPoint = this.myPoints;
                let option = {
                    arr: items,
                    time: 100,
                    i: 0,
                    callback: ({
                        arr,
                        i,
                        end
                    }) => {
                        if (end) {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有抽奖参加完成!</font></li>`
                            });
                        } else {
                            let item = arr[i];
                            let needPoints = $(item).find(".giveaways-page-item-header-points").text().match(/[\d]+/gim);
                            if (type === "points" && needPoints && parseInt(needPoints[0]) > myPoint) {
                                fuc.echoLog({
                                    type: 'custom',
                                    text: `<li><font class="warning">点数不足,任务中止!</font></li>`
                                });
                            } else if (type === "points" && !needPoints) {
                                fuc.echoLog({
                                    type: 'custom',
                                    text: `<li><font class="warning">获取抽奖需要点数失败,任务中止!</font></li>`
                                });
                            } else {
                                let status = fuc.echoLog({
                                    type: 'custom',
                                    text: `<li>正在参加抽奖<a href="${$(item).find("a.giveaways-page-item-img-btn-more").attr("href")}" target="_blank">${$(item).find(".giveaways-page-item-footer-name").text().trim()}</a>...<font></font></li>`
                                });
                                let a = $(item).find("a.giveaways-page-item-img-btn-enter:contains('enter')");
                                if (a.attr("onclick") && a.attr("onclick").includes('checkUser')) {
                                    let giveawayId = a.attr("onclick").match(/[\d]+/);
                                    if (giveawayId) {
                                        checkUser(giveawayId[0]);
                                    }
                                }
                                new Promise(r => {
                                    fuc.httpRequest({
                                        url: a.attr('href'),
                                        method: 'GET',
                                        onload: response => {
                                            if (debug) console.log(response);
                                            if (response.responseText && /You've entered this giveaway/gim.test(response.responseText)) {
                                                status.success();
                                                let points = response.responseText.match(/Points:[\s]*?([\d]+)/);
                                                if (type === "points" && points) {
                                                    if (debug) console.log('剩余点数: ' + points[1]);
                                                    opiumpulses.myPoints = parseInt(points[1]);
                                                }
                                            } else {
                                                status.error('Success:' + (response.status || response.statusText));
                                            }
                                            r(1);
                                        },
                                        status,
                                        r
                                    });
                                }).then(data => {
                                    i++;
                                    option.i = i;
                                    fuc.forOrder(option);
                                });
                            }
                        }
                    },
                    complete: true
                };
                fuc.forOrder(option);
            },
            verify: function() {
                let myPoints = $(".page-header__nav-func-user-nav-items.points-items").text().match(/[\d]+/gim);
                if (myPoints) {
                    this.myPoints = myPoints;
                    this.get_tasks('points');
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="error">获取当前拥有点数失败!</font></li>`
                    });
                }
            },
            remove: function() {},
            checkLogin: function() {},
            checkLeft: function(ui) {},
            myPoints: 0,
            setting: {
                'fuck': true,
                'fuckText': 'Free',
                'fuckTitle': '参加免费抽奖',
                'verify': true,
                'verifyText': 'Point',
                'verifyTitle': '参加点数抽奖',
                'join': false,
                'remove': false
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').opiumpulses && GM_getValue('conf').opiumpulses.load) ? GM_getValue('conf').opiumpulses : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const givekey = {
            fuck: function(btnArea) {
                if (!$("#navbarDropdown").text().includes("Русский")) {
                    fuc.echoLog({
                        type: "custom",
                        text: `<li><font class="error">需要将页面语言设置为"Русский"!</font></li>`
                    });
                } else {
                    givekey.wssApp.message = btnArea.$message({
                        message: "正在连接WSS...",
                        duration: 0
                    });
                    $(() => givekey.wssApp.init(btnArea));
                }
            },
            analyze_tasks: function(tasks) {
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在处理任务信息...<font></font></li>`
                });
                let pro = [];
                this.groups = [];
                this.wGames = [];
                this.fGames = [];
                this.links = [];
                for (let id of tasks) {
                    let task = $("#task_" + id);
                    let href = task.attr("href");
                    if (href.includes("vk.com")) {} else if (href.includes("steamcommunity.com/groups")) {
                        this.groups.push(href);
                        this.taskInfo.groups.push(href);
                    } else if (task.text().includes("加入愿望单")) {
                        pro.push(new Promise(r => {
                            new Promise(resolve => {
                                fuc.getFinalUrl(resolve, href);
                            }).then(data => {
                                if (data.result === "success") {
                                    let appId = data.finalUrl.match(/app\/([\d]+)/);
                                    if (appId) {
                                        this.wGames.push(appId[1]);
                                        this.taskInfo.wGames.push(appId[1]);
                                        r(1);
                                    } else {
                                        r(0);
                                    }
                                } else {
                                    r(0);
                                }
                            })
                        }));
                    } else if (href.includes("store.steampowered.com/app")) {
                        this.fGames.push(href);
                        this.taskInfo.fGames.push(href);
                    } else {
                        this.links.push(href);
                    }
                }
                Promise.all(pro).finally(() => {
                    this.groups = fuc.unique(this.groups);
                    this.wGames = fuc.unique(this.wGames);
                    this.fGames = fuc.unique(this.fGames);
                    this.links = fuc.unique(this.links);
                    this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                    this.taskInfo.fGames = fuc.unique(this.taskInfo.fGames);
                    if (this.groups.length > 0 || this.fGames.length > 0 || this.links.length > 0) {
                        this.do_task();
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="warning">没有可以自动完成的任务!</font></li>`
                        });
                    }
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    status.success();
                    if (debug) console.log(this);
                });
            },
            get_tasks: function() {
                let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                if (taskInfo && taskInfo !== '{"groups":[],"curators":[],"fGames":[],"wGames":[]}') {
                    this.taskInfo = taskInfo;
                    this.remove(true);
                } else {
                    let pro = [];
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在获取任务信息...<font></font></li>`
                    });

                    let tasksContainer = $("a[id^=task_]");
                    for (let task of tasksContainer) { //遍历任务信息
                        let href = task.attr("href");
                        if (href.includes("vk.com")) {} else if (href.includes("steamcommunity.com/groups/")) {
                            this.taskInfo.groups.push(href.match(/groups\/(.+)/)[1]);
                        } else if ($(task).text().includes("加入愿望单")) {
                            pro.push(new Promise(r => {
                                new Promise(resolve => {
                                    fuc.getFinalUrl(resolve, href);
                                }).then(data => {
                                    if (data.result === "success") {
                                        let appId = data.finalUrl.match(/app\/([\d]+)/);
                                        if (appId) {
                                            this.wGames.push(appId[1]);
                                            this.taskInfo.wGames.push(appId[1]);
                                            r(1);
                                        } else {
                                            r(0);
                                        }
                                    } else {
                                        r(0);
                                    }
                                })
                            }));
                        } else if (href.includes("store.steampowered.com/app/")) {
                            this.taskInfo.fGames.push(href.match(/app\/([\d]+)/)[1]);
                        }
                    }
                    Promise.all(pro).finally(() => {
                        this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                        this.taskInfo.curators = fuc.unique(this.taskInfo.curators);
                        GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                        status.success();
                        if (debug) console.log(this);
                        if (this.taskInfo.groups.length > 0 || this.taskInfo.curators.length > 0) {
                            this.remove(true);
                        } else {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="warning">没有可以移除的任务!</font></li>`
                            });
                        }
                    });
                }
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    let fGames = fuc.unique(this.fGames);
                    let wGames = fuc.unique(this.wGames);
                    let curators = fuc.unique(this.curators);
                    let links = fuc.unique(this.links);
                    if (this.conf.fuck.group) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    if (this.conf.fuck.wishlist) {
                        for (let game of wGames) {
                            pro.push(new Promise((resolve) => {
                                fuc.addWishlist(resolve, game);
                            }));
                        }
                    }
                    if (this.conf.fuck.followGame) {
                        for (let game of fGames) {
                            pro.push(new Promise((resolve) => {
                                fuc.followGame(resolve, game);
                            }));
                        }
                    }
                    if (this.conf.fuck.curator) {
                        for (let curator of curators) {
                            pro.push(new Promise((resolve) => {
                                fuc.followCurator(resolve, curator);
                            }));
                        }
                    }
                    if (this.conf.fuck.visit) {
                        for (let link of links) {
                            pro.push(new Promise((resolve) => {
                                fuc.visitLink(resolve, link);
                            }));
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                    });
                })
            },
            verify: function() {
                givekey.wssApp.status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在获取任务完成状态(时间稍长,请耐心等待)...<font></font></li>`
                });
                givekey.wssApp.request('/distribution/check', 'post', {
                    id: location.href.match(/[\d]+/)[0]
                })
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        if (this.conf.remove.unfollowGame) {
                            for (let game of fuc.unique(this.taskInfo.fGames)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowCurator(resolve, game);
                                }));
                            }
                        }
                        if (this.conf.remove.wishlist) {
                            for (let game of fuc.unique(this.taskInfo.wGames)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.removeWishlist(resolve, game);
                                }));
                            }
                        }
                        if (this.conf.remove.curator) {
                            for (let curator of fuc.unique(this.taskInfo.curators)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.unfollowCurator(resolve, curator);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            creat_app: function() {
                this.wssApp = {
                    status: {},
                    message: {},
                    loading: false,
                    centrifuge: new Centrifuge(/givekey.ru/.test(location.href) ? 'wss://app.givekey.ru/connection/websocket' : 'wss://app.gkey.fun/connection/websocket'),
                    uid: $('meta[name="uid"]').attr("content"),
                    init: function(m) {
                        this.centrifuge.setToken($('meta[name="cent_token"]').attr("content")), this.centrifuge.connect(), this.centrifuge.on("connect", function(e) {
                            if (debug) console.log(`WSS已连接!`);
                            $("#verify-task").removeClass("is-disabled").removeAttr("disabled");
                            givekey.wssApp.message.close();
                            m.$message({
                                message: "WSS连接成功!",
                                type: "success"
                            });
                            for (let a of $('a[id^=task_]')) {
                                $(a).html($(a).html().replace("Посмотреть обзор на игру", "查看游戏评论").replace("Подписаться на разработчика", "订阅开发者").replace("Подписаться на куратора", "订阅鉴赏家").replace("Поставить лайк", "点赞").replace("Подписаться на игру", "关注游戏").replace(/Subscribe|Подписаться/, "订阅/加组").replace("Сделать репост", "转发").replace("Добавить в список желаемого", "加入愿望单").replace("Сделать обзор на игру", "评论"));
                            }
                        }), this.centrifuge.on("disconnect", function(e) {
                            if (debug) console.log(`WSS连接断开!\n${e.reason}`);
                            $("#verify-task").addClass("is-disabled").attr("disabled", "disabled");
                            givekey.wssApp.message = m.$message({
                                message: "WSS连接断开,正在重连...",
                                type: "warning",
                                duration: 0
                            });
                        });
                        if (this.uid) this.centrifuge.subscribe(`usr#${this.uid}`, (data) => {
                            if (debug) console.log(data);
                            givekey.wssApp.status.success();
                            if (data.data.js) {
                                let taskA = data.data.js.split(";");
                                if (taskA) {
                                    let tasks = [];
                                    taskA.map((e) => {
                                        if (e.includes("btn-danger")) tasks.push(e.match(/[\d]+/)[0]);
                                    });
                                    givekey.analyze_tasks(tasks);
                                }
                            }
                        });
                    },
                    request: (url, type, data, page) => {
                        if (url) {
                            if (data || (data = {}), type || (type = "post"), "get" == type.toLowerCase()) {
                                if (givekey.wssApp.loading)
                                    return;
                                givekey.wssApp.loading = !0
                            }
                            $.ajax({
                                url: url,
                                type: type,
                                data: data,
                                headers: {
                                    "x-csrf-token": $('meta[name="csrf-token"]').attr("content")
                                },
                                success: function(data) {
                                    if (debug) console.log(data);
                                    if (data.msg && !data.msg.data.includes("Проверяем! Пожалуйста подождите")) givekey.wssApp.status.error(data.msg.data.replace("Вы уже участвовали в этой раздаче!", "你已经参与了此赠key!"));
                                },
                                error: function(e) {
                                    if (debug) console.log(e);
                                    switch (e.status) {
                                        case 401:
                                            givekey.wssApp.status.error("您尚未登录(不可用)!");
                                            break;
                                        case 403:
                                            givekey.wssApp.status.error("访问被拒绝!");
                                            break;
                                        case 404:
                                            givekey.wssApp.status.error("错误,找不到页面!");
                                            break;
                                        case 500:
                                            givekey.wssApp.status.error("服务器错误!");
                                            break;
                                        case 503:
                                            givekey.wssApp.status.error("错误,请刷新页面!");
                                            break;
                                        default:
                                            givekey.wssApp.status.error("Error:" + e.status);
                                            break;
                                    }
                                    givekey.wssApp.loading = !1
                                }
                            })
                        }
                    }
                }
            },
            get_giveawayId: function() {
                let id = location.href.match(/distribution\/([\d]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        if (this.taskInfo.curators.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wGames.length > 0) {
                            fuc.updateSteamInfo(resolve, "all");
                        } else {
                            fuc.updateSteamInfo(resolve, "community");
                        }
                    } else if (this.taskInfo.curators.length > 0 || this.taskInfo.fGames.length > 0 || this.taskInfo.wGames.length > 0) {
                        fuc.updateSteamInfo(resolve, "store");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {
                if ($("a[href='/auth']").length > 0) window.open("/auth/vk", "_self");
            },
            checkLeft: function(ui) {
                if ($("#keys_count").text() === "0") {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            curators: [], //任务需要关注的鉴赏家
            fGames: [], //任务需要关注的游戏
            wGames: [], //任务需要加愿望单的游戏
            links: [], //需要浏览的页面链接
            taskInfo: {
                groups: [], //所有任务需要加的组
                curators: [], //所有任务需要关注的鉴赏家
                fGames: [], //所有任务需要关注的游戏
                wGames: [], //所有任务需要加愿望单的游戏
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'fuckText': 'Init',
                'fuckTitle': '请先Init再做任务!',
                'verify': true,
                'verifyText': 'Fuck',
                'verifyTitle': '请先点击Init按钮再点此按钮!',
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').givekey && GM_getValue('conf').givekey.load) ? GM_getValue('conf').givekey : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const chubkeys = {
            fuck: function() {
                fuc.echoLog({
                    type: 'custom',
                    text: `<li><font class="warning">因为做新版脚本时此网站没有赠key,所以暂时不支持此网站,如果此网站有赠key,请联系作者!</font></li>`
                });
            },
            verify: function() {
                fuc.echoLog({
                    type: 'custom',
                    text: `<li><font class="warning">因为做新版脚本时此网站没有赠key,所以暂时不支持此网站,如果此网站有赠key,请联系作者!</font></li>`
                });
            },
            remove: function() {
                fuc.echoLog({
                    type: 'custom',
                    text: `<li><font class="warning">因为做新版脚本时此网站没有赠key,所以暂时不支持此网站,如果此网站有赠key,请联系作者!</font></li>`
                });
            },
            get_giveawayId: function() {
                let id = location.href.match(/giveaway\/([\d]+)/);
                if (id) {
                    return id[1];
                } else {
                    return location.href;
                }
            },
            checkLogin: function() {
                if ($("a.nav-link[href*=login]").length > 0) window.open("/login", "_self");
            },
            checkLeft: function(ui) {
                if ($("div.card-body h5:contains(There are no more keys left)").length > 0) {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').chubkeys && GM_getValue('conf').chubkeys.load) ? GM_getValue('conf').chubkeys : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const freegamelottery = {
            fuck: function(vue) {
                GM_setValue("lottery", 1);
                if ($("a.registration-button").length > 0) {
                    if (this.conf.fuck.autoLogin) {
                        let userInfo = GM_getValue('conf').lotteryUserInfo;
                        if (userInfo) {
                            let status = fuc.echoLog({
                                type: 'custom',
                                text: `<li>正在登录(不可用)...<font></font></li>`
                            });
                            fuc.httpRequest({
                                url: "https://freegamelottery.com/user/login",
                                method: "POST",
                                data: `username=${userInfo.username}&password=${userInfo.password}&rememberMe=1`,
                                headers: {
                                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                                },
                                onload: function(data) {
                                    if (data.status === 200) {
                                        status.success();
                                        window.location.reload(true);
                                    } else {
                                        status.error("Error:" + (data.statusText || data.status));
                                    }
                                },
                                status
                            });
                        } else {
                            vue.$message({
                                type: 'warning',
                                message: "请先登录(不可用)!"
                            });
                            $("a.registration-button")[0].click();
                            $("button[value=Login]").click(() => {
                                let conf = GM_getValue('conf');
                                conf.lotteryUserInfo = {
                                    username: $("#modal_login").val(),
                                    password: $("#modal_password").val()
                                };
                                GM_setValue("conf", conf);
                            });
                        }
                    } else {
                        vue.$message({
                            type: 'warning',
                            message: "请先登录(不可用)!"
                        });
                        $("a.registration-button")[0].click();
                    }
                } else {
                    this.draw();
                }
            },
            draw: function() {
                GM_setValue("lottery", 0);
                if (this.conf.fuck.doTask) {
                    let main = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在Visit MAIN DRAW(如果长时间没反应,请打开控制台查看错误日志)...<font></font></li>`
                    });
                    $.post('/draw/register-visit', {
                            drawId: DashboardApp.draws.main.actual.id
                        })
                        .done(function() {
                            DashboardApp.draws.main.actual.haveVisited = true;
                            main.success();
                            let survey = fuc.echoLog({
                                type: 'custom',
                                text: `<li>正在Visit SURVEY DRAW(如果长时间没反应,请打开控制台查看错误日志)...<font></font></li>`
                            });
                            $.post('/draw/register-visit', {
                                    type: 'survey',
                                    drawId: DashboardApp.draws.survey.actual.id
                                })
                                .done(function() {
                                    DashboardApp.draws.survey.actual.haveVisited = 1;
                                    survey.success();
                                    let video = fuc.echoLog({
                                        type: 'custom',
                                        text: `<li>正在Visit VIDEO DRAW(如果长时间没反应,请打开控制台查看错误日志)...<font></font></li>`
                                    });
                                    $.post('/draw/register-visit', {
                                            drawId: DashboardApp.draws.video.actual.id
                                        })
                                        .done(function() {
                                            DashboardApp.draws.video.actual.haveVisited = true;
                                            video.success();
                                            let stackpot = fuc.echoLog({
                                                type: 'custom',
                                                text: `<li>正在Visit STACKPOT(如果长时间没反应,请打开控制台查看错误日志)...<font></font></li>`
                                            });
                                            $.post('/draw/register-visit', {
                                                    type: 'stackpot',
                                                    drawId: DashboardApp.draws.stackpot.actual.id
                                                })
                                                .done(function() {
                                                    DashboardApp.draws.stackpot.actual.haveVisited = 1;
                                                    stackpot.success();
                                                    fuc.echoLog({
                                                        type: 'custom',
                                                        text: `<li>任务完成,正在刷新页面(如果页面没有自动刷新,请手动刷新查看结果)...<font></font></li>`
                                                    });
                                                    location.href = '/#/draw/stackpot';
                                                    window.location.reload(true);
                                                });
                                        });
                                });
                        });
                }
            },
            verify: function() {},
            remove: function() {},
            checkLogin: function() {},
            checkLeft: function(ui) {},
            setting: {
                'fuck': true,
                'verify': false,
                'join': false,
                'remove': false
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').freegamelottery && GM_getValue('conf').freegamelottery.load) ? GM_getValue('conf').freegamelottery : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const gleam = {
            fuck: function() {
                this.get_tasks('do_task');
            },
            get_tasks: function(callback = 'do_task') {
                let taskInfo = GM_getValue('taskInfo[' + location.host + this.get_giveawayId() + ']');
                if (callback === 'remove' && taskInfo && taskInfo !== '{"groups":[]}') {
                    this.taskInfo = taskInfo;
                    this.remove(true);
                } else {
                    this.twitters = [];
                    this.facebooks = [];
                    this.youtubes = [];
                    this.discords = [];
                    this.others = [];
                    this.groups = [];
                    this.links = [];
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在获取任务信息...<font></font></li>`
                    });

                    let tasksContainer = $('div.entry-content .entry-method');
                    for (let task of tasksContainer) { //遍历任务信息
                        if ($(task).find("i.fa-question").length > 0) {
                            if ($(task).hasClass("visit")) {
                                this.links.push(task);
                            } else {
                                let icon = $(task).find(".icon-wrapper i");
                                if (icon.hasClass("fa-twitter")) {
                                    this.twitters.push(task);
                                } else if (icon.hasClass("fa-facebook")) {
                                    this.facebooks.push(task);
                                } else if (icon.hasClass("fa-youtube")) {
                                    this.youtubes.push(task);
                                } else if (icon.hasClass("fa-discord")) {
                                    this.discords.push(task);
                                } else if (icon.hasClass("fa-steam") || icon.hasClass("fa-steam-symbol")) {
                                    let title = $(task).find(".entry-method-title");
                                    if (/join.*group/gim.test(title.text())) {
                                        let groupA = $(task).find("a[href*='steamcommunity.com/groups']:first").attr("href");
                                        if (groupA) {
                                            let groupName = groupA.match(/steamcommunity.com\/groups\/([\w\d\-_]*)/)[1];
                                            this.groups.push(groupName);
                                            this.taskInfo.groups.push(groupName);
                                        } else {
                                            fuc.echoLog({
                                                type: "custom",
                                                text: `<li><font class="error">获取Steam组信息失败!</font></li>`
                                            });
                                        }
                                    } else {
                                        this.others.push(task);
                                    }
                                } else {
                                    this.others.push(task);
                                }
                            }
                        } else if (callback === "remove") {
                            let icon = $(task).find(".icon-wrapper i");
                            if (icon.hasClass("fa-steam")) {
                                let title = $(task).find(".entry-method-title");
                                if (/join.*group/gim.test(title.text())) {
                                    let groupA = $(task).find("a[href*='steamcommunity.com/groups']:first").attr("href");
                                    if (groupA) {
                                        let groupName = groupA.match(/steamcommunity.com\/groups\/([\w\d\-_]*)/)[1];
                                        this.taskInfo.groups.push(groupName);
                                    } else {
                                        fuc.echoLog({
                                            type: "custom",
                                            text: `<li><font class="error">获取Steam组信息失败!</font></li>`
                                        });
                                    }
                                }
                            }
                        }
                    }
                    this.groups = fuc.unique(this.groups);
                    this.twitters = fuc.unique(this.twitters);
                    this.facebooks = fuc.unique(this.facebooks);
                    this.youtubes = fuc.unique(this.youtubes);
                    this.discords = fuc.unique(this.discords);
                    this.groups = fuc.unique(this.groups);
                    this.others = fuc.unique(this.others);
                    this.taskInfo.groups = fuc.unique(this.taskInfo.groups);
                    GM_setValue('taskInfo[' + location.host + this.get_giveawayId() + ']', this.taskInfo);
                    status.success();
                    if (debug) console.log(this);
                    if (callback === 'do_task') {
                        this.do_task();
                    } else if (callback === 'verify') {
                        this.verify(true);
                    } else {
                        JSON.stringify(this.taskInfo) !== '{"groups":[]}' ? this.remove(true) : fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="warning">没有可以移除的任务!</font></li>`
                        });;
                    }
                }
            },
            do_task: function() {
                this.updateSteamInfo(() => {
                    let pro = [];
                    let groups = fuc.unique(this.groups);
                    let twitters = fuc.unique(this.twitters);
                    let discords = fuc.unique(this.discords);
                    let facebooks = fuc.unique(this.facebooks);
                    let youtubes = fuc.unique(this.youtubes);
                    let others = fuc.unique(this.others);
                    let links = fuc.unique(this.links);
                    let disc_fb_ytb = [...discords, ...facebooks, ...youtubes];
                    if (this.conf.fuck.group && groups.length > 0) {
                        for (let group of groups) {
                            pro.push(new Promise((resolve) => {
                                fuc.joinSteamGroup(resolve, group);
                            }));
                        }
                    }
                    if (globalConf.other.autoOpen) {
                        if (twitters.length > 0) {
                            for (let twitter of twitters) {
                                let title = $(twitter).find(".entry-method-title").text().trim();
                                let status = fuc.echoLog({
                                    type: 'custom',
                                    text: `<li>正在做任务:${title}...<font></font></li>`
                                });
                                let button = $(twitter).find("a.twitter-button:contains(Follow)").attr("href");
                                if (button) {
                                    window.open(button, "_blank");
                                    status.warning("已打开任务页面");
                                } else {
                                    status.error("获取任务链接失败");
                                }
                            }
                        }
                        if (disc_fb_ytb.length > 0) {
                            for (let task of disc_fb_ytb) {
                                let title = $(task).find(".entry-method-title").text().trim();
                                let status = fuc.echoLog({
                                    type: 'custom',
                                    text: `<li>正在做任务:${title}...<font></font></li>`
                                });
                                let button = $(task).find("a.btn-info:first").attr("href");
                                if (button) {
                                    window.open(button, "_blank");
                                    status.warning("已打开任务页面");
                                } else {
                                    status.error("获取任务链接失败");
                                }
                            }
                        }
                    }
                    if ((globalConf.other.autoOpen || this.conf.fuck.visit) && links.length > 0) {
                        pro.push(new Promise((resolve) => {
                            this.visit_link(links, 0, resolve);
                        }));
                    }
                    for (let other of others) {
                        let icon = $(other).find(".icon-wrapper i");
                        if (icon.hasClass("fa-steam")) {
                            let title = $(other).find(".entry-method-title").text().trim();
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="warning">未知任务类型:${title}</font></li>`
                            });
                        } else {
                            let taskType = icon.attr("class").match(/fa-([\w]+)/) ? icon.attr("class").match(/fa-([\w]+)/)[1] : icon.attr("class");
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="warning">未知任务类型:${taskType}</font></li>`
                            });
                        }
                    }
                    Promise.all(pro).finally(resolve => {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="success">所有任务已完成!</font></li>`
                        });
                        if (this.conf.fuck.verify) this.verify(0);
                    });
                })
            },
            verify: function(i = 0) {
                if ($(".ng-scope[ng-include*=challenge]").is(":visible")) {
                    fuc.echoLog({
                        type: "custom",
                        text: `<li><font class="error">触发人机验证,请完成验证后再点击"Verify"按钮验证任务!</font></li>`
                    });
                    return 0;
                }
                let tasks = $('div.entry-content .entry-method');
                if (i < tasks.length) {
                    if (tasks.eq(i).find("i.fa-question").length > 0) {
                        let title = tasks.eq(i).find(".entry-method-title").text().trim();
                        let status = fuc.echoLog({
                            type: "custom",
                            text: `<li>正在验证任务:${title}...<font></font></li>`
                        });
                        tasks.eq(i).find("a.enter-link")[0].click();
                        let enterBtn = tasks.eq(i).find(".form-actions.center .btn-primary:contains(Continue)").removeAttr("disabled");
                        if (enterBtn.length > 0) {
                            setTimeout(() => {
                                enterBtn[0].click();
                                status.warning("Complete");
                                setTimeout(() => {
                                    gleam.verify(++i)
                                }, 1000);
                            }, 1000);
                        } else {
                            setTimeout(() => {
                                gleam.verify(++i)
                            }, 1000);
                        }
                    } else {
                        this.verify(++i);
                    }
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="success">所有任务已完成,</font><font class="warning">没完成的任务请手动完成!</font></li>`
                    });
                }
            },
            remove: function(remove = false) {
                let pro = [];
                if (remove) {
                    this.updateSteamInfo(() => {
                        if (this.conf.remove.group) {
                            for (let group of fuc.unique(this.taskInfo.groups)) {
                                pro.push(new Promise((resolve) => {
                                    fuc.leaveSteamGroup(resolve, group);
                                }));
                            }
                        }
                        Promise.all(pro).finally(data => {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="success">所有任务已完成!</font></li>`
                            });
                        });
                    });
                } else {
                    this.get_tasks('remove');
                }
            },
            visit_link: function(links, i, r) {
                if (i < links.length) {
                    let title = $(links[i]).find(".entry-method-title").text().trim();
                    let status = fuc.echoLog({
                        type: 'custom',
                        text: `<li>正在做任务:${title}...<font></font></li>`
                    });
                    let taskTime = $(links[i]).find('.form-actions.center span:contains(Visit):contains(seconds)').text();
                    if (taskTime) {
                        let taskBtn = $(links[i]).find('a.btn-info');
                        let href = taskBtn.attr("href");
                        taskBtn.removeAttr("href")[0].click();
                        let time = taskTime.match(/[\d]+/);
                        if (time) {
                            GM_openInTab("https://time.hclonely.com/?time=" + time[0], {
                                active: 1,
                                setParent: 1
                            }).onclose = () => {
                                status.warning("Complete");
                                taskBtn.attr("target", "_blank").attr("href", href);
                                gleam.visit_link(links, ++i, r);
                            };
                        } else {
                            GM_openInTab(`javascript:setTimeout(()=>{window.close()},1000)`, {
                                active: 1,
                                setParent: 1
                            }).onclose = () => {
                                status.warning("Complete");
                                taskBtn.attr("target", "_blank").attr("href", href);
                                gleam.visit_link(links, ++i, r);
                            };
                        }
                    } else {
                        status.error("获取浏览时间失败");
                    }
                } else {
                    r(1);
                }
            },
            get_giveawayId: function() {
                let id = location.pathname.replace(/\?.*/, "") || location.href;
                return id;
            },
            updateSteamInfo: function(callback) {
                new Promise(resolve => {
                    if (this.taskInfo.groups.length > 0) {
                        fuc.updateSteamInfo(resolve, "community");
                    } else {
                        resolve(1);
                    }
                }).then(s => {
                    if (s === 1) {
                        callback();
                    }
                });
            },
            checkLogin: function() {},
            checkLeft: function(ui) {
                if ($(".massive-message:contains(ended)").is(":visible")) {
                    ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning',
                        center: true
                    }).then(() => {
                        window.close();
                    });
                }
            },
            groups: [], //任务需要加的组
            links: [], //需要浏览的页面链接
            twitters: [], //twitter任务
            discords: [], //discord任务
            facebooks: [], //facebook任务
            youtubes: [], //youtube任务
            others: [], //位置类型任务
            taskInfo: {
                groups: [], //所有任务需要加的组
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': true,
                'join': false,
                'remove': true
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').gleam && GM_getValue('conf').gleam.load) ? GM_getValue('conf').gleam : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        const spoune = {
            fuck: function() {
                this.get_tasks();
            },
            get_tasks: function() {
                let status = fuc.echoLog({
                    type: 'custom',
                    text: `<li>正在获取任务信息...<font></font></li>`
                });
                let giveawayTasks = $("#GiveawayTasks button");
                for (let task of giveawayTasks) {
                    let taskClick = $(task).attr("onclick");
                    if (taskClick) {
                        let taskId = taskClick.match(/loadTask\(([\d]+)/);
                        if (taskId) {
                            this.tasks.push({
                                id: taskId[1],
                                text: $(task).text()
                            })
                        } else {
                            fuc.echoLog({
                                type: 'custom',
                                text: `<li><font class="error">获取${$(task).text()}任务id失败!</font></li>`
                            });
                        }
                    } else {
                        fuc.echoLog({
                            type: 'custom',
                            text: `<li><font class="error">获取${$(task).text()}任务id失败!</font></li>`
                        });
                    }
                }
                status.warning("Complete");
                if (this.tasks.length > 0) {
                    this.do_task();
                } else {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="warning">没有检测到可以自动完成的任务!</font></li>`
                    });
                }

            },
            do_task: function() {
                fuc.forOrder({
                    arr: fuc.unique(this.tasks),
                    i: 0,
                    callback: spoune.verify,
                    complete: true
                });
            },
            verify: function({
                arr,
                i,
                end
            }) {
                if (end) {
                    fuc.echoLog({
                        type: 'custom',
                        text: `<li><font class="success">所有任务已完成</font>,<font class="warning">没完成的请手动完成!</font></li>`
                    });
                } else {
                    let task = arr[i];
                    let status = fuc.echoLog({
                        type: "custom",
                        text: `<li>正在做任务${task.text}...<font></font></li>`
                    });
                    new Promise(resolve => {
                        fuc.httpRequest({
                            url: `/controller.php?taskDetail=${task.id}&show`,
                            method: "get",
                            onload: response => {
                                if (debug) console.log(response);
                                if (response.status === 200) {
                                    let src = response.responseText.match(/src="\.([\w\W]*?)">/);
                                    if (src) {
                                        fuc.httpRequest({
                                            url: src[1],
                                            method: "get",
                                            onload: response => {
                                                if (debug) console.log(response);
                                                if (response.status === 200) {
                                                    let href = response.responseText.match(/href="\.(\/verify[\w\W]*?)"/);
                                                    if (href) {
                                                        fuc.httpRequest({
                                                            url: "/werbung" + href[1],
                                                            method: "get",
                                                            onload: response => {
                                                                if (debug) console.log(response);
                                                                if (response.status === 200 && /Task.*completed/gim.test(response.responseText)) {
                                                                    status.success();
                                                                } else {
                                                                    status.error("Error:" + (response.statusText || response.status));
                                                                }
                                                                resolve(1);
                                                            },
                                                            r: resolve,
                                                            status
                                                        });
                                                    } else {
                                                        status.error("Error:获取任务链接失败(2)");
                                                        resolve(0);
                                                    }
                                                } else {
                                                    status.error("Error:" + (response.statusText || response.status));
                                                    resolve(0);
                                                }
                                            },
                                            r: resolve,
                                            status
                                        })
                                    } else {
                                        status.error("Error:获取任务链接失败(1)");
                                        resolve(0);
                                    }
                                } else {
                                    status.error("Error:" + (response.statusText || response.status));
                                    resolve(0);
                                }
                            },
                            r: resolve,
                            status
                        });
                    }).finally(() => {
                        fuc.forOrder({
                            arr,
                            i: ++i,
                            callback: spoune.verify,
                            complete: true
                        });
                    });
                }
            },
            remove: function() {},
            checkLogin: function() {},
            checkLeft: function(ui) {
                let checkLeft = setInterval(() => {
                    if ($("#keysAvailable").length > 0) {
                        clearInterval(checkLeft);
                        if ($("#keysAvailable").text() === '0') {
                            ui.$confirm('此页面已经没有剩余key了, 是否关闭?', '提示', {
                                confirmButtonText: '确定',
                                cancelButtonText: '取消',
                                type: 'warning',
                                center: true
                            }).then(() => {
                                window.close();
                            });
                        }
                    }
                }, 500);
            },
            tasks: [], //任务信息
            setting: {
                'fuck': true,
                'verify': false,
                'join': false,
                'remove': false
            },
            conf: GM_getValue('conf') ? ((GM_getValue('conf').spoune && GM_getValue('conf').spoune.load) ? GM_getValue('conf').spoune : (GM_getValue('conf').global || defaultConf)) : defaultConf
        };

        function loadSetting() {
            const eNameToNameJoin = {
                group: '加组',
                curator: '关注鉴赏家',
                developer: '关注开发商',
                publisher: '关注发行商',
                announcement: '点赞通知',
                wishlist: '加愿望单',
                followGame: '关注游戏',
                visit: '访问链接',
                verify: '验证任务',
                autoLogin: '自动登录(不可用)',
                doTask: '做任务'
            };
            const eNameToNameRemove = {
                group: '退组',
                curator: '取关鉴赏家',
                developer: '取关开发商',
                publisher: '取关发行商',
                wishlist: '移除愿望单',
                unfollowGame: '取关游戏',
            };
            const eNameToNameOther = {
                showLogs: '默认显示日志',
                showDetails: '输出详细日志',
                checkLogin: '登录(不可用)检测',
                checkLeft: '剩余key检测',
                autoOpen: '自动打开任务页面',
            };
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '关注开发商',
                        eName: 'developer',
                        des: "Follow XXX developer"
                    },
                    {
                        name: '关注发行商',
                        eName: 'publisher',
                        des: "Follow XXX publisher"
                    },
                    {
                        name: '点赞通知',
                        eName: 'announcement',
                        des: "Like Steam announcement"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    },
                    {
                        name: '自动登录(不可用)',
                        eName: 'autoLogin',
                        des: "自动登录(不可用),第一次需要手动登录(不可用)(仅适用于freegamelottery网站)"
                    },
                    {
                        name: '做任务',
                        eName: 'doTask',
                        des: '依次做"MAIN DRAW","SURVEY DRAW","VIDEO DRAW","STACKPOT"等任务'
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').global) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').global.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '关注开发商', '关注发行商', '点赞通知', '加愿望单', '关注游戏', '访问链接', '验证任务', '做任务'];

                const joinOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '关注开发商',
                        eName: 'developer',
                        des: "Follow XXX developer"
                    },
                    {
                        name: '关注发行商',
                        eName: 'publisher',
                        des: "Follow XXX publisher"
                    },
                    {
                        name: '点赞通知',
                        eName: 'announcement',
                        des: "Like Steam announcement"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    }
                ];
                const checkedJoins = (GM_getValue('conf') && GM_getValue('conf').global) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').global.join)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '关注开发商', '关注发行商', '点赞通知', '加愿望单', '关注游戏', '访问链接'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    },
                    {
                        name: '取关开发商',
                        eName: 'developer',
                        des: "取关steam开发商(Developer)"
                    },
                    {
                        name: '取关发行商',
                        eName: 'publisher',
                        des: "取关steam发行商(Publisher)"
                    },
                    {
                        name: '移除愿望单',
                        eName: 'wishlist',
                        des: "将游戏移除愿望单(Wishlist)"
                    },
                    {
                        name: '取关游戏',
                        eName: 'unfollowGame',
                        des: "取关游戏(Followed game)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').global) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').global.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家', '取关开发商', '取关发行商', '移除愿望单', '取关游戏'];

                const otherOptions = [{
                        name: '登录(不可用)检测',
                        eName: 'checkLogin',
                        des: "检测是否已登录(不可用),没登录(不可用)则跳转到登录(不可用)页面"
                    },
                    {
                        name: '剩余key检测',
                        eName: 'checkLeft',
                        des: "检测是否有剩余key,没有剩余key则提醒"
                    },
                    {
                        name: '自动打开任务页面',
                        eName: 'autoOpen',
                        des: "未完成的任务自动打开任务页面手动完成(需要关闭浏览器弹窗拦截)"
                    },
                    {
                        name: '默认显示日志',
                        eName: 'showLogs',
                        des: "默认显示右下角任务日志"
                    },
                    {
                        name: '输出详细日志',
                        eName: 'showDetails',
                        des: "控制台输出详细日志"
                    },
                    {
                        name: '自动检测更新',
                        eName: 'checkUpdate',
                        des: "自动检测更新"
                    },
                ];
                const checkedOthers = (GM_getValue('conf') && GM_getValue('conf').global) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').global.other)) {
                        conf.push(eNameToNameOther[eName]);
                    }
                    return conf;
                })() : ['登录(不可用)检测', '剩余key检测', '默认显示日志'];

                new Vue({
                    el: '#global',
                    data: {
                        header: '全局设置',
                        fuck: {
                            checkAll: fuckOptions.length === checkedFucks.length,
                            checkedFucks: checkedFucks,
                            fucks: fuckOptions,
                            isIndeterminate: fuckOptions.length !== checkedFucks.length,
                        },
                        join: {
                            checkAll: joinOptions.length === checkedJoins.length,
                            checkedJoins: checkedJoins,
                            joins: joinOptions,
                            isIndeterminate: joinOptions.length !== checkedJoins.length,
                        },
                        remove: {
                            checkAll: removeOptions.length === checkedRemoves.length,
                            checkedRemoves: checkedRemoves,
                            removes: removeOptions,
                            isIndeterminate: removeOptions.length !== checkedRemoves.length,
                        },
                        other: {
                            checkAll: otherOptions.length === checkedOthers.length,
                            checkedOthers: checkedOthers,
                            others: otherOptions,
                            isIndeterminate: otherOptions.length !== checkedOthers.length,
                        },
                        openDelay: 100,
                        rowType: "flex",
                        rowAlign: "middle",
                        verify: "1"
                    },
                    methods: {
                        fuckHandleCheckAllChange(val) {
                            this.fuck.checkedFucks = val ? fuckOptions.map(e => e.name) : [];
                            this.fuck.isIndeterminate = false;
                        },
                        handleCheckedFucksChange(value) {
                            let checkedCount = value.length;
                            this.fuck.checkAll = checkedCount === this.fuck.fucks.length;
                            this.fuck.isIndeterminate = checkedCount > 0 && checkedCount < this.fuck.fucks.length;
                        },
                        joinHandleCheckAllChange(val) {
                            this.join.checkedJoins = val ? joinOptions.map(e => e.name) : [];
                            this.join.isIndeterminate = false;
                        },
                        handleCheckedJoinsChange(value) {
                            let checkedCount = value.length;
                            this.join.checkAll = checkedCount === this.join.joins.length;
                            this.join.isIndeterminate = checkedCount > 0 && checkedCount < this.join.joins.length;
                        },
                        removeHandleCheckAllChange(val) {
                            this.remove.checkedRemoves = val ? removeOptions.map(e => e.name) : [];
                            this.remove.isIndeterminate = false;
                        },
                        handleCheckedRemovesChange(value) {
                            let checkedCount = value.length;
                            this.remove.checkAll = checkedCount === this.remove.removes.length;
                            this.remove.isIndeterminate = checkedCount > 0 && checkedCount < this.remove.removes.length;
                        },
                        otherHandleCheckAllChange(val) {
                            this.other.checkedOthers = val ? otherOptions.map(e => e.name) : [];
                            this.other.isIndeterminate = false;
                        },
                        handleCheckedOthersChange(value) {
                            let checkedCount = value.length;
                            this.other.checkAll = checkedCount === this.other.others.length;
                            this.other.isIndeterminate = checkedCount > 0 && checkedCount < this.other.others.length;
                        },
                    }
                });
            })();
            (function() {
                const joinOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '关注开发商',
                        eName: 'developer',
                        des: "Follow XXX developer"
                    },
                    {
                        name: '关注发行商',
                        eName: 'publisher',
                        des: "Follow XXX publisher"
                    },
                    {
                        name: '点赞通知',
                        eName: 'announcement',
                        des: "Like Steam announcement"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    }
                ];
                const checkedJoins = (GM_getValue('conf') && GM_getValue('conf').giveawaysu) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').giveawaysu.join)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '关注开发商', '关注发行商', '点赞通知', '加愿望单', '关注游戏'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    },
                    {
                        name: '取关开发商',
                        eName: 'developer',
                        des: "取关steam开发商(Developer)"
                    },
                    {
                        name: '取关发行商',
                        eName: 'publisher',
                        des: "取关steam发行商(Publisher)"
                    },
                    {
                        name: '移除愿望单',
                        eName: 'wishlist',
                        des: "将游戏移除愿望单(Wishlist)"
                    },
                    {
                        name: '取关游戏',
                        eName: 'unfollowGame',
                        des: "取关游戏(Followed game)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').giveawaysu) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').giveawaysu.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家', '取关开发商', '取关发行商', '移除愿望单', '取关游戏'];

                new Vue({
                    el: '#giveawaysu',
                    data: {
                        header: 'giveaway.su网站设置',
                        checked: GM_getValue('conf') ? GM_getValue('conf').giveawaysu ? GM_getValue('conf').giveawaysu.load ? true : false : false : false,
                        remove: {
                            checkAll: removeOptions.length === checkedRemoves.length,
                            checkedRemoves: checkedRemoves,
                            removes: removeOptions,
                            isIndeterminate: removeOptions.length !== checkedRemoves.length,
                        },
                        join: {
                            checkAll: joinOptions.length === checkedJoins.length,
                            checkedJoins: checkedJoins,
                            joins: joinOptions,
                            isIndeterminate: joinOptions.length !== checkedJoins.length,
                        },
                        openDelay: 100,
                        rowType: "flex",
                        rowAlign: "middle",
                        verify: "1"
                    },
                    methods: {
                        removeHandleCheckAllChange(val) {
                            this.remove.checkedRemoves = val ? removeOptions.map(e => e.name) : [];
                            this.remove.isIndeterminate = false;
                        },
                        handleCheckedRemovesChange(value) {
                            let checkedCount = value.length;
                            this.remove.checkAll = checkedCount === this.remove.removes.length;
                            this.remove.isIndeterminate = checkedCount > 0 && checkedCount < this.remove.removes.length;
                        },
                        joinHandleCheckAllChange(val) {
                            this.join.checkedJoins = val ? joinOptions.map(e => e.name) : [];
                            this.join.isIndeterminate = false;
                        },
                        handleCheckedJoinsChange(value) {
                            let checkedCount = value.length;
                            this.join.checkAll = checkedCount === this.join.joins.length;
                            this.join.isIndeterminate = checkedCount > 0 && checkedCount < this.join.joins.length;
                        }
                    }
                });
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '关注开发商',
                        eName: 'developer',
                        des: "Follow XXX developer"
                    },
                    {
                        name: '关注发行商',
                        eName: 'publisher',
                        des: "Follow XXX publisher"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').marvelousga) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').marvelousga.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '关注开发商', '关注发行商', '加愿望单', '关注游戏', '访问链接', '验证任务'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    },
                    {
                        name: '取关开发商',
                        eName: 'developer',
                        des: "取关steam开发商(Developer)"
                    },
                    {
                        name: '取关发行商',
                        eName: 'publisher',
                        des: "取关steam发行商(Publisher)"
                    },
                    {
                        name: '移除愿望单',
                        eName: 'wishlist',
                        des: "将游戏移除愿望单(Wishlist)"
                    },
                    {
                        name: '取关游戏',
                        eName: 'unfollowGame',
                        des: "取关游戏(Followed game)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').marvelousga) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').marvelousga.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家', '取关开发商', '取关发行商', '移除愿望单', '取关游戏'];

                fuc.creatSetting("marvelousga", "marvelousGA & dupedornot", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '关注开发商',
                        eName: 'developer',
                        des: "Follow XXX developer"
                    },
                    {
                        name: '关注发行商',
                        eName: 'publisher',
                        des: "Follow XXX publisher"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').banana) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').banana.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '关注开发商', '关注发行商', '加愿望单', '关注游戏', '访问链接', '验证任务'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    },
                    {
                        name: '取关开发商',
                        eName: 'developer',
                        des: "取关steam开发商(Developer)"
                    },
                    {
                        name: '取关发行商',
                        eName: 'publisher',
                        des: "取关steam发行商(Publisher)"
                    },
                    {
                        name: '移除愿望单',
                        eName: 'wishlist',
                        des: "将游戏移除愿望单(Wishlist)"
                    },
                    {
                        name: '取关游戏',
                        eName: 'unfollowGame',
                        des: "取关游戏(Followed game)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').banana) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').banana.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家', '取关开发商', '取关发行商', '移除愿望单', '取关游戏'];

                fuc.creatSetting("banana", "grabfreegame & bananagiveaway", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').gamecode) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gamecode.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '访问链接', '验证任务'];

                const removeOptions = [{
                    name: '退组',
                    eName: 'group',
                    des: "退出steam组(Group)"
                }, ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').gamecode) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gamecode.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组'];

                fuc.creatSetting("gamecode", "gamecode.win", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').gamehag) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gamehag.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '访问链接', '验证任务'];

                const removeOptions = [{
                    name: '退组',
                    eName: 'group',
                    des: "退出steam组(Group)"
                }, ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').gamehag) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gamehag.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组'];

                fuc.creatSetting("gamehag", "gamehag", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').prys) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').prys.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '验证任务'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').prys) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').prys.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家'];

                fuc.creatSetting("prys", "prys", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '关注鉴赏家',
                        eName: 'curator',
                        des: "Follow XXX curator"
                    },
                    {
                        name: '加愿望单',
                        eName: 'wishlist',
                        des: "Add XXX to your wishlist"
                    },
                    {
                        name: '关注游戏',
                        eName: 'followGame',
                        des: "Click \"Follow\" button"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').givekey) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').givekey.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '关注鉴赏家', '加愿望单', '关注游戏', '访问链接'];

                const removeOptions = [{
                        name: '退组',
                        eName: 'group',
                        des: "退出steam组(Group)"
                    },
                    {
                        name: '取关鉴赏家',
                        eName: 'curator',
                        des: "取关steam鉴赏家(Curator)"
                    },
                    {
                        name: '移除愿望单',
                        eName: 'wishlist',
                        des: "将游戏移除愿望单(Wishlist)"
                    },
                    {
                        name: '取关游戏',
                        eName: 'unfollowGame',
                        des: "取关游戏(Followed game)"
                    }
                ];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').givekey) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').givekey.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组', '取关鉴赏家', '移除愿望单', '取关游戏'];

                fuc.creatSetting("givekey", "gkey.fun", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '加组',
                        eName: 'group',
                        des: "Join XXX steam group"
                    },
                    {
                        name: '访问链接',
                        eName: 'visit',
                        des: "Visit XXX page"
                    },
                    {
                        name: '验证任务',
                        eName: 'verify',
                        des: "验证任务"
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').gleam) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gleam.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['加组', '访问链接', '验证任务'];

                const removeOptions = [{
                    name: '退组',
                    eName: 'group',
                    des: "退出steam组(Group)"
                }];
                const checkedRemoves = (GM_getValue('conf') && GM_getValue('conf').gleam) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').gleam.remove)) {
                        conf.push(eNameToNameRemove[eName]);
                    }
                    return conf;
                })() : ['退组'];

                fuc.creatSetting("gleam", "gleam.io", fuckOptions, checkedFucks, removeOptions, checkedRemoves);
            })();
            (function() {
                const fuckOptions = [{
                        name: '自动登录(不可用)',
                        eName: 'autoLogin',
                        des: "自动登录(不可用),第一次需要手动登录(不可用)"
                    },
                    {
                        name: '做任务',
                        eName: 'doTask',
                        des: '依次做"MAIN DRAW","SURVEY DRAW","VIDEO DRAW","STACKPOT"等任务'
                    }
                ];
                const checkedFucks = (GM_getValue('conf') && GM_getValue('conf').freegamelottery) ? (() => {
                    let conf = [];
                    for (let eName of Object.keys(GM_getValue('conf').freegamelottery.fuck)) {
                        conf.push(eNameToNameJoin[eName]);
                    }
                    return conf;
                })() : ['做任务'];

                new Vue({
                    el: '#freegamelottery',
                    data: {
                        header: 'freegamelottery网站设置',
                        checked: GM_getValue('conf') ? GM_getValue('conf').freegamelottery ? GM_getValue('conf').freegamelottery.load ? true : false : false : false,
                        fuck: {
                            checkAll: fuckOptions.length === checkedFucks.length,
                            checkedFucks: checkedFucks,
                            fucks: fuckOptions,
                            isIndeterminate: fuckOptions.length !== checkedFucks.length,
                        },
                        openDelay: 100,
                        rowType: "flex",
                        rowAlign: "middle",
                        verify: "1"
                    },
                    methods: {
                        fuckHandleCheckAllChange(val) {
                            this.fuck.checkedFucks = val ? fuckOptions.map(e => e.name) : [];
                            this.fuck.isIndeterminate = false;
                        },
                        handleCheckedFucksChange(value) {
                            let checkedCount = value.length;
                            this.fuck.checkAll = checkedCount === this.fuck.fucks.length;
                            this.fuck.isIndeterminate = checkedCount > 0 && checkedCount < this.fuck.fucks.length;
                        }
                    }
                });
            })();

            (function() {
                new Vue({
                    el: '#save',
                    data: {
                        title: "保存设置"
                    },
                    methods: {
                        save() {
                            let conf = fuc.creatConf();
                            GM_setValue('conf', conf);
                            this.$notify({
                                title: '保存成功',
                                type: 'success'
                            });
                        }
                    }
                });
                new Vue({
                    el: '#reset',
                    data: {
                        title: "重置所有设置"
                    },
                    methods: {
                        reset() {
                            this.$confirm('是否重置所有设置?', '提示', {
                                confirmButtonText: '确定',
                                cancelButtonText: '取消',
                                type: 'warning'
                            }).then(() => {
                                GM_deleteValue('conf');
                                if (!GM_getValue('conf')) {
                                    vueUi.$message({
                                        type: 'success',
                                        message: '重置成功!'
                                    });
                                } else {
                                    vueUi.$message({
                                        type: 'error',
                                        message: '重置失败!'
                                    });
                                }
                            }).catch(() => {
                                vueUi.$message({
                                    type: 'info',
                                    message: '已取消重置'
                                });
                            });
                        }
                    }
                });
                let download = new Vue({
                    el: '#download',
                    data: {
                        title: "下载设置文件"
                    },
                    methods: {
                        download() {
                            let msg = vueUi.$message({
                                type: 'info',
                                message: '正在处理设置...'
                            });
                            let conf = fuc.creatConf();
                            let creatFile = new FileReader();
                            creatFile.onload = () => {
                                $(`<a href="${creatFile.result}" download="auto-task.conf.json" target="_self"></a>`)[0].click();
                            };
                            creatFile.onerror = (e) => {
                                if (debug) console.log(e);
                                msg.close();
                                vueUi.$message({
                                    type: 'error',
                                    message: '创建下载链接失败!'
                                });
                            };
                            creatFile.readAsDataURL(new File([JSON.stringify(conf, null, 4)], 'setting.conf.txt'));
                        }
                    }
                });
                new Vue({
                    el: '#upload2',
                    data: {
                        title: "加载设置文件",
                        multiple: false,
                        sfl: false,
                        accept: "json",
                        httpRequest: () => {}
                    },
                    methods: {
                        upload(file) {
                            let msg = vueUi.$message({
                                type: 'info',
                                message: '正在读取设置文件...'
                            });
                            if (window.FileReader) {
                                let reader = new FileReader();
                                reader.onload = () => {
                                    if (debug) console.log(reader.result);
                                    msg.close();
                                    let cMsg = vueUi.$message({
                                        type: 'success',
                                        message: '设置文件读取完成!'
                                    });
                                    try {
                                        GM_setValue("conf", JSON.parse(reader.result));
                                        cMsg.close();
                                        vueUi.$message({
                                            type: 'success',
                                            message: '设置加载完成!'
                                        });
                                        location.reload();
                                    } catch (e) {
                                        cMsg.close();
                                        vueUi.$message({
                                            type: 'error',
                                            message: '设置加载失败!'
                                        });
                                        if (debug) console.log("设置加载失败:", e);
                                    }
                                };
                                reader.onerror = (e) => {
                                    if (debug) console.log(e);
                                    msg.close();
                                    vueUi.$message({
                                        type: 'error',
                                        message: '读取设置文件失败!'
                                    });
                                };
                                reader.readAsText(file);
                            } else {
                                msg.close();
                                vueUi.$message({
                                    type: 'warning',
                                    duration: 5000,
                                    message: '当前浏览器不支持直接读取文件,已触发备用方案!'
                                });
                                this.$msgbox({
                                        title: '请将设置文件里的内容复制到下面!',
                                        type: "info",
                                        showClose: false,
                                        showCancelButton: true,
                                        confirmButtonText: '确定',
                                        cancelButtonText: '取消',
                                        closeOnClickModal: false,
                                        closeOnPressEscape: false,
                                        closeOnHashChange: false,
                                        center: true,
                                        showInput: true,
                                        inputType: "textarea",
                                    })
                                    .then(({
                                        value
                                    }) => {
                                        if (debug) console.log(value);
                                        let cMsg = vueUi.$message({
                                            type: 'info',
                                            message: '正在加载设置...'
                                        });
                                        try {
                                            GM_setValue("conf", JSON.parse(value));
                                            cMsg.close();
                                            vueUi.$message({
                                                type: 'success',
                                                message: '设置加载完成!'
                                            });
                                            location.reload();
                                        } catch (e) {
                                            cMsg.close();
                                            vueUi.$message({
                                                type: 'error',
                                                message: '设置加载失败!'
                                            });
                                            if (debug) console.log("设置加载失败:", e);
                                        }
                                    })
                                    .catch(action => {
                                        vueUi.$message({
                                            type: 'info',
                                            message: '已取消'
                                        })
                                    });
                            }
                            this.$refs.upload.abort(file.name);
                        }
                    }
                });
            })();
        }

        function loadAnnouncement() {
            new Promise(resolve => {
                fuc.httpRequest({
                    url: "https://js.hclonely.com/auto-task/announcement.json",
                    method: "get",
                    dataType: "json",
                    onload: response => {
                        if (response.status === 200 && response.response) {
                            resolve({
                                result: "success",
                                data: response.response
                            });
                        } else {
                            resolve({
                                result: "error",
                                data: response
                            });
                        }
                    },
                    r: resolve
                });
            }).then(data => {
                if (data.result === "success") {
                    let announcements = data.data;
                    announcements.map(e => {
                        e.time = fuc.dateFormat("YYYY-mm-dd HH:MM", new Date(e.time));
                        return e;
                    });
                    new Vue({
                        el: "#app",
                        data: {
                            announcements: announcements
                        }
                    });
                } else {
                    vueUi.$message({
                        type: "error",
                        duration: 0,
                        message: `加载公告失败${data.statusText||",详情请查看控制台"}!`,
                        showClose: true
                    });
                    console.error(data);
                }
            }).catch(error => {
                vueUi.$message({
                    type: "error",
                    duration: 0,
                    message: `加载公告失败,详情请查看控制台!`,
                    showClose: true
                });
                console.error(error);
            });
        }

        if (window.location.host.includes('hclonely')) {
            if (window.location.pathname.includes('setting')) {
                loadSetting();
            } else if (window.location.pathname.includes('announcement')) {
                loadAnnouncement();
            }
        } else if ((window.location.host.includes('marvelousga') || window.location.host.includes('dupedornot') || window.location.host.includes('gamecode.win')) && (!window.location.pathname.includes('giveaway'))) {
            fuc.newTabBlock();
        } else {
            let website = {};
            if (window.location.host.includes('giveaway.su')) {
                website = giveawaysu;
            } else if (window.location.host.includes('marvelousga') || window.location.host.includes('dupedornot')) {
                fuc.newTabBlock();
                website = marvelousga;
            } else if (window.location.host.includes('grabfreegame') || window.location.host.includes('bananagiveaway')) {
                website = banana;
            } else if (window.location.host.includes('gamecode.win')) {
                fuc.newTabBlock();
                website = gamecode;
            } else if (window.location.host.includes('gamehag')) {
                $("#getkey").removeAttr("disabled");
                $("body").append(`<script>window.bannedCountries = ["en"];window.geo ="en";window.respCaptch="";</script>`);

                website = gamehag;
            } else if (window.location.host.includes('prys.revadike')) {
                website = prys;
            } else if (window.location.host.includes('indiedb')) {
                website = indiedb;
            } else if (window.location.host.includes('opiumpulses')) {
                website = opiumpulses;
            } else if (window.location.host.includes('gkey') || window.location.host.includes('givekey')) {
                website = givekey;
                let init = setInterval(() => {
                    if (Centrifuge) {
                        clearInterval(init);
                        website.creat_app();
                    }
                }, 500);
            } else if (window.location.host.includes('chubkeys') || window.location.host.includes('giveawayhopper')) {
                website = chubkeys;
            } else if (window.location.host.includes('freegamelottery')) {
                website = freegamelottery;
            } else if (window.location.host.includes('gleam.io')) {
                website = gleam;
            } else if (window.location.host.includes('spoune')) {
                website = spoune;
            }

            if (globalConf.other.checkLogin) {
                website.checkLogin();
            }
            if (globalConf.other.checkLeft) {
                website.checkLeft(vueUi);
            }

            $('body').append(`
<div id="fuck-task-app">
  <div v-cloak id="fuck-task-btn">
  <el-button :style="style" @click="toggleThisDiv" :icon="icon" :title="title" :show="show"></el-button>
    <el-button type="primary" v-for="item in buttons" v-if="item.show" @click="item.click" :id="item.id" :title="item.title">{{item.text}}</el-button>
    <el-button type="primary" @click="toggle" :id="drawerBtn.id" :title="drawerBtn.title">{{drawerBtn.text}}</el-button>
  </div>
  <div id="fuck-task-info"></div>
</div>
`);
            let showLogs = globalConf.other ? globalConf.other.showLogs : defaultConf.other.showLogs;

            let btnNum = 1;
            for (let boolean of Object.values(website.setting)) {
                if (boolean) btnNum++;
            }

            let btnArea = new Vue({
                el: '#fuck-task-btn',
                data: {
                    icon: "el-icon-arrow-right",
                    title: "收起",
                    show: true,
                    style: `position:absolute;left:-20px;width:20px;border:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;padding:0;height:${btnNum*40}px;opacity:80%;`,
                    buttons: [{
                            id: 'fuck-task',
                            text: website.setting.fuckText || 'FuckTask',
                            title: website.setting.fuckTitle || '一键做任务+验证',
                            show: website.setting.fuck,
                            click: () => {
                                website.fuck(btnArea);
                            }
                        },
                        {
                            id: 'verify-task',
                            text: website.setting.verifyText || 'Verify',
                            title: website.setting.verifyTitle || '一键验证任务',
                            show: website.setting.verify,
                            click: () => {
                                website.verify();
                            }
                        },
                        {
                            id: 'join-task',
                            text: website.setting.joinText || 'Join',
                            title: website.setting.joinDes || '一键加组、关注鉴赏家、关注游戏、添加愿望单...',
                            show: website.setting.join,
                            click: () => {
                                website.join();
                            }
                        },
                        {
                            id: 'remove-task',
                            text: website.setting.removeText || 'Remove',
                            title: website.setting.removeTitle || '一键退组、取关鉴赏家、取关游戏、移除愿望单...',
                            show: website.setting.remove,
                            click: () => {
                                website.remove()
                            }
                        }
                    ],
                    drawerBtn: {
                        id: 'show-logs',
                        text: !showLogs ? 'ShowLogs' : 'HideLogs',
                        title: !showLogs ? '显示执行日志' : '隐藏执行日志',
                        show: !!showLogs
                    },
                },
                methods: {
                    toggleThisDiv() {
                        if (this.show) {
                            this.icon = "el-icon-arrow-left";
                            this.title = "展开";
                            $("#fuck-task-btn").animate({
                                width: '0',
                            });
                        } else {
                            this.icon = "el-icon-arrow-right";
                            this.title = "收起";
                            $("#fuck-task-btn").animate({
                                width: '110',
                            });
                        }
                        this.show = !this.show;
                    },
                    toggle() {
                        if (this.drawerBtn.show) {
                            this.drawerBtn.text = 'ShowLogs';
                            this.drawerBtn.title = '显示执行日志';
                            $(".fuck-task-logs").animate({
                                right: '-100%'
                            }, 'fast');
                        } else {
                            this.drawerBtn.text = 'HideLogs';
                            this.drawerBtn.title = '隐藏执行日志';
                            $(".fuck-task-logs").animate({
                                right: '16px'
                            }, 'fast');
                        }
                        this.drawerBtn.show = !this.drawerBtn.show;
                    }
                }
            });
            let infoArea = new Vue({
                el: '#fuck-task-info',
            }).$notify({
                title: '任务执行日志',
                iconClass: '',
                duration: 0,
                position: 'bottom-right',
                showClose: false,
                customClass: 'fuck-task-logs',
                dangerouslyUseHTMLString: true,
                message: ''
            });
            $(".fuck-task-logs .el-notification__title").before(`
<h2 v-cloak id="extraBtn" class="el-notification__title">
<el-badge is-dot class="item" :hidden="hidden">
  <el-button :icon="icon" :title="title" @click="checkUpdate" circle></el-button>
</el-badge>
<el-badge is-dot class="item" :hidden="settingHidden">
  <el-button icon="el-icon-setting" title="设置" @click="setting" circle></el-button>
</el-badge>
<el-badge is-dot class="item" :hidden="announcementHidden">
  <el-button :icon="announcementIcon" title="查看更新内容" @click="updateText" circle></el-button>
</el-badge>
<el-badge is-dot class="item" :hidden="otherHidden">
  <el-button icon="el-icon-brush" title="清理缓存" @click="clearTemp" circle></el-button>
</el-badge>
<el-badge is-dot class="item" :hidden="otherHidden">
  <el-button icon="el-icon-s-promotion" title="提交建议/BUG" @click="updateBug" circle></el-button>
</el-badge>
</h2>
`);
            let extraBtn = new Vue({
                el: "#extraBtn",
                data: {
                    title: "检查更新",
                    icon: "el-icon-refresh",
                    hidden: true,
                    settingHidden: !!GM_getValue('conf'),
                    otherHidden: true,
                    announcementHidden: true,
                    announcementIcon: "el-icon-document"
                },
                methods: {
                    setting() {
                        window.open("https://js.hclonely.com/auto-task/setting.html", "_blank");
                    },
                    updateText() {
                        fuc.getAnnouncement(this);
                    },
                    updateBug() {
                        window.open("https://ask.hclonely.com/question/create", "_blank");
                    },
                    checkUpdate() {
                        fuc.checkUpdate(this, true);
                    },
                    clearTemp() {
                        let status = fuc.echoLog({
                            type: 'custom',
                            text: `<li>正在清理缓存...<font></font></li>`
                        });
                        let listValues = GM_listValues();
                        for (let value of listValues) {
                            if (value !== "conf") GM_deleteValue(value);
                        }
                        status.success();
                    }
                }
            });
            if (globalConf.other.checkUpdate) {
                fuc.checkUpdate(extraBtn);
            }

            $('.fuck-task-logs .el-notification__content').show();
            if (!showLogs) {
                $(".fuck-task-logs").animate({
                    right: '-100%',
                    display: '-webkit-box',
                    display: '-ms-flexbox',
                    display: 'flex',
                }, 0);
            }
            if (window.location.host.includes('gkey') || window.location.host.includes('givekey')) {
                $("#verify-task").addClass("is-disabled").attr("disabled", "disabled");
            } else if (window.location.host === 'd.freegamelottery.com' && GM_getValue("lottery") === 1) {
                website.draw();
            }
        }

        GM_registerMenuCommand('脚本说明', () => {
            window.open('https://blog.hclonely.com/forums/topic/255', '_blank')
        });

    } catch (e) {
        setTimeout(() => {
            vueUi.$message({
                type: "error",
                duration: 0,
                message: "脚本执行出错,详细信息请查看控制台(红色背景部分)!",
                showClose: true
            });
        }, 500);
        console.log("%c%s", "color:white;background:red", e.stack);
    }

})($jQuery);

QingJ © 2025

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