From 5b32a855e518f67589fd49837795a605a19badce Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 4 Jan 2018 20:45:00 +0300 Subject: code reordering, not to reassemble the whole project on each change in headers --- protocols/FacebookRM/facebook.vcxproj | 11 - protocols/FacebookRM/src/channel.cpp | 77 +++++++ protocols/FacebookRM/src/client.h | 2 +- protocols/FacebookRM/src/constants.h | 254 ++++++++++------------ protocols/FacebookRM/src/contacts.cpp | 112 ++++++++++ protocols/FacebookRM/src/dialogs.cpp | 26 +++ protocols/FacebookRM/src/feeds.cpp | 56 +++++ protocols/FacebookRM/src/history.cpp | 115 ++++++++++ protocols/FacebookRM/src/http_request.h | 230 ++++++++++++++++++++ protocols/FacebookRM/src/login.cpp | 102 +++++++++ protocols/FacebookRM/src/messages.cpp | 120 ++++++++++ protocols/FacebookRM/src/notifications.cpp | 64 ++++++ protocols/FacebookRM/src/profile.cpp | 75 +++++++ protocols/FacebookRM/src/requests/channel.h | 84 ------- protocols/FacebookRM/src/requests/contacts.h | 182 ---------------- protocols/FacebookRM/src/requests/feeds.h | 68 ------ protocols/FacebookRM/src/requests/history.h | 134 ------------ protocols/FacebookRM/src/requests/login.h | 113 ---------- protocols/FacebookRM/src/requests/messages.h | 163 -------------- protocols/FacebookRM/src/requests/notifications.h | 73 ------- protocols/FacebookRM/src/requests/profile.h | 88 -------- protocols/FacebookRM/src/requests/search.h | 46 ---- protocols/FacebookRM/src/requests/status.h | 72 ------ protocols/FacebookRM/src/requests/utils.h | 182 ---------------- protocols/FacebookRM/src/search.cpp | 38 ++++ protocols/FacebookRM/src/status.cpp | 63 ++++++ protocols/FacebookRM/src/stdafx.h | 14 +- protocols/FacebookRM/src/utils.cpp | 157 +++++++++++++ 28 files changed, 1354 insertions(+), 1367 deletions(-) create mode 100644 protocols/FacebookRM/src/channel.cpp create mode 100644 protocols/FacebookRM/src/feeds.cpp create mode 100644 protocols/FacebookRM/src/history.cpp create mode 100644 protocols/FacebookRM/src/login.cpp create mode 100644 protocols/FacebookRM/src/notifications.cpp create mode 100644 protocols/FacebookRM/src/profile.cpp delete mode 100644 protocols/FacebookRM/src/requests/channel.h delete mode 100644 protocols/FacebookRM/src/requests/contacts.h delete mode 100644 protocols/FacebookRM/src/requests/feeds.h delete mode 100644 protocols/FacebookRM/src/requests/history.h delete mode 100644 protocols/FacebookRM/src/requests/login.h delete mode 100644 protocols/FacebookRM/src/requests/messages.h delete mode 100644 protocols/FacebookRM/src/requests/notifications.h delete mode 100644 protocols/FacebookRM/src/requests/profile.h delete mode 100644 protocols/FacebookRM/src/requests/search.h delete mode 100644 protocols/FacebookRM/src/requests/status.h delete mode 100644 protocols/FacebookRM/src/requests/utils.h create mode 100644 protocols/FacebookRM/src/search.cpp create mode 100644 protocols/FacebookRM/src/status.cpp create mode 100644 protocols/FacebookRM/src/utils.cpp diff --git a/protocols/FacebookRM/facebook.vcxproj b/protocols/FacebookRM/facebook.vcxproj index e34ebb0673..4bf9c5b79c 100644 --- a/protocols/FacebookRM/facebook.vcxproj +++ b/protocols/FacebookRM/facebook.vcxproj @@ -29,17 +29,6 @@ NotUsing - - - - - - - - - - - diff --git a/protocols/FacebookRM/src/channel.cpp b/protocols/FacebookRM/src/channel.cpp new file mode 100644 index 0000000000..9498209ff2 --- /dev/null +++ b/protocols/FacebookRM/src/channel.cpp @@ -0,0 +1,77 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +///////////////////////////////////////////////////////////////////////////////////////// +// receiving updates, sending activity ping + +ChannelRequest::ChannelRequest(facebook_client *fc, Type type) : + HttpRequest(REQUEST_POST, FORMAT, + type == PULL ? FACEBOOK_SERVER_CHAT "/pull" : FACEBOOK_SERVER_CHAT "/active_ping", + fc->chat_conn_num_.empty() ? "0" : fc->chat_conn_num_.c_str(), + fc->chat_channel_host_.c_str()) +{ + if (type == PULL) { + timeout = 65 * 1000; + Persistent = CHANNEL; + } + + bool isPing = (type == PING); + + Url << CHAR_PARAM("channel", fc->chat_channel_.empty() ? ("p_" + fc->self_.user_id).c_str() : fc->chat_channel_.c_str()); + if (!isPing) + Url << CHAR_PARAM("seq", fc->chat_sequence_num_.empty() ? "0" : fc->chat_sequence_num_.c_str()); + + Url + << CHAR_PARAM("partition", fc->chat_channel_partition_.empty() ? "0" : fc->chat_channel_partition_.c_str()) + << CHAR_PARAM("clientid", fc->chat_clientid_.c_str()) + << CHAR_PARAM("cb", utils::text::rand_string(4, "0123456789abcdefghijklmnopqrstuvwxyz", &fc->random_).c_str()); + + int idleSeconds = fc->parent->IdleSeconds(); + Url << INT_PARAM("idle", idleSeconds); // Browser is sending "idle" always, even if it's "0" + + if (!isPing) { + Url << CHAR_PARAM("qp", "y") << CHAR_PARAM("pws", "fresh") << INT_PARAM("isq", 487632); + Url << INT_PARAM("msgs_recv", fc->chat_msgs_recv_); + // TODO: sometimes there is &tur=1711 and &qpmade= and &isq=487632 + // Url << "request_batch=1"; // it somehow batches up more responses to one - then response has special "t=batched" type and "batches" array with the data + // Url << "msgr_region=LLA"; // it was here only for first pull, same as request_batch + } + + Url << INT_PARAM("cap", 8) // TODO: what's this item? Sometimes it's 0, sometimes 8 + << CHAR_PARAM("uid", fc->self_.user_id.c_str()) + << CHAR_PARAM("viewer_uid", fc->self_.user_id.c_str()); + + if (!fc->chat_sticky_num_.empty() && !fc->chat_sticky_pool_.empty()) { + Url << CHAR_PARAM("sticky_token", fc->chat_sticky_num_.c_str()); + Url << CHAR_PARAM("sticky_pool", fc->chat_sticky_pool_.c_str()); + } + + if (!isPing && !fc->chat_traceid_.empty()) + Url << CHAR_PARAM("traceid", fc->chat_traceid_.c_str()); + + if (fc->parent->isInvisible()) + Url << CHAR_PARAM("state", "offline"); + else if (isPing || idleSeconds < 60) + Url << CHAR_PARAM("state", "active"); +} diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h index 129a2ae8c1..3ece37c27e 100644 --- a/protocols/FacebookRM/src/client.h +++ b/protocols/FacebookRM/src/client.h @@ -205,7 +205,7 @@ public: //////////////////////////////////////////////////////////// // HTTP communication - http::response sendRequest(HttpRequest *request); + http::response sendRequest(class HttpRequest *request); bool save_url(const std::string &url, const std::wstring &filename, HNETLIBCONN &nlc); //////////////////////////////////////////////////////////// diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h index 70470a3ba2..764e213286 100644 --- a/protocols/FacebookRM/src/constants.h +++ b/protocols/FacebookRM/src/constants.h @@ -23,175 +23,155 @@ along with this program. If not, see . #pragma once // Product management -#define FACEBOOK_NAME "Facebook" -#define FACEBOOK_URL_HOMEPAGE "https://www.facebook.com" -#define FACEBOOK_URL_REQUESTS "https://www.facebook.com/n/?reqs.php" -#define FACEBOOK_URL_MESSAGES "https://www.facebook.com/n/?inbox" -#define FACEBOOK_URL_NOTIFICATIONS "https://www.facebook.com/n/?notifications" -#define FACEBOOK_URL_PROFILE "https://www.facebook.com/profile.php?id=" -#define FACEBOOK_URL_GROUP "https://www.facebook.com/n/?home.php&sk=group_" -#define FACEBOOK_URL_PICTURE "https://graph.facebook.com/%s/picture" -#define FACEBOOK_URL_CONVERSATION "https://www.facebook.com/messages/t/" -//#define FACEBOOK_URL_STICKER "https://www.facebook.com/stickers/asset/?sticker_id=%s&image_type=BestEffortImage" +#define FACEBOOK_NAME "Facebook" +#define FACEBOOK_URL_HOMEPAGE "https://www.facebook.com" +#define FACEBOOK_URL_REQUESTS "https://www.facebook.com/n/?reqs.php" +#define FACEBOOK_URL_MESSAGES "https://www.facebook.com/n/?inbox" +#define FACEBOOK_URL_NOTIFICATIONS "https://www.facebook.com/n/?notifications" +#define FACEBOOK_URL_PROFILE "https://www.facebook.com/profile.php?id=" +#define FACEBOOK_URL_GROUP "https://www.facebook.com/n/?home.php&sk=group_" +#define FACEBOOK_URL_PICTURE "https://graph.facebook.com/%s/picture" +#define FACEBOOK_URL_CONVERSATION "https://www.facebook.com/messages/t/" // Connection -#define FACEBOOK_SERVER_REGULAR "www.facebook.com" -#define FACEBOOK_SERVER_MBASIC "mbasic.facebook.com" -#define FACEBOOK_SERVER_MOBILE "m.facebook.com" -#define FACEBOOK_SERVER_CHAT "%s-%s.facebook.com" -#define FACEBOOK_SERVER_LOGIN "www.facebook.com" -#define FACEBOOK_SERVER_APPS "apps.facebook.com" -#define FACEBOOK_SERVER_DOMAIN "facebook.com" +#define FACEBOOK_SERVER_REGULAR "www.facebook.com" +#define FACEBOOK_SERVER_MBASIC "mbasic.facebook.com" +#define FACEBOOK_SERVER_MOBILE "m.facebook.com" +#define FACEBOOK_SERVER_CHAT "%s-%s.facebook.com" +#define FACEBOOK_SERVER_LOGIN "www.facebook.com" +#define FACEBOOK_SERVER_APPS "apps.facebook.com" +#define FACEBOOK_SERVER_DOMAIN "facebook.com" // Facebook clients -#define FACEBOOK_CLIENT_WEB L"Facebook (website)" -#define FACEBOOK_CLIENT_MOBILE L"Facebook (mobile)" -#define FACEBOOK_CLIENT_OTHER L"Facebook (other)" -#define FACEBOOK_CLIENT_APP L"Facebook App" -#define FACEBOOK_CLIENT_MESSENGER L"Facebook Messenger" +#define FACEBOOK_CLIENT_WEB L"Facebook (website)" +#define FACEBOOK_CLIENT_MOBILE L"Facebook (mobile)" +#define FACEBOOK_CLIENT_OTHER L"Facebook (other)" +#define FACEBOOK_CLIENT_APP L"Facebook App" +#define FACEBOOK_CLIENT_MESSENGER L"Facebook Messenger" // Various constants -#define FACEBOOK_NOTIFICATIONS_CHATROOM "_notifications" -#define FACEBOOK_CHATROOM_NAMES_COUNT 3 // number of participant names to use for chatrooms without specific name (on website it's 2) -#define FACEBOOK_NOTIFICATIONS_LOAD_COUNT 20 // number of last notifications to load on login to notify -#define MANUALLY_TRIGGERED (void*)1 // to use as thread parameter to notify this action was activated by user, so we should show info popups +#define FACEBOOK_NOTIFICATIONS_CHATROOM "_notifications" +#define FACEBOOK_CHATROOM_NAMES_COUNT 3 // number of participant names to use for chatrooms without specific name (on website it's 2) +#define FACEBOOK_NOTIFICATIONS_LOAD_COUNT 20 // number of last notifications to load on login to notify +#define MANUALLY_TRIGGERED (void*)1 // to use as thread parameter to notify this action was activated by user, so we should show info popups // Limits -#define FACEBOOK_MESSAGE_LIMIT 200000 // this is guessed limit, in reality it is bigger -#define FACEBOOK_MESSAGE_LIMIT_TEXT "200000" -#define FACEBOOK_MIND_LIMIT 63206 // this should be correct maximal limit -#define FACEBOOK_MIND_LIMIT_TEXT "63206" -#define FACEBOOK_TIMEOUTS_LIMIT 3 -#define FACEBOOK_GROUP_NAME_LIMIT 100 -#define FACEBOOK_MESSAGES_ON_OPEN_LIMIT 99 -#define FACEBOOK_TYPING_TIME 60 -#define FACEBOOK_IGNORE_COUNTER_LIMIT 100 // how many consequent requests it should keep info about duplicit message ids -#define FACEBOOK_PING_TIME 90 // every 90 seconds send activity_ping (it's guessed value, but it's similar how often website does it) - -#define MAX_NEWSFEED_LEN 500 -#define MAX_LINK_DESCRIPTION_LEN 200 - -#define TEXT_ELLIPSIS "\xE2\x80\xA6" // unicode ellipsis -#define TEXT_EMOJI_LINK "\xF0\x9F\x94\x97" // emoji :link: -#define TEXT_EMOJI_CLOCK "\xF0\x9F\x95\x92" // emoji :clock3: -#define TEXT_EMOJI_PAGE "\xF0\x9F\x93\x84" // emoji :page_facing_up: +#define FACEBOOK_MESSAGE_LIMIT 200000 // this is guessed limit, in reality it is bigger +#define FACEBOOK_MESSAGE_LIMIT_TEXT "200000" +#define FACEBOOK_MIND_LIMIT 63206 // this should be correct maximal limit +#define FACEBOOK_MIND_LIMIT_TEXT "63206" +#define FACEBOOK_TIMEOUTS_LIMIT 3 +#define FACEBOOK_GROUP_NAME_LIMIT 100 +#define FACEBOOK_MESSAGES_ON_OPEN_LIMIT 99 +#define FACEBOOK_TYPING_TIME 60 +#define FACEBOOK_IGNORE_COUNTER_LIMIT 100 // how many consequent requests it should keep info about duplicit message ids +#define FACEBOOK_PING_TIME 90 // every 90 seconds send activity_ping (it's guessed value, but it's similar how often website does it) + +#define MAX_NEWSFEED_LEN 500 +#define MAX_LINK_DESCRIPTION_LEN 200 + +#define TEXT_ELLIPSIS "\xE2\x80\xA6" // unicode ellipsis +#define TEXT_EMOJI_LINK "\xF0\x9F\x94\x97" // emoji :link: +#define TEXT_EMOJI_CLOCK "\xF0\x9F\x95\x92" // emoji :clock3: +#define TEXT_EMOJI_PAGE "\xF0\x9F\x93\x84" // emoji :page_facing_up: // Defaults -#define FACEBOOK_MINIMAL_POLL_RATE 10 -#define FACEBOOK_DEFAULT_POLL_RATE 24 // in seconds -#define FACEBOOK_MAXIMAL_POLL_RATE 60 - -#define DEFAULT_SET_MIRANDA_STATUS 0 -#define DEFAULT_LOGGING_ENABLE 0 -#define DEFAULT_SYSTRAY_NOTIFY 0 -#define DEFAULT_DISABLE_STATUS_NOTIFY 0 -#define DEFAULT_BIG_AVATARS 0 -#define DEFAULT_DISCONNECT_CHAT 0 -#define DEFAULT_MAP_STATUSES 0 -#define DEFAULT_CUSTOM_SMILEYS 0 -#define DEFAULT_LOAD_PAGES 0 -#define DEFAULT_KEEP_UNREAD 0 -#define DEFAULT_FILTER_ADS 0 -#define DEFAULT_MESSAGES_ON_OPEN 0 -#define DEFAULT_MESSAGES_ON_OPEN_COUNT 10 -#define DEFAULT_HIDE_CHATS 0 -#define DEFAULT_ENABLE_CHATS 1 -#define DEFAULT_JOIN_EXISTING_CHATS 1 -#define DEFAULT_NOTIFICATIONS_CHATROOM 0 -#define DEFAULT_NAME_AS_NICK 1 -#define DEFAULT_LOAD_ALL_CONTACTS 0 -#define DEFAULT_PAGES_ALWAYS_ONLINE 1 -#define DEFAULT_TYPING_WHEN_INVISIBLE 1 - -#define DEFAULT_EVENT_NOTIFICATIONS_ENABLE 1 -#define DEFAULT_EVENT_FEEDS_ENABLE 0 -#define DEFAULT_EVENT_FRIENDSHIP_ENABLE 1 -#define DEFAULT_EVENT_TICKER_ENABLE 0 -#define DEFAULT_EVENT_ON_THIS_DAY_ENABLE 0 +#define FACEBOOK_MINIMAL_POLL_RATE 10 +#define FACEBOOK_DEFAULT_POLL_RATE 24 // in seconds +#define FACEBOOK_MAXIMAL_POLL_RATE 60 + +#define DEFAULT_SET_MIRANDA_STATUS 0 +#define DEFAULT_LOGGING_ENABLE 0 +#define DEFAULT_SYSTRAY_NOTIFY 0 +#define DEFAULT_DISABLE_STATUS_NOTIFY 0 +#define DEFAULT_BIG_AVATARS 0 +#define DEFAULT_DISCONNECT_CHAT 0 +#define DEFAULT_MAP_STATUSES 0 +#define DEFAULT_CUSTOM_SMILEYS 0 +#define DEFAULT_LOAD_PAGES 0 +#define DEFAULT_KEEP_UNREAD 0 +#define DEFAULT_FILTER_ADS 0 +#define DEFAULT_MESSAGES_ON_OPEN 0 +#define DEFAULT_MESSAGES_ON_OPEN_COUNT 10 +#define DEFAULT_HIDE_CHATS 0 +#define DEFAULT_ENABLE_CHATS 1 +#define DEFAULT_JOIN_EXISTING_CHATS 1 +#define DEFAULT_NOTIFICATIONS_CHATROOM 0 +#define DEFAULT_NAME_AS_NICK 1 +#define DEFAULT_LOAD_ALL_CONTACTS 0 +#define DEFAULT_PAGES_ALWAYS_ONLINE 1 +#define DEFAULT_TYPING_WHEN_INVISIBLE 1 + +#define DEFAULT_EVENT_NOTIFICATIONS_ENABLE 1 +#define DEFAULT_EVENT_FEEDS_ENABLE 0 +#define DEFAULT_EVENT_FRIENDSHIP_ENABLE 1 +#define DEFAULT_EVENT_TICKER_ENABLE 0 +#define DEFAULT_EVENT_ON_THIS_DAY_ENABLE 0 // Send message return values -#define SEND_MESSAGE_OK 0 -#define SEND_MESSAGE_ERROR 1 -#define SEND_MESSAGE_CANCEL -1 +#define SEND_MESSAGE_OK 0 +#define SEND_MESSAGE_ERROR 1 +#define SEND_MESSAGE_CANCEL -1 // Event types -#define FACEBOOK_EVENTTYPE_CALL 10010 - -enum ContactType { - CONTACT_FRIEND = 1, // contact that IS on our server list - CONTACT_NONE = 2, // contact that ISN'T on our server list - CONTACT_REQUEST = 3, // contact that we asked for friendship - CONTACT_APPROVE = 4, // contact that is asking us for approval of friendship - CONTACT_PAGE = 5 // contact is Facebook page +#define FACEBOOK_EVENTTYPE_CALL 10010 + +enum ContactType +{ + CONTACT_FRIEND = 1, // contact that IS on our server list + CONTACT_NONE = 2, // contact that ISN'T on our server list + CONTACT_REQUEST = 3, // contact that we asked for friendship + CONTACT_APPROVE = 4, // contact that is asking us for approval of friendship + CONTACT_PAGE = 5 // contact is Facebook page }; -enum ClientType { - CLIENT_WEB = 1, // Facebook website - CLIENT_APP = 2, // Facebook mobile application +enum ClientType +{ + CLIENT_WEB = 1, // Facebook website + CLIENT_APP = 2, // Facebook mobile application CLIENT_MESSENGER = 3, // Facebook Messenger application - CLIENT_OTHER = 4, // Facebook over XMPP - CLIENT_MOBILE = 5 // Facebook on unknown mobile client (can't be determined for offline contacts) + CLIENT_OTHER = 4, // Facebook over XMPP + CLIENT_MOBILE = 5 // Facebook on unknown mobile client (can't be determined for offline contacts) }; // TODO: Rework to "Events" and add also typing, seen, contact status, chat switch, etc. then have JSON parser only for parsing and a single place for processing updates // Each type then could have also separate class representing it. And when giving it in some list, make it map of arrays with key=thread_id to group it by contact/chat, to have it more effective // Use also for Poke and such events... -enum MessageType { - MESSAGE = 1, - PHONE_CALL = 2, - VIDEO_CALL = 3, - ADMIN_TEXT = 4, - SUBSCRIBE = 5, - UNSUBSCRIBE = 6, - THREAD_NAME = 7, - THREAD_IMAGE = 8, + +enum MessageType +{ + MESSAGE = 1, + PHONE_CALL = 2, + VIDEO_CALL = 3, + ADMIN_TEXT = 4, + SUBSCRIBE = 5, + UNSUBSCRIBE = 6, + THREAD_NAME = 7, + THREAD_IMAGE = 8, }; -enum EventType { - EVENT_CLIENT = 1, // Client error - EVENT_NEWSFEED = 2, // Newsfeed (wall) message - EVENT_NOTIFICATION = 3, // New notification - EVENT_OTHER = 4, // Other event (poke sent, status update, ...) - EVENT_FRIENDSHIP = 5, // Friendship event - EVENT_TICKER = 6, // Ticker message - EVENT_ON_THIS_DAY = 7, // On this day post (memories) +enum EventType +{ + EVENT_CLIENT = 1, // Client error + EVENT_NEWSFEED = 2, // Newsfeed (wall) message + EVENT_NOTIFICATION = 3, // New notification + EVENT_OTHER = 4, // Other event (poke sent, status update, ...) + EVENT_FRIENDSHIP = 5, // Friendship event + EVENT_TICKER = 6, // Ticker message + EVENT_ON_THIS_DAY = 7, // On this day post (memories) }; -enum ParticipantRole { +enum ParticipantRole +{ ROLE_ME = 0, ROLE_FRIEND = 1, ROLE_NONE = 2 }; -typedef struct { +struct ttype +{ const char *name; const char *id; -} ttype; - -// News Feed types -static const ttype feed_types[] = { - { LPGEN("Top News"), "h_nor" }, - { LPGEN("Most Recent"), "h_chr" }, - { LPGEN("Pages"), "pages" }, - //{ LPGEN("Apps and Games"), "FEED_FILTER_KEY_APPS_AND_GAMES" }, - - //{ LPGEN("Wall Posts"), "app_2915120374" }, - //{ LPGEN("Photos"), "app_2305272732_2392950137" }, - //{ LPGEN("Links"), "app_2309869772" }, -}; - -// Server types -static const ttype server_types[] = { - { LPGEN("Classic website"), "www.facebook.com" }, - { LPGEN("Mobile website"), "m.facebook.com" }, - { LPGEN("Smartphone website"), "touch.facebook.com" }, }; -// Status privacy types -static const ttype privacy_types[] = { - { LPGEN("Public"), "80" }, - { LPGEN("Friends of friends"), "111&audience[0][custom_value]=50" }, - { LPGEN("Friends"), "40" }, - { LPGEN("Friends except acquaintances"), "127" }, - { LPGEN("Only me"), "10" }, -}; \ No newline at end of file +extern const ttype feed_types[3], server_types[3], privacy_types[5]; diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 6352300348..6ae8fb0604 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -721,3 +721,115 @@ void FacebookProto::StopTyping(MCONTACT hContact) CallService(MS_PROTO_CONTACTISTYPING, hContact, (LPARAM)PROTOTYPE_CONTACTTYPING_OFF); facy.typers.erase(hContact); } + +///////////////////////////////////////////////////////////////////////////////////////// + +UserInfoRequest::UserInfoRequest(facebook_client *fc, const LIST &userIds) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/chat/user_info/") +{ + Url << INT_PARAM("dpr", 1); + + for (int i = 0; i < userIds.getCount(); i++) { + CMStringA id(::FORMAT, "ids[%i]", i); + Body << CHAR_PARAM(id, ptrA(mir_urlEncode(userIds[i]))); + } + + Body + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << INT_PARAM("__a", 1) + << INT_PARAM("__be", 1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT"); +} + +UserInfoAllRequest::UserInfoAllRequest(facebook_client *fc) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/chat/user_info_all/") +{ + Url + << INT_PARAM("dpr", 1) + << CHAR_PARAM("viewer", fc->self_.user_id.c_str()); + + Body + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__a", 1) + << INT_PARAM("__be", -1); +} + +AddFriendRequest::AddFriendRequest(facebook_client *fc, const char *userId) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/add_friend/action.php") +{ + Url << INT_PARAM("__a", 1); + + Body + << CHAR_PARAM("to_friend", userId) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("action", "add_friend") + << CHAR_PARAM("how_found", "profile_button") + << CHAR_PARAM("ref_param", "ts") + << CHAR_PARAM("no_flyout_on_click", "false"); +} + +DeleteFriendRequest::DeleteFriendRequest(facebook_client *fc, const char *userId) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/profile/removefriendconfirm.php") +{ + Url + << INT_PARAM("__a", 1) + << BOOL_PARAM("norefresh", true) + << CHAR_PARAM("unref", "button_dropdown") + << CHAR_PARAM("uid", userId); + + Body + << CHAR_PARAM("uid", userId) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("norefresh", "true") + << CHAR_PARAM("unref", "button_dropdown") + << INT_PARAM("confirmed", 1) + << INT_PARAM("__a", 1); +} + +CancelFriendshipRequest::CancelFriendshipRequest(facebook_client *fc, const char *userId) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/friends/requests/cancel.php") +{ + Url << INT_PARAM("__a", 1); + + Body + << INT_PARAM("confirmed", 1) + << CHAR_PARAM("friend", userId) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()); +} + +AnswerFriendshipRequest::AnswerFriendshipRequest(facebook_client *fc, const char *userId, Answer answer) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/requests/friends/ajax/") +{ + Url << INT_PARAM("__a", 1); + + const char *action = ""; + switch (answer) { + case CONFIRM: + action = "confirm"; + break; + case REJECT: + action = "reject"; + break; + } + + Body + << CHAR_PARAM("action", action) + << CHAR_PARAM("id", userId) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()); +} diff --git a/protocols/FacebookRM/src/dialogs.cpp b/protocols/FacebookRM/src/dialogs.cpp index e3988b3907..b5c1c6645f 100644 --- a/protocols/FacebookRM/src/dialogs.cpp +++ b/protocols/FacebookRM/src/dialogs.cpp @@ -22,6 +22,32 @@ along with this program. If not, see . #include "stdafx.h" +// News Feed types +const ttype feed_types[3] = +{ + { LPGEN("Top News"), "h_nor" }, + { LPGEN("Most Recent"), "h_chr" }, + { LPGEN("Pages"), "pages" }, +}; + +// Server types +const ttype server_types[3] = +{ + { LPGEN("Classic website"), "www.facebook.com" }, + { LPGEN("Mobile website"), "m.facebook.com" }, + { LPGEN("Smartphone website"), "touch.facebook.com" }, +}; + +// Status privacy types +const ttype privacy_types[5] = +{ + { LPGEN("Public"), "80" }, + { LPGEN("Friends of friends"), "111&audience[0][custom_value]=50" }, + { LPGEN("Friends"), "40" }, + { LPGEN("Friends except acquaintances"), "127" }, + { LPGEN("Only me"), "10" }, +}; + static BOOL LoadDBCheckState(FacebookProto* ppro, HWND hwnd, int idCtrl, const char* szSetting, BYTE bDef) { BOOL state = ppro->getByte(szSetting, bDef); diff --git a/protocols/FacebookRM/src/feeds.cpp b/protocols/FacebookRM/src/feeds.cpp new file mode 100644 index 0000000000..9e94c57f6e --- /dev/null +++ b/protocols/FacebookRM/src/feeds.cpp @@ -0,0 +1,56 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +// getting newsfeed posts +NewsfeedRequest::NewsfeedRequest(facebook_client *fc) : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/home/generic.php") +{ + BYTE feed_type = fc->parent->getByte(FACEBOOK_KEY_FEED_TYPE, 0); + if (feed_type >= _countof(feed_types)) + feed_type = 0; + + Url + << CHAR_PARAM("sk", feed_types[feed_type].id) + << CHAR_PARAM("key", (feed_type < 2) ? "nf" : feed_types[feed_type].id) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << INT_PARAM("__a", 1); +} + +MemoriesRequest::MemoriesRequest(facebook_client *fc) : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/onthisday/story/query/") +{ + Url + << INT_PARAM("__a", 1) + << INT_PARAM("start_index", 0) + << INT_PARAM("num_stories", 20) + << INT_PARAM("last_section_header", 0) + << CHAR_PARAM("last_section_key", "regular_story") + << INT_PARAM("__be", -1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT64_PARAM("timestamp", ::time(nullptr)) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()); +} diff --git a/protocols/FacebookRM/src/history.cpp b/protocols/FacebookRM/src/history.cpp new file mode 100644 index 0000000000..e1abb1dbeb --- /dev/null +++ b/protocols/FacebookRM/src/history.cpp @@ -0,0 +1,115 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +ThreadInfoRequest::ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id, const char* timestamp, int limit) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/api/graphqlbatch/") +{ + setCommonBody(fc); + + // FIXME: FB removed /ajax/mercury/thread_info requests and now all messaging stuff does through /api/graphqlbatch/ - all loading of threads, (unread) messages, list of contacts in groupchat, etc. + // All these request must be rewritten to the new request. Preparation is below but unfinished. + + //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())); + + JSONNode root, o0, query_params; + query_params + << CHAR_PARAM("id", idEncoded) + << INT_PARAM("message_limit", (limit == -1) ? 50 : limit) + << INT_PARAM("load_messages", 0) + << BOOL_PARAM("load_read_receipts", false); + + if (timestamp != nullptr) + query_params << CHAR_PARAM("before", timestamp); + else + query_params << NULL_PARAM("before"); + + o0 << CHAR_PARAM("doc_id", "1549485615075443") << JSON_PARAM("query_params", query_params); + root << JSON_PARAM("o0", o0); + + Body << CHAR_PARAM("queries", utils::url::encode(root.write()).c_str()); +} + +// Request both thread info and messages for more threads +ThreadInfoRequest::ThreadInfoRequest(facebook_client *fc, const LIST &ids, int offset, int limit) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/api/graphqlbatch/") +{ + 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 + << INT_PARAM(CMStringA(::FORMAT, "%s[offset]", begin.c_str()), offset) + << INT_PARAM(CMStringA(::FORMAT, "%s[limit]", begin.c_str()), limit) + << CHAR_PARAM(CMStringA(::FORMAT, "threads[%s][%i]", "thread_fbids", i), idEncoded); + } +} + +void ThreadInfoRequest::setCommonBody(facebook_client *fc) +{ + Body + << CHAR_PARAM("batch_name", "MessengerGraphQLThreadFetcherRe") + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << INT_PARAM("__a", 1) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << INT_PARAM("__be", 1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("jazoest", "265816910476541027556899745586581711208287100122699749108"); +} + +UnreadThreadsRequest::UnreadThreadsRequest(facebook_client *fc) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/unread_threads.php") +{ + Url << INT_PARAM("dpr", 1); + + Body + << CHAR_PARAM("folders[0]", "inbox") + << CHAR_PARAM("folders[1]", "other") // TODO: "other" is probably unused, and there is now "pending" instead + << CHAR_PARAM("client", "mercury") + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__a", 1) + << INT_PARAM("__be", -1); +} diff --git a/protocols/FacebookRM/src/http_request.h b/protocols/FacebookRM/src/http_request.h index 7c03adec46..523d7d6af8 100644 --- a/protocols/FacebookRM/src/http_request.h +++ b/protocols/FacebookRM/src/http_request.h @@ -246,4 +246,234 @@ public: } }; +///////////////////////////////////////////////////////////////////////////////////////// +// channel.cpp + +struct ChannelRequest : public HttpRequest +{ + enum Type { PULL, PING }; + + ChannelRequest(facebook_client *fc, Type type); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// contact.cpp + +// getting frienship requests (using mobile website) +struct GetFriendshipsRequest : public HttpRequest +{ + GetFriendshipsRequest(bool mobileBasicWorks) : + HttpRequest(REQUEST_GET, FORMAT, "%s/friends/center/requests/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) + { + flags |= NLHRF_REDIRECT; + } +}; + +// getting info about particular friend +struct UserInfoRequest : public HttpRequest +{ UserInfoRequest(facebook_client *fc, const LIST &userIds); +}; + +// getting info about all friends +struct UserInfoAllRequest : public HttpRequest +{ UserInfoAllRequest(facebook_client *fc); +}; + +// requesting friendships +struct AddFriendRequest : public HttpRequest +{ AddFriendRequest(facebook_client *fc, const char *userId); +}; + +// deleting friendships +struct DeleteFriendRequest : public HttpRequest +{ DeleteFriendRequest(facebook_client *fc, const char *userId); +}; + +// canceling (our) friendship request +struct CancelFriendshipRequest : public HttpRequest +{ CancelFriendshipRequest(facebook_client *fc, const char *userId); +}; + +// approving or ignoring friendship requests +struct AnswerFriendshipRequest : public HttpRequest +{ + enum Answer { CONFIRM, REJECT }; + + AnswerFriendshipRequest(facebook_client *fc, const char *userId, Answer answer); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// feeds.cpp + +// getting newsfeed posts +struct NewsfeedRequest : public HttpRequest +{ NewsfeedRequest(facebook_client *fc); +}; + +// getting memories ("on this day") posts +struct MemoriesRequest : public HttpRequest +{ MemoriesRequest(facebook_client *fc); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// history.cpp + +// getting thread info and messages +class ThreadInfoRequest : public HttpRequest +{ + void setCommonBody(facebook_client *fc); + +public: + // Request only messages history + ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id, const char* timestamp = nullptr, int limit = -1); + ThreadInfoRequest(facebook_client *fc, const LIST &ids, int offset, int limit); +}; + +// getting unread threads +struct UnreadThreadsRequest : public HttpRequest +{ UnreadThreadsRequest(facebook_client *fc); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// login.cpp + +// connecting physically +struct LoginRequest : public HttpRequest +{ + LoginRequest(); + LoginRequest(const char *username, const char *password, const char *urlData, const char *bodyData); +}; + +// disconnecting physically +struct LogoutRequest : public HttpRequest +{ LogoutRequest(const char *dtsg, const char *logoutHash); +}; + +// request to receive login code via SMS +struct LoginSmsRequest : public HttpRequest +{ LoginSmsRequest(facebook_client *fc, const char *dtsg); +}; + +// setting machine name +struct SetupMachineRequest : public HttpRequest +{ + SetupMachineRequest(); + SetupMachineRequest(const char *dtsg, const char *nh, const char *submit); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// messages.cpp + +// sending messages +struct SendMessageRequest : public HttpRequest +{ SendMessageRequest(facebook_client *fc, const char *userId, const char *threadId, const char *messageId, const char *messageText, bool isChat, const char *captcha, const char *captchaPersistData); +}; + +// sending typing notification +struct SendTypingRequest : public HttpRequest +{ SendTypingRequest(facebook_client *fc, const char *userId, bool isChat, bool isTyping); +}; + +struct MarkMessageReadRequest : public HttpRequest +{ MarkMessageReadRequest(facebook_client *fc, const LIST &ids); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// notifications.cpp + +// getting notifications +struct GetNotificationsRequest : public HttpRequest +{ GetNotificationsRequest(facebook_client *fc, int count); +}; + +// marking notifications read +struct MarkNotificationReadRequest : public HttpRequest +{ MarkNotificationReadRequest(facebook_client *fc, const char *id); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// profile.cpp + +// getting own name, avatar, ... +struct HomeRequest : public HttpRequest +{ HomeRequest(); +}; + +// getting fb_dtsg +struct DtsgRequest : public HttpRequest +{ DtsgRequest(); +}; + +// request mobile page containing profile picture +struct ProfilePictureRequest : public HttpRequest +{ ProfilePictureRequest(bool mobileBasicWorks, const char *userId); +}; + +// request mobile page containing user profile +struct ProfileRequest : public HttpRequest +{ ProfileRequest(bool mobileBasicWorks, const char *data); +}; + +// request mobile page containing user profile by his id, and in english language (for parsing data) +struct ProfileInfoRequest : public HttpRequest +{ ProfileInfoRequest(bool mobileBasicWorks, const char *userId); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// search.cpp + +// searching +struct SearchRequest : public HttpRequest +{ SearchRequest(bool mobileBasicWorks, const char *query, int s, int pn, const char *ssid); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// status.cpp + +// getting info about channel and connecting to it +struct ReconnectRequest : public HttpRequest +{ ReconnectRequest(facebook_client *fc); +}; + +// setting chat visibility +struct SetVisibilityRequest : public HttpRequest +{ SetVisibilityRequest(facebook_client *fc, bool online); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// utils.cpp + +// getting data for given url (for sending/posting reasons) +struct LinkScraperRequest : public HttpRequest +{ LinkScraperRequest(facebook_client *fc, status_data *status); +}; + +// refreshing captcha dialog (changing captcha type) +struct RefreshCaptchaRequest : public HttpRequest +{ RefreshCaptchaRequest(facebook_client *fc, const char *captchaPersistData); +}; + +// getting owned/admined pages list +struct GetPagesRequest : public HttpRequest +{ + GetPagesRequest() : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/bookmarks/pages") + {} +}; + +// changing identity to post status for pages +struct SwitchIdentityRequest : public HttpRequest +{ SwitchIdentityRequest(const char *dtsg, const char *userId); +}; + +// posting status to our or friends's wall +struct SharePostRequest : public HttpRequest +{ SharePostRequest(facebook_client *fc, status_data *status, const char *linkData); +}; + +// sending pokes +struct SendPokeRequest : public HttpRequest +{ SendPokeRequest(facebook_client *fc, const char *userId); +}; + #endif //_HTTP_REQUEST_H_ \ No newline at end of file diff --git a/protocols/FacebookRM/src/login.cpp b/protocols/FacebookRM/src/login.cpp new file mode 100644 index 0000000000..8547da48d2 --- /dev/null +++ b/protocols/FacebookRM/src/login.cpp @@ -0,0 +1,102 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +////////////////////////////////////////////////////////////////////////////////////////// +// connecting physically + +LoginRequest::LoginRequest() : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_LOGIN "/login.php") +{ + Url << INT_PARAM("login_attempt", 1); +} + +LoginRequest::LoginRequest(const char *username, const char *password, const char *urlData, const char *bodyData) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_LOGIN "/login.php") +{ + Persistent = NONE; + + Url + << INT_PARAM("login_attempt", 1) + << urlData; // additional data parsed from form + + Body + << INT_PARAM("persistent", 1) + << CHAR_PARAM("email", ptrA(mir_urlEncode(username))) + << CHAR_PARAM("pass", ptrA(mir_urlEncode(password))) + << CHAR_PARAM("lgndim", "eyJ3IjoxOTIwLCJoIjoxMDgwLCJhdyI6MTgzNCwiYWgiOjEwODAsImMiOjMyfQ==") // means base64 encoded: {"w":1920,"h":1080,"aw":1834,"ah":1080,"c":32} + << bodyData; // additional data parsed from form +} + +////////////////////////////////////////////////////////////////////////////////////////// +// request to receive login code via SMS + +LoginSmsRequest::LoginSmsRequest(facebook_client *fc, const char *dtsg) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/login/approvals/send_sms") +{ + Url << INT_PARAM("dpr", 1); + + Body + << CHAR_PARAM("method_requested", "sms_requested") + << INT_PARAM("__a", 1) + << INT_PARAM("__user", 0) + << INT_PARAM("__be", 0) + << CHAR_PARAM("__pc", "EXP1:DEFAULT") + << CHAR_PARAM("current_time", (utils::time::unix_timestamp() + ".000").c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("fb_dtsg", dtsg) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__rev", fc->__rev()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// setting machine name + +SetupMachineRequest::SetupMachineRequest() : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/checkpoint/") +{ + Url << "next"; +} + +SetupMachineRequest::SetupMachineRequest(const char *dtsg, const char *nh, const char *submit) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/checkpoint/") +{ + Url << "next"; + + Body + << CHAR_PARAM(CMStringA(::FORMAT, "submit[%s]", submit), submit) + << CHAR_PARAM("nh", nh) + << CHAR_PARAM("fb_dtsg", dtsg); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// disconnecting physically + +LogoutRequest::LogoutRequest(const char *dtsg, const char *logoutHash) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/logout.php") +{ + Body + << CHAR_PARAM("fb_dtsg", dtsg) + << CHAR_PARAM("h", logoutHash); +} diff --git a/protocols/FacebookRM/src/messages.cpp b/protocols/FacebookRM/src/messages.cpp index e634473c6d..d6284c43ea 100644 --- a/protocols/FacebookRM/src/messages.cpp +++ b/protocols/FacebookRM/src/messages.cpp @@ -220,3 +220,123 @@ void FacebookProto::StickerAsSmiley(std::string sticker, const std::string &url, cont.path = dir; CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont); } + +////////////////////////////////////////////////////////////////////////////////////////// + +SendMessageRequest::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 << INT_PARAM("dpr", 1); + + if (mir_strlen(captcha) > 0) + Body << CHAR_PARAM("captcha_persist_data", captchaPersistData) << CHAR_PARAM("captcha_response", captcha); + + Body << CHAR_PARAM("client", "mercury") << CHAR_PARAM("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) == "]]") + // TODO: For sending GIF images instead of "sticker_id=" there is "image_ids[0]=", otherwise it's same + Body + << "body=" + << CHAR_PARAM("sticker_id", ptrA(mir_urlEncode(message_text.substr(10, message_text.length() - 10 - 2).c_str()))) + << BOOL_PARAM("has_attachment", true); + else + Body << CHAR_PARAM("body", ptrA(mir_urlEncode(messageText))) << BOOL_PARAM("has_attachment", false); + + Body + << INT_PARAM("ephemeral_ttl_mode", 0) + << CHAR_PARAM("message_id", messageId) + << CHAR_PARAM("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_PARAM("thread_fbid", threadFbid.c_str()); + } + else + Body + << CHAR_PARAM("other_user_fbid", userId) + << CHAR_PARAM("specific_to_list[0]", CMStringA(::FORMAT, "fbid:%s", userId)) + << CHAR_PARAM("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" + << CHAR_PARAM("source", "source:chat:web") // or "source:titan:web" for web_messenger + << CHAR_PARAM("timestamp", utils::time::mili_timestamp().c_str()) + << CHAR_PARAM("ui_push_phase", "V3") + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << INT_PARAM("__a", 1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__be", -1); +} + +SendTypingRequest::SendTypingRequest(facebook_client *fc, const char *userId, bool isChat, bool isTyping) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/messaging/typ.php") +{ + Url << INT_PARAM("dpr", 1); + + ptrA idEncoded(mir_urlEncode(userId)); + + Body + << INT_PARAM("typ", isTyping ? 1 : 0) + << CHAR_PARAM("to", isChat ? "" : idEncoded) + << CHAR_PARAM("thread", idEncoded) + << CHAR_PARAM("source", "mercury-chat") + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__a", 1) + << INT_PARAM("__be", -1); +} + +MarkMessageReadRequest::MarkMessageReadRequest(facebook_client *fc, const LIST &ids) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/mercury/change_read_status.php") +{ + Url << INT_PARAM("__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]", ptrA(mir_urlEncode(id_.c_str()))); + Body << BOOL_PARAM(id, true); + } + + Body + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << INT_PARAM("__a", 1); +} diff --git a/protocols/FacebookRM/src/notifications.cpp b/protocols/FacebookRM/src/notifications.cpp new file mode 100644 index 0000000000..eee2574fce --- /dev/null +++ b/protocols/FacebookRM/src/notifications.cpp @@ -0,0 +1,64 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +////////////////////////////////////////////////////////////////////////////////////////// +// getting notifications + +GetNotificationsRequest::GetNotificationsRequest(facebook_client *fc, int count) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/notifications/client/get.php") +{ + Url << INT_PARAM("dpr", 1); + + Body + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + // << "cursor=" // when loading more + << INT_PARAM("length", count) // number of items to load + // << "businessID=" // probably for pages? + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__be", -1) + << INT_PARAM("__a", 1); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// marking notifications read + +MarkNotificationReadRequest::MarkNotificationReadRequest(facebook_client *fc, const char *id) : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/notifications/mark_read.php") +{ + Url + << INT_PARAM("__a", 1) + << INT_PARAM("seen", 0) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("alert_ids%5B0%5D", ptrA(mir_urlEncode(id))); +} diff --git a/protocols/FacebookRM/src/profile.cpp b/protocols/FacebookRM/src/profile.cpp new file mode 100644 index 0000000000..6b0e8a4250 --- /dev/null +++ b/protocols/FacebookRM/src/profile.cpp @@ -0,0 +1,75 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +////////////////////////////////////////////////////////////////////////////////////////// +// getting own name, avatar, ... + +HomeRequest::HomeRequest() : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_MOBILE "/profile.php") +{ + flags |= NLHRF_REDIRECT; + + Url << CHAR_PARAM("v", "info"); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// getting fb_dtsg + +DtsgRequest::DtsgRequest() : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_MOBILE "/profile/basic/intro/bio/") +{ + flags |= NLHRF_REDIRECT; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// request mobile page containing profile picture + +ProfilePictureRequest::ProfilePictureRequest(bool mobileBasicWorks, const char *userId) : + HttpRequest(REQUEST_GET, FORMAT, "%s/profile/picture/view/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) +{ + flags |= NLHRF_REDIRECT; + + Url << CHAR_PARAM("profile_id", userId); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// request mobile page containing user profile + +ProfileRequest::ProfileRequest(bool mobileBasicWorks, const char *data) : + HttpRequest(REQUEST_GET, FORMAT, "%s/%s", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE, data) +{ + Url << CHAR_PARAM("v", "info"); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// request mobile page containing user profile by his id, and in english language (for parsing data) + +ProfileInfoRequest::ProfileInfoRequest(bool mobileBasicWorks, const char *userId) : + HttpRequest(REQUEST_GET, FORMAT, "%s/profile.php", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) +{ + Url + << CHAR_PARAM("id", userId) + << CHAR_PARAM("v", "info") + << CHAR_PARAM("locale", "en_US"); +} diff --git a/protocols/FacebookRM/src/requests/channel.h b/protocols/FacebookRM/src/requests/channel.h deleted file mode 100644 index a1c1b649de..0000000000 --- a/protocols/FacebookRM/src/requests/channel.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_CHANNEL_H_ -#define _FACEBOOK_REQUEST_CHANNEL_H_ - -// receiving updates, sending activity ping -class ChannelRequest : public HttpRequest -{ -public: - enum Type { PULL, PING }; - - ChannelRequest(facebook_client *fc, Type type) : - HttpRequest(REQUEST_POST, FORMAT, - type == PULL ? FACEBOOK_SERVER_CHAT "/pull" : FACEBOOK_SERVER_CHAT "/active_ping", - fc->chat_conn_num_.empty() ? "0" : fc->chat_conn_num_.c_str(), - fc->chat_channel_host_.c_str()) - { - if (type == PULL) { - timeout = 65 * 1000; - Persistent = CHANNEL; - } - - bool isPing = (type == PING); - - Url << CHAR_PARAM("channel", fc->chat_channel_.empty() ? ("p_" + fc->self_.user_id).c_str() : fc->chat_channel_.c_str()); - if (!isPing) - Url << CHAR_PARAM("seq", fc->chat_sequence_num_.empty() ? "0" : fc->chat_sequence_num_.c_str()); - - Url - << CHAR_PARAM("partition", fc->chat_channel_partition_.empty() ? "0" : fc->chat_channel_partition_.c_str()) - << CHAR_PARAM("clientid", fc->chat_clientid_.c_str()) - << CHAR_PARAM("cb", utils::text::rand_string(4, "0123456789abcdefghijklmnopqrstuvwxyz", &fc->random_).c_str()); - - int idleSeconds = fc->parent->IdleSeconds(); - Url << INT_PARAM("idle", idleSeconds); // Browser is sending "idle" always, even if it's "0" - - if (!isPing) { - Url << CHAR_PARAM("qp", "y") << CHAR_PARAM("pws", "fresh") << INT_PARAM("isq", 487632); - Url << INT_PARAM("msgs_recv", fc->chat_msgs_recv_); - // TODO: sometimes there is &tur=1711 and &qpmade= and &isq=487632 - // Url << "request_batch=1"; // it somehow batches up more responses to one - then response has special "t=batched" type and "batches" array with the data - // Url << "msgr_region=LLA"; // it was here only for first pull, same as request_batch - } - - Url << INT_PARAM("cap", 8) // TODO: what's this item? Sometimes it's 0, sometimes 8 - << CHAR_PARAM("uid", fc->self_.user_id.c_str()) - << CHAR_PARAM("viewer_uid", fc->self_.user_id.c_str()); - - if (!fc->chat_sticky_num_.empty() && !fc->chat_sticky_pool_.empty()) { - Url << CHAR_PARAM("sticky_token", fc->chat_sticky_num_.c_str()); - Url << CHAR_PARAM("sticky_pool", fc->chat_sticky_pool_.c_str()); - } - - if (!isPing && !fc->chat_traceid_.empty()) - Url << CHAR_PARAM("traceid", fc->chat_traceid_.c_str()); - - if (fc->parent->isInvisible()) - Url << CHAR_PARAM("state", "offline"); - else if (isPing || idleSeconds < 60) - Url << CHAR_PARAM("state", "active"); - } -}; - -#endif //_FACEBOOK_REQUEST_CHANNEL_H_ diff --git a/protocols/FacebookRM/src/requests/contacts.h b/protocols/FacebookRM/src/requests/contacts.h deleted file mode 100644 index 4b1122c808..0000000000 --- a/protocols/FacebookRM/src/requests/contacts.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_CONTACTS_H_ -#define _FACEBOOK_REQUEST_CONTACTS_H_ - -// getting frienship requests (using mobile website) -class GetFriendshipsRequest : public HttpRequest -{ -public: - GetFriendshipsRequest(bool mobileBasicWorks) : - HttpRequest(REQUEST_GET, FORMAT, "%s/friends/center/requests/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) - { - flags |= NLHRF_REDIRECT; - } -}; - - -// getting info about particular friend -// revised 3.12.2017 -class UserInfoRequest : public HttpRequest -{ -public: - UserInfoRequest(facebook_client *fc, const LIST &userIds) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/chat/user_info/") - { - Url << INT_PARAM("dpr", 1); - - for (int i = 0; i < userIds.getCount(); i++) { - CMStringA id(::FORMAT, "ids[%i]", i); - Body << CHAR_PARAM(id, ptrA(mir_urlEncode(userIds[i]))); - } - - Body - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << INT_PARAM("__a", 1) - << INT_PARAM("__be", 1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT"); - } -}; - -// getting info about all friends -// revised 17.8.2016 -class UserInfoAllRequest : public HttpRequest -{ -public: - UserInfoAllRequest(facebook_client *fc) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/chat/user_info_all/") - { - Url - << INT_PARAM("dpr", 1) - << CHAR_PARAM("viewer", fc->self_.user_id.c_str()); - - Body - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__a", 1) - << INT_PARAM("__be", -1); - } -}; - -// requesting friendships -class AddFriendRequest : public HttpRequest -{ -public: - AddFriendRequest(facebook_client *fc, const char *userId) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/add_friend/action.php") - { - Url << INT_PARAM("__a", 1); - - Body - << CHAR_PARAM("to_friend", userId) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("action", "add_friend") - << CHAR_PARAM("how_found", "profile_button") - << CHAR_PARAM("ref_param", "ts") - << CHAR_PARAM("no_flyout_on_click", "false"); - } -}; - -// deleting friendships -class DeleteFriendRequest : public HttpRequest -{ -public: - DeleteFriendRequest(facebook_client *fc, const char *userId) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/profile/removefriendconfirm.php") - { - Url - << INT_PARAM("__a", 1) - << BOOL_PARAM("norefresh", true) - << CHAR_PARAM("unref", "button_dropdown") - << CHAR_PARAM("uid", userId); - - Body - << CHAR_PARAM("uid", userId) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("norefresh", "true") - << CHAR_PARAM("unref", "button_dropdown") - << INT_PARAM("confirmed", 1) - << INT_PARAM("__a", 1); - } -}; - -// canceling (our) friendship request -class CancelFriendshipRequest : public HttpRequest -{ -public: - CancelFriendshipRequest(facebook_client *fc, const char *userId) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/friends/requests/cancel.php") - { - Url << INT_PARAM("__a", 1); - - Body - << INT_PARAM("confirmed", 1) - << CHAR_PARAM("friend", userId) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()); - } -}; - -// approving or ignoring friendship requests -class AnswerFriendshipRequest : public HttpRequest -{ -public: - enum Answer { CONFIRM, REJECT }; - - AnswerFriendshipRequest(facebook_client *fc, const char *userId, Answer answer) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/requests/friends/ajax/") - { - Url << INT_PARAM("__a", 1); - - const char *action = ""; - switch (answer) { - case CONFIRM: - action = "confirm"; - break; - case REJECT: - action = "reject"; - break; - } - - Body - << CHAR_PARAM("action", action) - << CHAR_PARAM("id", userId) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()); - } -}; - -#endif //_FACEBOOK_REQUEST_CONTACTS_H_ diff --git a/protocols/FacebookRM/src/requests/feeds.h b/protocols/FacebookRM/src/requests/feeds.h deleted file mode 100644 index 7cc9fa0d3c..0000000000 --- a/protocols/FacebookRM/src/requests/feeds.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_FEEDS_H_ -#define _FACEBOOK_REQUEST_FEEDS_H_ - -// getting newsfeed posts -class NewsfeedRequest : public HttpRequest -{ -public: - NewsfeedRequest(facebook_client *fc) : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/home/generic.php") - { - BYTE feed_type = fc->parent->getByte(FACEBOOK_KEY_FEED_TYPE, 0); - if (feed_type >= _countof(feed_types)) - feed_type = 0; - - Url - << CHAR_PARAM("sk", feed_types[feed_type].id) - << CHAR_PARAM("key", (feed_type < 2) ? "nf" : feed_types[feed_type].id) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << INT_PARAM("__a", 1); - } -}; - -// getting memories ("on this day") posts -class MemoriesRequest : public HttpRequest -{ -public: - MemoriesRequest(facebook_client *fc) : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/onthisday/story/query/") - { - Url - << INT_PARAM("__a", 1) - << INT_PARAM("start_index", 0) - << INT_PARAM("num_stories", 20) - << INT_PARAM("last_section_header", 0) - << CHAR_PARAM("last_section_key", "regular_story") - << INT_PARAM("__be", -1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT64_PARAM("timestamp", ::time(nullptr)) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()); - } -}; - -#endif //_FACEBOOK_REQUEST_FEEDS_H_ diff --git a/protocols/FacebookRM/src/requests/history.h b/protocols/FacebookRM/src/requests/history.h deleted file mode 100644 index 08def19920..0000000000 --- a/protocols/FacebookRM/src/requests/history.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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 3.12.2017 -class ThreadInfoRequest : public HttpRequest -{ - JSONNode data; - -public: - // Request only messages history - ThreadInfoRequest(facebook_client *fc, bool isChat, const char *id, const char* timestamp = nullptr, int limit = -1) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/api/graphqlbatch/") - { - setCommonBody(fc); - - // FIXME: FB removed /ajax/mercury/thread_info requests and now all messaging stuff does through /api/graphqlbatch/ - all loading of threads, (unread) messages, list of contacts in groupchat, etc. - // All these request must be rewritten to the new request. Preparation is below but unfinished. - - //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())); - - JSONNode root, o0, query_params; - query_params - << CHAR_PARAM("id", idEncoded) - << INT_PARAM("message_limit", (limit == -1) ? 50 : limit) - << INT_PARAM("load_messages", 0) - << BOOL_PARAM("load_read_receipts", false); - - if (timestamp != nullptr) - query_params << CHAR_PARAM("before", timestamp); - else - query_params << NULL_PARAM("before"); - - o0 << CHAR_PARAM("doc_id", "1549485615075443") << JSON_PARAM("query_params", query_params); - root << JSON_PARAM("o0", o0); - - Body << CHAR_PARAM("queries", utils::url::encode(root.write()).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 "/api/graphqlbatch/") - { - 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 - << INT_PARAM(CMStringA(::FORMAT, "%s[offset]", begin.c_str()), offset) - << INT_PARAM(CMStringA(::FORMAT, "%s[limit]", begin.c_str()), limit) - << CHAR_PARAM(CMStringA(::FORMAT, "threads[%s][%i]", "thread_fbids", i), idEncoded); - } - } - -private: - void setCommonBody(facebook_client *fc) - { - Body - << CHAR_PARAM("batch_name", "MessengerGraphQLThreadFetcherRe") - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << INT_PARAM("__a", 1) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << INT_PARAM("__be", 1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("jazoest", "265816910476541027556899745586581711208287100122699749108"); - } -}; - -// 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 << INT_PARAM("dpr", 1); - - Body - << CHAR_PARAM("folders[0]", "inbox") - << CHAR_PARAM("folders[1]", "other") // TODO: "other" is probably unused, and there is now "pending" instead - << CHAR_PARAM("client", "mercury") - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__a", 1) - << INT_PARAM("__be", -1); - } -}; - -#endif //_FACEBOOK_REQUEST_HISTORY_H_ diff --git a/protocols/FacebookRM/src/requests/login.h b/protocols/FacebookRM/src/requests/login.h deleted file mode 100644 index be6cb1f244..0000000000 --- a/protocols/FacebookRM/src/requests/login.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_LOGIN_H_ -#define _FACEBOOK_REQUEST_LOGIN_H_ - -// connecting physically -class LoginRequest : public HttpRequest -{ -public: - LoginRequest() : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_LOGIN "/login.php") - { - Url << INT_PARAM("login_attempt", 1); - } - - LoginRequest(const char *username, const char *password, const char *urlData, const char *bodyData) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_LOGIN "/login.php") - { - Persistent = NONE; - - Url - << INT_PARAM("login_attempt", 1) - << urlData; // additional data parsed from form - - Body - << INT_PARAM("persistent", 1) - << CHAR_PARAM("email", ptrA(mir_urlEncode(username))) - << CHAR_PARAM("pass", ptrA(mir_urlEncode(password))) - << CHAR_PARAM("lgndim", "eyJ3IjoxOTIwLCJoIjoxMDgwLCJhdyI6MTgzNCwiYWgiOjEwODAsImMiOjMyfQ==") // means base64 encoded: {"w":1920,"h":1080,"aw":1834,"ah":1080,"c":32} - << bodyData; // additional data parsed from form - } -}; - -// request to receive login code via SMS -class LoginSmsRequest : public HttpRequest -{ -public: - LoginSmsRequest(facebook_client *fc, const char *dtsg) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/login/approvals/send_sms") - { - Url << INT_PARAM("dpr", 1); - - Body - << CHAR_PARAM("method_requested", "sms_requested") - << INT_PARAM("__a", 1) - << INT_PARAM("__user", 0) - << INT_PARAM("__be", 0) - << CHAR_PARAM("__pc", "EXP1:DEFAULT") - << CHAR_PARAM("current_time", (utils::time::unix_timestamp() + ".000").c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("fb_dtsg", dtsg) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__rev", fc->__rev()); - } -}; - -// setting machine name -class SetupMachineRequest : public HttpRequest -{ -public: - SetupMachineRequest() : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/checkpoint/") - { - Url << "next"; - } - - SetupMachineRequest(const char *dtsg, const char *nh, const char *submit) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/checkpoint/") - { - Url << "next"; - - Body - << CHAR_PARAM(CMStringA(::FORMAT, "submit[%s]", submit), submit) - << CHAR_PARAM("nh", nh) - << CHAR_PARAM("fb_dtsg", dtsg); - } -}; - -// disconnecting physically -class LogoutRequest : public HttpRequest -{ -public: - LogoutRequest(const char *dtsg, const char *logoutHash) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/logout.php") - { - Body - << CHAR_PARAM("fb_dtsg", dtsg) - << CHAR_PARAM("h", logoutHash); - } -}; - -#endif //_FACEBOOK_REQUEST_LOGIN_H_ diff --git a/protocols/FacebookRM/src/requests/messages.h b/protocols/FacebookRM/src/requests/messages.h deleted file mode 100644 index a0d782612a..0000000000 --- a/protocols/FacebookRM/src/requests/messages.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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 << INT_PARAM("dpr", 1); - - if (mir_strlen(captcha) > 0) { - Body - << CHAR_PARAM("captcha_persist_data", captchaPersistData) - << CHAR_PARAM("captcha_response", captcha); - } - - Body - << CHAR_PARAM("client", "mercury") // or "web_messenger" (whole messages page) - << CHAR_PARAM("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_PARAM("sticker_id", ptrA(mir_urlEncode(message_text.substr(10, message_text.length() - 10 - 2).c_str()))) - << BOOL_PARAM("has_attachment", true); - // TODO: For sending GIF images instead of "sticker_id=" there is "image_ids[0]=", otherwise it's same - } - else { - Body - << CHAR_PARAM("body", ptrA(mir_urlEncode(messageText))) - << BOOL_PARAM("has_attachment", false); - } - - Body - << INT_PARAM("ephemeral_ttl_mode", 0) - << CHAR_PARAM("message_id", messageId) - << CHAR_PARAM("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_PARAM("thread_fbid", threadFbid.c_str()); - } - else { - Body - << CHAR_PARAM("other_user_fbid", userId) - << CHAR_PARAM("specific_to_list[0]", CMStringA(::FORMAT, "fbid:%s", userId)) - << CHAR_PARAM("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" - << CHAR_PARAM("source", "source:chat:web") // or "source:titan:web" for web_messenger - << CHAR_PARAM("timestamp", utils::time::mili_timestamp().c_str()) - << CHAR_PARAM("ui_push_phase", "V3") - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << INT_PARAM("__a", 1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__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 << INT_PARAM("dpr", 1); - - ptrA idEncoded(mir_urlEncode(userId)); - - Body - << INT_PARAM("typ", isTyping ? 1 : 0) - << CHAR_PARAM("to", isChat ? "" : idEncoded) - << CHAR_PARAM("thread", idEncoded) - << CHAR_PARAM("source", "mercury-chat") - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__a", 1) - << INT_PARAM("__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 << INT_PARAM("__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]", ptrA(mir_urlEncode(id_.c_str()))); - Body << BOOL_PARAM(id, true); - } - - Body - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << INT_PARAM("__a", 1); - } -}; - -#endif //_FACEBOOK_REQUEST_MESSAGES_H_ diff --git a/protocols/FacebookRM/src/requests/notifications.h b/protocols/FacebookRM/src/requests/notifications.h deleted file mode 100644 index 801af7f642..0000000000 --- a/protocols/FacebookRM/src/requests/notifications.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_NOTIFICATIONS_H_ -#define _FACEBOOK_REQUEST_NOTIFICATIONS_H_ - -// getting notifications -// revised 17.8.2016 -class GetNotificationsRequest : public HttpRequest -{ -public: - GetNotificationsRequest(facebook_client *fc, int count) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/notifications/client/get.php") - { - Url << INT_PARAM("dpr", 1); - - Body - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - // << "cursor=" // when loading more - << INT_PARAM("length", count) // number of items to load - // << "businessID=" // probably for pages? - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__be", -1) - << INT_PARAM("__a", 1); - } -}; - -// marking notifications read -// request revised 11.2.2016 (we're not using the main website request, as it doesn't work, but still the old one with GET parameters) -class MarkNotificationReadRequest : public HttpRequest -{ -public: - MarkNotificationReadRequest(facebook_client *fc, const char *id) : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/notifications/mark_read.php") - { - Url - << INT_PARAM("__a", 1) - << INT_PARAM("seen", 0) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("alert_ids%5B0%5D", ptrA(mir_urlEncode(id))); - } -}; - -#endif //_FACEBOOK_REQUEST_NOTIFICATIONS_H_ diff --git a/protocols/FacebookRM/src/requests/profile.h b/protocols/FacebookRM/src/requests/profile.h deleted file mode 100644 index ecd0c43b4c..0000000000 --- a/protocols/FacebookRM/src/requests/profile.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_PROFILE_H_ -#define _FACEBOOK_REQUEST_PROFILE_H_ - -// getting own name, avatar, ... -class HomeRequest : public HttpRequest -{ -public: - HomeRequest() : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_MOBILE "/profile.php") - { - flags |= NLHRF_REDIRECT; - - Url << CHAR_PARAM("v", "info"); - } -}; - -// getting fb_dtsg -class DtsgRequest : public HttpRequest -{ -public: - DtsgRequest() : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_MOBILE "/profile/basic/intro/bio/") - { - flags |= NLHRF_REDIRECT; - } -}; - -// request mobile page containing profile picture -class ProfilePictureRequest : public HttpRequest -{ -public: - ProfilePictureRequest(bool mobileBasicWorks, const char *userId) : - HttpRequest(REQUEST_GET, FORMAT, "%s/profile/picture/view/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) - { - flags |= NLHRF_REDIRECT; - - Url << CHAR_PARAM("profile_id", userId); - } -}; - -// request mobile page containing user profile -class ProfileRequest : public HttpRequest -{ -public: - ProfileRequest(bool mobileBasicWorks, const char *data) : - HttpRequest(REQUEST_GET, FORMAT, "%s/%s", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE, data) - { - Url << CHAR_PARAM("v", "info"); - } -}; - -// request mobile page containing user profile by his id, and in english language (for parsing data) -class ProfileInfoRequest : public HttpRequest -{ -public: - ProfileInfoRequest(bool mobileBasicWorks, const char *userId) : - HttpRequest(REQUEST_GET, FORMAT, "%s/profile.php", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) - { - Url - << CHAR_PARAM("id", userId) - << CHAR_PARAM("v", "info") - << CHAR_PARAM("locale", "en_US"); - } -}; - -#endif //_FACEBOOK_REQUEST_PROFILE_H_ diff --git a/protocols/FacebookRM/src/requests/search.h b/protocols/FacebookRM/src/requests/search.h deleted file mode 100644 index f7d77d600d..0000000000 --- a/protocols/FacebookRM/src/requests/search.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_SEARCH_H_ -#define _FACEBOOK_REQUEST_SEARCH_H_ - -// searching -class SearchRequest : public HttpRequest -{ -public: - SearchRequest(bool mobileBasicWorks, const char *query, int s, int pn, const char *ssid) : - HttpRequest(REQUEST_GET, FORMAT, "%s/search/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) - { - flags |= NLHRF_REDIRECT; - - Url - << CHAR_PARAM("q", query) - << INT_PARAM("s", s) - << INT_PARAM("pn", pn); - - if (mir_strlen(ssid) > 0) { - Url << CHAR_PARAM("ssid", ssid); - } - } -}; - -#endif //_FACEBOOK_REQUEST_SEARCH_H_ diff --git a/protocols/FacebookRM/src/requests/status.h b/protocols/FacebookRM/src/requests/status.h deleted file mode 100644 index 4589604c18..0000000000 --- a/protocols/FacebookRM/src/requests/status.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_STATUS_H_ -#define _FACEBOOK_REQUEST_STATUS_H_ - -// getting info about channel and connecting to it -// revised 17.8.2016 -class ReconnectRequest : public HttpRequest -{ -public: - ReconnectRequest(facebook_client *fc) : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/presence/reconnect.php") - { - Url - << INT_PARAM("__a", 1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__be", -1) - << CHAR_PARAM("reason", fc->chat_reconnect_reason_.empty() ? "6" : fc->chat_reconnect_reason_.c_str()) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()); - } -}; - -// setting chat visibility -// revised 17.8.2016 -class SetVisibilityRequest : public HttpRequest -{ -public: - SetVisibilityRequest(facebook_client *fc, bool online) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/chat/privacy/visibility.php") - { - Url << INT_PARAM("dpr", 1); - - Body - << INT_PARAM("visibility", online ? 1 : 0) - << INT_PARAM("window_id", 0) - << INT_PARAM("__a", 1) - << CHAR_PARAM("__pc", "PHASED:DEFAULT") - << INT_PARAM("__be", -1) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()); - } -}; - -#endif //_FACEBOOK_REQUEST_STATUS_H_ diff --git a/protocols/FacebookRM/src/requests/utils.h b/protocols/FacebookRM/src/requests/utils.h deleted file mode 100644 index beef14842a..0000000000 --- a/protocols/FacebookRM/src/requests/utils.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - -Facebook plugin for Miranda Instant Messenger -_____________________________________________ - -Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team - -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_UTILS_H_ -#define _FACEBOOK_REQUEST_UTILS_H_ - -// refreshing captcha dialog (changing captcha type) -class RefreshCaptchaRequest : public HttpRequest -{ -public: - RefreshCaptchaRequest(facebook_client *fc, const char *captchaPersistData) : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/captcha/refresh_ajax.php") - { - Url - << INT_PARAM("__a", 1) - << CHAR_PARAM("new_captcha_type", "TFBCaptcha") - << CHAR_PARAM("skipped_captcha_data", captchaPersistData) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("__rev", fc->__rev()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()); - } -}; - -// getting data for given url (for sending/posting reasons) -class LinkScraperRequest : public HttpRequest -{ -public: - LinkScraperRequest(facebook_client *fc, status_data *status) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/composerx/attachment/link/scraper/") - { - Url - << INT_PARAM("__a", 1) - << INT_PARAM("composerurihash", 2) - << CHAR_PARAM("scrape_url", ptrA(mir_urlEncode(status->url.c_str()))); - - Body - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) - << CHAR_PARAM("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) - << INT_PARAM("istimeline", 1) - << CHAR_PARAM("composercontext", "composer") - << INT_PARAM("onecolumn", 1) - << CHAR_PARAM("nctr[_mod]", "pagelet_timeline_recent") - << INT_PARAM("__a", 1) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) - << CHAR_PARAM("loaded_components[0]", "maininput") - << CHAR_PARAM("loaded_components[1]", "backdateicon") - << CHAR_PARAM("loaded_components[2]", "withtaggericon") - << CHAR_PARAM("loaded_components[3]", "cameraicon") - << CHAR_PARAM("loaded_components[4]", "placetaggericon") - << CHAR_PARAM("loaded_components[5]", "mainprivacywidget") - << CHAR_PARAM("loaded_components[6]", "withtaggericon") - << CHAR_PARAM("loaded_components[7]", "backdateicon") - << CHAR_PARAM("loaded_components[8]", "placetaggericon") - << CHAR_PARAM("loaded_components[9]", "cameraicon") - << CHAR_PARAM("loaded_components[10]", "mainprivacywidget") - << CHAR_PARAM("loaded_components[11]", "maininput") - << CHAR_PARAM("loaded_components[12]", "explicitplaceinput") - << CHAR_PARAM("loaded_components[13]", "hiddenplaceinput") - << CHAR_PARAM("loaded_components[14]", "placenameinput") - << CHAR_PARAM("loaded_components[15]", "hiddensessionid") - << CHAR_PARAM("loaded_components[16]", "withtagger") - << CHAR_PARAM("loaded_components[17]", "backdatepicker") - << CHAR_PARAM("loaded_components[18]", "placetagger") - << CHAR_PARAM("loaded_components[19]", "citysharericon"); - } -}; - -// getting owned/admined pages list -class GetPagesRequest : public HttpRequest -{ -public: - GetPagesRequest() : - HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/bookmarks/pages") - {} -}; - -// changing identity to post status for pages -class SwitchIdentityRequest : public HttpRequest -{ -public: - SwitchIdentityRequest(const char *dtsg, const char *userId) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/identity_switch.php") - { - Url << INT_PARAM("__a", 1); - Body << CHAR_PARAM("fb_dtsg", dtsg) << CHAR_PARAM("user_id", userId) << CHAR_PARAM("url", FACEBOOK_URL_HOMEPAGE); - } -}; - -// posting status to our or friends's wall -class SharePostRequest : public HttpRequest -{ -public: - SharePostRequest(facebook_client *fc, status_data *status, const char *linkData) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/updatestatus.php") - { - Url - << INT_PARAM("__a", 1); - - ptrA text(mir_urlEncode(status->text.c_str())); - - Body - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__dyn", fc->__dyn()) - << CHAR_PARAM("__req", fc->__req()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) - << CHAR_PARAM("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) - << CHAR_PARAM("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) - << CHAR_PARAM("xhpc_message", text) - << CHAR_PARAM("xhpc_message_text", text) - << CHAR_PARAM("xhpc_context", "profile") - << INT_PARAM("xhpc_ismeta", 1) - << INT_PARAM("xhpc_timeline", 1) - << CHAR_PARAM("xhpc_composerid", "u_0_2y") - << BOOL_PARAM("disable_location_sharing", false) - << CHAR_PARAM("nctr[_mod]", "pagelet_composer"); - - if (!status->isPage) - Body << CHAR_PARAM("audience[0][value]", fc->get_privacy_type().c_str()); - - if (!status->place.empty()) - Body << CHAR_PARAM("composertags_place_name", ptrA(mir_urlEncode(status->place.c_str()))); - - // Status with users - for (std::vector::size_type i = 0; i < status->users.size(); i++) { - CMStringA withId(::FORMAT, "composertags_with[%i]", i); - CMStringA withName(::FORMAT, "text_composertags_with[%i]", i); - - Body - << CHAR_PARAM(withId.c_str(), status->users[i]->user_id.c_str()) - << CHAR_PARAM(withName.c_str(), status->users[i]->real_name.c_str()); - } - - // Link attachment - if (mir_strlen(linkData) > 0) { - Body << linkData; - // << "no_picture=0" // for disabling link preview image - } - } -}; - -// sending pokes -class SendPokeRequest : public HttpRequest -{ -public: - SendPokeRequest(facebook_client *fc, const char *userId) : - HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/pokes/dialog/") - { - Url - << INT_PARAM("__a", 1); - - Body - << INT_PARAM("do_confirm", 0) - << CHAR_PARAM("poke_target", userId) - << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) - << CHAR_PARAM("__user", fc->self_.user_id.c_str()) - << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()); - } -}; - -#endif //_FACEBOOK_REQUEST_UTILS_H_ diff --git a/protocols/FacebookRM/src/search.cpp b/protocols/FacebookRM/src/search.cpp new file mode 100644 index 0000000000..f64f868339 --- /dev/null +++ b/protocols/FacebookRM/src/search.cpp @@ -0,0 +1,38 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +// searching +SearchRequest::SearchRequest(bool mobileBasicWorks, const char *query, int s, int pn, const char *ssid) : + HttpRequest(REQUEST_GET, FORMAT, "%s/search/", mobileBasicWorks ? FACEBOOK_SERVER_MBASIC : FACEBOOK_SERVER_MOBILE) +{ + flags |= NLHRF_REDIRECT; + + Url + << CHAR_PARAM("q", query) + << INT_PARAM("s", s) + << INT_PARAM("pn", pn); + + if (mir_strlen(ssid) > 0) + Url << CHAR_PARAM("ssid", ssid); +} diff --git a/protocols/FacebookRM/src/status.cpp b/protocols/FacebookRM/src/status.cpp new file mode 100644 index 0000000000..f6ba5e9963 --- /dev/null +++ b/protocols/FacebookRM/src/status.cpp @@ -0,0 +1,63 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +////////////////////////////////////////////////////////////////////////////////////////// +// getting info about channel and connecting to it + +ReconnectRequest::ReconnectRequest(facebook_client *fc) : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/ajax/presence/reconnect.php") +{ + Url + << INT_PARAM("__a", 1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__be", -1) + << CHAR_PARAM("reason", fc->chat_reconnect_reason_.empty() ? "6" : fc->chat_reconnect_reason_.c_str()) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// setting chat visibility + +SetVisibilityRequest::SetVisibilityRequest(facebook_client *fc, bool online) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/chat/privacy/visibility.php") +{ + Url << INT_PARAM("dpr", 1); + + Body + << INT_PARAM("visibility", online ? 1 : 0) + << INT_PARAM("window_id", 0) + << INT_PARAM("__a", 1) + << CHAR_PARAM("__pc", "PHASED:DEFAULT") + << INT_PARAM("__be", -1) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()); +} diff --git a/protocols/FacebookRM/src/stdafx.h b/protocols/FacebookRM/src/stdafx.h index 6bf092d283..83f39e24e6 100644 --- a/protocols/FacebookRM/src/stdafx.h +++ b/protocols/FacebookRM/src/stdafx.h @@ -70,8 +70,8 @@ class FacebookProto; #include "constants.h" #include "entities.h" #include "http.h" -#include "http_request.h" #include "client.h" +#include "http_request.h" #include "proto.h" #include "db.h" #include "dialogs.h" @@ -79,18 +79,6 @@ class FacebookProto; #include "resource.h" #include "version.h" -#include "requests/contacts.h" -#include "requests/feeds.h" -#include "requests/history.h" -#include "requests/channel.h" -#include "requests/login.h" -#include "requests/messages.h" -#include "requests/notifications.h" -#include "requests/profile.h" -#include "requests/search.h" -#include "requests/status.h" -#include "requests/utils.h" - extern HINSTANCE g_hInstance; extern std::string g_strUserAgent; extern DWORD g_mirandaVersion; diff --git a/protocols/FacebookRM/src/utils.cpp b/protocols/FacebookRM/src/utils.cpp new file mode 100644 index 0000000000..019ccddeea --- /dev/null +++ b/protocols/FacebookRM/src/utils.cpp @@ -0,0 +1,157 @@ +/* + +Facebook plugin for Miranda Instant Messenger +_____________________________________________ + +Copyright © 2011-17 Robert Pösel, 2017-18 Miranda NG team + +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 . + +*/ + +#include "stdafx.h" + +////////////////////////////////////////////////////////////////////////////////////////// +// refreshing captcha dialog (changing captcha type) + +RefreshCaptchaRequest::RefreshCaptchaRequest(facebook_client *fc, const char *captchaPersistData) : + HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/captcha/refresh_ajax.php") +{ + Url + << INT_PARAM("__a", 1) + << CHAR_PARAM("new_captcha_type", "TFBCaptcha") + << CHAR_PARAM("skipped_captcha_data", captchaPersistData) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("__rev", fc->__rev()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// getting data for given url (for sending/posting reasons) + +LinkScraperRequest::LinkScraperRequest(facebook_client *fc, status_data *status) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/composerx/attachment/link/scraper/") +{ + Url + << INT_PARAM("__a", 1) + << INT_PARAM("composerurihash", 2) + << CHAR_PARAM("scrape_url", ptrA(mir_urlEncode(status->url.c_str()))); + + Body + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) + << CHAR_PARAM("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) + << INT_PARAM("istimeline", 1) + << CHAR_PARAM("composercontext", "composer") + << INT_PARAM("onecolumn", 1) + << CHAR_PARAM("nctr[_mod]", "pagelet_timeline_recent") + << INT_PARAM("__a", 1) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) + << CHAR_PARAM("loaded_components[0]", "maininput") + << CHAR_PARAM("loaded_components[1]", "backdateicon") + << CHAR_PARAM("loaded_components[2]", "withtaggericon") + << CHAR_PARAM("loaded_components[3]", "cameraicon") + << CHAR_PARAM("loaded_components[4]", "placetaggericon") + << CHAR_PARAM("loaded_components[5]", "mainprivacywidget") + << CHAR_PARAM("loaded_components[6]", "withtaggericon") + << CHAR_PARAM("loaded_components[7]", "backdateicon") + << CHAR_PARAM("loaded_components[8]", "placetaggericon") + << CHAR_PARAM("loaded_components[9]", "cameraicon") + << CHAR_PARAM("loaded_components[10]", "mainprivacywidget") + << CHAR_PARAM("loaded_components[11]", "maininput") + << CHAR_PARAM("loaded_components[12]", "explicitplaceinput") + << CHAR_PARAM("loaded_components[13]", "hiddenplaceinput") + << CHAR_PARAM("loaded_components[14]", "placenameinput") + << CHAR_PARAM("loaded_components[15]", "hiddensessionid") + << CHAR_PARAM("loaded_components[16]", "withtagger") + << CHAR_PARAM("loaded_components[17]", "backdatepicker") + << CHAR_PARAM("loaded_components[18]", "placetagger") + << CHAR_PARAM("loaded_components[19]", "citysharericon"); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// changing identity to post status for pages + +SwitchIdentityRequest::SwitchIdentityRequest(const char *dtsg, const char *userId) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/identity_switch.php") +{ + Url << INT_PARAM("__a", 1); + + Body << CHAR_PARAM("fb_dtsg", dtsg) << CHAR_PARAM("user_id", userId) << CHAR_PARAM("url", FACEBOOK_URL_HOMEPAGE); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// posting status to our or friends's wall + +SharePostRequest::SharePostRequest(facebook_client *fc, status_data *status, const char *linkData) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/updatestatus.php") +{ + Url << INT_PARAM("__a", 1); + + ptrA text(mir_urlEncode(status->text.c_str())); + + Body + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__dyn", fc->__dyn()) + << CHAR_PARAM("__req", fc->__req()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()) + << CHAR_PARAM("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) + << CHAR_PARAM("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) + << CHAR_PARAM("xhpc_message", text) + << CHAR_PARAM("xhpc_message_text", text) + << CHAR_PARAM("xhpc_context", "profile") + << INT_PARAM("xhpc_ismeta", 1) + << INT_PARAM("xhpc_timeline", 1) + << CHAR_PARAM("xhpc_composerid", "u_0_2y") + << BOOL_PARAM("disable_location_sharing", false) + << CHAR_PARAM("nctr[_mod]", "pagelet_composer"); + + if (!status->isPage) + Body << CHAR_PARAM("audience[0][value]", fc->get_privacy_type().c_str()); + + if (!status->place.empty()) + Body << CHAR_PARAM("composertags_place_name", ptrA(mir_urlEncode(status->place.c_str()))); + + // Status with users + for (std::vector::size_type i = 0; i < status->users.size(); i++) { + CMStringA withId(::FORMAT, "composertags_with[%i]", i); + CMStringA withName(::FORMAT, "text_composertags_with[%i]", i); + + Body + << CHAR_PARAM(withId.c_str(), status->users[i]->user_id.c_str()) + << CHAR_PARAM(withName.c_str(), status->users[i]->real_name.c_str()); + } + + // Link attachment + if (mir_strlen(linkData) > 0) + Body << linkData; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// sending pokes + +SendPokeRequest::SendPokeRequest(facebook_client *fc, const char *userId) : + HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/pokes/dialog/") +{ + Url << INT_PARAM("__a", 1); + + Body + << INT_PARAM("do_confirm", 0) + << CHAR_PARAM("poke_target", userId) + << CHAR_PARAM("fb_dtsg", fc->dtsg_.c_str()) + << CHAR_PARAM("__user", fc->self_.user_id.c_str()) + << CHAR_PARAM("ttstamp", fc->ttstamp_.c_str()); +} -- cgit v1.2.3