Pikpak เสริม

Violentmonkey Scripts

// ==UserScript==
// @name        Pikpak Enhance
// @name:en     Pikpak Enhance
// @name:zh-CN  Pikpak 增强
// @name:zh-TW  Pikpak 增強
// @name:ja     Pikpak エンハンス
// @name:ko     Pikpak 개선
// @name:de     Pikpak Verbessern
// @name:fr     Pikpak Améliorer
// @name:es     Mejora de Pikpak
// @name:pt     Aumentar o pikpak
// @name:ru     Pikpak Улучшить
// @name:it     Miglioramento di Pikpak
// @name:tr     Pikpak Geliştirmek
// @name:ar     تعزيز Pikpak
// @name:th     Pikpak เสริม
// @name:vi     Nâng cao Pikpak
// @name:id     Tingkatkan Pikpak
// @namespace   Violentmonkey Scripts
// @match       *://mypikpak.com/drive/*
// @version     XiaoYing_2024.09.12.1
// @grant       GM_info
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_addStyle
// @grant       GM_deleteValue
// @grant       GM_xmlhttpRequest
// @grant       GM_setClipboard
// @grant       GM_registerMenuCommand
// @grant       GM_unregisterMenuCommand
// @grant       GM_getResourceText
// @grant       GM_getResourceURL
// @grant       GM_openInTab
// @grant       unsafeWindow
// @run-at      document-start
// @author      github.com @XiaoYingYo
// @require     https://greasyfork.org/scripts/464929-module-jquery-xiaoying/code/module_jquery_XiaoYing.js
// @require     https://greasyfork.org/scripts/464780-global-module/code/global_module.js
// @require     https://greasyfork.org/scripts/465483-hookfetch/code/hookFetch.js
// @description Violentmonkey Scripts
// @description:en Violentmonkey Scripts
// @description:zh-CN Violentmonkey 脚本
// @description:zh-TW Violentmonkey 腳本
// @description:ja Violentmonkey スクリプト
// @description:ko Violentmonkey 스크립트
// @description:de Violentmonkey Skripte
// @description:fr Violentmonkey Scripts
// @description:es Violentmonkey Scripts
// @description:pt Violentmonkey Scripts
// @description:ru Violentmonkey Сценарии
// @description:it Violentmonkey Scripts
// @description:tr Violentmonkey Scripts
// @description:ar Violentmonkey Scripts
// @description:th Violentmonkey Scripts
// @description:vi Violentmonkey Scripts
// @description:id Violentmonkey Scripts
// ==/UserScript==

var GlobalVariable = {};

async function DealWithoverlay(i, callback) {
    return new Promise(async (resolve) => {
        let overlay = await global_module.waitForElement('div.el-overlay:not([style*="display"])', null, null, 100, 3 * 1000);
        if (overlay.length === 0) {
            resolve();
            return;
        }
        let Target = null;
        if (i != null) {
            switch (i) {
                case 0:
                    Target = overlay.find('button[class*="is-text"]').eq(0);
                    break;
                case 1:
                    Target = overlay.find('button[class*="--primary"]').eq(0);
                    break;
                case 2:
                    Target = overlay.find('label[class^="el-checkbox"]').eq(0);
                    break;
            }
        }
        if (typeof callback == 'function') {
            callback(overlay, Target);
        } else {
            if (Target != null) {
                Target.click();
            }
            overlay.hide();
        }
        resolve();
    });
}

async function LiClick() {
    let activeLiHref = GlobalVariable.activeLi.attr('href');
    let that = $(this).find('a').eq(0);
    let thisHref = that.attr('href');
    if (activeLiHref == thisHref) {
        return;
    }
    GlobalVariable.activeLi = that;
    clearInterval(GlobalVariable.FindLiActiveInterval);
    $('ul[class^="context-menu"]').remove();
    await new Promise((resolve) => {
        GlobalVariable.FindLiActiveInterval = setInterval(() => {
            if (that.attr('class').indexOf('active') != -1) {
                clearInterval(GlobalVariable.FindLiActiveInterval);
                resolve();
            }
        }, 100);
    });
    MonitorMenu();
}

