Beefing up contact form data population.

This commit is contained in:
Nick Winter 2014-12-19 17:27:58 -08:00
parent 9522da28e8
commit 6ac0bea5ca
2 changed files with 32 additions and 7 deletions
server

View file

@ -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')

View file

@ -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