// ==UserScript==
// @name Camamba OnMessageHandling
// @namespace dannysaurus.camamba
// @version 0.2
// @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);
}
}
});