diff --git a/scripts/mail.coffee b/scripts/mail.coffee new file mode 100644 index 000000000..140697370 --- /dev/null +++ b/scripts/mail.coffee @@ -0,0 +1,103 @@ +do (setupLodash = this) -> + GLOBAL._ = require 'lodash' + _.str = require 'underscore.string' + _.mixin _.str.exports() + +async = require 'async' + +serverSetup = require '../server_setup' +sendwithus = require '../server/sendwithus' +User = require '../server/users/User.coffee' +Level = require '../server/levels/Level.coffee' +LevelSession = require '../server/levels/sessions/LevelSession.coffee' + +alreadyEmailed = [] + +DEBUGGING = true + +sendInitialRecruitingEmail = -> + leaderboards = [ + {slug: 'brawlwood', team: 'humans', limit: 55, name: "Brawlwood", original: "52d97ecd32362bc86e004e87", majorVersion: 0} + {slug: 'brawlwood', team: 'ogres', limit: 40, name: "Brawlwood", original: "52d97ecd32362bc86e004e87", majorVersion: 0} + {slug: 'dungeon-arena', team: 'humans', limit: 200, name: "Dungeon Arena", original: "53173f76c269d400000543c2", majorVersion: 0} + {slug: 'dungeon-arena', team: 'ogres', limit: 150, name: "Dungeon Arena", original: "53173f76c269d400000543c2", majorVersion: 0} + ] + async.waterfall [ + (callback) -> async.map leaderboards, grabSessions, callback + (sessionLists, callback) -> async.map collapseSessions(sessionLists), grabUser, callback + (users, callback) -> async.map users, emailUser, callback + ], (err, results) -> + return console.log "Error:", err if err + console.log "Looked at sending to #{results.length} users; sent to #{_.filter(results).length}." + console.log "Sent to: ['#{(user.email for user in results when user).join('\', \'')}']" + +grabSessions = (levelInfo, callback) -> + queryParameters = + level: {original: levelInfo.original, majorVersion: levelInfo.majorVersion} + team: levelInfo.team + submitted: true + sortParameters = totalScore: -1 + selectString = 'totalScore creator' + query = LevelSession + .find(queryParameters) + .limit(levelInfo.limit) + .sort(sortParameters) + .select(selectString) + .lean() + query.exec (err, sessions) -> + return callback err if err + for session, rank in sessions + session.levelInfo = levelInfo + session.rank = rank + 1 + callback null, sessions + +collapseSessions = (sessionLists) -> + userRanks = {} + for sessionList in sessionLists + for session in sessionList + ranks = userRanks[session.creator] ? [] + ranks.push session + userRanks[session.creator] = _.sortBy ranks, 'rank' + topSessions = [] + for userID, ranks of userRanks + topSessions.push ranks[0] + topSessions + +grabUser = (session, callback) -> + findParameters = _id: session.creator + selectString = 'email emailSubscriptions name jobProfile' + query = User + .findOne(findParameters) + .select(selectString) + .lean() + query.exec (err, user) -> + return callback err if err + user.session = session + callback null, user + +totalEmailsSent = 0 +emailUser = (user, callback) -> + return callback null, false if user.emails?.recruiting?.enabled is false # TODO: later, obey also "announcements" when that's untangled + return callback null, false if user.email in alreadyEmailed + return callback null, false if DEBUGGING and (totalEmailsSent > 1 or Math.random() > 0.1) + ++totalEmailsSent + name = if user.firstName and user.lastName then "#{user.firstName}" else user.name + name = "Wizard" if not name or name is "Anoner" + team = user.session.levelInfo.team + team = team.substr(0, team.length - 1) + context = + email_id: sendwithus.templates.one_time_recruiting_email + recipient: + address: if DEBUGGING then 'nick@codecombat.com' else user.email + name: name + email_data: + name: name + level_name: user.session.levelInfo.name + place: "##{user.session.rank}" # like "#31" + level_race: team + sendwithus.api.send context, (err, result) -> + return callback err if err + callback null, user + +serverSetup.connectToDatabase() +sendInitialRecruitingEmail() diff --git a/server/sendwithus.coffee b/server/sendwithus.coffee index 04d8205c3..1f8145eb1 100644 --- a/server/sendwithus.coffee +++ b/server/sendwithus.coffee @@ -1,12 +1,10 @@ config = require '../server_config' sendwithusAPI = require 'sendwithus' swuAPIKey = config.mail.sendwithusAPIKey -queues = require './commons/queue' module.exports.setupRoutes = (app) -> return - debug = not config.isProduction module.exports.api = new sendwithusAPI swuAPIKey, debug if config.unittest @@ -16,3 +14,4 @@ module.exports.templates = ladder_update_email: 'JzaZxf39A4cKMxpPZUfWy4' patch_created: 'tem_xhxuNosLALsizTNojBjNcL' change_made_notify_watcher: 'tem_7KVkfmv9SZETb25dtHbUtG' + one_time_recruiting_email: 'tem_mdFMgtcczHKYu94Jmq68j8'