非公開 キーボード縦移動修正

  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._intervalSwitchPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        /* ======================================================== */
        /* 【微調整エリア】(ミリ秒単位で指定してください。10ミリ秒 = 10) */
        /* ======================================================== */
        const UP_NORMAL_MS = 10;  /* 真上・本来の向き(64: 右逸れ)の維持時間 */
        const UP_ALTER_MS  = 12;  /* 真上・逆の向き (63: 左逸れ)の維持時間 */
    
        const DOWN_NORMAL_MS = 10; /* 真下・本来の向き(191: 左逸れ)の維持時間 */
        const DOWN_ALTER_MS  = 12; /* 真下・逆の向き (190: 右逸れ)の維持時間 */
        /* ======================================================== */
    
        /* 状態管理用変数 */
        let lastUpState = 64;   /* 現在(直前)の上の状態 (64 または 63) */
        let lastDownState = 191; /* 現在(直前)の下の状態 (191 または 190) */
        let lastUpSwitchTime = Date.now();
        let lastDownSwitchTime = Date.now();
    
        /* WebSocketの送信関数(大元)をハック */
        const originalSend = WebSocket.prototype.send;
        WebSocket.prototype.send = function(data) {
            
            if (data && (data.byteLength === 1 || data.length === 1)) {
                const view = new Uint8Array(data.buffer || data);
                let currentByte = view[0]; 
                const now = Date.now();
    
                /* 【真上移動のとき】 */
                if (currentByte === 64 || currentByte === 63) {
                    /* 現在の状態に応じた制限時間を取得 */
                    const currentLimit = (lastUpState === 64) ? UP_NORMAL_MS : UP_ALTER_MS;
                    
                    /* 指定された時間が経過していたら、状態を反転させる */
                    if (now - lastUpSwitchTime >= currentLimit) {
                        lastUpState = (lastUpState === 64) ? 63 : 64;
                        lastUpSwitchTime = now;
                    }
                    
                    /* 決定された状態の数値をパケットに上書き */
                    view[0] = lastUpState;
                }
                /* 【真下移動のとき】 */
                else if (currentByte === 191 || currentByte === 190) {
                    /* 現在の状態に応じた制限時間を取得 */
                    const currentLimit = (lastDownState === 191) ? DOWN_NORMAL_MS : DOWN_ALTER_MS;
                    
                    /* 指定された時間が経過していたら、状態を反転させる */
                    if (now - lastDownSwitchTime >= currentLimit) {
                        lastDownState = (lastDownState === 191) ? 190 : 191;
                        lastDownSwitchTime = now;
                    }
                    
                    /* 決定された状態の数値をパケットに上書き */
                    view[0] = lastDownState;
                }
            }
            return originalSend.apply(this, arguments);
        };
    
        window._intervalSwitchPatch = true;
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。