func (app *AnsweringMachine) checkMessagesHandlerInternal(tropoHandler *tropo.CommunicationHandler, session *tropo.Session, w http.ResponseWriter, req *http.Request) {
	glog.V(3).Infof("checkMessagesHandlerInternal")

	// check if new messages
	messages := app.db.FetchNewMessages()
	nbOfNewMessages := len(messages)
	if nbOfNewMessages == 0 {
		msg := fmt.Sprintf(app.messages.CheckNoMessage, app.env.CheckerFirstName)
		tropoHandler.Say(msg, app.messages.DefaultVoice)
		return
	}

	compo := tropoHandler.NewComposer()
	msg := fmt.Sprintf(app.messages.CheckNewMessages, app.env.CheckerFirstName, nbOfNewMessages)
	compo.AddCommand(&tropo.SayCommand{Message: msg, Voice: app.messages.DefaultVoice})

	// TODO: Say when the message was recorded

	// play first message
	firstMessage := messages[0]
	audioFile := firstMessage.CallID + ".wav"
	audioURI := app.env.AudioServerEndpoint + "/" + audioFile
	compo.AddCommand(&tropo.SayCommand{Message: audioURI})

	// TODO: play next messages
	//     - register event with messageID

	//     - Mark latest message as read (place code below in the commands callback)
	app.db.MarkMessageAsRead(firstMessage)

	tropoHandler.ExecuteComposer(compo)
}
func (app *AnsweringMachine) welcomeHandlerInternal(tropoHandler *tropo.CommunicationHandler, session *tropo.Session, w http.ResponseWriter, req *http.Request) {
	glog.V(3).Infof("welcomeHandlerInternal")

	// if no database to record message, say alternate welcome message
	if app.db == nil {
		tropoHandler.Say(app.messages.WelcomeAltMessage, app.messages.DefaultVoice)
		return
	}

	// store the new message entry
	voiceMessage := app.db.CreateVoiceMessage(session.CallID, "+"+session.From.ID)
	if err := app.db.Store(voiceMessage); err != nil {
		// say alternate welcome message
		tropoHandler.Say(app.messages.WelcomeAltMessage, app.messages.DefaultVoice)
		return
	}

	// please leave a message, start recording
	compo := tropoHandler.NewComposer()
	compo.AddCommand(&tropo.SayCommand{Message: app.messages.WelcomeMessage, Voice: app.messages.DefaultVoice})

	choices := tropo.RecordChoices{Terminator: "#"}
	transcript := tropo.RecordTranscription{ID: session.CallID, URL: app.env.TranscriptsReceiver}
	recorderURL := app.env.RecorderEndpoint + "/" + session.CallID + ".wav"
	compo.AddCommand(&tropo.RecordCommand{
		Bargein:       true,
		Attempts:      3,
		Beep:          true,
		Choices:       &choices,
		MaxSilence:    3,
		Timeout:       10,
		MaxTime:       60,
		Name:          "recording",
		URL:           recorderURL,
		Username:      app.env.RecorderUsername,
		Password:      app.env.RecorderPassword,
		AsyncUpload:   true,
		Transcription: &transcript})
	compo.AddCommand(&tropo.OnCommand{Event: "continue", Next: app.routes.RecordingSuccessRoute, Required: true})
	compo.AddCommand(&tropo.OnCommand{Event: "incomplete", Next: app.routes.RecordingIncompleteRoute, Required: true})
	compo.AddCommand(&tropo.OnCommand{Event: "error", Next: app.routes.RecordingFailedRoute, Required: true})

	tropoHandler.ExecuteComposer(compo)
}