Author: Adam <git@apiote.xyz>
pipeline and latest message in eostre
eostre.go | 10 ++++++---- eostre_2.go | 52 +++++++++++++++++++++++++++++----------------------- main.go | 26 ++++++++++++++++++++++----
diff --git a/eostre.go b/eostre.go index b989477b72606c3fb7a6b33ce642b80b9d85b369..810f016df087f50769b20d2f3081bc3d99f7d05b 100644 --- a/eostre.go +++ b/eostre.go @@ -20,7 +20,7 @@ "github.com/emersion/go-message" _ "github.com/emersion/go-message/charset" ) -func eostre(config Config) error { +func eostre(config Config) (int, error) { c, err := client.DialTLS(config.Eostre.ImapAddress, nil) if err != nil { log.Fatalln(err) @@ -46,6 +46,7 @@ go func() { done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, section.FetchItem(), imap.FetchFlags, imap.FetchUid}, messages) }() delSeqset := new(imap.SeqSet) + doneMessages := 0 for msg := range messages { log.Println("doing", msg.Uid) subject := msg.Envelope.Subject @@ -77,7 +78,7 @@ p, err := mr.NextPart() if err == io.EOF { break } else if err != nil { - return fmt.Errorf("while reading next part: %w", err) + return 0, fmt.Errorf("while reading next part: %w", err) } t, _, err := p.Header.ContentType() if err != nil { @@ -144,6 +145,7 @@ } defer f.Close() f.WriteString(html) delSeqset.AddNum(msg.Uid) + doneMessages++ } if !delSeqset.Empty() { item := imap.FormatFlagsOp(imap.AddFlags, true) @@ -156,7 +158,7 @@ err = c.UidStore(delSeqset, item, flags, nil) if err != nil { log.Fatalln(err) } - return c.Expunge(nil) + return doneMessages, c.Expunge(nil) } - return nil + return doneMessages, nil } diff --git a/eostre_2.go b/eostre_2.go index 74dac2ce2c07f393f5d0ef6136aaf9d318a74b73..6f24ab811042c0adc3b842371fada474d6a7d0e6 100644 --- a/eostre_2.go +++ b/eostre_2.go @@ -47,7 +47,8 @@ section := &imap.BodySectionName{} go func() { done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, section.FetchItem(), imap.FetchFlags, imap.FetchUid}, messages) }() - // TODO find latest + var latestMessage *message.Entity + var latestDate time.Time for msg := range messages { subject := msg.Envelope.Subject if subject != config.Eostre.DiarySubject { @@ -62,38 +63,43 @@ } bodyReader := msg.GetBody(section) if bodyReader == nil { log.Printf("body for %d is nil\n", msg.Uid) + continue } m, err := message.Read(bodyReader) if err != nil { - log.Fatalln(err) + log.Println(err) + continue } t, _, err := m.Header.ContentType() if err != nil { - log.Fatalln(err) + log.Println(err) + continue } - if t == "application/octet-stream" || t == "application/age" { - identity, err := age.ParseX25519Identity(config.Eostre.DiaryPrivateKey) - if err != nil { - log.Fatalf("Failed to parse private key: %v", err) - } - r, err := age.Decrypt(m.Body, identity) // TODO check if body is base64-decoded - if err != nil { - log.Fatalf("Failed to open encrypted file: %v", err) - } - out, err := os.Create("diary.epub") - if err != nil { - log.Fatalf("Failed to create diary file: %v", err) - } - if _, err := io.Copy(out, r); err != nil { - log.Fatalf("Failed to read encrypted file: %v", err) - } - out.Close() - return nil - } else { - log.Printf("%d is not binary or age\n", msg.Uid) + if t != "application/age" { + log.Printf("%d is not age\n", msg.Uid) continue } + if msg.Envelope.Date.After(latestDate) { + latestDate = msg.Envelope.Date + latestMessage = m + } } + identity, err := age.ParseX25519Identity(config.Eostre.DiaryPrivateKey) + if err != nil { + log.Fatalf("Failed to parse private key: %v", err) + } + r, err := age.Decrypt(latestMessage.Body, identity) // TODO check if body is base64-decoded + if err != nil { + log.Fatalf("Failed to open encrypted file: %v", err) + } + out, err := os.Create("diary.epub") + if err != nil { + log.Fatalf("Failed to create diary file: %v", err) + } + if _, err := io.Copy(out, r); err != nil { + log.Fatalf("Failed to read encrypted file: %v", err) + } + out.Close() return nil } diff --git a/main.go b/main.go index 375dd430c5f95333a7245fc8e1c05ad857438197..ee7a2bdfea219b86cd54de024817fed4f2615e2d 100644 --- a/main.go +++ b/main.go @@ -169,13 +169,31 @@ case "Ä“ostre": fallthrough case "eostre": - log.Println(eostre(config)) + n, err := eostre(config) + if err != nil { + log.Println(err) + return + } _, err = os.Stat("diary.epub") if err != nil && errors.Is(err, os.ErrNotExist) { - log.Println(downloadDiary(config)) + err = downloadDiary(config) + if err != nil { + log.Println(err) + return + } } - fmt.Println(updateDiary(config)) - fmt.Println(sendDiary(config)) + if n > 0 { + err = updateDiary(config) + if err != nil { + log.Println(err) + return + } + } + err = sendDiary(config) + if err != nil { + log.Println(err) + return + } case "gersemi": log.Println(gersemi(config))