diff options
Diffstat (limited to 'snitch.cpp')
-rw-r--r-- | snitch.cpp | 82 |
1 files changed, 50 insertions, 32 deletions
diff --git a/snitch.cpp b/snitch.cpp index 3fcb3d0..2357a7d 100644 --- a/snitch.cpp +++ b/snitch.cpp | |||
@@ -23,30 +23,44 @@ int main(int argc, char** argv) | |||
23 | img_file.close(); | 23 | img_file.close(); |
24 | 24 | ||
25 | twitter::client client(auth); | 25 | twitter::client client(auth); |
26 | std::set<twitter::user_id> streamed_friends; | ||
26 | client.setUserStreamNotifyCallback([&] (twitter::notification n) { | 27 | client.setUserStreamNotifyCallback([&] (twitter::notification n) { |
27 | if (n.getType() == twitter::notification::type::tweet) | 28 | if (n.getType() == twitter::notification::type::friends) |
28 | { | 29 | { |
29 | std::string orig = n.getTweet().getText(); | 30 | streamed_friends = n.getFriends(); |
30 | std::string canonical; | 31 | } else if (n.getType() == twitter::notification::type::follow) |
31 | std::transform(std::begin(orig), std::end(orig), std::back_inserter(canonical), [] (char ch) { | 32 | { |
32 | return std::tolower(ch); | 33 | streamed_friends.insert(n.getUser().getID()); |
33 | }); | 34 | } else if (n.getType() == twitter::notification::type::unfollow) |
34 | 35 | { | |
35 | if (canonical.find("calling the cops") != std::string::npos) | 36 | streamed_friends.erase(n.getUser().getID()); |
37 | } else if (n.getType() == twitter::notification::type::tweet) | ||
38 | { | ||
39 | // Only monitor people you are following | ||
40 | if (streamed_friends.count(n.getTweet().getAuthor().getID()) == 1) | ||
36 | { | 41 | { |
37 | std::cout << "Calling the cops on @" << n.getTweet().getAuthor().getScreenName() << std::endl; | 42 | std::string orig = n.getTweet().getText(); |
38 | 43 | std::string canonical; | |
39 | long media_id; | 44 | std::transform(std::begin(orig), std::end(orig), std::back_inserter(canonical), [] (char ch) { |
40 | twitter::response resp = client.uploadMedia("image/jpeg", (const char*) img_buf, img_len, media_id); | 45 | return std::tolower(ch); |
41 | if (resp != twitter::response::ok) | 46 | }); |
47 | |||
48 | if (canonical.find("calling the cops") != std::string::npos) | ||
42 | { | 49 | { |
43 | std::cout << "Twitter error while uploading image: " << resp << std::endl; | 50 | std::cout << "Calling the cops on @" << n.getTweet().getAuthor().getScreenName() << std::endl; |
44 | } else { | 51 | |
45 | twitter::tweet tw; | 52 | long media_id; |
46 | resp = client.updateStatus("@" + n.getTweet().getAuthor().getScreenName(), tw, n.getTweet(), {media_id}); | 53 | twitter::response resp = client.uploadMedia("image/jpeg", (const char*) img_buf, img_len, media_id); |
47 | if (resp != twitter::response::ok) | 54 | if (resp != twitter::response::ok) |
48 | { | 55 | { |
49 | std::cout << "Twitter error while tweeting: " << resp << std::endl; | 56 | std::cout << "Twitter error while uploading image: " << resp << std::endl; |
57 | } else { | ||
58 | twitter::tweet tw; | ||
59 | resp = client.updateStatus("@" + n.getTweet().getAuthor().getScreenName(), tw, n.getTweet(), {media_id}); | ||
60 | if (resp != twitter::response::ok) | ||
61 | { | ||
62 | std::cout << "Twitter error while tweeting: " << resp << std::endl; | ||
63 | } | ||
50 | } | 64 | } |
51 | } | 65 | } |
52 | } | 66 | } |
@@ -66,7 +80,7 @@ int main(int argc, char** argv) | |||
66 | client.startUserStream(); | 80 | client.startUserStream(); |
67 | for (;;) | 81 | for (;;) |
68 | { | 82 | { |
69 | std::this_thread::sleep_for(std::chrono::hours(4)); | 83 | std::this_thread::sleep_for(std::chrono::minutes(1)); |
70 | 84 | ||
71 | std::set<twitter::user_id> friends; | 85 | std::set<twitter::user_id> friends; |
72 | std::set<twitter::user_id> followers; | 86 | std::set<twitter::user_id> followers; |
@@ -76,22 +90,24 @@ int main(int argc, char** argv) | |||
76 | resp = client.getFollowers(followers); | 90 | resp = client.getFollowers(followers); |
77 | if (resp == twitter::response::ok) | 91 | if (resp == twitter::response::ok) |
78 | { | 92 | { |
79 | auto frit = std::begin(friends); | 93 | std::list<twitter::user_id> old_friends, new_followers; |
80 | auto foit = std::begin(followers); | 94 | std::set_difference(std::begin(friends), std::end(friends), std::begin(followers), std::end(followers), std::back_inserter(old_friends)); |
95 | std::set_difference(std::begin(followers), std::end(followers), std::begin(friends), std::end(friends), std::back_inserter(new_followers)); | ||
96 | for (auto f : old_friends) | ||
97 | { | ||
98 | resp = client.unfollow(f); | ||
99 | if (resp != twitter::response::ok) | ||
100 | { | ||
101 | std::cout << "Twitter error while unfollowing" << std::endl; | ||
102 | } | ||
103 | } | ||
81 | 104 | ||
82 | while (frit != std::end(friends)) | 105 | for (auto f : new_followers) |
83 | { | 106 | { |
84 | auto match = std::mismatch(frit, std::end(friends), foit); | 107 | resp = client.follow(f); |
85 | if (match.first != std::end(friends)) | 108 | if (resp != twitter::response::ok) |
86 | { | 109 | { |
87 | resp = client.unfollow(*match.first); | 110 | std::cout << "Twitter error while following" << std::endl; |
88 | if (resp != twitter::response::ok) | ||
89 | { | ||
90 | std::cout << "Twitter error while unfollowing" << std::endl; | ||
91 | } | ||
92 | |||
93 | frit = match.first; | ||
94 | frit++; | ||
95 | } | 111 | } |
96 | } | 112 | } |
97 | } else { | 113 | } else { |
@@ -100,6 +116,8 @@ int main(int argc, char** argv) | |||
100 | } else { | 116 | } else { |
101 | std::cout << "Twitter error while getting friends: " << resp << std::endl; | 117 | std::cout << "Twitter error while getting friends: " << resp << std::endl; |
102 | } | 118 | } |
119 | |||
120 | std::this_thread::sleep_for(std::chrono::hours(4)); | ||
103 | } | 121 | } |
104 | 122 | ||
105 | client.stopUserStream(); | 123 | client.stopUserStream(); |