diff --git a/README.md b/README.md index f22ab7e..8340588 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ you can use these endpoint - favorites/create - favorites/destroy - media/upload(support: jpg, jpeg, png, gif, mp4) +- direct_messages/events/new (message_create) # Dependency - libcurl(openssl version) @@ -142,6 +143,10 @@ api.favorite().Destroy("tweet id"); // get a timeline with screen name auto timeline = api.status().UserTimeline("milkcocoa0902"); +// send a direct message +// you cau get recipient_id using https://idtwi.com/ +api.directMessage().messageCreate("", "Sent message using Cocoa Twitter Library"); + ``` # More Information diff --git a/src/cocoatweet/api/api.cc b/src/cocoatweet/api/api.cc index 6d5abd7..af529c1 100644 --- a/src/cocoatweet/api/api.cc +++ b/src/cocoatweet/api/api.cc @@ -2,10 +2,11 @@ namespace CocoaTweet::API { API::API(CocoaTweet::OAuth::Key _key) { - oauth_ = std::make_shared(_key); - status_ = Statuses::Status(oauth_); - favorite_ = Favorites::Favorite(oauth_); - media_ = Medias::Media(oauth_); + oauth_ = std::make_shared(_key); + status_ = Statuses::Status(oauth_); + favorite_ = Favorites::Favorite(oauth_); + media_ = Medias::Media(oauth_); + directMessage_ = DirectMessages::DirectMessage(oauth_); } Statuses::Status API::status() const { @@ -19,4 +20,8 @@ Favorites::Favorite API::favorite() const { Medias::Media API::media() const { return media_; } + +DirectMessages::DirectMessage API::directMessage() const { + return directMessage_; +} } // namespace CocoaTweet::API diff --git a/src/cocoatweet/api/api.h b/src/cocoatweet/api/api.h index 21ba046..0366517 100644 --- a/src/cocoatweet/api/api.h +++ b/src/cocoatweet/api/api.h @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace CocoaTweet::API { @@ -24,10 +25,13 @@ public: Medias::Media media() const; + DirectMessages::DirectMessage directMessage() const; + private: Statuses::Status status_; Favorites::Favorite favorite_; Medias::Media media_; + DirectMessages::DirectMessage directMessage_; std::shared_ptr oauth_; }; } // namespace CocoaTweet::API diff --git a/src/cocoatweet/api/directMessage/directMessage.cc b/src/cocoatweet/api/directMessage/directMessage.cc new file mode 100644 index 0000000..4788418 --- /dev/null +++ b/src/cocoatweet/api/directMessage/directMessage.cc @@ -0,0 +1,15 @@ +#include +#include + +namespace CocoaTweet::API::DirectMessages { +DirectMessage::DirectMessage(std::shared_ptr _oauth) { + oauth_ = _oauth; +} + +void DirectMessage::messageCreate(const std::string& _recipient, const std::string& _message) { + CocoaTweet::API::DirectMessages::New dm; + dm.recipient(_recipient); + dm.message(_message); + dm.process(oauth_); +} +} // namespace CocoaTweet::API::DirectMessages \ No newline at end of file diff --git a/src/cocoatweet/api/directMessage/directMessage.h b/src/cocoatweet/api/directMessage/directMessage.h new file mode 100644 index 0000000..d796111 --- /dev/null +++ b/src/cocoatweet/api/directMessage/directMessage.h @@ -0,0 +1,27 @@ +#ifndef COCOATWEET_API_DIRECTMESSAGE_DIRECTMESSAGE_H_ +#define COCOATWEET_API_DIRECTMESSAGE_DIRECTMESSAGE_H_ + +#include "cocoatweet/api/interface/groupInterface.h" +#include "cocoatweet/oauth/oauth.h" +#include +#include +#include + +namespace CocoaTweet::API::DirectMessages { + +/// @brief Entory point for statuses/* +class DirectMessage : public groupInterface { +public: + DirectMessage() = default; + + /// @brief constructor which finally should to be called. + /// @param[in] std::shared_ptr : pointer to OAuth object + DirectMessage(std::shared_ptr _oauth); + + void messageCreate(const std::string& _recipient, const std::string& _message); + +private: +}; +} // namespace CocoaTweet::API::DirectMessages + +#endif diff --git a/src/cocoatweet/api/directMessage/new.cc b/src/cocoatweet/api/directMessage/new.cc new file mode 100644 index 0000000..7cbbbec --- /dev/null +++ b/src/cocoatweet/api/directMessage/new.cc @@ -0,0 +1,30 @@ +#include +#include +#include + +namespace CocoaTweet::API::DirectMessages { +New::New() { + url_ = "https://api.twitter.com/1.1/direct_messages/events/new.json"; + contentType_ = "application/json"; + + nlohmann::json tmp; + tmp["type"] = "message_create"; + tmp["message_create"] = nlohmann::json::object(); + tmp["message_create"]["target"] = nlohmann::json::object(); + tmp["message_create"]["message_data"] = nlohmann::json::object(); + json_["event"] = tmp; +} + +void New::recipient(const std::string& _id) { + json_["event"]["message_create"]["target"]["recipient_id"] = std::stol(_id); +} + +void New::message(const std::string& _message) { + json_["event"]["message_create"]["message_data"]["text"] = _message; +} + +void New::process(std::weak_ptr _oauth) { + bodyParam_.insert_or_assign("data", json_.dump()); + HttpPost::process(_oauth, [](const std::string& _rcv) {}); +} +} // namespace CocoaTweet::API::DirectMessages \ No newline at end of file diff --git a/src/cocoatweet/api/directMessage/new.h b/src/cocoatweet/api/directMessage/new.h new file mode 100644 index 0000000..e717e9a --- /dev/null +++ b/src/cocoatweet/api/directMessage/new.h @@ -0,0 +1,30 @@ +#ifndef COCOATWEET_API_DIRECTMESSAGE_NEW_H_ +#define COCOATWEET_API_DIRECTMESSAGE_NEW_H_ + +#include +#include +#include +#include +#include +#include "nlohmann/json.hpp" + +namespace CocoaTweet::API::DirectMessages { +/// @brief class for using statuses/update endpoint +class New : public CocoaTweet::API::Interface::HttpPost { +public: + New(); + void recipient(const std::string& _id); + void message(const std::string& _message); + + /// @brief process request for endpoint + /// @param[in] std::weak_ptr _oauth : pointer to oauth object + /// @param[out] CocoaTweet::API::Model::Tweet : request result + void process(std::weak_ptr _oauth); + +private: + std::string status_; + nlohmann::json json_; +}; +} // namespace CocoaTweet::API::DirectMessages + +#endif diff --git a/src/cocoatweet/api/interface/httpPost.cc b/src/cocoatweet/api/interface/httpPost.cc index 378c280..1d42587 100644 --- a/src/cocoatweet/api/interface/httpPost.cc +++ b/src/cocoatweet/api/interface/httpPost.cc @@ -53,6 +53,8 @@ void HttpPost::process(std::weak_ptr _oauth, ("Content-Disposition: form-data; name=\"" + key + "\";\r\n\r\n" + value + "\r\n"); } requestBody += (std::string("--") + "milkcocoa0902" + "--" + "\r\n"); + } else if (contentType_ == "application/json") { + requestBody = bodyParam_["data"]; } } @@ -95,6 +97,8 @@ void HttpPost::process(std::weak_ptr _oauth, contentType = contentType_; } else if (contentType_ == "multipart/form-data") { contentType = contentType_ + "; boundary=milkcocoa0902"; + } else if (contentType_ == "application/json") { + contentType_ = "application/json"; } headers = curl_slist_append(headers, ("Content-Type: " + contentType).c_str());