UNPKG

@screeps/engine

Version:

This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.

123 lines (106 loc) 3.44 kB
'use strict'; var q = require('q'), _ = require('lodash'), utils = require('./utils'), driver = utils.getDriver(), config = require('./config'); var usersInRooms, roomNames, usersDone = {}, roomsDone = {}, activeUsers, started = false, waitDeferred, roomsQueue, timeout; driver.listenUserDoneTick(function (userId) { if (!started) { return; } //console.log('-->', userId); usersDone[userId] = true; throttledProcess(); }); function doProcess() { var add = [], notDone = 0; for (var i = 0; i < roomNames.length; i++) { if (roomsDone[roomNames[i]]) { continue; } var flag = 0, usersInThisRoom = usersInRooms[roomNames[i]]; for (var j = 0; j < usersInThisRoom.length; j++) { if (!usersInThisRoom[j]) { continue; } if (!usersDone[usersInThisRoom[j]] && !usersDone[usersInThisRoom[j] + ':' + roomNames[i]] && (activeUsers[usersInThisRoom[j]] || usersInThisRoom[j] == '2' || usersInThisRoom[j] == '3')) { flag++; break; } } if (!flag) { //console.log(`! room ${roomNames[i]} done!`); roomsDone[roomNames[i]] = true; add.push(roomNames[i]); } else { //console.log(`...... room ${roomNames[i]} waiting: ${u.join(',')}`) notDone++; } } if (add.length) { roomsQueue.addMulti(add); } if (!notDone) { clearTimeout(timeout); waitDeferred.resolve(); } } var throttledProcess = _.throttle(doProcess, 50); function start(rooms, users) { return driver.getUsersInRoomPresence(_.map(rooms, '_id')).then(function (data) { usersInRooms = data; usersDone = {}; activeUsers = {}; for (var i = 0; i < users.length; i++) { activeUsers[users[i]._id] = true; } roomsDone = {}; roomNames = Object.keys(usersInRooms); started = true; waitDeferred = q.defer(); timeout = setTimeout(function () { waitDeferred.reject('rooms/users tracker timeout'); for (var i = 0; i < roomNames.length; i++) { if (!roomsDone[roomNames[i]]) { var usersInThisRoom = usersInRooms[roomNames[i]]; for (var j = 0; j < usersInThisRoom.length; j++) { if (!usersInThisRoom[j]) { continue; } if (!usersDone[usersInThisRoom[j]] && !usersDone[usersInThisRoom[j] + ':' + roomNames[i]] && (activeUsers[usersInThisRoom[j]] || usersInThisRoom[j] == '2' || usersInThisRoom[j] == '3')) { console.log('!!! room ' + roomNames[i] + ' waiting for ' + usersInThisRoom[j]); break; } } break; } } }, driver.config.mainLoopResetInterval); doProcess(); }); } function wait() { return waitDeferred.promise; } function stop() { started = false; } function setRoomsQueue(queue) { roomsQueue = queue; } exports.start = start; exports.wait = wait; exports.stop = stop; exports.setRoomsQueue = setRoomsQueue; //# sourceMappingURL=sourcemaps/rooms-users-tracker.js.map