b-live-random-send-test

定时从设置的字幕中随机取出一条在B站直播间发送,需先登录B站账号

Version vom 13.09.2023. Aktuellste Version

Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greatest.deepsurf.us/scripts/447936/1249747/b-live-random-send-test.js

(function () {
    window.autoSendDanmuModuleLoaded = false;
    const blobURL = URL.createObjectURL(
        new Blob(
            [
                '(',
                function () {
                    const ids = {};
                    // 监听message 开始执行定时器或者销毁
                    self.onmessage = (e) => {
                        switch (e.data.command) {
                            case 'interval:start': // 开启定时器
                                const intervalId = setInterval(() => postMessage({ message: 'interval:tick', id: e.data.id }), e.data.interval);
                                // postMessage({ message: 'interval:started', id: e.data.id });
                                ids[e.data.id] = intervalId;
                                break;
                            case 'interval:clear': // 销毁
                                clearInterval(ids[e.data.id]);
                                postMessage({ message: 'interval:cleared', id: e.data.id });
                                delete ids[e.data.id];
                                break;
                            case 'timeout:start':
                                const timeoutId = setTimeout(() => postMessage({ message: 'timeout:tick', id: e.data.id }), e.data.timeout);
                                // postMessage({ message: 'timeout:started', id: e.data.id });
                                ids[e.data.id] = timeoutId;
                                break;
                            case 'timeout:clear':
                                clearTimeout(ids[e.data.id]);
                                postMessage({ message: 'timeout:cleared', id: e.data.id });
                                delete ids[e.data.id];
                                break;
                        }
                    };
                }.toString(),
                ')()',
            ],
            { type: 'application/javascript' },
        ),
    );
    const worker = new Worker(blobURL);
    URL.revokeObjectURL(blobURL); //用完释放URL对象
    const workerTimer = {
        id: 0,
        callbacks: {},
        setInterval: (cb, interval, context) => {
            const id = ++workerTimer.id;
            workerTimer.callbacks[id] = { fn: cb, context: context };
            worker.postMessage({ command: 'interval:start', interval: interval, id: id });
            return id;
        },
        setTimeout: (cb, timeout, context) => {
            const id = ++workerTimer.id;
            workerTimer.callbacks[id] = { fn: cb, context: context };
            worker.postMessage({ command: 'timeout:start', timeout: timeout, id: id });
            return id;
        },

        // 监听worker 里面的定时器发送的message 然后执行回调函数
        onMessage: (e) => {
            switch (e.data.message) {
                case 'interval:tick':
                case 'timeout:tick':
                    const callbackItem = workerTimer.callbacks[e.data.id];
                    if (callbackItem && callbackItem.fn) {
                        callbackItem.fn.apply(callbackItem.context);
                    }

                    break;
                case 'interval:cleared':
                case 'timeout:cleared':
                    delete workerTimer.callbacks[e.data.id];
                    break;
            }
        },

        // 往worker里面发送销毁指令
        clearInterval: (id) => worker.postMessage({ command: 'interval:clear', id: id }),
        clearTimeout: (id) => worker.postMessage({ command: 'timeout:clear', id: id }),
    };
    worker.onmessage = workerTimer.onMessage.bind(workerTimer);
})();