GlobalVariable.MonitorMenuClickFun = global_module.debounce(MonitorMenuClick, 100);
GlobalVariable.InterfacelanguageList = ['en', 'zh-CN', 'zh-TW', 'ja', 'ko', 'de', 'fr', 'es', 'pt', 'ru', 'it', 'tr', 'ar', 'th', 'vi', 'id'];
GlobalVariable.Navigatorlanguage = GlobalVariable.InterfacelanguageList.indexOf(navigator.language) != -1 ? navigator.language : 'en';
GlobalVariable.Pikpaklanguage = localStorage.getItem('pp_locale') || 'en';
GlobalVariable.Interfacelanguage = {
    login: {
        '001': {
            en: 'preferred use Sign in or Register with Email',
            'zh-CN': '首选使用邮箱登录或注册',
            'zh-TW': '首選使用郵箱登錄或註冊',
            ja: 'メールでログインまたは登録することを好む',
            ko: '이메일로 로그인 또는 등록하는 것을 선호합니다',
            de: 'Bevorzugte Anmeldung oder Registrierung per E-Mail',
            fr: 'Préférez-vous vous connecter ou vous inscrire par e-mail',
            es: 'Preferencia para iniciar sesión o registrarse con correo electrónico',
            pt: 'Preferência para fazer login ou registrar com e-mail',
            ru: 'Предпочтительный вход или регистрация по электронной почте',
            it: 'Preferenza per accedere o registrarsi con e-mail',
            tr: 'E-posta ile oturum açın veya kaydolun',
            ar: 'تفضيل تسجيل الدخول أو التسجيل باستخدام البريد الإلكتروني',
            th: 'การเข้าสู่ระบบหรือลงทะเบียนด้วยอีเมลที่ต้องการ',
            vi: 'Ưu tiên sử dụng Đăng nhập hoặc Đăng ký bằng Email',
            id: 'Pilihan untuk masuk atau mendaftar dengan email'
        },
        '002': {
            en: 'Enter your email address and password here to automatically try to log in',
            'zh-CN': '在此输入您的电子邮件地址和密码,以自动尝试登录',
            'zh-TW': '在此輸入您的電子郵件地址和密碼,以自動嘗試登錄',
            ja: 'ここにメールアドレスとパスワードを入力して、自動的にログインを試みます',
            ko: '이메일 주소와 비밀번호를 입력하여 자동으로 로그인하십시오',
            de: 'Geben Sie hier Ihre E-Mail-Adresse und Ihr Passwort ein, um sich automatisch anzumelden',
            fr: 'Entrez votre adresse e-mail et votre mot de passe ici pour vous connecter automatiquement',
            es: 'Ingrese su dirección de correo electrónico y contraseña aquí para iniciar sesión automáticamente',
            pt: 'Insira seu endereço de e-mail e senha aqui para fazer login automaticamente',
            ru: 'Введите здесь свой адрес электронной почты и пароль, чтобы автоматически войти в систему',
            it: 'Inserisci qui il tuo indirizzo email e la tua password per accedere automaticamente',
            tr: 'E-posta adresinizi ve şifrenizi buraya girin ve otomatik olarak oturum açmaya çalışın',
            ar: 'أدخل عنوان بريدك الإلكتروني وكلمة المرور هنا للمحاولة تسجيل الدخول تلقائيًا',
            th: 'ป้อนที่อยู่อีเมลและรหัสผ่านของคุณที่นี่เพื่อล็อกอินโดยอัตโนมัติ',
            vi: 'Nhập địa chỉ email và mật khẩu của bạn ở đây để tự động đăng nhập',
            id: 'Masukkan alamat email dan kata sandi Anda di sini untuk masuk secara otomatis'
        },
        '003': {
            en: 'Register new account with one click and log in immediately',
            'zh-CN': '一键注册新的账号并立即登录',
            'zh-TW': '一鍵註冊新的賬號並立即登錄',
            ja: 'ワンクリックで新しいアカウントを登録してすぐにログインする',
            ko: '한 번의 클릭으로 새 계정을 등록하고 즉시 로그인하십시오',
            de: 'Registrieren Sie ein neues Konto mit einem Klick und melden Sie sich sofort an',
            fr: 'Enregistrez un nouveau compte en un clic et connectez-vous immédiatement',
            es: 'Registre una nueva cuenta con un clic e inicie sesión de inmediato',
            pt: 'Registre uma nova conta com um clique e faça login imediatamente',
            ru: 'Зарегистрируйте новую учетную запись одним щелчком и войдите в систему немедленно',
            it: 'Registra un nuovo account con un clic e accedi immediatamente',
            tr: 'Bir tıklamayla yeni bir hesabı kaydedin ve hemen oturum açın',
            ar: 'سجل حساب جديد بنقرة واحدة وسجل الدخول على الفور',
            th: 'ลงทะเบียนบัญชี ใหม่ด้วยคลิกเดียวและเข้าสู่ระบบทันที',
            vi: 'Đăng ký tài khoản mới chỉ với một cú nhấp chuột và đăng nhập ngay lập tức',
            id: 'Daftar akun baru dengan satu klik dan masuk segera'
        }
    },
    main: {
        '001': {
            en: 'Auto confirm all delete tasks',
            'zh-CN': '自动确认全部删除任务',
            'zh-TW': '自動確認全部刪除任務',
            ja: 'すべての削除タスクを自動確認する',
            ko: '모든 삭제 작업 자동 확인',
            de: 'Alle Löschvorgänge automatisch bestätigen',
            fr: 'Confirmer automatiquement toutes les tâches de suppression',
            es: 'Confirmar automáticamente todas las tareas de eliminación',
            pt: 'Confirmar automaticamente todas as tarefas de exclusão',
            ru: 'Автоматически подтверждать все задачи на удаление',
            it: 'Conferma automaticamente tutti i compiti di eliminazione',
            tr: 'Tüm silme görevlerini otomatik olarak onaylayın',
            ar: 'تأكيد جميع مهام الحذف تلقائيًا',
            th: 'ยืนยันงานลบทั้งหมดโดยอัตโนมัติ',
            vi: 'Tự động xác nhận tất cả các tác vụ xóa',
            id: 'Konfirmasi otomatis semua tugas penghapusan'
        }
    }
};

