Camamba OnMessageHandling

allows to add handlers for onMessage requests

2021-03-20 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트는 직접 설치하는 용도가 아닙니다. 다른 스크립트에서 메타 지시문 // @require https://update.greasyfork.org/scripts/423665/913137/Camamba%20OnMessageHandling.js을(를) 사용하여 포함하는 라이브러리입니다.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name            Camamba OnMessageHandling
// @namespace       dannysaurus.camamba
// @version         0.1
// @description     allows to add handlers for onMessage requests
// @license         MIT License
// @include         https://www.camamba.com/chat/
// @include         https://www.de.camamba.com/chat/
// ==/UserScript==

/* jslint esnext: true */
/* global me, camData, rooms, blockList, friendList, friendRequests, adminMessages, jsLang, byId, myRooms, knownUsers, activeRoom, selectedUser, settings */

// === overwrite relevant property to add handler before onMessage is going to be processed
const onMessageHandlers = {
    // Keepalive response
    pong: data => {
        return true;
    },

    // Chat message
    roomChat: data => {
        return true;
    },

    // Private message
    private: data => {
        return true;
    },

    // Control messages
    control: data => {
        return true;
    },

    // User Joined Room
    joined: data => {
        return true;
    },

    // User left
    left: data => {
        return true;
    },

    // User disconnected from server
    disco: data => {
        return true;
    },

    // Room User List
    roomList: data => {
        return true;
    },

    // Room access denied
    denied: data => {
        return true;
    },

    // Private room ready
    privateCreate: data => {
        return true;
    },

    // Owner of a private room left the chat
    ownerLeft: data => {
        return true;
    },

    // User joins my room
    joinRequest: data => {
        return true;
    },

    // Room user count
    roomStats: data => {
        return true;
    },

    // Private room data
    privStats: data => {
        return true;
    },

    // Image Upload
    file: data => {
        return true;
    },

    // Cam published
    camOn: data => {
        return true;
    },

    // Cam turned off
    camOff: data => {
        return true;
    },

    // AFK mark
    afk: data => {
        return true;
    },

    // Second login overrides
    duplicate: data => {
        return true;
    },

    // Admin messages
    admin: data => {
        return true;
    },

    // Admin ban
    ban: data => {
        return true;
    },

    // Connected (control layer)
    connectConfirm: data => {
        return true;
    }
};

// === overwrite relevant property to add handler after onMessage got processed
const postMessageHandlers = {
    // Keepalive response
    pong: data => {
        return;
    },

    // Chat message
    roomChat: data => {
        return;
    },

    // Private message
    private: data => {
        return;
    },

    // Control messages
    control: data => {
        return;
    },

    // User Joined Room
    joined: data => {
        return;
    },

    // User left
    left: data => {
        return;
    },

    // User disconnected from server
    disco: data => {
        return;
    },

    // Room User List
    roomList: data => {
        return;
    },

    // Room access denied
    denied: data => {
        return;
    },

    // Private room ready
    privateCreate: data => {
        return;
    },

    // Owner of a private room left the chat
    ownerLeft: data => {
        return;
    },

    // User joins my room
    joinRequest: data => {
        return;
    },

    // Room user count
    roomStats: data => {
        return;
    },

    // Private room data
    privStats: data => {
        return;
    },

    // Image Upload
    file: data => {
        return;
    },

    // Cam published
    camOn: data => {
        return;
    },

    // Cam turned off
    camOff: data => {
        return;
    },

    // AFK mark
    afk: data => {
        return;
    },

    // Second login overrides
    duplicate: data => {
        return;
    },

    // Admin messages
    admin: data => {
        return;
    },

    // Admin ban
    ban: data => {
        return;
    },

    // Connected (control layer)
    connectConfirm: data => {
        return;
    }
};

// perform hook
const hookIntoOnMessage = function({
    onMessage = (m => true),
    postMessage = (m => {}),
    timeOutRetryMillis = 350
} = {}) {
    /* eslint-disable no-undef */
    if (!ws || !ws.onmessage) {
        // retry
        setTimeout(() => {
            hookIntoOnMessage({ onMessage, postMessage, timeOutRetryMillis });
        }, timeOutRetryMillis);

        return;
    }

    // perform hook
    const originalOnMessage = ws.onmessage;

    ws.onmessage = (message) => {
        const resultOnMessage = onMessage(message);

        if (resultOnMessage) {
            originalOnMessage(message);
            postMessage(message);
        }
    };
    /* eslint-enable no-undef */
};

hookIntoOnMessage({
    onMessage: (message) => {
        const data = JSON.parse(message.data);

        let handler = onMessageHandlers[data.command];
        return (typeof handler === 'function') ? handler(data) : true;
    },
    postMessage: (message) => {
        const data = JSON.parse(message.data);

        let handler = postMessageHandlers[data.command];
        if (typeof handler === 'function') {
            handler(data);
        }
    }
});