summaryrefslogtreecommitdiff
path: root/commands
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-05-25 14:52:57 -0400
committerDrew DeVault <sir@cmpwn.com>2019-05-25 14:52:57 -0400
commit38e71659ff5b386450248c0e56b8797498e2c298 (patch)
tree773f88485ab1823f063b5cca623e7605fa0ef485 /commands
parentcef784bf520470315e93835e9c2828d69de0d5c9 (diff)
downloadaerc-38e71659ff5b386450248c0e56b8797498e2c298.zip
Implement :forward
Diffstat (limited to 'commands')
-rw-r--r--commands/account/reply.go112
1 files changed, 81 insertions, 31 deletions
diff --git a/commands/account/reply.go b/commands/account/reply.go
index 579d671..0e43b88 100644
--- a/commands/account/reply.go
+++ b/commands/account/reply.go
@@ -20,6 +20,7 @@ import (
func init() {
register("reply", Reply)
+ register("forward", Reply)
}
var (
@@ -74,38 +75,44 @@ func Reply(aerc *widgets.Aerc, args []string) error {
cc []string
toList []*imap.Address
)
- if len(msg.Envelope.ReplyTo) != 0 {
- toList = msg.Envelope.ReplyTo
- } else {
- toList = msg.Envelope.From
- }
- for _, addr := range toList {
- if addr.PersonalName != "" {
- to = append(to, fmt.Sprintf("%s <%s@%s>",
- addr.PersonalName, addr.MailboxName, addr.HostName))
+ if args[0] == "reply" {
+ if len(msg.Envelope.ReplyTo) != 0 {
+ toList = msg.Envelope.ReplyTo
} else {
- to = append(to, fmt.Sprintf("<%s@%s>",
- addr.MailboxName, addr.HostName))
+ toList = msg.Envelope.From
}
- }
- if replyAll {
- for _, addr := range msg.Envelope.Cc {
- cc = append(cc, formatAddress(addr))
+ for _, addr := range toList {
+ if addr.PersonalName != "" {
+ to = append(to, fmt.Sprintf("%s <%s@%s>",
+ addr.PersonalName, addr.MailboxName, addr.HostName))
+ } else {
+ to = append(to, fmt.Sprintf("<%s@%s>",
+ addr.MailboxName, addr.HostName))
+ }
}
- for _, addr := range msg.Envelope.To {
- address := fmt.Sprintf("%s@%s", addr.MailboxName, addr.HostName)
- if address == us.Address {
- continue
+ if replyAll {
+ for _, addr := range msg.Envelope.Cc {
+ cc = append(cc, formatAddress(addr))
+ }
+ for _, addr := range msg.Envelope.To {
+ address := fmt.Sprintf("%s@%s", addr.MailboxName, addr.HostName)
+ if address == us.Address {
+ continue
+ }
+ to = append(to, formatAddress(addr))
}
- to = append(to, formatAddress(addr))
}
}
var subject string
- if !strings.HasPrefix(msg.Envelope.Subject, "Re: ") {
- subject = "Re: " + msg.Envelope.Subject
+ if args[0] == "forward" {
+ subject = "Fwd: " + msg.Envelope.Subject
} else {
- subject = msg.Envelope.Subject
+ if !strings.HasPrefix(msg.Envelope.Subject, "Re: ") {
+ subject = "Re: " + msg.Envelope.Subject
+ } else {
+ subject = msg.Envelope.Subject
+ }
}
composer := widgets.NewComposer(
@@ -115,8 +122,11 @@ func Reply(aerc *widgets.Aerc, args []string) error {
"Cc": strings.Join(cc, ", "),
"Subject": subject,
"In-Reply-To": msg.Envelope.MessageId,
- }).
- FocusTerminal()
+ })
+
+ if args[0] == "reply" {
+ composer.FocusTerminal()
+ }
addTab := func() {
tab := aerc.NewTab(composer, subject)
@@ -130,8 +140,9 @@ func Reply(aerc *widgets.Aerc, args []string) error {
})
}
- if quote {
+ if args[0] == "forward" {
// TODO: something more intelligent than fetching the 1st part
+ // TODO: add attachments!
store.FetchBodyPart(msg.Uid, []int{1}, func(reader io.Reader) {
header := message.Header{}
header.SetText(
@@ -157,18 +168,57 @@ func Reply(aerc *widgets.Aerc, args []string) error {
scanner := bufio.NewScanner(part.Body)
go composer.SetContents(pipeout)
// TODO: Let user customize the date format used here
- io.WriteString(pipein, fmt.Sprintf("On %s %s wrote:\n",
- msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM"),
- msg.Envelope.From[0].PersonalName))
+ io.WriteString(pipein, fmt.Sprintf("Forwarded message from %s on %s:\n\n",
+ msg.Envelope.From[0].PersonalName,
+ msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM")))
for scanner.Scan() {
- io.WriteString(pipein, fmt.Sprintf("> %s\n", scanner.Text()))
+ io.WriteString(pipein, fmt.Sprintf("%s\n", scanner.Text()))
}
pipein.Close()
pipeout.Close()
addTab()
})
} else {
- addTab()
+ if quote {
+ // TODO: something more intelligent than fetching the 1st part
+ store.FetchBodyPart(msg.Uid, []int{1}, func(reader io.Reader) {
+ header := message.Header{}
+ header.SetText(
+ "Content-Transfer-Encoding", msg.BodyStructure.Encoding)
+ header.SetContentType(
+ msg.BodyStructure.MIMEType, msg.BodyStructure.Params)
+ header.SetText("Content-Description", msg.BodyStructure.Description)
+ entity, err := message.New(header, reader)
+ if err != nil {
+ // TODO: Do something with the error
+ addTab()
+ return
+ }
+ mreader := mail.NewReader(entity)
+ part, err := mreader.NextPart()
+ if err != nil {
+ // TODO: Do something with the error
+ addTab()
+ return
+ }
+
+ pipeout, pipein := io.Pipe()
+ scanner := bufio.NewScanner(part.Body)
+ go composer.SetContents(pipeout)
+ // TODO: Let user customize the date format used here
+ io.WriteString(pipein, fmt.Sprintf("On %s %s wrote:\n",
+ msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM"),
+ msg.Envelope.From[0].PersonalName))
+ for scanner.Scan() {
+ io.WriteString(pipein, fmt.Sprintf("> %s\n", scanner.Text()))
+ }
+ pipein.Close()
+ pipeout.Close()
+ addTab()
+ })
+ } else {
+ addTab()
+ }
}
return nil