Camamba Hook Into OnMessage

allows to add handlers for onMessage requests

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

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

  1. // ==UserScript==
  2. // @name Camamba Hook Into OnMessage
  3. // @namespace dannysaurus.camamba
  4. // @version 0.1
  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: null,
  18. // Chat message
  19. roomChat: null,
  20. // Private message
  21. 'private': null,
  22. // Control messages
  23. control: null,
  24. // User Joined Room
  25. joined: null,
  26. // User left
  27. left: null,
  28. // User disconnected from server
  29. disco: null,
  30. // Room User List
  31. roomList: null,
  32. // Room access denied
  33. denied: null,
  34. // Private room ready
  35. privateCreate: null,
  36. // Owner of a private room left the chat
  37. ownerLeft: null,
  38. // User joins my room
  39. joinRequest: null,
  40. // Room user count
  41. roomStats: null,
  42. // Private room data
  43. privStats: null,
  44. // Image Upload
  45. file: null,
  46. // Cam published
  47. camOn: null,
  48. // Cam turned off
  49. camOff: null,
  50. // AFK mark
  51. afk: null,
  52. // Second login overrides
  53. duplicate: null,
  54. // Admin messages
  55. admin: null,
  56. // Admin ban
  57. ban: null,
  58. // Connected (control layer)
  59. connectConfirm: null,
  60. };
  61.  
  62. // === overwrite relevant property to add handler after onMessage got processed
  63. const postMessageHandlers = {
  64. // Keepalive response
  65. pong: null,
  66. // Chat message
  67. roomChat: null,
  68. // Private message
  69. 'private': null,
  70. // Control messages
  71. control: null,
  72. // User Joined Room
  73. joined: null,
  74. // User left
  75. left: null,
  76. // User disconnected from server
  77. disco: null,
  78. // Room User List
  79. roomList: null,
  80. // Room access denied
  81. denied: null,
  82. // Private room ready
  83. privateCreate: null,
  84. // Owner of a private room left the chat
  85. ownerLeft: null,
  86. // User joins my room
  87. joinRequest: null,
  88. // Room user count
  89. roomStats: null,
  90. // Private room data
  91. privStats: null,
  92. // Image Upload
  93. file: null,
  94. // Cam published
  95. camOn: null,
  96. // Cam turned off
  97. camOff: null,
  98. // AFK mark
  99. afk: null,
  100. // Second login overrides
  101. duplicate: null,
  102. // Admin messages
  103. admin: null,
  104. // Admin ban
  105. ban: null,
  106. // Connected (control layer)
  107. connectConfirm: null,
  108. };
  109.  
  110. // perform hook
  111. const hookIntoOnMessage = function({
  112. onMessage = (m => true),
  113. postMessage = (m => {}),
  114. timeOutRetryMillis = 350
  115. } = {}) {
  116. /* eslint-disable no-undef */
  117. if (!ws || !ws.onmessage) {
  118. // retry
  119. setTimeout(() => {
  120. hookIntoOnMessage({ onMessage, postMessage, timeOutRetryMillis });
  121. }, timeOutRetryMillis);
  122.  
  123. return;
  124. }
  125.  
  126. // perform hook
  127. const originalOnMessage = ws.onmessage;
  128.  
  129. ws.onmessage = (message) => {
  130. const resultOnMessage = onMessage(message);
  131.  
  132. if (resultOnMessage) {
  133. originalOnMessage(message);
  134. postMessage(message);
  135. }
  136. };
  137. /* eslint-enable no-undef */
  138. };
  139.  
  140. hookIntoOnMessage({
  141. onMessage: (message) => {
  142. const data = JSON.parse(message.data);
  143.  
  144. const handler = onMessageHandlers[data.command];
  145. if (typeof handler === 'function') {
  146. const result = handler(data);
  147. message.data = JSON.stringify(data);
  148. return result;
  149. }
  150. return true;
  151. },
  152. postMessage: (message) => {
  153. const data = JSON.parse(message.data);
  154.  
  155. let handler = postMessageHandlers[data.command];
  156. if (typeof handler === 'function') {
  157. handler(data);
  158. }
  159. }
  160. });