nodebb-plugin-whoisin
Version:
A NodeBB plugin to embed a simple button to RSVP in a post
164 lines (146 loc) • 4.95 kB
JavaScript
(function(module) {
;
var whoisin = {},
SocketPlugins = module.parent.require('./socket.io/plugins'),
db = module.parent.require('./database'),
meta = module.parent.require('./meta'),
user = module.parent.require('./user'),
// posts = module.parent.require('./posts'),
mainTemplate =
'<div id="whoisin-{postData.pid}" class="whoisin" data-pid="{postData.pid}">' +
' <h4>{title}</h4>' +
' <div class="participants"></div>' +
' <div class="whoisin-btn-wrapper">' +
' <button title="add yourself to the list" class="iamin btn btn-primary">' +
' <i class="fa fa-plus"></i> {iamin}</button>' +
' <button title="remove yourself from this list" class="iamnotin btn btn-danger">' +
' <i class="fa fa-times"></i></button>' +
' </div>' +
'</div>' +
'<br />';
whoisin.init = function(params, callback) {
// We create two routes for every view. One API call, and the actual route itself.
// Just add the buildHeader middleware to your route and NodeBB will take care of everything for you.
params.router.get('/admin/plugins/whoisin', params.middleware.admin.buildHeader, renderAdmin);
params.router.get('/api/admin/plugins/whoisin', renderAdmin);
SocketPlugins.whoisin = {
commit: whoisin.commit,
load: whoisin.load
};
callback();
};
whoisin.addAdminNavigation = function(header, callback) {
header.plugins.push({
route: '/plugins/whoisin',
icon: 'fa-child',
name: 'whoisin'
});
callback(null, header);
};
whoisin.parse = function(data, callback) {
if (data && data.postData && data.postData.content) {
var settings = /(\[whoisin )(.*)(\])/.exec(data.postData.content);
var title = "Who is in?";
var iamin = "I am in!";
if (!!settings && settings.length > 2) {
var title_attr = /(title=\()(.*?)(\))/.exec(settings[2]);
var iamin_attr = /(iamin=\()(.*?)(\))/.exec(settings[2]);
if (title_attr) {
title = title_attr[2];
}
if (iamin_attr) {
iamin = iamin_attr[2];
}
}
var tmp =
mainTemplate.replace(/\{postData.pid\}/gi, data.postData.pid)
.replace(/\{title\}/gi, title)
.replace(/\{iamin\}/gi, iamin);
data.postData.content =
data.postData.content.replace(/\[whoisin(.*?)\]/gi, tmp);
}
callback(null, data);
};
whoisin.commit = function(socket, data, callback) {
if (socket.hasOwnProperty('uid') && socket.uid > 0) {
db.getObject('whoisin-post-' + data.pid + '-participants', function(err, whoisin_participants) {
if (err) {
console.log('whoisin plugin: noone is in');
}
whoisin_participants = whoisin_participants || {};
if (data.action === 'add') {
whoisin_participants[socket.uid] = {
isin: true,
timestamp: new Date()
};
} else if (data.action === 'remove' && whoisin_participants[socket.uid]) {
whoisin_participants[socket.uid].isin = false;
}
//serialize
whoisin_participants[socket.uid] = JSON.stringify(whoisin_participants[socket.uid]);
db.setObject('whoisin-post-' + data.pid + '-participants', whoisin_participants, function(err){
if (err) {
console.log('Whoisin Plugin: Error saving to db, ', err);
} else {
callback(null, "success");
}
});
});
} else {
callback(new Error('not-logged-in'));
}
}
whoisin.load = function(socket, data, callback) {
db.getObject('whoisin-post-' + data.pid + '-participants', function(err, participants) {
var users_array = [];
var whoisin_data = {};
if (err) {
console.log('whoisin plugin: Error getting list of participants for topic');
}
whoisin_data.current_user_is_in = false;
whoisin_data.current_user_id = socket.uid;
whoisin_data.users = participants;
for (var userid in whoisin_data.users) {
// FIXME
whoisin_data.users[userid] = JSON.parse(whoisin_data.users[userid]);
users_array.push(userid);
if (userid == socket.uid && whoisin_data.users[userid].isin) {
whoisin_data.current_user_is_in = true;
}
}
user.getMultipleUserFields(users_array, ['username', 'userslug', 'picture', 'uid'], function(err, users_data) {
// Add user data to whoisin data
var sortable = [], user;
for (var id in users_data) {
user = users_data[id];
whoisin_data.users[user.uid].userslug = user.userslug;
whoisin_data.users[user.uid].picture = user.picture;
whoisin_data.users[user.uid].username = user.username;
}
for (user in whoisin_data.users){
if(whoisin_data.users.hasOwnProperty(user)){
var u = whoisin_data.users[user];
u.uid = user;
sortable.push(u);
}
}
whoisin_data.users = sortable.sort(function(a,b){
var an = new Date(a.timestamp),
bn = new Date(b.timestamp);
if(an > bn || b.uid == socket.uid) {
return 1;
}
if(an < bn || a.uid == socket.uid) {
return -1;
}
return 0;
});
callback(null, whoisin_data);
});
});
}
function renderAdmin(req, res, next) {
res.render('admin/plugins/whoisin', {});
}
module.exports = whoisin;
}(module));