Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 163:0f6da35b27a0
RLGWebD: overhaul the list of current games.
The /status WebSocket now only sends a complete list when opened. At
40-second intervals, it sends a list of games that have been updated in
the last minute. The client now uses this to keep its own list.
author | John "Elwin" Edwards |
---|---|
date | Sun, 04 Jan 2015 16:55:57 -0500 |
parents | 5a7e7ec136c8 |
children | 3a97e4ee50f0 |
comparison
equal
deleted
inserted
replaced
162:5a7e7ec136c8 | 163:0f6da35b27a0 |
---|---|
696 function getStatus(callback) { | 696 function getStatus(callback) { |
697 var now = new Date(); | 697 var now = new Date(); |
698 var statusinfo = {"s": allowlogin, "g": []}; | 698 var statusinfo = {"s": allowlogin, "g": []}; |
699 for (var tag in sessions) { | 699 for (var tag in sessions) { |
700 var gamedesc = {}; | 700 var gamedesc = {}; |
701 gamedesc["tag"] = tag; | |
702 gamedesc["p"] = sessions[tag].pname; | 701 gamedesc["p"] = sessions[tag].pname; |
703 gamedesc["g"] = sessions[tag].game.uname; | 702 gamedesc["g"] = sessions[tag].game.uname; |
704 gamedesc["i"] = now - sessions[tag].lasttime; | 703 gamedesc["i"] = now - sessions[tag].lasttime; |
705 statusinfo["g"].push(gamedesc); | 704 statusinfo["g"].push(gamedesc); |
706 } | 705 } |
707 statusinfo["dgl"] = []; | 706 statusinfo["dgl"] = []; |
708 for (var tag in dglgames) { | 707 for (var tag in dglgames) { |
709 statusinfo["dgl"].push(tag); | 708 var dglinfo = {}; |
709 var slash = tag.search('/'); | |
710 dglinfo["g"] = tag.slice(0, slash); | |
711 dglinfo["p"] = tag.slice(slash + 1); | |
712 dglinfo["i"] = -1; | |
713 statusinfo["dgl"].push(dglinfo); | |
710 } | 714 } |
711 callback(statusinfo); | 715 callback(statusinfo); |
712 } | 716 } |
713 | 717 |
714 function statusmsg(req, res) { | 718 function statusmsg(req, res) { |
971 } | 975 } |
972 else | 976 else |
973 wsRequest.reject(404, "No such resource."); | 977 wsRequest.reject(404, "No such resource."); |
974 } | 978 } |
975 | 979 |
976 /* TODO use a list instead */ | 980 /* Only games with low idle time are included. Use getStatus() for the |
981 * complete list. */ | |
977 function pushStatus() { | 982 function pushStatus() { |
978 getStatus(function(info) { | 983 var now = new Date(); |
979 info["t"] = "t"; | 984 var statusinfo = {"t": "p", "s": allowlogin, "g": [], "dgl": []}; |
980 gamemux.emit('list', info); | 985 for (var tag in sessions) { |
981 }); | 986 var delta = now - sessions[tag].lasttime; |
987 if (delta < 60000) { | |
988 var gamedesc = {}; | |
989 gamedesc["p"] = sessions[tag].pname; | |
990 gamedesc["g"] = sessions[tag].game.uname; | |
991 gamedesc["i"] = delta; | |
992 statusinfo["g"].push(gamedesc); | |
993 } | |
994 } | |
995 for (var tag in dglgames) { | |
996 var dglinfo = {}; | |
997 var slash = tag.search('/'); | |
998 dglinfo["g"] = tag.slice(0, slash); | |
999 dglinfo["p"] = tag.slice(slash + 1); | |
1000 dglinfo["i"] = -1; | |
1001 statusinfo["dgl"].push(dglinfo); | |
1002 } | |
1003 gamemux.emit('list', statusinfo); | |
982 } | 1004 } |
983 | 1005 |
984 function shutdown () { | 1006 function shutdown () { |
985 httpServer.close(); | 1007 httpServer.close(); |
986 httpServer.removeAllListeners('request'); | 1008 httpServer.removeAllListeners('request'); |
1065 tslog('rlgwebd running on port %d', httpPort); | 1087 tslog('rlgwebd running on port %d', httpPort); |
1066 wsServer = new WebSocketServer({"httpServer": httpServer}); | 1088 wsServer = new WebSocketServer({"httpServer": httpServer}); |
1067 wsServer.on("request", wsHandler); | 1089 wsServer.on("request", wsHandler); |
1068 tslog('WebSockets are online'); | 1090 tslog('WebSockets are online'); |
1069 progressWatcher = startProgressWatcher(); | 1091 progressWatcher = startProgressWatcher(); |
1070 setInterval(pushStatus, 4000); | 1092 setInterval(pushStatus, 40000); |
1071 }); | 1093 }); |
1072 | 1094 |