- case "refusechallenge":
- clients[obj.target].sock.send(JSON.stringify(
- {code:"refusechallenge", cid:obj.cid, from:sid}));
+ }
+ case "pollclientsandgamers": {
+ // From Hall
+ let sockIds = [];
+ Object.keys(clients["/"]).forEach(k => {
+ // Avoid polling myself: no new information to get
+ if (k != sid) sockIds.push({sid:k});
+ });
+ // NOTE: a "gamer" could also just be an observer
+ Object.keys(clients).forEach(p => {
+ if (p.indexOf("/game/") >= 0) {
+ Object.keys(clients[p]).forEach(k => {
+ // 'page' indicator is needed for gamers
+ if (k != sid) sockIds.push({ sid:k, page:p });
+ });
+ }
+ });
+ send(socket, { code: "pollclientsandgamers", sockIds: sockIds });
+ break;
+ }
+
+ // Asking something: from is fully identified,
+ // but the requested resource can be from any tmpId (except current!)
+ case "askidentity":
+ case "asklastate":
+ case "askchallenges":
+ case "askgame": {
+ const pg = obj.page || page; //required for askidentity and askgame
+ if (!!clients[pg] && !!clients[pg][obj.target]) {
+ let tmpIds = Object.keys(clients[pg][obj.target]);
+ if (obj.target == sid) {
+ // Targetting myself
+ const idx_myTmpid = tmpIds.findIndex(x => x == tmpId);
+ if (idx_myTmpid >= 0) tmpIds.splice(idx_myTmpid, 1);
+ }
+ if (tmpIds.length > 0) {
+ const ttmpId = tmpIds[Math.floor(Math.random() * tmpIds.length)];
+ send(
+ clients[pg][obj.target][ttmpId].socket,
+ { code: obj.code, from: [sid,tmpId,page] }
+ );
+ }
+ }