Discord Web Stereo and High Bitratde

Enable stereo microphone input and set the highest bitrate for Discord Web.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Discord Web Stereo and High Bitratde
// @namespace    http://tampermonkey.net/
// @version      0.7
// @description  Enable stereo microphone input and set the highest bitrate for Discord Web.
// @match        https://discord.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Search for the appropriate methods dynamically
    const findAndHookMethods = () => {
        const searchInterval = 5000;

        const hookMethod = (object, methodName, hookFunction) => {
            if (object && typeof object[methodName] === 'function') {
                const originalMethod = object[methodName];
                object[methodName] = function() {
                    hookFunction.apply(this, arguments);
                    return originalMethod.apply(this, arguments);
                };
                console.log(`Hooked ${methodName} on`, object);
                return true;
            }
            return false;
        };

        const hookSetTransceiverEncodingParameters = () => {
            const hookFunction = function(parameters) {
                console.log('hookSetTransceiverEncodingParameters called with parameters:', parameters);
                if (parameters && parameters.encodings) {
                    for (const encoding of parameters.encodings) {
                        encoding.maxBitrate = 1329600; // Set this to the desired bitrate (1329.60 kbps)
                        encoding.channels = 2; // Enable stereo
                        console.log('Updated encoding:', encoding);
                    }
                }
            };

            let hooked = false;
            const potentialObjects = [window, ...Object.values(window)];

            for (const obj of potentialObjects) {
                if (hookMethod(obj, 'setTransceiverEncodingParameters', hookFunction)) {
                    hooked = true;
                    break;
                }
            }

            if (!hooked) {
                console.error('setTransceiverEncodingParameters method not found. Retrying in 5 seconds.');
                setTimeout(hookSetTransceiverEncodingParameters, searchInterval);
            }
        };

        const hookSetTransportOptions = () => {
            const hookFunction = function(options) {
                console.log('hookSetTransportOptions called with options:', options);
                if (options && options.audio && options.audio.transportOptions) {
                    options.audio.transportOptions.encodingParams = {
                        channels: 2 // Enable stereo
                    };
                    console.log('Updated audio transport options:', options.audio.transportOptions);
                }
            };

            let hooked = false;
            const potentialObjects = [window, ...Object.values(window)];

            for (const obj of potentialObjects) {
                if (hookMethod(obj, 'setTransportOptions', hookFunction)) {
                    hooked = true;
                    break;
                }
            }

            if (!hooked) {
                console.error('setTransportOptions method not found. Retrying in 5 seconds.');
                setTimeout(hookSetTransportOptions, searchInterval);
            }
        };

        // Initialize hooks
        const init = () => {
            console.log('Initializing hooks');
            hookSetTransceiverEncodingParameters();
            hookSetTransportOptions();
            console.log('Hooks initialization attempted');
        };

        // Wait for the Discord Web app to fully load before initializing
        window.addEventListener('load', init);
        console.log('Event listener added for window load');
    };

    findAndHookMethods();
})();