Files
go-npfd-printer/parser/message.go
2025-02-03 16:58:00 -05:00

145 lines
3.8 KiB
Go

package parser
import (
"bufio"
"fmt"
"html"
"log"
"os"
"regexp"
"strings"
"google.golang.org/api/gmail/v1"
)
// Message .
type Message struct {
gmailID string
date string // retrieved from message header
snippet string
}
// GetMessages .
func GetMessages(srv *gmail.Service) []Message {
msgs := []Message{}
pageToken := ""
for {
req := srv.Users.Messages.List("me").Q("is:unread").Q("from:messaging@iamresponding.com")
// req := srv.Users.Messages.List("me").Q("is:unread")
if pageToken != "" {
req.PageToken(pageToken)
}
r, err := req.Do()
if err != nil {
log.Fatalf("Unable to retrieve messages: %v", err)
}
log.Printf("Processing %v messages...\n", len(r.Messages))
for _, m := range r.Messages {
msg, err := srv.Users.Messages.Get("me", m.Id).Format("full").Do()
if err != nil {
log.Fatalf("Unable to retrieve message %v: %v", m.Id, err)
}
date := ""
for _, h := range msg.Payload.Headers {
if h.Name == "Date" {
date = h.Value
}
// break
}
msgs = append(msgs, Message{
gmailID: msg.Id,
date: date,
snippet: html.UnescapeString(msg.Snippet),
})
}
if r.NextPageToken == "" {
break
}
pageToken = r.NextPageToken
}
reader := bufio.NewReader(os.Stdin)
count, deleted := 0, 0
for _, m := range msgs {
count++
re := regexp.MustCompile(`^(?P<address>[^\s\[\[].*)\s\[\[(?P<city>[^\]\]].*)\]\]\s\((?P<type>[^\)].*)\)\s\-\s(?P<description>.*?)(?P<phone>\(\d{3}\)\s\d{3}\-\d{4})?\s?(?:F\d{9})?\s?(?:\d{7})?\s?(?P<time>\d{2}\:\d{2})?$`)
if re.Match([]byte(m.snippet)) {
groups := re.SubexpNames()
result := re.FindAllStringSubmatch(m.snippet, -1)
rt := map[string]string{}
for i, n := range result[0] {
rt[groups[i]] = n
}
fmt.Printf("=============================================================\n")
fmt.Printf("Message URL: https://mail.google.com/mail/u/0/#all/%v\n", m.gmailID)
fmt.Printf("Snippet: %q\n", m.snippet)
if value, ok := rt["address"]; ok {
fmt.Printf("Address: %s\n", value)
} else {
fmt.Print("There is no address value\n")
}
if value, ok := rt["city"]; ok {
fmt.Printf("City: %s\n", value)
} else {
fmt.Print("There is no city value\n")
}
if value, ok := rt["type"]; ok {
fmt.Printf("Type: %s\n", value)
} else {
fmt.Print("There is no type value\n")
}
if value, ok := rt["description"]; ok {
fmt.Printf("Description: %s\n", value)
} else {
fmt.Print("There is no description value\n")
}
if value, ok := rt["phone"]; ok {
fmt.Printf("Phone: %s\n", value)
} else {
fmt.Print("There is no phone value\n")
}
if value, ok := rt["time"]; ok {
fmt.Printf("Time: %s\n", value)
} else {
fmt.Print("There is no time value\n")
}
fmt.Printf("Date: %v\n", m.date)
fmt.Printf("=============================================================\n")
fmt.Printf("Options: (d)elete, (r)ead, (p)rint, (s)kip, (q)uit: [s] ")
val := ""
if _, err := reader.ReadString('\n'); err != nil {
log.Fatalf("unable to scan input: %v", err)
}
val = strings.TrimSpace(val)
switch val {
case "d": // delete message
if err := srv.Users.Messages.Delete("me", m.gmailID).Do(); err != nil {
log.Fatalf("unable to delete message %v: %v", m.gmailID, err)
}
log.Printf("Deleted message %v.\n", m.gmailID)
deleted++
case "r": // mark as read
msg, err := srv.Users.Messages.Modify("me", m.gmailID, &gmail.ModifyMessageRequest{RemoveLabelIds: []string{"UNREAD"}}).Do()
if err != nil {
log.Fatalf("unable to modify message %v: %v", m.gmailID, err)
}
log.Printf("Modified message %v.\n", msg)
case "q": // quit
log.Printf("Done. %v messages processed, %v deleted\n", count, deleted)
os.Exit(0)
default:
}
}
}
return msgs
}