diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-05-20 15:34:44 -0400 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-05-20 15:34:44 -0400 |
commit | 0ccac89815ee92c69fefc148cfb272faf7309136 (patch) | |
tree | 228775a433018c8a5fd20f0ebb0f8446057b2112 /src/client.h | |
parent | f465dce27cf0f07039e29d8975ad98939f0df3a9 (diff) | |
download | libtwittercpp-0ccac89815ee92c69fefc148cfb272faf7309136.tar.gz libtwittercpp-0ccac89815ee92c69fefc148cfb272faf7309136.tar.bz2 libtwittercpp-0ccac89815ee92c69fefc148cfb272faf7309136.zip |
Started implementing user streams
You can now start a user stream and end it yourself. If it disconnects abnormally, it will reconnect with a backoff as described by Twitter. Some data structures have some fields parsed now; tweets have IDs, text, and authors. Users have IDs, screen names, and names. Notifications from the stream are parsed completely. The ability to follow and unfollow users has also been added, as well as the ability to get a list of friends and followers, and to reply to a tweet.
Diffstat (limited to 'src/client.h')
-rw-r--r-- | src/client.h | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/src/client.h b/src/client.h index 3a133e4..ae80ed9 100644 --- a/src/client.h +++ b/src/client.h | |||
@@ -7,6 +7,12 @@ | |||
7 | #include <list> | 7 | #include <list> |
8 | #include <curl_easy.h> | 8 | #include <curl_easy.h> |
9 | #include <curl_header.h> | 9 | #include <curl_header.h> |
10 | #include <thread> | ||
11 | #include <mutex> | ||
12 | #include "notification.h" | ||
13 | #include <set> | ||
14 | #include <ctime> | ||
15 | #include <chrono> | ||
10 | 16 | ||
11 | namespace OAuth { | 17 | namespace OAuth { |
12 | class Consumer; | 18 | class Consumer; |
@@ -18,21 +24,82 @@ namespace twitter { | |||
18 | 24 | ||
19 | class client { | 25 | class client { |
20 | public: | 26 | public: |
27 | class stream { | ||
28 | public: | ||
29 | typedef std::function<void(notification _notification)> notify_callback; | ||
30 | |||
31 | stream(client& _client); | ||
32 | |||
33 | void setNotifyCallback(notify_callback _n); | ||
34 | |||
35 | bool isRunning() const; | ||
36 | void start(); | ||
37 | void stop(); | ||
38 | |||
39 | private: | ||
40 | enum class backoff { | ||
41 | none, | ||
42 | network, | ||
43 | http, | ||
44 | rate_limit | ||
45 | }; | ||
46 | |||
47 | void run(); | ||
48 | int progress(); | ||
49 | int write(char* ptr, size_t size, size_t nmemb); | ||
50 | |||
51 | friend int client_stream_progress_callback_wrapper(void* stream, curl_off_t, curl_off_t, curl_off_t, curl_off_t); | ||
52 | friend size_t client_stream_write_callback_wrapper(void* ptr, size_t size, size_t nmemb, void* stream); | ||
53 | |||
54 | client& _client; | ||
55 | notify_callback _notify; | ||
56 | bool _stop = false; | ||
57 | std::thread _thread; | ||
58 | std::mutex _running_mutex; | ||
59 | std::mutex _notify_mutex; | ||
60 | std::mutex _stall_mutex; | ||
61 | std::string _buffer; | ||
62 | time_t _last_write; | ||
63 | bool _established = false; | ||
64 | backoff _backoff_type = backoff::none; | ||
65 | std::chrono::milliseconds _backoff_amount; | ||
66 | }; | ||
67 | |||
21 | client(const auth& _auth); | 68 | client(const auth& _auth); |
22 | ~client(); | 69 | ~client(); |
23 | 70 | ||
24 | response updateStatus(std::string msg, tweet& result, std::list<long> media_ids = {}); | 71 | response updateStatus(std::string msg, tweet& result, tweet in_response_to = tweet(), std::list<long> media_ids = {}); |
25 | response uploadMedia(std::string media_type, const char* data, long data_length, long& media_id); | 72 | response uploadMedia(std::string media_type, const char* data, long data_length, long& media_id); |
26 | 73 | ||
74 | response follow(user_id toFollow); | ||
75 | response follow(user toFollow); | ||
76 | |||
77 | response unfollow(user_id toUnfollow); | ||
78 | response unfollow(user toUnfollow); | ||
79 | |||
80 | response getFriends(std::set<user_id>& result); | ||
81 | response getFollowers(std::set<user_id>& result); | ||
82 | |||
83 | const user& getUser() const; | ||
84 | |||
85 | void setUserStreamNotifyCallback(stream::notify_callback callback); | ||
86 | void startUserStream(); | ||
87 | void stopUserStream(); | ||
88 | |||
27 | private: | 89 | private: |
90 | friend class stream; | ||
91 | |||
28 | OAuth::Consumer* _oauth_consumer; | 92 | OAuth::Consumer* _oauth_consumer; |
29 | OAuth::Token* _oauth_token; | 93 | OAuth::Token* _oauth_token; |
30 | OAuth::Client* _oauth_client; | 94 | OAuth::Client* _oauth_client; |
31 | 95 | ||
32 | bool performGet(std::string url, long& response_code, json& result); | 96 | user _current_user; |
33 | bool performPost(std::string url, std::string dataStr, long& response_code, json& result); | 97 | stream _user_stream{*this}; |
34 | bool performMultiPost(std::string url, const curl_httppost* fields, long& response_code, json& result); | 98 | |
35 | response codeForError(int httpcode, json errors) const; | 99 | bool performGet(std::string url, long& response_code, std::string& result); |
100 | bool performPost(std::string url, std::string dataStr, long& response_code, std::string& result); | ||
101 | bool performMultiPost(std::string url, const curl_httppost* fields, long& response_code, std::string& result); | ||
102 | response codeForError(int httpcode, std::string errors) const; | ||
36 | }; | 103 | }; |
37 | 104 | ||
38 | }; | 105 | }; |