ep_email_notifications/update.js

166 lines
5.3 KiB
JavaScript
Raw Normal View History

2013-01-31 15:49:45 +00:00
// Main job is to check pads periodically for activity and notify owners when someone begins editing and when someone finishes.
var db = require('../../src/node/db/DB').db,
2013-01-29 23:15:53 +00:00
API = require('../../src/node/db/API.js'),
async = require('../../src/node_modules/async'),
2013-01-31 01:16:34 +00:00
check = require('validator').check,
2013-01-31 01:57:12 +00:00
email = require('emailjs'),
2013-01-29 23:15:53 +00:00
settings = require('../../src/node/utils/Settings');
2013-01-31 15:49:45 +00:00
// Settings -- EDIT THESE IN settings.json not here..
2013-01-29 23:15:53 +00:00
var pluginSettings = settings.ep_email_notifications;
2013-01-31 15:49:45 +00:00
var checkFrequency = pluginSettings.checkFrequency || 3000;
var staleTime = pluginSettings.staleTime || 30000;
var fromName = pluginSettings.fromName || "Etherpad";
var fromEmail = pluginSettings.fromEmail || "pad@etherpad.org";
var urlToPads = pluginSettings.urlToPads || "http://beta.etherpad.org/p/";
var smtpHostname = pluginSettings.smtpHostname || "127.0.0.1";
// A timer object we maintain to control how we send emails
2013-01-29 23:15:53 +00:00
var timers = {};
2013-01-31 15:49:45 +00:00
// Connect to the email server
2013-01-31 01:57:12 +00:00
var server = email.server.connect({
2013-01-31 15:49:45 +00:00
host: smtpHostname,
2013-01-31 01:57:12 +00:00
});
2013-01-29 17:35:40 +00:00
exports.padUpdate = function (hook_name, _pad) {
2013-01-29 23:15:53 +00:00
var pad = _pad.pad;
var padId = pad.id;
exports.sendUpdates(padId);
// does an interval not exist for this pad?
if(!timers[padId]){
2013-01-31 01:57:12 +00:00
console.warn("Someone started editing "+padId);
exports.notifyBegin(padId);
2013-01-29 23:15:53 +00:00
console.debug("Created an interval time check for "+padId);
// if not then create one and write it to the timers object
2013-01-31 15:49:45 +00:00
timers[padId] = exports.createInterval(padId, checkFrequency);
2013-01-29 23:15:53 +00:00
}else{ // an interval already exists so don't create
}
};
2013-01-31 01:57:12 +00:00
exports.notifyBegin = function(padId){
2013-01-31 02:31:59 +00:00
console.warn("Getting "+padId);
2013-01-31 01:57:12 +00:00
db.get("emailSubscription:" + padId, function(err, recipients){ // get everyone we need to email
2013-01-31 02:31:59 +00:00
console.warn(recipients);
2013-01-31 15:49:45 +00:00
if(recipients){
async.forEach(Object.keys(recipients), function(recipient, cb){
console.warn("Emailing "+recipient +" about a new begin update");
server.send({
text: "Your pad at "+urlToPads+padId +" is being edited, we're just emailing you let you know :)",
from: fromName+ "<"+fromEmail+">",
to: recipient,
subject: "Someone begin editing "+padId
}, function(err, message) { console.log(err || message); });
cb(); // finish each user
},
function(err){
});
}
2013-01-31 01:57:12 +00:00
});
}
exports.notifyEnd = function(padId){
// get the modified contents...
2013-01-31 02:16:20 +00:00
var changesToPad = "Functionality does not exist";
2013-01-31 01:57:12 +00:00
db.get("emailSubscription:" + padId, function(err, recipients){ // get everyone we need to email
async.forEach(Object.keys(recipients), function(recipient, cb){
console.debug("Emailing "+recipient +" about a new begin update");
server.send({
2013-01-31 02:31:59 +00:00
text: "Your pad at "+urlToPads+padId +" has finished being edited, we're just emailing you let you know :) The changes look like this:" + changesToPad,
2013-01-31 01:57:12 +00:00
from: fromName+ "<"+fromEmail+">",
to: recipient,
2013-01-31 02:31:59 +00:00
subject: "Someone finished editing "+padId
2013-01-31 01:57:12 +00:00
}, function(err, message) { console.log(err || message); });
cb(); // finish each user
},
function(err){
});
});
}
2013-01-29 23:15:53 +00:00
exports.sendUpdates = function(padId){
// check to see if we can delete this interval
API.getLastEdited(padId, function(callback, message){
// we delete an interval if a pad hasn't been edited in X seconds.
var currTS = new Date().getTime();
if(currTS - message.lastEdited > staleTime){
2013-01-31 01:57:12 +00:00
exports.notifyEnd(padId);
2013-01-29 23:15:53 +00:00
console.warn("Interval went stale so deleting it from object and timer");
var interval = timers[padId];
clearInterval(timers[padId]); // remove the interval timer
delete timers[padId]; // remove the entry from the padId
}else{
2013-01-31 01:57:12 +00:00
console.debug("email timeout not stale so not deleting");
2013-01-29 23:15:53 +00:00
}
});
2013-01-29 17:35:40 +00:00
// The status of the users relationship with the pad -- IE if it's subscribed to this pad / if it's already on the pad
2013-01-29 23:15:53 +00:00
// This comes frmo the database
2013-01-29 17:35:40 +00:00
var userStatus = {};
// Temporary user object
var user = {
name: "John McLear",
email: "john@mclear.co.uk",
id: "a.n4gEeMLsv1GivNeh"
}
console.debug("ep_email_noficiations: padID of pad being edited:"+padId);
2013-01-29 23:15:53 +00:00
exports.isUserEditingPad(padId, user, function(err,results){
userStatus.userIsEditing = results;
console.debug("isUserEditingPad is:", results);
});
2013-01-29 17:35:40 +00:00
2013-01-29 23:15:53 +00:00
}
2013-01-29 17:35:40 +00:00
2013-01-29 23:15:53 +00:00
// Is the user editing the pad?
exports.isUserEditingPad = function(padId, user, cb){
API.padUsers(padId, function(callback, padUsers){ // get the current users editing the pad
2013-01-29 17:35:40 +00:00
var userIsEditing = false;
2013-01-29 23:15:53 +00:00
console.debug("Pad Users:"+padUsers);
// for each user on the pad right now
async.forEach(padUsers.padUsers,
2013-01-29 17:35:40 +00:00
function(userOnPad, callback){
2013-01-29 23:15:53 +00:00
2013-01-29 17:35:40 +00:00
if(userOnPad.id == user.id){
2013-01-29 23:15:53 +00:00
console.debug("I'm on the pad so don't send any notification");
2013-01-29 17:35:40 +00:00
userIsEditing = true; // If the user is editing the pad then return true
2013-01-29 23:15:53 +00:00
}else{
userIsEditing = false; // If the user isnt on this pad then that'd be okay to contact em
2013-01-29 17:35:40 +00:00
}
2013-01-29 23:15:53 +00:00
callback(userIsEditing);
2013-01-29 17:35:40 +00:00
},
2013-01-29 23:15:53 +00:00
2013-01-29 17:35:40 +00:00
function(err){
2013-01-29 23:15:53 +00:00
cb(null, userIsEditing);
});
});
2013-01-29 17:35:40 +00:00
};
2013-01-31 15:49:45 +00:00
// Creates an interval process to check to send Updates based on checkFrequency and it returns an ID
2013-01-29 23:15:53 +00:00
exports.createInterval = function(padId){
return setInterval(function(){
2013-01-31 15:49:45 +00:00
exports.sendUpdates(padId), checkFrequency
2013-01-29 23:15:53 +00:00
});
}