async function MonitorMenuClick() {
    let Download = GlobalVariable.language['download'];
    let Delete = GlobalVariable.language['i18n-delete'];
    let DeletePermanently = GlobalVariable.language['delete-permanently'];
    let DownloadElement = GlobalVariable.menu.find('li[aria-label="' + Download + '"]').eq(0);
    let DeleteElement = GlobalVariable.menu.find('li[aria-label="' + Delete + '"]').eq(0);
    let DeletePermanentlyElement = GlobalVariable.menu.find('li[aria-label="' + DeletePermanently + '"]').eq(0);
    if (DownloadElement.length != 0) {
        DownloadElement.on('click', () => {
            DealWithoverlay(0);
        });
    }
    if (DeleteElement.length != 0) {
        DeleteElement.on('click', () => {
            DealWithoverlay(1);
        });
    }
    if (DeletePermanentlyElement.length != 0) {
        DeletePermanentlyElement.on('click', () => {
            DealWithoverlay(1);
        });
    }
}

async function MonitorMenu() {
    let menu = await global_module.waitForElement('ul[class^="context-menu"]', null, null, 100);
    if (menu.html() != '') {
        return;
    }
    GlobalVariable.menu = menu;
    $(menu).on('DOMSubtreeModified', GlobalVariable.MonitorMenuClickFun);
}

