'use strict'; var nconf = require('nconf'), async = require('async'), winston = require('winston'), topics = require('../topics'), categories = require('../categories'), privileges = require('../privileges'), plugins = require('../plugins'), notifications = require('../notifications'), websockets = require('./index'), user = require('../user'), db = require('../database'), meta = require('../meta'), events = require('../events'), utils = require('../../public/src/utils'), SocketTopics = {}; SocketTopics.post = function(socket, data, callback) { if(!data) { return callback(new Error('[[error:invalid-data]]')); } topics.post({ uid: socket.uid, handle: data.handle, title: data.title, content: data.content, cid: data.category_id, thumb: data.topic_thumb, tags: data.tags, req: websockets.reqFromSocket(socket) }, function(err, result) { if (err) { return callback(err); } if (data.lock) { SocketTopics.doTopicAction('lock', 'event:topic_locked', socket, {tids: [result.topicData.tid], cid: result.topicData.cid}); } callback(null, result.topicData); socket.emit('event:new_post', {posts: [result.postData]}); socket.emit('event:new_topic', result.topicData); async.waterfall([ function(next) { user.getUidsFromSet('users:online', 0, -1, next); }, function(uids, next) { privileges.categories.filterUids('read', result.topicData.cid, uids, next); }, function(uids, next) { plugins.fireHook('filter:sockets.sendNewPostToUids', {uidsTo: uids, uidFrom: data.uid, type: 'newTopic'}, next); } ], function(err, data) { if (err) { return winston.error(err.stack); } var uids = data.uidsTo; for(var i=0; i 0) { return next(); } topics.getMainPost(data.tid, socket.uid, next); }, posts: function(next) { topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next); }, privileges: function(next) { next(null, results.privileges); }, 'reputation:disabled': function(next) { next(null, parseInt(meta.config['reputation:disabled'], 10) === 1); }, 'downvote:disabled': function(next) { next(null, parseInt(meta.config['downvote:disabled'], 10) === 1); } }, function(err, results) { if (results.mainPost) { results.posts = [results.mainPost].concat(results.posts); } callback(err, results); }); }); }; SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { if (!data || !data.after) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), stop = start + 9; topics.getUnreadTopics(data.cid, socket.uid, start, stop, callback); }; SocketTopics.loadMoreFromSet = function(socket, data, callback) { if (!data || !data.after || !data.set) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), stop = start + 9; topics.getTopicsFromSet(data.set, socket.uid, start, stop, callback); }; SocketTopics.loadTopics = function(socket, data, callback) { if (!data || !data.set || !utils.isNumber(data.start) || !utils.isNumber(data.stop)) { return callback(new Error('[[error:invalid-data]]')); } topics.getTopicsFromSet(data.set, socket.uid, data.start, data.stop, callback); }; SocketTopics.getPageCount = function(socket, tid, callback) { topics.getPageCount(tid, socket.uid, callback); }; SocketTopics.searchTags = function(socket, data, callback) { topics.searchTags(data, callback); }; SocketTopics.search = function(socket, data, callback) { topics.search(data.tid, data.term, callback); }; SocketTopics.searchAndLoadTags = function(socket, data, callback) { if (!data) { return callback(new Error('[[error:invalid-data]]')); } topics.searchAndLoadTags(data, callback); }; SocketTopics.loadMoreTags = function(socket, data, callback) { if(!data || !utils.isNumber(data.after)) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), stop = start + 99; topics.getTags(start, stop, function(err, tags) { if (err) { return callback(err); } callback(null, {tags: tags, nextStart: stop + 1}); }); }; SocketTopics.isModerator = function(socket, tid, callback) { topics.getTopicField(tid, 'cid', function(err, cid) { if (err) { return callback(err); } user.isModerator(socket.uid, cid, callback); }); }; module.exports = SocketTopics;