/* 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_MESSAGES_H_ #define _FACEBOOK_REQUEST_MESSAGES_H_ // sending messages // revised 17.8.2016 class SendMessageRequest : public HttpRequest { public: SendMessageRequest(facebook_client *fc, const char *userId, const char *threadId, const char *messageId, const char *messageText, bool isChat, const char *captcha, const char *captchaPersistData) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/messaging/send/") { // Don't notify errors for this request, because we're getting them inline in messaging window NotifyErrors = false; // Use own persistent connection for sending messages Persistent = MESSAGES; Url << "dpr=1"; if (mir_strlen(captcha) > 0) { Body << CHAR_VALUE("captcha_persist_data", captchaPersistData) << "recaptcha_challenge_field=" << CHAR_VALUE("captcha_response", captcha); } Body << "client=mercury" // or "web_messenger" (whole messages page) << "action_type=ma-type:user-generated-message"; // Experimental sticker sending support std::string message_text = messageText; // FIXME: Rewrite this without std::string... if (message_text.substr(0, 10) == "[[sticker:" && message_text.substr(message_text.length() - 2) == "]]") { Body << "body=" << CHAR_VALUE("sticker_id", ptrA(mir_urlEncode(message_text.substr(10, message_text.length() - 10 - 2).c_str()))) << "has_attachment=true"; // TODO: For sending GIF images instead of "sticker_id=" there is "image_ids[0]=", otherwise it's same } else { Body << CHAR_VALUE("body", ptrA(mir_urlEncode(messageText))) << "has_attachment=false"; } Body << "ephemeral_ttl_mode=0" // << "force_sms=true" // TODO: This is present always when sending via "web_messenger" << CHAR_VALUE("message_id", messageId) << CHAR_VALUE("offline_threading_id", messageId); // Same as message ID if (isChat) { // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId std::string threadFbid = threadId; // FIXME: Rewrite this without std::string... if (threadFbid.substr(0, 3) == "id.") threadFbid = threadFbid.substr(3); Body << CHAR_VALUE("thread_fbid", threadFbid.c_str()); } else { Body << CHAR_VALUE("other_user_fbid", userId) << CHAR_VALUE("specific_to_list[0]", CMStringA(::FORMAT, "fbid:%s", userId)) << CHAR_VALUE("specific_to_list[1]", CMStringA(::FORMAT, "fbid:%s", fc->self_.user_id.c_str())); } Body << "signature_id=" // TODO: How to generate signature ID? It is present only when sending via "mercury" << "source=source:chat:web" // or "source:titan:web" for web_messenger << CHAR_VALUE("timestamp", utils::time::mili_timestamp().c_str()) << "ui_push_phase=V3" << 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"; } }; // sending typing notification // revised 17.8.2016 class SendTypingRequest : public HttpRequest { public: SendTypingRequest(facebook_client *fc, const char *userId, bool isChat, bool isTyping) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/messaging/typ.php") { Url << "dpr=1"; ptrA idEncoded(mir_urlEncode(userId)); Body << (isTyping ? "typ=1" : "typ=0") << CHAR_VALUE("to", isChat ? "" : idEncoded) << CHAR_VALUE("thread", idEncoded) << "source=mercury-chat" << 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"; } }; // marking messages read class MarkMessageReadRequest : public HttpRequest { public: MarkMessageReadRequest(facebook_client *fc, const LIST &ids) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/change_read_status.php") { Url << "__a=1"; for (int i = 0; i < ids.getCount(); i++) { std::string id_ = ids[i]; // NOTE: Remove "id." prefix as here we need to give threadFbId and not threadId if (id_.substr(0, 3) == "id.") id_ = id_.substr(3); CMStringA id(::FORMAT, "ids[%s]=true", ptrA(mir_urlEncode(id_.c_str()))); Body << id.c_str(); } Body << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()) << CHAR_VALUE("__user", fc->self_.user_id.c_str()) << CHAR_VALUE("__dyn", fc->__dyn()) << CHAR_VALUE("__req", fc->__req()) << CHAR_VALUE("__rev", fc->__rev()) << "__a=1"; } }; #endif //_FACEBOOK_REQUEST_MESSAGES_H_