1 | var 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 |
|
11 | module.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 |