/* Facebook plugin for Miranda Instant Messenger _____________________________________________ Copyright © 2011-17 Robert Pösel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _FACEBOOK_REQUEST_HISTORY_H_ #define _FACEBOOK_REQUEST_HISTORY_H_ // getting thread info and messages // revised 17.8.2016 class ThreadInfoRequest : public HttpRequest { public: // Request only messages history ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id, int offset, const char *timestamp, int limit) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/thread_info.php") { Url << "dpr=1"; setCommonBody(fc); const char *type = isChat ? "thread_fbids" : "user_ids"; std::string id_ = id; // FIXME: Rewrite this without std::string... if (isChat) { // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId if (id_.substr(0, 3) == "id.") id_ = id_.substr(3); } ptrA idEncoded(mir_urlEncode(id_.c_str())); //if (loadMessages) { // Grrr, offset doesn't work at all, we need to use timestamps to get back in history... // And we don't know, what's timestamp of first message, so we need to get from latest to oldest CMStringA begin(::FORMAT, "messages[%s][%s]", type, idEncoded); Body << CMStringA(::FORMAT, "%s[offset]=%i", begin.c_str(), offset).c_str() << CMStringA(::FORMAT, "%s[timestamp]=%s", begin.c_str(), timestamp).c_str() << CMStringA(::FORMAT, "%s[limit]=%i", begin.c_str(), limit).c_str(); //} /*if (loadThreadInfo) { data += "&threads[" + type + "][0]=" + idEncoded; }*/ } // Request only thread info // TODO: Make it array of ids ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/thread_info.php") { Url << "dpr=1"; setCommonBody(fc); const char *type = isChat ? "thread_fbids" : "user_ids"; std::string id_ = id; // FIXME: Rewrite this without std::string... if (isChat) { // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId if (id_.substr(0, 3) == "id.") id_ = id_.substr(3); } ptrA idEncoded(mir_urlEncode(id_.c_str())); // Load only thread info Body << CMStringA(::FORMAT, "threads[%s][0]=%s", type, idEncoded).c_str(); } // Request both thread info and messages for single contact/chat ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id, int limit) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/thread_info.php") { Url << "dpr=1"; setCommonBody(fc); const char *type = isChat ? "thread_fbids" : "user_ids"; std::string id_ = id; // FIXME: Rewrite this without std::string... if (isChat) { // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId if (id_.substr(0, 3) == "id.") id_ = id_.substr(3); } ptrA idEncoded(mir_urlEncode(id_.c_str())); // Load messages CMStringA begin(::FORMAT, "messages[%s][%s]", type, idEncoded); Body << CMStringA(::FORMAT, "%s[offset]=%i", begin.c_str(), 0).c_str() << CMStringA(::FORMAT, "%s[timestamp]=%s", begin.c_str(), "").c_str() << CMStringA(::FORMAT, "%s[limit]=%i", begin.c_str(), limit).c_str(); // Load thread info Body << CMStringA(::FORMAT, "threads[%s][0]=%s", type, idEncoded).c_str(); } // Request both thread info and messages for more threads ThreadInfoRequest(facebook_client *fc, const LIST &ids, int offset, int limit) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/thread_info.php") { Url << "dpr=1"; setCommonBody(fc); for (int i = 0; i < ids.getCount(); i++) { // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId std::string id_ = ids[i]; // FIXME: Rewrite this without std::string... if (id_.substr(0, 3) == "id.") id_ = id_.substr(3); ptrA idEncoded(mir_urlEncode(id_.c_str())); // Load messages CMStringA begin(::FORMAT, "messages[%s][%s]", "thread_fbids", idEncoded); Body << CMStringA(::FORMAT, "%s[offset]=%i", begin.c_str(), offset).c_str() //<< CMStringA(::FORMAT, "%s[timestamp]=%s", begin.c_str(), "").c_str() << CMStringA(::FORMAT, "%s[limit]=%i", begin.c_str(), limit).c_str(); // Load thread info Body << CMStringA(::FORMAT, "threads[%s][%i]=%s", "thread_fbids", i, idEncoded).c_str(); } } private: void setCommonBody(facebook_client *fc) { Body << "client=mercury" << CHAR_VALUE("__user", fc->self_.user_id.c_str()) << CHAR_VALUE("__dyn", fc->__dyn()) << CHAR_VALUE("__req", fc->__req()) << CHAR_VALUE("__rev", fc->__rev()) << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()) << "__a=1" << "__pc=PHASED:DEFAULT" << "__be=-1"; } }; // getting unread threads // revised 17.8.2016 class UnreadThreadsRequest : public HttpRequest { public: UnreadThreadsRequest(facebook_client *fc) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/unread_threads.php") { Url << "dpr=1"; Body << "folders[0]=inbox" << "folders[1]=other" // TODO: "other" is probably unused, and there is now "pending" instead << "client=mercury" << CHAR_VALUE("__user", fc->self_.user_id.c_str()) << CHAR_VALUE("__dyn", fc->__dyn()) << CHAR_VALUE("__req", fc->__req()) << CHAR_VALUE("__rev", fc->__rev()) << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()) << "__a=1" << "__pc=PHASED:DEFAULT" << "__be=-1"; } }; #endif //_FACEBOOK_REQUEST_HISTORY_H_