asgard.git

commit bbd8c50f7cf7229d019db93dfae6ec72ab9943d7

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