function FindStr(obj) {
    global_module.objectDepthEnumerate(obj, function (key, obj) {
        if (key == null) {
            return false;
        }
        if (typeof obj === 'function') {
            let scriptStr = obj.toString();
            if (scriptStr.indexOf('.exports=JSON.parse') != -1 && GlobalVariable['allFileText'] && scriptStr.indexOf(GlobalVariable['allFileText']) != -1) {
                let index = scriptStr.indexOf('.exports=JSON.parse') - 1;
                let char = scriptStr[index];
                scriptStr = scriptStr.replace(char + '.exports=', 'window["__language__"]=');
                scriptStr = '(' + scriptStr + ')()';
                let func = new Function(scriptStr);
                func();
                GlobalVariable.language = unsafeWindow.__language__;
                unsafeWindow.GlobalVariable = GlobalVariable;
                return true;
            }
        }
        return false;
    });
}

GlobalVariable.registerEdMenu = [];

function OverloadMenu() {
    for (let i = 0; i < GlobalVariable.registerEdMenu.length; i++) {
        GM_unregisterMenuCommand(GlobalVariable.registerEdMenu[i]);
    }
    let L001 = GlobalVariable.Interfacelanguage['login']['001'][GlobalVariable.Navigatorlanguage];
    let V001 = GM_getValue('loginForEmail', false) ? '√' : '×';
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L001 + ' ' + V001, () => {
            GM_setValue('loginForEmail', !GM_getValue('loginForEmail', false));
            OverloadMenu();
        })
    );
    let L002 = GlobalVariable.Interfacelanguage['main']['001'][GlobalVariable.Navigatorlanguage];
    let V002 = GM_getValue('autoConfirmAllDeleteTasks', false) ? '√' : '×';
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L002 + ' ' + V002, () => {
            GM_setValue('autoConfirmAllDeleteTasks', !GM_getValue('autoConfirmAllDeleteTasks', false));
            OverloadMenu();
        })
    );
    let L003 = GlobalVariable.Interfacelanguage['login']['003'][GlobalVariable.Navigatorlanguage];
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L003, () => {
            RegisterNewAccount();
        })
    );
}

async function _sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, ms);
    });
}

async function RegisterNewAccount() {
    let QuickInput = $('div#QuickInput').eq(0);
    if (QuickInput.length === 0) {
        alert('Not in the login interface, unable to continue');
        return;
    }
    if ($('input[class*="-login"][class*="password-repeat"][type="password"]').eq(0).length === 0) {
        let tipsLink = $('span[class*="tips-link"]').eq(0);
        global_module.clickElement(tipsLink[0]);
    }
    let email = await global_module.Mail.Change();
    await _sleep(1000);
    let formEmail = $('input[class*="-login"][class*="email"][type="text"]').eq(0);
    global_module.AnalogInput.AnalogInput(formEmail[0], email);
    let sendCode = $('div[class*="-login"][class*="send-message"]').eq(0);
    global_module.clickElement(sendCode[0]);
    while (true) {
        let Mails = await global_module.Mail.getMails();
        if (Mails.length !== 0) {
            let r = await handlingPikpakCaptchasAndLogin(Mails);
            if (r) {
                break;
            }
        }
        await _sleep(1000);
    }
}

function extractNumbers(str) {
    let reg = /\d{6}/g;
    str = str.match(reg);
    if (str == null) {
        return null;
    }
    return str[0];
}

async function handlingPikpakCaptchasAndLogin(Mails) {
    return new Promise((resolve) => {
        let code = null;
        for (let i = 0; i < Mails.length; i++) {
            let Mail = Mails[i];
            let sender = Mail.sender;
            if (sender.search(/Pikpak/i) === -1) {
                continue;
            }
            let text = Mail.text;
            code = extractNumbers(text);
            if (code === null) {
                continue;
            }
            break;
        }
        if (code == null) {
            resolve(false);
            return false;
        }
        let formCode = $('input[class*="-login"][class*="code"][type="text"]').eq(0);
        let formPassword = $('input[class*="-login"][class*="password"][type="password"]').eq(0);
        let formPasswordRepeat = $('input[class*="-login"][class*="password-repeat"][type="password"]').eq(0);
        global_module.AnalogInput.AnalogInput(formCode[0], code);
        let pass = global_module.getRandomString(16);
        global_module.AnalogInput.AnalogInput(formPassword[0], pass);
        global_module.AnalogInput.AnalogInput(formPasswordRepeat[0], pass);
        let loginBtn = $('div[class*="-login"][class*="button"]').eq(0);
        setTimeout(() => {
            global_module.clickElement(loginBtn[0]);
            let now = Date.now();
            let t = setInterval(() => {
                if (Date.now() - now > 30000) {
                    clearInterval(t);
                    resolve(false);
                    return false;
                }
                if (window.location.href.search(/login/i) === -1) {
                    clearInterval(t);
                    alert('Your password is:' + pass);
                    MonitorUrl(1);
                }
            }, 1000);
            resolve(true);
        }, 200);
    });
}

