about summary refs log tree commit diff stats
path: root/src/tweet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tweet.cpp')
-rw-r--r--src/tweet.cpp133
1 files changed, 34 insertions, 99 deletions
diff --git a/src/tweet.cpp b/src/tweet.cpp index 2927018..4849fb7 100644 --- a/src/tweet.cpp +++ b/src/tweet.cpp
@@ -1,134 +1,69 @@
1#include "tweet.h" 1#include "tweet.h"
2#include <json.hpp> 2#include <json.hpp>
3#include <cassert> 3#include "util.h"
4 4#include "codes.h"
5using nlohmann::json; 5#include "client.h"
6 6
7namespace twitter { 7namespace twitter {
8 8
9 tweet::tweet() : _valid(false) 9 tweet::tweet(const client& tclient, std::string data) try
10 { 10 : _client(tclient)
11
12 }
13
14 tweet::tweet(std::string data) : _valid(true)
15 { 11 {
16 auto _data = json::parse(data); 12 auto json = nlohmann::json::parse(data);
17 _id = _data.at("id"); 13 _id = json["id"].get<tweet_id>();
18 _text = _data.at("text"); 14 _text = json["text"].get<std::string>();
19 _author = user(_data.at("user").dump()); 15 _author = make_unique<user>(_client, json["user"].dump());
20 16
21 if (_data.find("retweeted_status") != _data.end()) 17 if (!json["retweeted_status"].is_null())
22 { 18 {
23 _is_retweet = true; 19 _is_retweet = true;
24 20
25 std::string retweet = _data.at("retweeted_status").dump(); 21 _retweeted_status = make_unique<tweet>(_client, json["retweeted_status"].dump());
26 _retweeted_status = new tweet(retweet);
27 } 22 }
28 23
29 if (_data.find("entities") != _data.end()) 24 if (!json["entities"].is_null())
30 { 25 {
31 auto _entities = _data.at("entities"); 26 auto entities = json["entities"];
32 if (_entities.find("user_mentions") != _entities.end()) 27 if (!entities["user_mentions"].is_null())
33 { 28 {
34 for (auto _mention : _entities.at("user_mentions")) 29 for (auto mention : entities["user_mentions"])
35 { 30 {
36 _mentions.push_back(std::make_pair(_mention.at("id"), _mention.at("screen_name").get<std::string>())); 31 _mentions.push_back(std::make_pair(mention["id"].get<user_id>(), mention["screen_name"].get<std::string>()));
37 } 32 }
38 } 33 }
39 } 34 }
40 } 35 } catch (const std::invalid_argument& error)
41
42 tweet::tweet(const tweet& other)
43 { 36 {
44 _valid = other._valid; 37 std::throw_with_nested(malformed_object("tweet", data));
45 _id = other._id; 38 } catch (const std::domain_error& error)
46 _text = other._text;
47 _author = other._author;
48 _is_retweet = other._is_retweet;
49
50 if (_is_retweet)
51 {
52 _retweeted_status = new tweet(*other._retweeted_status);
53 }
54
55 _mentions = other._mentions;
56 }
57
58 tweet::tweet(tweet&& other) : tweet()
59 { 39 {
60 swap(*this, other); 40 std::throw_with_nested(malformed_object("tweet", data));
61 } 41 }
62 42
63 tweet::~tweet() 43 std::string tweet::generateReplyPrefill() const
64 { 44 {
65 if (_is_retweet) 45 std::ostringstream output;
46 output << "@" << _author->getScreenName() << " ";
47
48 for (auto mention : _mentions)
66 { 49 {
67 delete _retweeted_status; 50 if ((mention.first != _author->getID()) && (mention.first != _client.getUser().getID()))
51 {
52 output << "@" << mention.second << " ";
53 }
68 } 54 }
69 }
70
71 tweet& tweet::operator=(tweet other)
72 {
73 swap(*this, other);
74
75 return *this;
76 }
77
78 void swap(tweet& first, tweet& second)
79 {
80 std::swap(first._valid, second._valid);
81 std::swap(first._id, second._id);
82 std::swap(first._text, second._text);
83 std::swap(first._author, second._author);
84 std::swap(first._is_retweet, second._is_retweet);
85 std::swap(first._retweeted_status, second._retweeted_status);
86 std::swap(first._mentions, second._mentions);
87 }
88
89 tweet_id tweet::getID() const
90 {
91 assert(_valid);
92
93 return _id;
94 }
95
96 std::string tweet::getText() const
97 {
98 assert(_valid);
99
100 return _text;
101 }
102
103 const user& tweet::getAuthor() const
104 {
105 assert(_valid);
106
107 return _author;
108 }
109
110 bool tweet::isRetweet() const
111 {
112 assert(_valid);
113
114 return _is_retweet;
115 }
116
117 tweet tweet::getRetweet() const
118 {
119 assert(_valid && _is_retweet);
120 55
121 return *_retweeted_status; 56 return output.str();
122 } 57 }
123 58
124 std::vector<std::pair<user_id, std::string>> tweet::getMentions() const 59 tweet tweet::reply(std::string message, std::list<long> media_ids) const
125 { 60 {
126 return _mentions; 61 return _client.replyToTweet(message, _id, media_ids);
127 } 62 }
128 63
129 tweet::operator bool() const 64 bool tweet::isMyTweet() const
130 { 65 {
131 return _valid; 66 return *_author == _client.getUser();
132 } 67 }
133 68
134}; 69};