You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.4 KiB
JavaScript

11 years ago
'use strict';
var meta = require('../meta'),
user = require('../user'),
topics = require('../topics'),
logger = require('../logger'),
plugins = require('../plugins'),
11 years ago
emitter = require('../emitter'),
nconf = require('nconf'),
gravatar = require('gravatar'),
winston = require('winston'),
validator = require('validator'),
11 years ago
websockets = require('./'),
SocketMeta = {
rooms: {}
};
11 years ago
SocketMeta.reconnected = function(socket, data, callback) {
var uid = socket.uid,
sessionID = socket.id;
if (uid) {
topics.pushUnreadCount(uid);
user.notifications.pushCount(uid);
}
if (process.env.NODE_ENV === 'development') {
if (uid) {
winston.info('[socket] uid ' + uid + ' (' + sessionID + ') has successfully reconnected.');
} else {
winston.info('[socket] An anonymous user (' + sessionID + ') has successfully reconnected.');
}
}
};
11 years ago
emitter.on('nodebb:ready', function() {
websockets.server.sockets.emit('event:nodebb.ready', {
general: meta.config['cache-buster'],
css: meta.css.hash,
js: meta.js.hash
});
11 years ago
});
SocketMeta.buildTitle = function(socket, text, callback) {
if (socket.uid) {
user.getSettings(socket.uid, function(err, settings) {
if (err) {
return callback(err);
}
meta.title.build(text, settings.language, callback);
});
} else {
meta.title.build(text, meta.config.defaultLang, callback);
}
};
SocketMeta.getUsageStats = function(socket, data, callback) {
module.parent.exports.emitTopicPostStats(callback);
};
/* Rooms */
11 years ago
SocketMeta.rooms.enter = function(socket, data, callback) {
if (!data) {
return callback(new Error('[[error:invalid-data]]'));
11 years ago
}
if (data.leave) {
socket.leave(data.leave);
if (socket.uid && data.leave.indexOf('topic') !== -1) {
websockets.in(data.leave).emit('event:user_leave', socket.uid);
}
}
if (data.enter) {
socket.join(data.enter);
if (socket.uid && data.enter.indexOf('topic') !== -1) {
data.uid = socket.uid;
websockets.in(data.enter).emit('event:user_enter', data);
}
}
};
SocketMeta.rooms.getAll = function(socket, data, callback) {
var rooms = websockets.server.sockets.manager.rooms,
socketData = {
onlineGuestCount: websockets.getOnlineAnonCount(),
onlineRegisteredCount: websockets.getOnlineUserCount(),
socketCount: websockets.getSocketCount(),
users: {
home: rooms['/home'] ? rooms['/home'].length : 0,
topics: 0,
category: 0
},
topics: {}
};
var scores = {},
topTenTopics = [],
tid;
for (var room in rooms) {
if (rooms.hasOwnProperty(room)) {
if (tid = room.match(/^\/topic_(\d+)/)) {
var length = rooms[room].length;
socketData.users.topics += length;
if (scores[length]) {
scores[length].push(tid[1]);
} else {
scores[length] = [tid[1]];
}
} else if (room.match(/^\/category/)) {
socketData.users.category += rooms[room].length;
}
}
}
var scoreKeys = Object.keys(scores),
mostActive = scoreKeys.sort();
while(topTenTopics.length < 10 && mostActive.length > 0) {
topTenTopics = topTenTopics.concat(scores[mostActive.pop()]);
}
topTenTopics = topTenTopics.slice(0,9);
topics.getTopicsFields(topTenTopics, ['title'], function(err, titles) {
topTenTopics.forEach(function(tid, id) {
socketData.topics[tid] = {
value: rooms['/topic_' + tid].length,
title: validator.escape(titles[id].title)
};
});
callback(null, socketData);
});
};
/* Exports */
module.exports = SocketMeta;