您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
allows to add handlers for onMessage requests
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/423665/913862/Camamba%20Hook%20Into%20OnMessage.js
// ==UserScript== // @name Camamba Hook Into OnMessage // @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: null, // Chat message roomChat: null, // Private message 'private': null, // Control messages control: null, // User Joined Room joined: null, // User left left: null, // User disconnected from server disco: null, // Room User List roomList: null, // Room access denied denied: null, // Private room ready privateCreate: null, // Owner of a private room left the chat ownerLeft: null, // User joins my room joinRequest: null, // Room user count roomStats: null, // Private room data privStats: null, // Image Upload file: null, // Cam published camOn: null, // Cam turned off camOff: null, // AFK mark afk: null, // Second login overrides duplicate: null, // Admin messages admin: null, // Admin ban ban: null, // Connected (control layer) connectConfirm: null, }; // === overwrite relevant property to add handler after onMessage got processed const postMessageHandlers = { // Keepalive response pong: null, // Chat message roomChat: null, // Private message 'private': null, // Control messages control: null, // User Joined Room joined: null, // User left left: null, // User disconnected from server disco: null, // Room User List roomList: null, // Room access denied denied: null, // Private room ready privateCreate: null, // Owner of a private room left the chat ownerLeft: null, // User joins my room joinRequest: null, // Room user count roomStats: null, // Private room data privStats: null, // Image Upload file: null, // Cam published camOn: null, // Cam turned off camOff: null, // AFK mark afk: null, // Second login overrides duplicate: null, // Admin messages admin: null, // Admin ban ban: null, // Connected (control layer) connectConfirm: null, }; // 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); const handler = onMessageHandlers[data.command]; if (typeof handler === 'function') { const result = handler(data); message.data = JSON.stringify(data); return result; } return true; }, postMessage: (message) => { const data = JSON.parse(message.data); let handler = postMessageHandlers[data.command]; if (typeof handler === 'function') { handler(data); } } });