-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpoll.go
103 lines (92 loc) · 2.27 KB
/
poll.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"sync"
"time"
"cloud.google.com/go/pubsub"
"github.com/getsentry/raven-go"
"github.com/kruszczynski/auto-pocketer/gmail"
"github.com/kruszczynski/auto-pocketer/googlepubsub"
"github.com/kruszczynski/auto-pocketer/pocket"
)
func main() {
raven.SetDSN(os.Getenv("SENTRY_DSN"))
gmailClient, err := gmail.GetClient()
if err != nil {
raven.CaptureErrorAndWait(err, nil)
log.Panic(err)
}
pocketClient := pocket.GetClient()
gmailClient.Watch()
gmailWatchCalledOn := daysSinceBeginning()
pubsubClient := googlepubsub.GetClient()
sub, err := pubsubClient.GetSubscription()
if err != nil {
raven.CaptureErrorAndWait(err, nil)
log.Panic(err)
}
var mu sync.Mutex
err = sub.Receive(context.Background(), func(ctx context.Context, msg *pubsub.Message) {
// locks because of startHistoryId is shared
mu.Lock()
defer mu.Unlock()
// call watch if more than one day has elapsed
if gmailWatchCalledOn < daysSinceBeginning() {
gmailClient.Watch()
gmailWatchCalledOn = daysSinceBeginning()
}
msg.Ack()
var message googlepubsub.Message
err := json.Unmarshal(msg.Data, &message)
if err != nil {
raven.CaptureError(err, nil)
return
}
messageIds, err := gmailClient.ListMessageIds(message.HistoryId)
if err != nil {
raven.CaptureError(err, nil)
return
}
fmt.Printf("%d new messages received\n", len(messageIds))
processedMessages, err := gmailClient.ProcessMessages(messageIds)
if err != nil {
raven.CaptureError(err, nil)
return
}
filteredMessages := filterMessages(processedMessages)
for _, pm := range filteredMessages {
link := pm.FindLink()
if link != "" {
err := pocketClient.Add(link)
if err != nil {
raven.CaptureError(err, nil)
continue
}
err = gmailClient.Archive(pm.Id)
if err != nil {
raven.CaptureError(err, nil)
continue
}
}
}
})
if err != nil {
raven.CaptureErrorAndWait(err, nil)
}
}
func filterMessages(messages []*gmail.ProcessedMessage) (ret []*gmail.ProcessedMessage) {
for _, msg := range messages {
fmt.Printf("Message sender is: %s\n", msg.From)
if msg.AllowedSender() {
ret = append(ret, msg)
}
}
return
}
func daysSinceBeginning() int64 {
return time.Now().Unix() / 60 / 60 / 24
}