discord jump top

discord爬楼辅助器

当前为 2024-08-01 提交的版本,查看 最新版本

// ==UserScript==
// @name         discord jump top
// @namespace    http://tampermonkey.net/
// @version      v0.0.8
// @description  discord爬楼辅助器
// @author       bincooo 折戟沉沙、丿
// @match        https://discord.com/channels/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=discord.com
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    console.log("discord jump top")
    document.head.appendChild($(`<style>.j-top, j-cancel {}</style>`)[0])
    const jumpBtm = $(`<a class='j-top' href='javascript:;' style='position: absolute; top: calc(100% - 20px); right: 30px; cursor: pointer'>jump top ⬆️</a>`)
    const cancelBtm = $(`<a class='j-cancel' hidden href='javascript:;' style='position: absolute; top: calc(100% - 20px); right: 30px; cursor: pointer'>cancel</a>`)

    function waitTimout(selector, millisecond) {
        let timer, count = millisecond / 1000;
        return new Promise(function(resolve, reject) {
            timer = setInterval(() => {
                const obj = $(selector);
                if (obj.length > 0) {
                    clearInterval(timer);
                    return resolve(obj);
                }

                if (count == 0) {
                    clearInterval(timer);
                    return reject();
                }

                count--;
            }, 1000)
        })
    }

    function rebin(selector, fun) {
        let retry = 10, timer;
        timer = setInterval(() => {
            if (retry <= 0) {
                clearInterval(timer);
                return
            }

            retry --
            if ($(selector).length > 0) {
                return
            }

            fun()
        }, 1000);
    }

    function jumpTop(selector, key = 'g') {
        const top = $(`#j${key}-top`); if (top.length > 0) {
            return
        }

        let retry = 30;
        const btm = jumpBtm.clone();
        const cancel = cancelBtm.clone();
        btm.attr("id", `j${key}-top`)

        rebin(`#j${key}-top`, () => {
            const barArea = $(selector)
            barArea.append(btm);
            barArea.append(cancel);
            btm.click(() => {
                if (btm.disabled === true) {
                    return
                }

                btm.disabled = true;
                btm.attr("hidden", true);
                cancel.attr("hidden", false);
                const $jump = (resolve, reject) => {
                    if (retry <= 0) {
                        resolve()
                        retry = 30;
                        return
                    }

                    retry --;
                    const chat = $("div[id^=chat-messages-]");
                    $("div[class^=messagesWrapper] > div[class^=scroller_]").animate({scrollTop: 0}, 800);
                    setTimeout(() => {
                        (chat.length > 0) ? resolve() : $jump(resolve, reject);
                    }, 1000);
                }
                new Promise($jump).then(_ => {
                    btm.disabled = false;
                    btm.attr("hidden", false);
                    cancel.attr("hidden", true);
                    console.log("~ top over ~");
                    retry = 30;
                });
            });
            cancel.click(() => {
                retry = 0
                btm.attr("hidden", false);
                cancel.attr("hidden", true);
            });
            jumpTop(selector, key);
        });
    }

    $(() => {
        let appAsidePanelWrapper = false
        waitTimout('#app-mount div[class^=appAsidePanelWrapper_]', 10000)?.then(dom => {
            dom.on('click', () => {
                console.log('appAsidePanelWrapper click ...')
                const barArea = $("div[class^=channelBottomBarArea_]");
                if (barArea.length > 0 && barArea.find('#jg-top').length == 0) {
                    jumpTop("div[class^=channelBottomBarArea_]", 'g');
                }
            });
            setTimeout(() => dom.trigger('click'), 3000);
        });
    });

})();

QingJ © 2025

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