about summary refs log tree commit diff stats
path: root/snitch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'snitch.cpp')
-rw-r--r--snitch.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/snitch.cpp b/snitch.cpp new file mode 100644 index 0000000..3fcb3d0 --- /dev/null +++ b/snitch.cpp
@@ -0,0 +1,106 @@
1#include <yaml-cpp/yaml.h>
2#include <twitter.h>
3#include <fstream>
4#include <thread>
5#include <chrono>
6
7int main(int argc, char** argv)
8{
9 YAML::Node config = YAML::LoadFile("config.yml");
10
11 twitter::auth auth;
12 auth.setConsumerKey(config["consumer_key"].as<std::string>());
13 auth.setConsumerSecret(config["consumer_secret"].as<std::string>());
14 auth.setAccessKey(config["access_key"].as<std::string>());
15 auth.setAccessSecret(config["access_secret"].as<std::string>());
16
17 std::ifstream img_file("image.jpg");
18 img_file.seekg(0, std::ios::end);
19 size_t img_len = img_file.tellg();
20 char* img_buf = new char[img_len];
21 img_file.seekg(0, std::ios::beg);
22 img_file.read(img_buf, img_len);
23 img_file.close();
24
25 twitter::client client(auth);
26 client.setUserStreamNotifyCallback([&] (twitter::notification n) {
27 if (n.getType() == twitter::notification::type::tweet)
28 {
29 std::string orig = n.getTweet().getText();
30 std::string canonical;
31 std::transform(std::begin(orig), std::end(orig), std::back_inserter(canonical), [] (char ch) {
32 return std::tolower(ch);
33 });
34
35 if (canonical.find("calling the cops") != std::string::npos)
36 {
37 std::cout << "Calling the cops on @" << n.getTweet().getAuthor().getScreenName() << std::endl;
38
39 long media_id;
40 twitter::response resp = client.uploadMedia("image/jpeg", (const char*) img_buf, img_len, media_id);
41 if (resp != twitter::response::ok)
42 {
43 std::cout << "Twitter error while uploading image: " << resp << std::endl;
44 } else {
45 twitter::tweet tw;
46 resp = client.updateStatus("@" + n.getTweet().getAuthor().getScreenName(), tw, n.getTweet(), {media_id});
47 if (resp != twitter::response::ok)
48 {
49 std::cout << "Twitter error while tweeting: " << resp << std::endl;
50 }
51 }
52 }
53 } else if (n.getType() == twitter::notification::type::followed)
54 {
55 twitter::response resp = client.follow(n.getUser());
56 if (resp != twitter::response::ok)
57 {
58 std::cout << "Twitter error while following @" << n.getUser().getScreenName() << ": " << resp << std::endl;
59 }
60 }
61 });
62
63 std::this_thread::sleep_for(std::chrono::minutes(1));
64
65 std::cout << "Starting streaming" << std::endl;
66 client.startUserStream();
67 for (;;)
68 {
69 std::this_thread::sleep_for(std::chrono::hours(4));
70
71 std::set<twitter::user_id> friends;
72 std::set<twitter::user_id> followers;
73 twitter::response resp = client.getFriends(friends);
74 if (resp == twitter::response::ok)
75 {
76 resp = client.getFollowers(followers);
77 if (resp == twitter::response::ok)
78 {
79 auto frit = std::begin(friends);
80 auto foit = std::begin(followers);
81
82 while (frit != std::end(friends))
83 {
84 auto match = std::mismatch(frit, std::end(friends), foit);
85 if (match.first != std::end(friends))
86 {
87 resp = client.unfollow(*match.first);
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 }
96 }
97 } else {
98 std::cout << "Twitter error while getting followers: " << resp << std::endl;
99 }
100 } else {
101 std::cout << "Twitter error while getting friends: " << resp << std::endl;
102 }
103 }
104
105 client.stopUserStream();
106}