func (c *Client) GetMessages(user *common.User) ([]*common.Message, error) {
	if user == nil {
		return nil, ErrInvalidRequest
	}
	query := &url.Values{}
	query.Set("key", user.Key)
	url := c.GetURL("messages", query)
	res, err := http.Get(url)
	if err != nil {
		return nil, err
	}

	var s MessagesResponse
	if res.Header.Get("Content-Type") == "application/octet-stream" {
		decryptedData, err := crypto.GPGDecrypt(user.Key, res.Body)
		if err != nil {
			return nil, err
		}
		if err := json.Unmarshal(decryptedData, &s); err != nil {
			return nil, err
		}
	} else if res.Header.Get("Content-Type") == "application/json" {
		d, _ := ioutil.ReadAll(res.Body)
		if err := json.Unmarshal(d, &s); err != nil {
			return nil, err
		}
	}

	if !s.Success {
		return nil, errors.New(s.Error)
	}

	// success
	return s.Messages, nil
}
func (this *App) list(c *cli.Context) {
	if err := this.setup(c); err != nil {
		fmt.Fprintf(os.Stderr, "Error: %s\n", err.Error())
		return
	}

	messages, err := this.client.GetMessages(this.user)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
	}

	if len(messages) > 0 {
		fmt.Printf("You have new messages:\n\n")
		for i := range messages {
			m := messages[i]
			fmt.Printf("  (%d) %s <%s> - %s\n", i+1, m.From.Name, m.From.Email, m.CreatedAt.Format("Jan 02"))
		}

		for {
			fmt.Printf("Enter number (%d - %d) to listen, or Q)uit > ", 1, len(messages))
			var choice string
			fmt.Scanf("%v", &choice)
			if choice == "Q" {
				break
			}

			idx, _ := strconv.ParseInt(choice, 10, 4)
			if int(idx) > 0 && int(idx) <= len(messages) {
				// play message at idx-1
				m := messages[int(idx)-1]

				// download content
				if len(m.Content) == 0 {
					m.Content, err = this.client.DownloadMessage(m.MessageID)
					if err != nil {
						fmt.Printf("Error download message! %s\n", err.Error())
						continue
					}
				}

				// decrypt content
				content, err := crypto.GPGDecrypt(this.user.Key, bytes.NewReader(m.Content))
				if err != nil {
					fmt.Printf("Error decrypt message! %s\n", err.Error())
					continue
				}

				// save it to a temp file
				tempfile := path.Join(os.TempDir(), fmt.Sprintf("%s.aiff", uuid.NewUUID().String()))
				defer func() {
					os.RemoveAll(tempfile)
				}()
				f, err := os.Create(tempfile)
				if err != nil {
					fmt.Printf("Error: %s\n", err.Error())
					continue
				}
				defer f.Close()

				_, err = io.Copy(f, bytes.NewBuffer(content))
				if err != nil {
					fmt.Printf("Error: %s\n", err.Error())
					continue
				}

				// play
				fmt.Printf("Playing...")
				err = audio.PlayAIFF(tempfile, nil)
				if err != nil {
					fmt.Printf("Error: %s\n", err.Error())
					continue
				}
				fmt.Println()
			}
		}

	} else {
		fmt.Println("No messages.")
	}
}