function analyzeLoginInfo(item, text) {
    let emailReg = /([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/g;
    let email = text.match(emailReg);
    if (email == null) {
        return;
    }
    let password = '';
    text = text.replace(/:/g, '-');
    text = text.replace(/:/g, ':');
    text = text.replace(emailReg, '');
    // text = text.replace(/\n/g, '');
    email = email[0];
    if (text.indexOf(':') != -1) {
        let index = text.indexOf(':');
        password = text.substring(index + 1);
        if (password.indexOf('\n') != -1) {
            password = password.substring(0, password.indexOf('\n'));
        }
    } else if (!/\s/.test(text)) {
        password = text.replace(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+\-\=\[\]\{\}\|\\\:\;\"\'\,\.\/\<\>\?]/g, '');
    } else {
        let index = text.lastIndexOf(' ');
        password = text.substring(index + 1);
    }
    if (email != '' && password != '') {
        let inputList = item.find('input[class][placeholder]');
        email = email.replace(/\s/g, '');
        password = password.replace(/\s/g, '');
        global_module.AnalogInput.AnalogInput(inputList.eq(0)[0], email);
        global_module.AnalogInput.AnalogInput(inputList.eq(1)[0], password);
        MonitorUrl(1);
        setTimeout(() => {
            $('[class="pp-button"]').eq(0).click();
        }, 200);
    }
}

function loginPaneleModified() {
    let forgetPasswordElement = GlobalVariable.loginPanel.find('div[class*="forget-password"]').eq(0);
    if (forgetPasswordElement.length == 0) {
        return;
    }
    let item = forgetPasswordElement.parent();
    let form = item.parent().eq(0);
    if (form.find('div#QuickInput').length != 0) {
        return;
    }
    let QuickInputHeight = 188;
    let div = $(`<div id="QuickInput"><textarea placeholder="` + GlobalVariable.Interfacelanguage['login']['002'][GlobalVariable.Navigatorlanguage] + `" style="width: 100%; height:` + QuickInputHeight + `px;"></textarea></div>`);
    form.append(div);
    // let formHeight = form.height();
    // form.css('height', formHeight + QuickInputHeight + 'px');
    form.find('div[class="agreement"]').eq(0).css('display', 'none');
    let textarea = div.find('textarea').eq(0);
    textarea.on(
        'input propertychange',
        global_module.debounce(() => {
            let text = $(textarea).val();
            analyzeLoginInfo(item, text);
        }, 200)
    );
    if (unsafeWindow['_autoLoginInfo_']) {
        analyzeLoginInfo(item, unsafeWindow['_autoLoginInfo_']());
    }
}

function StopMonitorUrl() {
    if (GlobalVariable.MonitorUrlInterval != null) {
        for (let i = 0; i < GlobalVariable.MonitorUrlInterval.length; i++) {
            clearInterval(GlobalVariable.MonitorUrlInterval[i]);
        }
        GlobalVariable.MonitorUrlInterval = [];
    }
}

function MonitorUrl(to) {
    GlobalVariable.HistoricalUrlPath = unsafeWindow.location.pathname;
    if (GlobalVariable.MonitorUrlInterval == null) {
        GlobalVariable.MonitorUrlInterval = [];
    }
    StopMonitorUrl();
    GlobalVariable.MonitorUrlInterval.push(
        setInterval(() => {
            let path = unsafeWindow.location.pathname;
            if (path == GlobalVariable.HistoricalUrlPath) {
                return;
            }
            if (path.indexOf('/drive/login') != -1 && to == 0) {
                login();
            } else if (to == 1) {
                main();
            }
            StopMonitorUrl();
        }, 500)
    );
}

async function login() {
    let loginPanel = await global_module.waitForElement('div[class*="login-panel"]', null, null, 100, -1);
    loginPanel = loginPanel.eq(0);
    GlobalVariable.loginPanel = loginPanel;
    loginPanel.on('DOMSubtreeModified', global_module.debounce(loginPaneleModified, 200));
    if (GM_getValue('loginForEmail', false)) {
        let emailBtn = await global_module.waitForElement('div[class*="icon-email"]', null, null, 100, -1);
        emailBtn.eq(0).click();
    }
    Init(0);
}

async function MonitorLogout() {
    let nav = await global_module.waitForElement('ul[class="user-nav"]', null, null, 100, -1);
    let li = nav.find('li').eq(-1);
    li.on('click', () => {
        $('body').remove();
        for (let key in localStorage) {
            localStorage.removeItem(key);
        }
        global_module.Cookie.clear();
        unsafeWindow.location.href = '/drive/login';
    });
}

async function ListenControlButtonClick() {
    let controlButton = await global_module.waitForElement('div[class="menu-box"]', null, null, 1000, 60 * 1000);
    GlobalVariable.controlButton = {
        controlButton
    };
    let globalActionClick = () => {
        DealWithoverlay(2, (overlay, Target) => {
            if (Target.hasClass('is-checked')) {
                Target.click();
            }
            setTimeout(() => {
                DealWithoverlay(1);
            }, 100);
        });
    };
    let Btn = controlButton;
    controlButton.click(() => {
        if (!GM_getValue('autoConfirmAllDeleteTasks', false)) {
            return;
        }
        if (GlobalVariable.controlButton.transferContent == null || GlobalVariable.controlButton.transferContent.length == 0) {
            GlobalVariable.controlButton.transferContent = $(Btn).parent().eq(0).parent().eq(0).find('div[class^="transfer-content"]').eq(0);
        }
        let transferContent = GlobalVariable.controlButton.transferContent;
        let clearTimes = () => {
            if (GlobalVariable.controlButton.FindTime != null) {
                clearTimeout(GlobalVariable.controlButton.FindTime);
            }
            if (GlobalVariable.controlButton.FindGlobalActionTime != null) {
                clearInterval(GlobalVariable.controlButton.FindGlobalActionTime);
            }
        };
        clearTimes();
        GlobalVariable.controlButton.FindTime = setTimeout(() => {
            let isShow = transferContent.css('display') != 'none';
            if (!isShow) {
                if (GlobalVariable.controlButton.globalAction != null) {
                    GlobalVariable.controlButton.globalAction.off('click', globalActionClick);
                }
                clearTimes();
                return;
            }
            let _class = 'global-action';
            let transferContentFather = transferContent.find('div[class="' + _class + '"]').eq(0);
            let FindGlobalAction = () => {
                let globalAction = transferContentFather.find('div[class^="' + _class + '"]').eq(0);
                GlobalVariable.controlButton.globalAction = globalAction;
                globalAction.on('click', globalActionClick);
            };
            if (transferContentFather.length > 0) {
                FindGlobalAction();
            } else {
                GlobalVariable.controlButton.FindGlobalActionTime = setInterval(() => {
                    transferContentFather = transferContent.find('div[class="' + _class + '"]').eq(0);
                    if (transferContentFather.length == 0) {
                        return;
                    }
                    clearTimes();
                    FindGlobalAction();
                }, 200);
            }
        }, 260);
    });
}

function hideIntrojs() {
    return new Promise(async (resolve) => {
        await global_module.waitForElement('div[class^="introjs-"]', null, null, 100, 10 * 1000);
        $('div[class^="introjs-"]').remove();
        resolve();
    });
}

async function main() {
    hideIntrojs();
    MonitorUrl(0);
    MonitorLogout();
    let nav = await global_module.waitForElement('ul[class="nav"]', null, null, 100, 60 * 1000);
    if (nav == null) {
        for (let i = 0; i < 5; i++) {
            new Error('nav is null');
        }
        return;
    }
    await new Promise((resolve) => {
        let timer = setInterval(() => {
            try {
                let text = $('span[class="nav-item-name"]').eq(0).text();
                if (text == null || text == '') {
                    return;
                }
                clearInterval(timer);
                GlobalVariable['allFileText'] = text;
                resolve();
            } catch (e) {}
        }, 200);
    });
    FindStr(unsafeWindow.webpackChunkxlco_pikpak_web);
    if (GlobalVariable.language == null) {
        GlobalVariable.language = {
            'my-vip-days': 'Vip remaining {0} days',
            download: 'Download',
            'i18n-delete': 'Delete',
            'delete-permanently': 'Delete permanently'
        };
    }
    GlobalVariable.nav = nav;
    let activeLi = await global_module.waitForElement('a[class^="active"]', null, null, 100, 60 * 1000, nav);
    if (activeLi == null) {
        for (let i = 0; i < 5; i++) {
            new Error('activeLi is null');
        }
        return;
    }
    ListenControlButtonClick();
    StopMonitorUrl();
    GlobalVariable.activeLi = activeLi;
    nav.find('li').on('click', LiClick);
    $('svg[class="safety"]').eq(0).remove();
    MonitorMenu();
    Init(1);
}

unsafeWindow['__hookRequest__'].FetchCallback.add('/vip/v1/vip/info', (_object, period) => {
    if (period === 'preRequest') {
        return null;
    } else if (period === 'done') {
        (async () => {
            let json = JSON.parse(_object.text);
            let data = json.data;
            let expire = data.expire;
            let day = 0;
            if (expire && expire != '') {
                let now = new Date();
                let expireDate = new Date(expire);
                day = (expireDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
                day = Math.ceil(day);
            }
            if (unsafeWindow['Pikpak_Archive'] != null) {
                try {
                    unsafeWindow['Pikpak_Archive']();
                } catch (e) {}
            }
            await new Promise((resolve) => {
                let Time = setInterval(() => {
                    if (GlobalVariable.language == null) {
                        return;
                    }
                    if (GlobalVariable.language['my-vip-days'] == null) {
                        return;
                    }
                    clearInterval(Time);
                    resolve();
                }, 500);
            });
            let title = GlobalVariable.language['my-vip-days'].replace('{0}', day);
            if (GlobalVariable.vipDaysDom != null) {
                GlobalVariable.vipDaysDom.text(title);
                return;
            }
            let cloneDom = await global_module.waitForElement('div[class*="header-bar-right"]', null, null, 100, -1);
            cloneDom = cloneDom.eq(0).find('a').eq(0);
            let newDom = $(global_module.cloneAndHide(cloneDom[0], 1));
            newDom.attr('id', '_vipdays_');
            GlobalVariable.vipDaysDom = newDom;
            cloneDom.show();
            $(newDom).text(title);
        })();
    }
});

function Init(index) {
    SaveStorage('pp_access_to_visit', 'true');
    SaveStorage('allow_analysis', 'true');
    if (index == 0) {
    } else if (index == 1) {
        for (let i = 0; i < localStorage.length; i++) {
            let key = localStorage.key(i);
            let value = localStorage.getItem(key);
            if (key.indexOf('credentials_') != -1) {
                let json = JSON.parse(value);
                let sub = json.sub;
                let token = json.access_token;
                GlobalVariable.Token = token;
                if (sub == null) {
                    new Error(json);
                    return;
                }
                SaveStorage('pp_disabled_speed_save_dialog_' + sub, 'true');
                break;
            }
        }
    }
}

function SaveStorage(key, value) {
    global_module.Cookie.set(key, value, 365);
    localStorage.setItem(key, value);
}

function Preload() {
    OverloadMenu();
    Init();
    let href = unsafeWindow.location.href;
    if (href.indexOf('/drive/login') != -1) {
        login();
    } else {
        main();
    }
}

Preload();