Camamba OnMessageHandling

allows to add handlers for onMessage requests

当前为 2021-03-20 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/423665/913136/Camamba%20OnMessageHandling.js

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