main.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. /*eslint-disable*/
  2. import { MyWebSocket } from "./common/MyWebSocket.js";
  3. /**
  4. * 主程序
  5. */
  6. export class Main {
  7. // 每次 new 出对象则会调用这个构造函数
  8. constructor() {
  9. // 记录当前要私聊的cid
  10. this.objUserCid = null;
  11. // websocket 的端口号,可以在调用接口后更新
  12. this.protWebSocket = 3000;
  13. }
  14. // 实现单例模式
  15. static find() {
  16. if (!Main.instance) {
  17. Main.instance = new Main();
  18. }
  19. return Main.instance;
  20. }
  21. /**
  22. * 视图
  23. */
  24. view = function() {
  25. let thisClass = this;
  26. // 更新websocket的端口号
  27. MyWebSocket.find().prot = thisClass.protWebSocket;
  28. let thisTime = new Date().getTime();
  29. document.getElementById("nickname").value = "自定义昵称_" + thisTime;
  30. document.getElementById("nickname").onchange = function(e) {
  31. // console.log(
  32. // "nickname", this.value
  33. // );
  34. /**
  35. * 更新自己当前用户的数据字段,
  36. * 更新后,同时会自动通知自己
  37. * 所在房间的所有用户,更新了哪些字段数据
  38. */
  39. MyWebSocket.find().commonSend(
  40. "upUser",
  41. /**
  42. * 更新的字段数据,如果字段不存在,则会再服务器里自动追加对应的字段数据
  43. * 如果存在,则是更新
  44. */
  45. {
  46. "name" : this.value,
  47. }
  48. );
  49. }
  50. document.getElementById("socketStart").onclick = function() {
  51. MyWebSocket.find().nickname = document.getElementById("nickname").value;
  52. // 这里的 userId 后面如果你想要跟数据库的id对应才填写,否则这里会自动生成一个唯一的userId
  53. // MyWebSocket.find().userId = null;
  54. MyWebSocket.find().webSocketInit();
  55. // 房间里发送变化触发回调
  56. MyWebSocket.find().roomUpdateCallback = function(
  57. // 类型
  58. type,
  59. // 某个用户退出,或者加入的时候,该用户的相关数据
  60. cidJson,
  61. // 某个用户更新了具体哪些字段,后续例如同步用户昵称,坐标等数据使用
  62. dbUpdate
  63. ) {
  64. console.log(
  65. "roomUpdateCallback", type, cidJson, dbUpdate
  66. );
  67. if (typeof type == "string") {
  68. switch (type) {
  69. // 有用户退出
  70. case "roomUserExit":
  71. thisClass.roomUserExitEvent(cidJson);
  72. break;
  73. // 有用户加入
  74. case "roomUserJoin":
  75. thisClass.roomUserJoinEvent(cidJson);
  76. break;
  77. // 用户数据发送了变化
  78. case "roomUserDbUpdate":
  79. thisClass.roomUserDbUpdateEvent(cidJson, dbUpdate);
  80. break;
  81. }
  82. }
  83. // // 更新当前房间号的列表数据
  84. // console.log("更新当前房间号的列表数据", MyWebSocket.find().roomList);
  85. thisClass.rightUserListEvent();
  86. }
  87. // 每次房间里有群发消息的时候回调
  88. MyWebSocket.find().roomChatAllCallback = function(
  89. // 用户的 json数据
  90. cidJson,
  91. // 消息的内容
  92. message
  93. ) {
  94. // console.log(
  95. // "MyWebSocket.find().roomChatAllCallback",
  96. // cidJson, message
  97. // );
  98. thisClass.roomChatAllCallbackEvent(cidJson, message);
  99. }
  100. /**
  101. * 每次有其他用户单独发送消息给你回调
  102. */
  103. MyWebSocket.find().cidSendCallback = function(
  104. // 发起消息用户的json数据
  105. sendCidJson,
  106. // 接收消息用户的json数据
  107. getCidJson,
  108. // 消息内容
  109. message
  110. ) {
  111. thisClass.cidSendCallbackEvent(sendCidJson, getCidJson, message);
  112. }
  113. }
  114. document.getElementById("joinRoom").onclick = function() {
  115. var room = document.getElementById("room").value;
  116. MyWebSocket.find().joinRoom(room);
  117. }
  118. document.getElementById("subSend").onclick = function() {
  119. var objTxtSend = document.getElementById("txtSend");
  120. var sendTxt = objTxtSend.value;
  121. if (sendTxt == null || sendTxt == undefined) {
  122. return;
  123. }
  124. // console.log(
  125. // "发送消息的内容", sendTxt
  126. // );
  127. if (thisClass.objUserCid != null && thisClass.objUserCid != undefined) {
  128. // 给指定的用户发送消息
  129. MyWebSocket.find().cidSend("chat", thisClass.objUserCid, sendTxt);
  130. } else {
  131. // 房间里群聊
  132. MyWebSocket.find().roomSend("chatAll", sendTxt);
  133. }
  134. objTxtSend.value = "";
  135. }
  136. document.getElementById("objUserExit").onclick = function() {
  137. thisClass.objUserCid = null;
  138. document.getElementById("objUserCid").innerHTML = "";
  139. // 重新更新UI
  140. thisClass.rightUserListEvent();
  141. }
  142. }
  143. /**
  144. * 更新当前的用户列表
  145. */
  146. rightUserListEvent = function() {
  147. // console.log("更新当前房间号的列表数据 rightUserListEvent", MyWebSocket.find().roomList);
  148. let thisClass = this;
  149. var html = "";
  150. for (var i = 0; i < MyWebSocket.find().roomList.length; i++) {
  151. var thisRoomList = MyWebSocket.find().roomList[i];
  152. // console.log(
  153. // "thisRoomList", thisRoomList
  154. // );
  155. var name = thisRoomList["name"];
  156. var cid = thisRoomList["cid"];
  157. var userId = thisRoomList["userId"];
  158. var roomId = thisRoomList["roomId"];
  159. let classNew = "select ";
  160. if (thisClass.objUserCid == cid) {
  161. classNew += "selectYes ";
  162. }
  163. var addHtml = '<div class="' + classNew + '" cid="'
  164. + cid +'" userId="'
  165. + userId +'" roomId="'
  166. + roomId + '" >'
  167. + name
  168. +'</div>';
  169. html += addHtml;
  170. }
  171. document.getElementById("rightUserList").innerHTML = html;
  172. $("#rightUserList").find(".select").click(function(e) {
  173. var obj = $(this);
  174. var cid = obj.attr("cid");
  175. var userId = obj.attr("userId");
  176. var roomId = obj.attr("roomId");
  177. console.log("userObj", cid, userId, roomId);
  178. thisClass.objUserCid = cid;
  179. document.getElementById("objUserCid").innerHTML = thisClass.objUserCid;
  180. // 重新更新UI,让被选中的 cid 目标有样式
  181. thisClass.rightUserListEvent();
  182. });
  183. return thisClass;
  184. }
  185. /**
  186. * 房间有用户加入
  187. * cidJson 该用户的相关数据
  188. */
  189. roomUserJoinEvent = function(cidJson) {
  190. let thisClass = this;
  191. // console.log(
  192. // "房间有用户加入 roomUserJoinEvent", cidJson
  193. // );
  194. let name = cidJson.name;
  195. let userId = cidJson.userId;
  196. /**
  197. * 如果加入房间的是自己用户,说明是自己第一次进入房间
  198. * 后续开发,这里就需要特殊进行处理,自己第一次登陆
  199. * 则要根据房间里所有用户的数据,同步,例如游戏中玩家的坐标,穿着等各种数据参数
  200. */
  201. if (userId == MyWebSocket.find().userId) {
  202. name = "自己";
  203. }
  204. let objDiv = document.createElement("div");
  205. objDiv.className = "chat";
  206. let addHtml = '';
  207. addHtml += '<p class="chatTitle chatSys">' + name + '</p>';
  208. addHtml += '<p class="chatTxt chatSys">用户-进入-房间</p>';
  209. objDiv.innerHTML = addHtml;
  210. document.getElementById('chatList').appendChild(objDiv);
  211. thisClass.chatListEvent();
  212. }
  213. /**
  214. * 房间有用户退出
  215. * cidJson 该用户的相关数据
  216. */
  217. roomUserExitEvent = function(cidJson) {
  218. let thisClass = this;
  219. // console.log(
  220. // "房间有用户退出 roomUserExitEvent", cidJson
  221. // );
  222. let name = cidJson.name;
  223. let userId = cidJson.userId;
  224. /**
  225. * 如果是自己退出,后续可能会有些单独处理的逻辑
  226. */
  227. if (userId == MyWebSocket.find().userId) {
  228. name = "自己";
  229. }
  230. let objDiv = document.createElement("div");
  231. objDiv.className = "chat";
  232. let addHtml = '';
  233. addHtml += '<p class="chatTitle chatSys">' + name + '</p>';
  234. addHtml += '<p class="chatTxt chatSys">用户-退出-房间</p>';
  235. objDiv.innerHTML = addHtml;
  236. document.getElementById('chatList').appendChild(objDiv);
  237. thisClass.chatListEvent();
  238. }
  239. /**
  240. * 当前房间里的某个用户数据发生了变化
  241. * cidJson 该用户的相关数据
  242. * dbUpdate 具体变化了哪些数据
  243. */
  244. roomUserDbUpdateEvent = function(cidJson, dbUpdate) {
  245. let thisClass = this;
  246. let name = cidJson.name;
  247. let userId = cidJson.userId;
  248. /**
  249. * 如果是自己退出,后续可能会有些单独处理的逻辑
  250. */
  251. if (userId == MyWebSocket.find().userId) {
  252. console.log("自己在房间里更新了数据", dbUpdate);
  253. }
  254. console.log(
  255. "当前房间里的某个用户数据发生了变化 roomUserDbUpdateEvent",
  256. cidJson, dbUpdate
  257. );
  258. }
  259. /**
  260. * 每次房间里有群发消息的时候回调
  261. * cidJson 该用户的相关数据
  262. * message 消息的内容
  263. */
  264. roomChatAllCallbackEvent = function(cidJson, message) {
  265. let thisClass = this;
  266. // console.log(
  267. // "roomChatAllCallbackEvent", cidJson, message
  268. // );
  269. let name = cidJson.name;
  270. let userId = cidJson.userId;
  271. let jsonMessage = message.message;
  272. if (typeof jsonMessage["type"] != 'string') {
  273. return thisClass;
  274. }
  275. let jsonMessageType = jsonMessage.type;
  276. // console.log(
  277. // "roomChatAllCallbackEvent", jsonMessageType, jsonMessage
  278. // );
  279. // 这里根据自定义不同类型,来判断触发不同逻辑
  280. switch (jsonMessageType) {
  281. // 群发聊天消息
  282. case "chatAll":
  283. let content = jsonMessage.content;
  284. /**
  285. * 如果是自己退出,后续可能会有些单独处理的逻辑
  286. */
  287. if (userId == MyWebSocket.find().userId) {
  288. name = "自己";
  289. }
  290. let objDiv = document.createElement("div");
  291. objDiv.className = "chat";
  292. let addHtml = '';
  293. addHtml += '<p class="chatTitle">' + name + '</p>';
  294. addHtml += '<p class="chatTxt">' + content + '</p>';
  295. objDiv.innerHTML = addHtml;
  296. document.getElementById('chatList').appendChild(objDiv);
  297. thisClass.chatListEvent();
  298. break;
  299. // //
  300. // case "":
  301. // break;
  302. // //
  303. // case "":
  304. // break;
  305. // //
  306. // case "":
  307. // break;
  308. }
  309. return thisClass;
  310. }
  311. /**
  312. * 每次有其他用户单独发送消息给你回调
  313. * sendCidJson 发起消息用户的json数据
  314. * getCidJson 接收消息用户的json数据
  315. * message 消息内容
  316. */
  317. cidSendCallbackEvent = function(sendCidJson, getCidJson, message) {
  318. let thisClass = this;
  319. // console.log(
  320. // "cidSendCallbackEvent", sendCidJson, getCidJson, message
  321. // );
  322. let sendCidJsonName = sendCidJson["name"];
  323. /**
  324. * 如果是自己退出,后续可能会有些单独处理的逻辑
  325. */
  326. if (sendCidJson["userId"] == MyWebSocket.find().userId) {
  327. sendCidJsonName = "自己";
  328. }
  329. let getCidJsonName = getCidJson["name"];
  330. /**
  331. * 如果是自己退出,后续可能会有些单独处理的逻辑
  332. */
  333. if (getCidJson["userId"] == MyWebSocket.find().userId) {
  334. getCidJsonName = "自己";
  335. }
  336. let type = message["type"];
  337. let content = message["content"];
  338. // 这里根据自定义不同类型,来判断触发不同逻辑
  339. switch (type) {
  340. // 处理私聊聊天内容
  341. case "chat":
  342. let objDiv = document.createElement("div");
  343. objDiv.className = "chat";
  344. let addHtml = '';
  345. addHtml += '<p class="chatTitle chatObj">' + sendCidJsonName + ' 给 ' + getCidJsonName + ' 发送的私聊消息' + '</p>';
  346. addHtml += '<p class="chatTxt chatObj">' + content + '</p>';
  347. objDiv.innerHTML = addHtml;
  348. document.getElementById('chatList').appendChild(objDiv);
  349. thisClass.chatListEvent();
  350. break;
  351. // //
  352. // case "":
  353. // break;
  354. // //
  355. // case "":
  356. // break;
  357. // //
  358. // case "":
  359. // break;
  360. }
  361. return thisClass;
  362. }
  363. // 滚动条滚动到最底部
  364. chatListEvent = function() {
  365. // 滚动条滚动到最底部
  366. document.getElementById("chatList").scrollTop = document.getElementById("chatList").scrollHeight;
  367. }
  368. }