api.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. var defaultEvent = {}
  2. var proto = {}
  3. var api = {
  4. token: "",
  5. roomToken: "",
  6. event: null,
  7. ws: null,
  8. init(token, event) {
  9. this.token = token
  10. this.event = event || defaultEvent
  11. protobuf.load("game.proto", function (err, root) {
  12. if (err)
  13. throw err;
  14. proto.Ping = root.lookupType("Ping");
  15. proto.JoinRoom = root.lookupType("JoinRoom");
  16. proto.LeaveRoom = root.lookupType("LeaveRoom");
  17. proto.Connect = root.lookupType("Connect");
  18. proto.Disconnect = root.lookupType("Disconnect");
  19. proto.Ready = root.lookupType("Ready");
  20. proto.UnReady = root.lookupType("UnReady");
  21. proto.Start = root.lookupType("Start");
  22. proto.ChooseMaster = root.lookupType("ChooseMaster");
  23. proto.ChooseMasterFinish = root.lookupType("ChooseMasterFinish");
  24. proto.ChooseMul = root.lookupType("ChooseMul");
  25. proto.ChooseMulinish = root.lookupType("ChooseMulinish");
  26. proto.Open = root.lookupType("Open");
  27. proto.GameInit = root.lookupType("GameInit");
  28. proto.NotifyTypeEnum = root.lookupEnum("NotifyTypeEnum");
  29. console.log(proto)
  30. })
  31. },
  32. startWS() {
  33. //debug_auth 是调试,其他用之前的模式
  34. //const connectStr = "wss://nn.daxia.dev/connect?debug_auth=ucqrjnhiyHfuUrmR"
  35. const connectStr = "ws://localhost:18880/connect?debug_auth=ucqrjnhiyHfuUrmR"
  36. var ws = new WebSocket(connectStr);
  37. this.ws = ws;
  38. var token = this.token
  39. ws.onmessage = async (evt) => {
  40. console.log("ok:", evt)
  41. var received_msg = evt.data;
  42. var buffer = await received_msg.arrayBuffer()
  43. var array = new Uint8Array(buffer);
  44. var arrayLen = array.length;
  45. var dataType = array[0]
  46. var eventType = array[1]
  47. var data = array.subarray(2)
  48. if (dataType != 0) {
  49. console.log("TODO:需要处理压缩和解密====")
  50. data = decrypt("sBWBAyOaGqkuEhCw", "sBWBAyOaGqkuEhCw", array.subarray(1))
  51. eventType = data[0]
  52. data = data.subarray(1)
  53. console.log("data==>", data)
  54. }
  55. console.log("data type:", dataType)
  56. console.log("event type:", eventType)
  57. console.log("data:", data, " len:", data.length)
  58. printMsg(eventType, data)
  59. }
  60. ws.onopen = () => {
  61. // Web Socket 已连接上,使用 send() 方法发送数据
  62. let msg = { "type": "connect", "once": 123, "token": token }
  63. ws.send(JSON.stringify(msg));
  64. setInterval(() => {
  65. let msg = { "type": "ping" }
  66. ws.send(JSON.stringify(msg));
  67. }, 5000)
  68. };
  69. ws.onclose = function () {
  70. // 关闭 websocket
  71. console.log("连接已关闭...");
  72. };
  73. },
  74. joinRoom(roomID, chairID) {
  75. let msg = {
  76. "type": "perform",
  77. "version": "1.0.0",
  78. "name": "room/join",
  79. "body": {
  80. "room_id": roomID,
  81. "chair_id": chairID,
  82. },
  83. "once": "1234"
  84. }
  85. msg.body = JSON.stringify(msg.body)
  86. this.ws.send(JSON.stringify(msg))
  87. },
  88. leaveRoom() {
  89. let msg = {
  90. "type": "perform",
  91. "version": "1.0.0",
  92. "name": "room/leave",
  93. "body": {
  94. },
  95. "once": "1234"
  96. }
  97. msg.body = JSON.stringify(msg.body)
  98. this.ws.send(JSON.stringify(msg))
  99. },
  100. ready() {
  101. console.log("ready")
  102. let msg = {
  103. "type": "perform",
  104. "version": "1.0.0",
  105. "name": "qznn/ready",
  106. "body": {
  107. },
  108. "once": "1234"
  109. }
  110. msg.body = JSON.stringify(msg.body)
  111. this.ws.send(JSON.stringify(msg))
  112. },
  113. unready() {
  114. console.log("unready")
  115. let msg = {
  116. "type": "perform",
  117. "version": "1.0.0",
  118. "name": "qznn/unready",
  119. "body": {
  120. },
  121. "once": "1234"
  122. }
  123. msg.body = JSON.stringify(msg.body)
  124. this.ws.send(JSON.stringify(msg))
  125. },
  126. chooseMaster() {
  127. console.log("chooseMaster")
  128. let msg = {
  129. "type": "perform",
  130. "version": "1.0.0",
  131. "name": "qznn/choose_master",
  132. "body": {
  133. "mul": 1,
  134. },
  135. "once": "1234"
  136. }
  137. msg.body = JSON.stringify(msg.body)
  138. this.ws.send(JSON.stringify(msg))
  139. },
  140. chooseMul() {
  141. console.log("choose_mul")
  142. let msg = {
  143. "type": "perform",
  144. "version": "1.0.0",
  145. "name": "qznn/choose_mul",
  146. "body": {
  147. "mul": 1,
  148. },
  149. "once": "1234"
  150. }
  151. msg.body = JSON.stringify(msg.body)
  152. this.ws.send(JSON.stringify(msg))
  153. },
  154. open() {
  155. console.log("open")
  156. let msg = {
  157. "type": "perform",
  158. "version": "1.0.0",
  159. "name": "qznn/open",
  160. "body": {
  161. },
  162. "once": "1234"
  163. }
  164. msg.body = JSON.stringify(msg.body)
  165. this.ws.send(JSON.stringify(msg))
  166. }
  167. }
  168. function printMsg(eventType, data) {
  169. var decodedMessage = null;
  170. try {
  171. switch (eventType) {
  172. case proto.NotifyTypeEnum.values['NotifyTypePing']:
  173. decodedMessage = proto.Ping.decode(data);
  174. break;
  175. case proto.NotifyTypeEnum.values['NotifyTypeConnect']:
  176. decodedMessage = proto.Connect.decode(data);
  177. break;
  178. case proto.NotifyTypeEnum.values['NotifyTypeDisconnect']:
  179. decodedMessage = proto.Disconnect.decode(data);
  180. break;
  181. case proto.NotifyTypeEnum.values['NotifyTypeJoinRoom']:
  182. decodedMessage = proto.JoinRoom.decode(data);
  183. break;
  184. case proto.NotifyTypeEnum.values['NotifyTypeLeaveRoom']:
  185. decodedMessage = proto.LeaveRoom.decode(data);
  186. break;
  187. case proto.NotifyTypeEnum.values['NotifyTypeReady']:
  188. decodedMessage = proto.Ready.decode(data);
  189. break;
  190. case proto.NotifyTypeEnum.values['NotifyTypeUnReady']:
  191. decodedMessage = proto.UnReady.decode(data);
  192. break;
  193. case proto.NotifyTypeEnum.values['NotifyTypeStart']:
  194. decodedMessage = proto.Start.decode(data);
  195. break;
  196. case proto.NotifyTypeEnum.values['NotifyTypeChooseMaster']:
  197. decodedMessage = proto.ChooseMaster.decode(data);
  198. break;
  199. case proto.NotifyTypeEnum.values['NotifyTypeChooseMasterFinish']:
  200. decodedMessage = proto.ChooseMasterFinish.decode(data);
  201. break;
  202. case proto.NotifyTypeEnum.values['NotifyTypeChooseMul']:
  203. decodedMessage = proto.ChooseMul.decode(data);
  204. break;
  205. case proto.NotifyTypeEnum.values['NotifyTypeChooseMulinish']:
  206. decodedMessage = proto.ChooseMulinish.decode(data);
  207. break;
  208. case proto.NotifyTypeEnum.values['NotifyTypeOpen']:
  209. decodedMessage = proto.Open.decode(data);
  210. break;
  211. case proto.NotifyTypeEnum.values['NotifyTypeGameInit']:
  212. decodedMessage = proto.GameInit.decode(data);
  213. break;
  214. default:
  215. throw ("没找到类型:", eventType)
  216. }
  217. } catch (e) {
  218. console.log("err:", e)
  219. return
  220. }
  221. console.log("decode msg", Date().toLocaleString(), "==>", decodedMessage)
  222. }