Camamba Hook Into OnMessage

allows to add handlers for onMessage requests

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/423665/1180072/Camamba%20Hook%20Into%20OnMessage.js

  1. // ==UserScript==
  2. // @name Camamba Hook Into OnMessage Library
  3. // @namespace dannysaurus.camamba
  4. // @version 0.2
  5. // @description allows to add handlers for onMessage requests
  6. // @license MIT License
  7. // @include https://www.camamba.com/chat/
  8. // @include https://www.de.camamba.com/chat/
  9. // ==/UserScript==
  10.  
  11. /* jslint esversion: 9 */
  12. /* global me, camData, rooms, blockList, friendList, friendRequests, adminMessages, jsLang, byId, myRooms, knownUsers, activeRoom, selectedUser, settings */
  13.  
  14. // https://gf.qytechs.cn/scripts/423665-camamba-hook-into-onmessage
  15.  
  16. // === overwrite relevant property to add handler before onMessage is going to be processed
  17. const onMessageHandlers = {
  18. // Keepalive response
  19. pong: data => {
  20. return true;
  21. },
  22.  
  23. // Chat message
  24. roomChat: data => {
  25. return true;
  26. },
  27.  
  28. // Private message
  29. private: data => {
  30. return true;
  31. },
  32.  
  33. // Control messages
  34. control: data => {
  35. return true;
  36. },
  37.  
  38. // User Joined Room
  39. joined: data => {
  40. return true;
  41. },
  42.  
  43. // User left
  44. left: data => {
  45. return true;
  46. },
  47.  
  48. // User disconnected from server
  49. disco: data => {
  50. return true;
  51. },
  52.  
  53. // Room User List
  54. roomList: data => {
  55. return true;
  56. },
  57.  
  58. // Room access denied
  59. denied: data => {
  60. return true;
  61. },
  62.  
  63. // Private room ready
  64. privateCreate: data => {
  65. return true;
  66. },
  67.  
  68. // Owner of a private room left the chat
  69. ownerLeft: data => {
  70. return true;
  71. },
  72.  
  73. // User joins my room
  74. joinRequest: data => {
  75. return true;
  76. },
  77.  
  78. // Room user count
  79. roomStats: data => {
  80. return true;
  81. },
  82.  
  83. // Private room data
  84. privStats: data => {
  85. return true;
  86. },
  87.  
  88. // Image Upload
  89. file: data => {
  90. return true;
  91. },
  92.  
  93. // Cam published
  94. camOn: data => {
  95. return true;
  96. },
  97.  
  98. // Cam turned off
  99. camOff: data => {
  100. return true;
  101. },
  102.  
  103. // AFK mark
  104. afk: data => {
  105. return true;
  106. },
  107.  
  108. // Second login overrides
  109. duplicate: data => {
  110. return true;
  111. },
  112.  
  113. // Admin messages
  114. admin: data => {
  115. return true;
  116. },
  117.  
  118. // Admin ban
  119. ban: data => {
  120. return true;
  121. },
  122.  
  123. // Connected (control layer)
  124. connectConfirm: data => {
  125. return true;
  126. }
  127. };
  128.  
  129. // === overwrite relevant property to add handler after onMessage got processed
  130. const postMessageHandlers = {
  131. // Keepalive response
  132. pong: data => {
  133. return;
  134. },
  135.  
  136. // Chat message
  137. roomChat: data => {
  138. return;
  139. },
  140.  
  141. // Private message
  142. private: data => {
  143. return;
  144. },
  145.  
  146. // Control messages
  147. control: data => {
  148. return;
  149. },
  150.  
  151. // User Joined Room
  152. joined: data => {
  153. return;
  154. },
  155.  
  156. // User left
  157. left: data => {
  158. return;
  159. },
  160.  
  161. // User disconnected from server
  162. disco: data => {
  163. return;
  164. },
  165.  
  166. // Room User List
  167. roomList: data => {
  168. return;
  169. },
  170.  
  171. // Room access denied
  172. denied: data => {
  173. return;
  174. },
  175.  
  176. // Private room ready
  177. privateCreate: data => {
  178. return;
  179. },
  180.  
  181. // Owner of a private room left the chat
  182. ownerLeft: data => {
  183. return;
  184. },
  185.  
  186. // User joins my room
  187. joinRequest: data => {
  188. return;
  189. },
  190.  
  191. // Room user count
  192. roomStats: data => {
  193. return;
  194. },
  195.  
  196. // Private room data
  197. privStats: data => {
  198. return;
  199. },
  200.  
  201. // Image Upload
  202. file: data => {
  203. return;
  204. },
  205.  
  206. // Cam published
  207. camOn: data => {
  208. return;
  209. },
  210.  
  211. // Cam turned off
  212. camOff: data => {
  213. return;
  214. },
  215.  
  216. // AFK mark
  217. afk: data => {
  218. return;
  219. },
  220.  
  221. // Second login overrides
  222. duplicate: data => {
  223. return;
  224. },
  225.  
  226. // Admin messages
  227. admin: data => {
  228. return;
  229. },
  230.  
  231. // Admin ban
  232. ban: data => {
  233. return;
  234. },
  235.  
  236. // Connected (control layer)
  237. connectConfirm: data => {
  238. return;
  239. }
  240. };
  241.  
  242.  
  243. (() => {
  244. 'use strict';
  245.  
  246. const onMessage = (message) => {
  247. const data = JSON.parse(message.data);
  248.  
  249. let handler = onMessageHandlers[data.command];
  250. return (typeof handler === 'function') ? handler(data) : true;
  251. };
  252.  
  253. const postMessage = (message) => {
  254. const data = JSON.parse(message.data);
  255.  
  256. let handler = postMessageHandlers[data.command];
  257. if (typeof handler === 'function') {
  258. handler(data);
  259. }
  260. };
  261.  
  262. (async () => {
  263. const wait = async (ms) => new Promise(res => setTimeout(res, ms));
  264. // wait until websocket has been connected
  265. while (typeof ws !== 'object' || !ws || !ws.readyState) {
  266. await wait(100);
  267. }
  268.  
  269. const originalOnMessage = ws.onmessage;
  270. ws.onmessage = (message) => {
  271. const resultOnMessage = onMessage(message);
  272.  
  273. if (resultOnMessage) {
  274. originalOnMessage(message);
  275. postMessage(message);
  276. }
  277. };
  278. })();
  279. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址