-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtimeline.go
112 lines (98 loc) · 2.59 KB
/
timeline.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
104
105
106
107
108
109
110
111
112
package main
import (
"fmt"
"time"
"github.com/crueber/twitter-pruner/pruner"
"github.com/dghubble/go-twitter/twitter"
)
func isAgedOut(t *twitter.Tweet, env *pruner.Env) bool {
createdTime, _ := t.CreatedAtTime()
return env.MaxAge.After(createdTime)
}
func isBoring(t *twitter.Tweet, env *pruner.Env) bool {
if env.AllRts && t.Retweeted {
return true
}
if t.FavoriteCount >= env.Favs || t.RetweetCount >= env.Rts {
rt := ""
if t.Retweeted {
rt += "re"
}
if env.Verbose {
fmt.Printf("Ignoring %vtweet (%v fav/%v rt): %v\n", rt, t.FavoriteCount, t.RetweetCount, t.Text)
}
return false
}
return true
}
func calcTweetsToDelete(tweets []twitter.Tweet, env *pruner.Env) []int64 {
var tweetsToDelete []int64
for _, tweet := range tweets {
if isAgedOut(&tweet, env) && isBoring(&tweet, env) {
if env.Verbose {
fmt.Printf("%v --- %v %v --- %v\n", tweet.CreatedAt, tweet.FavoriteCount, tweet.RetweetCount, tweet.Text)
}
tweetsToDelete = append(tweetsToDelete, tweet.ID)
}
}
return tweetsToDelete
}
func deleteTweets(c *pruner.Client, tweetIds []int64) (int, int) {
count := 0
errorCount := 0
if c.Env.Commit {
for _, id := range tweetIds {
err := c.DestroyTweet(id)
if err != nil {
if c.Env.Verbose {
fmt.Printf("\n")
}
fmt.Printf("Error removing status: %v\n", err)
errorCount++
continue
}
if c.Env.Verbose {
fmt.Printf(".")
}
count++
}
}
return count, errorCount
}
// PruneTimeline does exactly what it says it does
func PruneTimeline(c *pruner.Client, user *twitter.User) error {
var max int64
count := 0
markedForRemoval := 0
removed := 0
errorCount := 0
shouldContinue := true
for shouldContinue {
c.Env.MaxAPICalls--
tweets, err := c.GetTimeline(max)
if err != nil {
fmt.Printf("Error in timeline retrieval: %+v", err)
errorCount++
}
count += len(tweets)
tweetsToDelete := calcTweetsToDelete(tweets, c.Env)
markedForRemoval += len(tweetsToDelete)
numberRemoved, errs := deleteTweets(c, tweetsToDelete)
if c.Env.Commit && c.Env.Verbose {
fmt.Printf("\n")
}
c.Env.MaxAPICalls -= numberRemoved
removed += numberRemoved
errorCount += errs
if errorCount < 20 && len(tweets) > 0 && c.Env.MaxAPICalls > 0 {
max = tweets[len(tweets)-1].ID - 1
if c.Env.Verbose {
fmt.Printf("%v errs -- %v tweets -- %v calls left -- %v current id\n", errorCount, len(tweets), c.Env.MaxAPICalls, max)
}
} else {
shouldContinue = false
}
}
fmt.Printf("\nTotal Scanned Tweets: %v; Removed: %v of %v; Max Age: %v\n", count, removed, markedForRemoval, c.Env.MaxAge.Format(time.RFC3339))
return nil
}