UNPKG

2.39 kBJavaScriptView Raw
1var q = require('q'),
2 _ = require('lodash'),
3 utils = require('../../utils'),
4 common = require('@screeps/common'),
5 config = common.configManager.config.backend,
6 db = common.storage.db,
7 env = common.storage.env;
8
9
10
11module.exports = function(listen, emit) {
12
13 var connectedToRooms = {}, m;
14
15 listen(/^roomsDone$/, _.throttle(() => {
16
17 var roomsToFetch = [], roomsIdx = {};
18
19 for(let roomName in connectedToRooms) {
20 if (connectedToRooms[roomName].length > 0) {
21 roomsIdx[roomName] = roomsToFetch.length;
22 roomsToFetch.push(env.keys.MAP_VIEW+roomName);
23 }
24 }
25
26 if(!roomsToFetch.length) {
27 return;
28 }
29
30 env.mget(roomsToFetch).then((mapViewData) => {
31
32 for(let roomName in connectedToRooms) {
33
34 let mapView = mapViewData[roomsIdx[roomName]] || "{}";
35 let message = `["roomMap2:${roomName}",${mapView}]`;
36
37 connectedToRooms[roomName].forEach((i) => {
38 i.conn._writeEventRaw(message);
39 });
40 }
41
42 })
43
44 }, config.socketUpdateThrottle));
45
46 return {
47 onSubscribe(channel, user, conn) {
48
49 if(user && (m = channel.match(/^roomMap2:([a-zA-Z0-9_-]+)$/))) {
50
51 let roomName = m[1];
52
53 connectedToRooms[roomName] = connectedToRooms[roomName] || [];
54 connectedToRooms[roomName].push({
55 conn,
56 user
57 });
58
59 var startTime = Date.now();
60
61 env.get(env.keys.MAP_VIEW+roomName).then((data) => {
62 data = data || "{}";
63 conn._writeEventRaw(`["roomMap2:${roomName}",${data}]`);
64 });
65
66 conn.on('close', () => {
67 if(connectedToRooms[roomName]) {
68 _.remove(connectedToRooms[roomName], (i) => i.conn === conn);
69 }
70 });
71
72 return true;
73 }
74
75 return false;
76 },
77
78 onUnsubscribe(channel, user, conn) {
79
80 if(m = channel.match(/^roomMap2:([a-zA-Z0-9_-]+)$/)) {
81 if(connectedToRooms[m[1]]) {
82 _.remove(connectedToRooms[m[1]], (i) => i.conn === conn);
83 }
84 }
85 }
86 };
87
88
89};
\No newline at end of file