Commit | Line | Data |
---|---|---|
a29d9d6b | 1 | const url = require('url'); |
1d184b4c | 2 | |
2807f530 | 3 | // Node version in Ubuntu 16.04 does not know about URL class |
98db2082 BA |
4 | function getJsonFromUrl(url) |
5 | { | |
c6788ecf BA |
6 | // url: /game/XYZ/?sid=XYZ |
7 | const queryParts = url.split("?"); | |
8 | let result = {page: queryParts[0]}; | |
9 | queryParts[1].split("&").forEach((part) => { | |
5bd05dba BA |
10 | const item = part.split("="); |
11 | result[item[0]] = decodeURIComponent(item[1]); | |
12 | }); | |
13 | return result; | |
2807f530 BA |
14 | } |
15 | ||
1d184b4c | 16 | module.exports = function(wss) { |
5bd05dba BA |
17 | let clients = {}; //associative array sid --> socket |
18 | wss.on("connection", (socket, req) => { | |
19 | const query = getJsonFromUrl(req.url); | |
20 | const sid = query["sid"]; | |
d4036efe | 21 | // TODO: later, allow duplicate connections (shouldn't be much more complicated) |
5bd05dba BA |
22 | if (!!clients[sid]) |
23 | return socket.send(JSON.stringify({code:"duplicate"})); | |
92a523d1 | 24 | clients[sid] = {sock: socket, page: query["page"]}; |
c6788ecf | 25 | const notifyRoom = (page,code,obj={},excluded=[]) => { |
92a523d1 | 26 | Object.keys(clients).forEach(k => { |
c6788ecf BA |
27 | if (k in excluded) |
28 | return; | |
92a523d1 | 29 | if (k != sid && clients[k].page == page) |
5c8e044f BA |
30 | { |
31 | clients[k].sock.send(JSON.stringify(Object.assign( | |
c6788ecf | 32 | {code:code, from:sid}, obj))); |
5c8e044f | 33 | } |
92a523d1 BA |
34 | }); |
35 | }; | |
c6788ecf | 36 | notifyRoom(query["page"], "connect"); //Hall or Game |
5a3da968 | 37 | socket.on("message", objtxt => { |
5bd05dba | 38 | let obj = JSON.parse(objtxt); |
5a3da968 | 39 | if (!!obj.target && !clients[obj.target]) |
b4d619d1 | 40 | return; //receiver not connected, nothing we can do |
c6788ecf BA |
41 | |
42 | console.log(obj.code); | |
43 | console.log(clients); | |
44 | ||
5bd05dba BA |
45 | switch (obj.code) |
46 | { | |
81d9ce72 | 47 | case "pollclients": |
f41ce580 | 48 | const curPage = clients[sid].page; |
81d9ce72 | 49 | socket.send(JSON.stringify({code:"pollclients", |
c6788ecf BA |
50 | sockIds: Object.keys(clients).filter(k => k != sid && |
51 | (clients[k].page == curPage || | |
52 | // Consider that people playing are in Hall too: | |
53 | (curPage == "/" && clients[k].page.indexOf("/game/") >= 0)) | |
54 | )})); | |
92a523d1 BA |
55 | break; |
56 | case "pagechange": | |
c6788ecf | 57 | notifyRoom(clients[sid].page, "disconnect"); |
92a523d1 | 58 | clients[sid].page = obj.page; |
c6788ecf | 59 | notifyRoom(obj.page, "connect"); |
5a3da968 BA |
60 | break; |
61 | case "askidentity": | |
f41ce580 BA |
62 | clients[obj.target].sock.send(JSON.stringify( |
63 | {code:"askidentity",from:sid})); | |
81d9ce72 | 64 | break; |
dd75774d | 65 | case "askchallenge": |
f41ce580 BA |
66 | clients[obj.target].sock.send(JSON.stringify( |
67 | {code:"askchallenge",from:sid})); | |
81d9ce72 BA |
68 | break; |
69 | case "askgame": | |
c6788ecf BA |
70 | // Check all clients playing, and send them a "askgame" message |
71 | Object.keys(clients).forEach(k => { | |
72 | if (k != sid && clients[k].page.indexOf("/game/") >= 0) | |
73 | { | |
74 | clients[k].sock.send(JSON.stringify( | |
75 | {code:"askgame", from: sid})); | |
76 | } | |
77 | }); | |
f41ce580 BA |
78 | clients[obj.target].sock.send(JSON.stringify( |
79 | {code:"askgame",from:sid})); | |
5a3da968 BA |
80 | break; |
81 | case "identity": | |
f41ce580 BA |
82 | clients[obj.target].sock.send(JSON.stringify( |
83 | {code:"identity",user:obj.user})); | |
4d64881e | 84 | break; |
5bd05dba | 85 | case "refusechallenge": |
f41ce580 BA |
86 | clients[obj.target].sock.send(JSON.stringify( |
87 | {code:"refusechallenge", cid:obj.cid, from:sid})); | |
5bd05dba | 88 | break; |
98f48579 | 89 | case "deletechallenge": |
f41ce580 BA |
90 | clients[obj.target].sock.send(JSON.stringify( |
91 | {code:"deletechallenge", cid:obj.cid, from:sid})); | |
98f48579 | 92 | break; |
a6bddfc6 | 93 | case "newgame": |
92a523d1 | 94 | clients[obj.target].sock.send(JSON.stringify( |
5bd05dba | 95 | {code:"newgame", gameInfo:obj.gameInfo, cid:obj.cid})); |
a6bddfc6 | 96 | break; |
42c15a75 | 97 | case "challenge": |
92a523d1 | 98 | clients[obj.target].sock.send(JSON.stringify( |
42c15a75 BA |
99 | {code:"challenge", chall:obj.chall, from:sid})); |
100 | break; | |
dd75774d | 101 | case "game": |
c6788ecf BA |
102 | if (!!obj.target) |
103 | { | |
104 | clients[obj.target].sock.send(JSON.stringify( | |
105 | {code:"game", game:data.game, from:sid})); | |
106 | } | |
107 | else | |
108 | { | |
109 | // Notify all room except opponent and me: | |
110 | notifyRoom("/", "game", {game:data.game}, [data.oppsid]); | |
111 | } | |
4d64881e | 112 | break; |
5bd05dba | 113 | case "newchat": |
c6788ecf | 114 | notifyRoom(query["page"], "newchat", {msg:obj.msg, name:obj.name}); |
5bd05dba | 115 | break; |
5bd05dba BA |
116 | // TODO: WebRTC instead in this case (most demanding?) |
117 | case "newmove": | |
f41ce580 | 118 | clients[obj.target].sock.send(JSON.stringify( |
c6788ecf | 119 | {code:"newmove", move:obj.move})); |
5bd05dba BA |
120 | break; |
121 | case "lastate": | |
f41ce580 BA |
122 | clients[obj.target].sock.send(JSON.stringify( |
123 | {code:"lastate", state:obj.state})); | |
5bd05dba | 124 | break; |
5bd05dba | 125 | case "resign": |
f41ce580 BA |
126 | clients[obj.target].sock.send(JSON.stringify( |
127 | {code:"resign"})); | |
5bd05dba | 128 | break; |
b988c726 | 129 | case "abort": |
f41ce580 BA |
130 | clients[obj.target].sock.send(JSON.stringify( |
131 | {code:"abort",msg:obj.msg})); | |
b988c726 | 132 | break; |
2cc10cdb | 133 | case "drawoffer": |
f41ce580 BA |
134 | clients[obj.target].sock.send(JSON.stringify( |
135 | {code:"drawoffer"})); | |
2cc10cdb BA |
136 | break; |
137 | case "draw": | |
f41ce580 BA |
138 | clients[obj.target].sock.send(JSON.stringify( |
139 | {code:"draw"})); | |
2cc10cdb | 140 | break; |
5bd05dba BA |
141 | } |
142 | }); | |
143 | socket.on("close", () => { | |
92a523d1 | 144 | const page = clients[sid].page; |
5bd05dba | 145 | delete clients[sid]; |
92a523d1 | 146 | notifyRoom(page, "disconnect"); |
5bd05dba BA |
147 | }); |
148 | }); | |
1d184b4c | 149 | } |