diff options
Diffstat (limited to 'src/client.cpp')
-rw-r--r-- | src/client.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/client.cpp b/src/client.cpp new file mode 100644 index 0000000..b71ff70 --- /dev/null +++ b/src/client.cpp | |||
@@ -0,0 +1,124 @@ | |||
1 | #include "client.h" | ||
2 | #include <curl_easy.h> | ||
3 | #include <curl_header.h> | ||
4 | #include <sstream> | ||
5 | #include <set> | ||
6 | #include <algorithm> | ||
7 | #include <liboauthcpp/liboauthcpp.h> | ||
8 | |||
9 | namespace twitter { | ||
10 | |||
11 | client::client(const auth& _arg) | ||
12 | { | ||
13 | _oauth_consumer = new OAuth::Consumer(_arg.getConsumerKey(), _arg.getConsumerSecret()); | ||
14 | _oauth_token = new OAuth::Token(_arg.getAccessKey(), _arg.getAccessSecret()); | ||
15 | _oauth_client = new OAuth::Client(_oauth_consumer, _oauth_token); | ||
16 | } | ||
17 | |||
18 | client::~client() | ||
19 | { | ||
20 | delete _oauth_client; | ||
21 | delete _oauth_token; | ||
22 | delete _oauth_consumer; | ||
23 | } | ||
24 | |||
25 | response client::updateStatus(std::string msg, tweet& result) | ||
26 | { | ||
27 | std::ostringstream output; | ||
28 | curl::curl_ios<std::ostringstream> ios(output); | ||
29 | curl::curl_easy conn(ios); | ||
30 | |||
31 | std::stringstream datastrstream; | ||
32 | datastrstream << "status=" << OAuth::PercentEncode(msg); | ||
33 | |||
34 | std::string datastr = datastrstream.str(); | ||
35 | std::string url = "https://api.twitter.com/1.1/statuses/update.json"; | ||
36 | |||
37 | curl::curl_header headers; | ||
38 | std::string oauth_header = _oauth_client->getFormattedHttpHeader(OAuth::Http::Post, url, datastr); | ||
39 | if (!oauth_header.empty()) | ||
40 | { | ||
41 | headers.add(oauth_header); | ||
42 | } | ||
43 | |||
44 | try { | ||
45 | conn.add<CURLOPT_URL>(url.c_str()); | ||
46 | conn.add<CURLOPT_COPYPOSTFIELDS>(datastr.c_str()); | ||
47 | conn.add<CURLOPT_POST>(1); | ||
48 | conn.add<CURLOPT_HTTPHEADER>(headers.get()); | ||
49 | |||
50 | conn.perform(); | ||
51 | } catch (curl::curl_easy_exception error) | ||
52 | { | ||
53 | error.print_traceback(); | ||
54 | |||
55 | return response::curl_error; | ||
56 | } | ||
57 | |||
58 | long response_code = conn.get_info<CURLINFO_RESPONSE_CODE>().get(); | ||
59 | json response_data = json::parse(output.str()); | ||
60 | if (response_code == 200) | ||
61 | { | ||
62 | result = tweet(response_data); | ||
63 | return response::ok; | ||
64 | } | ||
65 | |||
66 | std::set<int> error_codes; | ||
67 | if (response_data.find("errors") != response_data.end()) | ||
68 | { | ||
69 | std::transform(std::begin(response_data["errors"]), std::end(response_data["errors"]), std::inserter(error_codes, std::begin(error_codes)), [] (const json& error) { | ||
70 | return error["code"].get<int>(); | ||
71 | }); | ||
72 | } | ||
73 | |||
74 | if (error_codes.count(32) == 1 || error_codes.count(135) == 1 || error_codes.count(215) == 1) | ||
75 | { | ||
76 | return response::bad_auth; | ||
77 | } else if (error_codes.count(64) == 1) | ||
78 | { | ||
79 | return response::suspended; | ||
80 | } else if (error_codes.count(88) == 1 || error_codes.count(185) == 1) | ||
81 | { | ||
82 | return response::limited; | ||
83 | } else if (error_codes.count(89) == 1) | ||
84 | { | ||
85 | return response::bad_token; | ||
86 | } else if (error_codes.count(130) == 1) | ||
87 | { | ||
88 | return response::server_overloaded; | ||
89 | } else if (error_codes.count(131) == 1) | ||
90 | { | ||
91 | return response::server_error; | ||
92 | } else if (error_codes.count(186) == 1) | ||
93 | { | ||
94 | return response::bad_length; | ||
95 | } else if (error_codes.count(187) == 1) | ||
96 | { | ||
97 | return response::duplicate_status; | ||
98 | } else if (error_codes.count(226) == 1) | ||
99 | { | ||
100 | return response::suspected_spam; | ||
101 | } else if (error_codes.count(261) == 1) | ||
102 | { | ||
103 | return response::write_restricted; | ||
104 | } else if (response_code == 429) | ||
105 | { | ||
106 | return response::limited; | ||
107 | } else if (response_code == 500) | ||
108 | { | ||
109 | return response::server_error; | ||
110 | } else if (response_code == 502) | ||
111 | { | ||
112 | return response::server_unavailable; | ||
113 | } else if (response_code == 503) | ||
114 | { | ||
115 | return response::server_overloaded; | ||
116 | } else if (response_code == 504) | ||
117 | { | ||
118 | return response::server_timeout; | ||
119 | } else { | ||
120 | return response::unknown_error; | ||
121 | } | ||
122 | } | ||
123 | |||
124 | }; | ||