diff --git a/server/levels/sessions/LevelSession.coffee b/server/levels/sessions/LevelSession.coffee index 22306c3c0..7832875c0 100644 --- a/server/levels/sessions/LevelSession.coffee +++ b/server/levels/sessions/LevelSession.coffee @@ -50,10 +50,8 @@ LevelSessionSchema.pre 'save', (next) -> LevelSessionSchema.statics.privateProperties = ['code', 'submittedCode', 'unsubscribed'] LevelSessionSchema.statics.editableProperties = ['multiplayer', 'players', 'code', 'codeLanguage', 'completed', 'state', 'levelName', 'creatorName', 'levelID', 'screenshot', - 'chat', 'teamSpells', 'submitted', 'submittedCodeLanguage', + 'chat', 'teamSpells', 'submitted', 'submittedCodeLanguage', 'unsubscribed', 'playtime', 'heroConfig', 'team', 'transpiledCode'] LevelSessionSchema.statics.jsonSchema = jsonschema -LevelSessionSchema.index {user: 1, changed: -1}, {sparse: true, name: 'last played index'} - module.exports = LevelSession = mongoose.model('level.session', LevelSessionSchema, 'level.sessions') diff --git a/server/routes/contact.coffee b/server/routes/contact.coffee index bce7e8612..2ae8564fc 100644 --- a/server/routes/contact.coffee +++ b/server/routes/contact.coffee @@ -2,6 +2,9 @@ config = require '../../server_config' log = require 'winston' User = require '../users/User' sendwithus = require '../sendwithus' +async = require 'async' +LevelSession = require '../levels/sessions/LevelSession' +moment = require 'moment' module.exports.setup = (app) -> app.post '/contact', (req, res) -> @@ -19,7 +22,8 @@ createMailContext = (sender, message, user, recipientID, subject, done) -> content = """ #{message} - #{user.get('name') or 'Anonymous'} - Level #{level}#{if premium then ' - Subscriber' else ''} - #{user._id} + -- + <a href='http://codecombat.com/user/#{user.get('slug') or user.get('_id')}'>#{user.get('name') or 'Anonymous'}</a> - Level #{level}#{if premium then ' - Subscriber' else ''} """ context = @@ -39,8 +43,31 @@ createMailContext = (sender, message, user, recipientID, subject, done) -> if err log.error "Error looking up recipient to email from #{recipientID}: #{err}" if err else - context.bcc = [context.to, sender] - context.to = document.get('email') + context.recipient.bcc = [context.recipient.address, sender] + context.recipient.address = document.get('email') + context.email_data.content = message done context else - done context + async.waterfall [ + fetchRecentSessions.bind undefined, user, context + # Can add other data-grabbing stuff here if we want. + # TODO: grab platform/browser/browser version/screen size from client + # TODO: try automatically including Surface screenshot if opening contact form from level? + ], (err, results) -> + console.error "Error getting contact message context for #{sender}: #{err}" if err + done context + +fetchRecentSessions = (user, context, callback) -> + query = creator: user.get('_id') + '' + projection = levelID: 1, levelName: 1, changed: 1, team: 1, codeLanguage: 1, 'state.complete': 1, playtime: 1 + sort = changed: -1 + LevelSession.find(query).select(projection).sort(sort).limit(3).lean().exec (err, sessions) -> + return callback err if err + console.log 'found', sessions.length, 'sessions' + for s in sessions + if s.playtime < 120 then playtime = "#{s.playtime}s played" + else if s.playtime < 7200 then playtime = "#{Math.round(s.playtime / 60)}m played" + else playtime = "#{Math.round(s.playtime / 3600)}h played" + ago = moment(s.changed).fromNow() + context.email_data.content += "\n<a href='http://codecombat.com/play/level/#{s.levelID}?session=#{s._id}&team=#{s.team or 'humans'}&dev=true'>#{s.levelName}#{if s.team is 'ogres' then ' ' + s.team else ''}</a>#{if s.state?.complete then ' complete ' else ''}- #{s.codeLanguage}, #{playtime}, #{ago}" + callback null