diff options
author | Robert Pösel <robyer@seznam.cz> | 2016-05-17 20:15:33 +0000 |
---|---|---|
committer | Robert Pösel <robyer@seznam.cz> | 2016-05-17 20:15:33 +0000 |
commit | 5e5cabbee2c2249be4e34efc9bafa1b05136111a (patch) | |
tree | 5705bd162306f31b1d41dc2b1d48ae53ca4046d4 /protocols | |
parent | 82cd0bd751e964a84746740abd03a419b8b80532 (diff) |
Facebook: Rework loading online contacts (not properly finished!); version bump
This is work in progress, which might (and will) cause wrong status reporting and maybe related problems. On the other hand this way is only "preferred" way. Previous way (using buddy_list request) isn't used anymore and might cause the captcha problems and antivirus checks from FB...
git-svn-id: http://svn.miranda-ng.org/main/trunk@16843 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols')
-rw-r--r-- | protocols/FacebookRM/src/client.h | 3 | ||||
-rw-r--r-- | protocols/FacebookRM/src/communication.cpp | 24 | ||||
-rw-r--r-- | protocols/FacebookRM/src/connection.cpp | 6 | ||||
-rw-r--r-- | protocols/FacebookRM/src/contacts.cpp | 5 | ||||
-rw-r--r-- | protocols/FacebookRM/src/entities.h | 4 | ||||
-rw-r--r-- | protocols/FacebookRM/src/json.cpp | 293 | ||||
-rw-r--r-- | protocols/FacebookRM/src/json.h | 1 | ||||
-rw-r--r-- | protocols/FacebookRM/src/process.cpp | 133 | ||||
-rw-r--r-- | protocols/FacebookRM/src/proto.cpp | 17 | ||||
-rw-r--r-- | protocols/FacebookRM/src/proto.h | 2 | ||||
-rw-r--r-- | protocols/FacebookRM/src/theme.cpp | 6 | ||||
-rw-r--r-- | protocols/FacebookRM/src/version.h | 4 |
12 files changed, 200 insertions, 298 deletions
diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h index a6b0ddd4ac..f065893af7 100644 --- a/protocols/FacebookRM/src/client.h +++ b/protocols/FacebookRM/src/client.h @@ -39,7 +39,7 @@ public: {
msgid_ = error_count_ = last_feeds_update_ = last_notification_time_ = random_ = chat_msgs_recv_ = chat_req_ = 0;
- buddies_lock_ = send_message_lock_ = notifications_lock_ = cookies_lock_ = NULL;
+ send_message_lock_ = notifications_lock_ = cookies_lock_ = NULL;
hMsgCon = NULL;
hFcbCon = NULL;
fcb_conn_lock_ = NULL;
@@ -184,7 +184,6 @@ public: // Updates handling
List::List<facebook_user> buddies;
- HANDLE buddies_lock_;
HANDLE send_message_lock_;
HANDLE notifications_lock_;
diff --git a/protocols/FacebookRM/src/communication.cpp b/protocols/FacebookRM/src/communication.cpp index 8e77b71316..c847279530 100644 --- a/protocols/FacebookRM/src/communication.cpp +++ b/protocols/FacebookRM/src/communication.cpp @@ -1273,6 +1273,8 @@ bool facebook_client::channel() } std::string type = utils::text::source_get_value(&resp.data, 2, "\"t\":\"", "\""); + parent->debugLogA("Pull response type = %s", type.c_str()); + if (type == "continue" || type == "heartbeat") { // Everything is OK, no new message received } @@ -1284,21 +1286,19 @@ bool facebook_client::channel() this->chat_sticky_num_ = utils::text::source_get_value2(&resp.data, "\"sticky\":\"", "\""); parent->debugLogA(" Got self sticky number: %s", this->chat_sticky_num_.c_str()); } - else if (type == "fullReload" || type == "refresh") { - // Requested reload of page or relogin (due to some settings change, removing this session, etc.) - parent->debugLogA("!!! Requested %s", type.c_str()); + if (type == "refresh") { + // Requested relogin (due to some settings change, removing this session, etc.) + parent->debugLogA("!!! Requested refresh"); this->chat_sequence_num_ = utils::text::source_get_value2(&resp.data, "\"seq\":", ",}"); parent->debugLogA(" Got self sequence number: %s", this->chat_sequence_num_.c_str()); - if (type == "refresh") { - this->chat_reconnect_reason_ = utils::text::source_get_value2(&resp.data, "\"reason\":", ",}"); - parent->debugLogA(" Got reconnect reason: %s", this->chat_reconnect_reason_.c_str()); + this->chat_reconnect_reason_ = utils::text::source_get_value2(&resp.data, "\"reason\":", ",}"); + parent->debugLogA(" Got reconnect reason: %s", this->chat_reconnect_reason_.c_str()); - return this->reconnect(); - } - } - else if (!type.empty()) { + return this->reconnect(); + } + else if (!type.empty()) { // for "msg", "fullReload" and maybe also other types // Something has been received, throw to new thread to process std::string* response_data = new std::string(resp.data); parent->ForkThread(&FacebookProto::ProcessMessages, response_data); @@ -1311,6 +1311,10 @@ bool facebook_client::channel() // Update msgs_recv number for every "msg" type we receive (during fullRefresh/reload responses it stays the same) this->chat_msgs_recv_++; } + else if (type == "fullReload") { + // At fullReload we force our seq number to received value (there may have been some error or something) + this->chat_sequence_num_ = seq; + } // Check if it's different from our old one (which means we should increment our old one) if (seq != this->chat_sequence_num_) { diff --git a/protocols/FacebookRM/src/connection.cpp b/protocols/FacebookRM/src/connection.cpp index 4a34435549..06222249fc 100644 --- a/protocols/FacebookRM/src/connection.cpp +++ b/protocols/FacebookRM/src/connection.cpp @@ -25,7 +25,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. void FacebookProto::ChangeStatus(void*) { ScopedLock s(signon_lock_); - ScopedLock b(facy.buddies_lock_); int new_status = m_iDesiredStatus; int old_status = m_iStatus; @@ -64,7 +63,6 @@ void FacebookProto::ChangeStatus(void*) facy.clear_notifications(); facy.clear_chatrooms(); facy.clear_readers(); - facy.buddies.clear(); facy.messages_ignore.clear(); facy.messages_timestamp.clear(); facy.pages.clear(); @@ -168,8 +166,6 @@ void FacebookProto::ChangeStatus(void*) facy.chat_state(!m_invisible); - ForkThread(&FacebookProto::ProcessBuddyList, NULL); - m_iStatus = facy.self_.status_id = new_status; ProtoBroadcastAck(0, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); @@ -216,8 +212,6 @@ void FacebookProto::UpdateLoop(void *) for (int i = -1; !isOffline(); i = (i + 1) % 50) { if (i != -1) { - ProcessBuddyList(NULL); - if (getByte(FACEBOOK_KEY_EVENT_FEEDS_ENABLE, DEFAULT_EVENT_FEEDS_ENABLE)) ProcessFeeds(NULL); } diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 167933f061..70bb6aca5a 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -489,9 +489,10 @@ void FacebookProto::DeleteContactFromServer(void *data) if (resp.data.find("\"payload\":null", 0) != std::string::npos) { - facebook_user* fbu = facy.buddies.find(id); + // FIXME: Remember that we deleted this contact, so we won't accidentally add him at status change + /* facebook_user* fbu = facy.buddies.find(id); if (fbu != NULL) - fbu->deleted = true; + fbu->deleted = true; */ MCONTACT hContact = ContactIDToHContact(id); diff --git a/protocols/FacebookRM/src/entities.h b/protocols/FacebookRM/src/entities.h index 88be2bd21e..8cd50f590b 100644 --- a/protocols/FacebookRM/src/entities.h +++ b/protocols/FacebookRM/src/entities.h @@ -40,6 +40,8 @@ struct facebook_user bool deleted; bool idle; + bool updated; + ClientType client; facebook_user() @@ -47,7 +49,7 @@ struct facebook_user this->handle = NULL; this->status_id = ID_STATUS_OFFLINE; this->gender = this->last_active = 0; - this->deleted = this->idle = false; + this->deleted = this->idle = this->updated = false; this->client = CLIENT_WEB; } diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index 901b28ada6..7b5ac5dd04 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -22,100 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h" -int facebook_json_parser::parse_buddy_list(std::string *data, List::List< facebook_user >* buddy_list) -{ - facebook_user* current = NULL; - std::string jsonData = data->substr(9); - - JSONNode root = JSONNode::parse(jsonData.c_str()); - if (!root) - return EXIT_FAILURE; - - const JSONNode &list = root["payload"].at("buddy_list"); - if (!list) - return EXIT_FAILURE; - - // Set all contacts in map to offline (and reset client) - for (List::Item< facebook_user >* i = buddy_list->begin(); i != NULL; i = i->next) { - i->data->status_id = ID_STATUS_OFFLINE; - if (i->data->client == 0) - i->data->client = CLIENT_WEB; - } - - // Load last active times - const JSONNode &lastActive = list["last_active_times"]; - for (auto it = lastActive.begin(); it != lastActive.end(); ++it) { - const char *id = (*it).name(); - - current = buddy_list->find(id); - if (current == NULL) { - buddy_list->insert(std::make_pair(id, new facebook_user())); - current = buddy_list->find(id); - current->user_id = id; - } - - current->last_active = (*it).as_int(); - } - - // Find mobile friends - const JSONNode &mobileFriends = list["mobile_friends"]; - for (auto it = mobileFriends.begin(); it != mobileFriends.end(); ++it) { - std::string id = (*it).as_string(); - - current = buddy_list->find(id); - if (current == NULL) { - buddy_list->insert(std::make_pair(id, new facebook_user())); - current = buddy_list->find(id); - current->user_id = id; - } - - current->status_id = ID_STATUS_OFFLINE; - current->client = CLIENT_MOBILE; - } - - time_t now = ::time(NULL); - - // Find now available contacts - const JSONNode &nowAvailable = list["nowAvailableList"]; - for (auto it = nowAvailable.begin(); it != nowAvailable.end(); ++it) { - const char *id = (*it).name(); - - current = buddy_list->find(id); - if (current == NULL) { - buddy_list->insert(std::make_pair(id, new facebook_user())); - current = buddy_list->find(id); - current->user_id = id; - } - - current->status_id = (current->client == CLIENT_MOBILE || current->client == CLIENT_MESSENGER) ? ID_STATUS_ONTHEPHONE : ID_STATUS_ONLINE; - - // Set contacts that were last active more than 1 minute ago as away - if (current->status_id == ID_STATUS_ONLINE && current->last_active > 0 && (now - current->last_active) > 60) { - current->status_id = ID_STATUS_AWAY; - } - } - - // Get aditional informations about contacts (if available) - const JSONNode &userInfos = list["userInfos"]; - for (auto it = userInfos.begin(); it != userInfos.end(); ++it) { - const char *id = (*it).name(); - - current = buddy_list->find(id); - if (current == NULL) - continue; - - std::string name = (*it)["name"].as_string(); - if (!name.empty()) - current->real_name = utils::text::slashu_to_utf8(name); - - std::string thumbSrc = (*it)["thumbSrc"].as_string(); - if (!thumbSrc.empty()) - current->image_url = utils::text::slashu_to_utf8(thumbSrc); - } - - return EXIT_SUCCESS; -} - void parseUser(const JSONNode &it, facebook_user *fbu) { fbu->user_id = it.name(); @@ -758,54 +664,191 @@ int facebook_json_parser::parse_messages(std::string *pData, std::vector<faceboo proto->SetStatus(isVisible ? ID_STATUS_ONLINE : ID_STATUS_INVISIBLE); } } + else if (t == "chatproxy-presence") { + const JSONNode &buddyList = (*it)["buddyList"]; + if (!buddyList) + continue; + + for (auto itNodes = buddyList.begin(); itNodes != buddyList.end(); ++itNodes) { + std::string id = (*itNodes).name(); + + MCONTACT hContact = proto->ContactIDToHContact(id); + if (!hContact) { + // FIXME: What to do, when we don't have this contact? What does it mean? + // fbu->handle = AddToContactList(fbu, CONTACT_FRIEND); // add this contact as friend? + continue; + } + + // TODO: Check for friends existence/inexistence? Here we should get all friends (but we're already doing friendslist request, so we should have fresh data already) + + const JSONNode &p_ = (*itNodes)["p"]; // possible values: 0, 2 (something more?) (might not be present) + const JSONNode &lat_ = (*itNodes)["lat"]; // timestamp of last activity (could be 0) (is always present) + const JSONNode &vc_ = (*itNodes)["vc"]; // possible values: 0, 8, 10 (something more?) (might not be present) + + int status = ID_STATUS_DND; // DND to easily spot some problem, as we expect it will always be p==0 or p==2 below + + // Probably means presence: 0 = away, 2 = online, when not present then that probably means don't change that status + if (p_) { + int p = p_.as_int(); + + if (p == 0) + status = ID_STATUS_AWAY; + else if (p == 2) + status = ID_STATUS_ONLINE; + + if (proto->getWord(hContact, "Status", 0) != status) + proto->setWord(hContact, "Status", status); + } + + // Last active time + if (lat_) { + time_t last_active = utils::time::from_string(lat_.as_string()); + + if (proto->getDword(hContact, "LastActiveTS", 0) != last_active) { + if (last_active > 0) + proto->setDword(hContact, "LastActiveTS", last_active); + else + proto->delSetting(hContact, "LastActiveTS"); + } + } + + // Probably means client: guess 0 = web, 8 = messenger, 10 = something else? + if (vc_) { + int vc = vc_.as_int(); + TCHAR *client; + + if (vc == 0) { + client = _T(FACEBOOK_CLIENT_WEB); + } + else if (vc == 8) { + client = _T(FACEBOOK_CLIENT_MESSENGER); // I was online on Miranda, but when looked at myself at messenger.com I had icon of Messenger. + } + else if (vc == 10) { + client = _T(FACEBOOK_CLIENT_MOBILE); + } + else { + client = _T(FACEBOOK_CLIENT_OTHER); + } + + ptrT oldClient(proto->getTStringA(hContact, "MirVer")); + if (!oldClient || mir_tstrcmp(oldClient, client)) + proto->setTString(hContact, "MirVer", client); + } + } + } else if (t == "buddylist_overlay") { - // additional info about user status (used client) + // TODO: This is now supported also via /ajax/mercury/tabs_presence.php request (probably) + // additional info about user status (status, used client) const JSONNode &overlay = (*it)["overlay"]; if (!overlay) continue; for (auto itNodes = overlay.begin(); itNodes != overlay.end(); ++itNodes) { - std::string id = (*itNodes).as_string(); + std::string id = (*itNodes).name(); - const JSONNode &p_ = (*itNodes)["p"]; - if (!p_) + MCONTACT hContact = proto->ContactIDToHContact(id); + if (!hContact) { + // FIXME: What to do, when we don't have this contact? What does it mean? + // fbu->handle = AddToContactList(fbu, CONTACT_FRIEND); // add this contact as friend? continue; + } - // TODO: This is now supported also via /ajax/mercury/tabs_presence.php request - const JSONNode &p = (*it)["p"]; - if (p) { - facebook_user* current = proto->facy.buddies.find(id); // HACKISH-WAY to get buddies... - if (current == NULL) - continue; + // TODO: Check for friends existence/inexistence? - std::string status = p["status"].as_string(); // this seems to be "active" or "invisible" or null - std::string webStatus = p["webStatus"].as_string(); // "active", "idle" or "offline" - std::string fbAppStatus = p["fbAppStatus"].as_string(); // "offline" or "active" or "invisible" or null - std::string messengerStatus = p["messengerStatus"].as_string(); // "offline" or "active" or "invisible" or null - std::string otherStatus = p["otherStatus"].as_string(); // "offline" or "active" or "invisible" or null - this seems to be "active" when webStatus is "idle" or "active" only + /* if (getByte(fbu->handle, FACEBOOK_KEY_CONTACT_TYPE, 0) != CONTACT_FRIEND) { + setByte(fbu->handle, FACEBOOK_KEY_CONTACT_TYPE, CONTACT_FRIEND); + // TODO: remove that popup and use "Contact added you" event? + } - // this may never happen - if (status != "active") - current->status_id = ID_STATUS_OFFLINE; + // Wasn't contact removed from "server-list" someday? + if (getDword(fbu->handle, FACEBOOK_KEY_DELETED, 0)) { + delSetting(fbu->handle, FACEBOOK_KEY_DELETED); - bool b; + std::string url = FACEBOOK_URL_PROFILE + fbu->user_id; + std::string contactname = getContactName(this, fbu->handle, !fbu->real_name.empty() ? fbu->real_name.c_str() : fbu->user_id.c_str()); - // "webStatus" and "otherStatus" are marked as "WEB" on FB website - if ((b = (webStatus == "active")) || otherStatus == "active") { - current->status_id = ID_STATUS_ONLINE; - current->client = b ? CLIENT_WEB : CLIENT_OTHER; - } + ptrT szTitle(mir_utf8decodeT(contactname.c_str())); + NotifyEvent(szTitle, TranslateT("Contact is back on server-list."), fbu->handle, FACEBOOK_EVENT_FRIENDSHIP, &url); + } */ + + + /* ptrT client(getTStringA(fbu->handle, "MirVer")); + if (!client || mir_tstrcmp(client, fbu->getMirVer())) + setTString(fbu->handle, "MirVer", fbu->getMirVer()); + */ + + const JSONNode &a_ = (*itNodes)["a"]; // possible values: 0, 2 (something more?) + const JSONNode &la_ = (*itNodes)["la"]; // timestamp of last activity (could be 0) + const JSONNode &s_ = (*itNodes)["s"]; // possible values: push (something more?) + const JSONNode &vc_ = (*itNodes)["vc"]; // possible values: 0, 8, 10 (something more?) + + // Friller account has also these: + // const JSONNode &ol_ = (*itNodes)["ol"]; // possible values: -1 (when goes to offline), 0 (when goes back online) (something more?) + // const JSONNode &p_ = (*itNodes)["p"]; // class with fbAppStatus, messengerStatus, otherStatus, status, webStatus + + int status = ID_STATUS_FREECHAT; // FREECHAT to easily spot some problem, as we expect it will always be p==0 or p==2 below + + if (a_) { + int a = a_.as_int(); + + if (a == 0) + status = ID_STATUS_OFFLINE; + else if (a == 2) + status = ID_STATUS_ONLINE; + } - // "fbAppStatus" and "messengerStatus" are marked as "MOBILE" on FB website - if ((b = (fbAppStatus == "active")) || messengerStatus == "active") { - current->status_id = ID_STATUS_ONTHEPHONE; - current->client = b ? CLIENT_APP : CLIENT_MESSENGER; + if (proto->getWord(hContact, "Status", 0) != status) + proto->setWord(hContact, "Status", status); + + + if (la_ && status != ID_STATUS_ONLINE) { + time_t last_active = utils::time::from_string(la_.as_string()); + + // we should set IdleTS only when contact is IDLE, or OFFLINE + if (proto->getDword(hContact, "IdleTS", 0) != last_active) { + if (/*(fbu->idle || status == ID_STATUS_OFFLINE) &&*/ last_active > 0) + proto->setDword(hContact, "IdleTS", last_active); + else + proto->delSetting(hContact, "IdleTS"); } - // this is not marked anyhow on website (yet?) - current->idle = webStatus == "idle" || otherStatus == "idle" || fbAppStatus == "idle" || messengerStatus == "idle"; + /*if (proto->getDword(hContact, "LastActiveTS", 0) != last_active) { + if (last_active > 0) + proto->setDword(hContact, "LastActiveTS", last_active); + else + proto->delSetting(hContact, "LastActiveTS"); + }*/ + } + else { + proto->delSetting(hContact, "IdleTS"); + } + + if (s_) { + // what to do with this? + } + // Probably means client: guess 0 = web, 8 = messenger, 10 = something else? + if (vc_) { + int vc = vc_.as_int(); + TCHAR *client = _T(FACEBOOK_CLIENT_WEB); + + /*if (vc == 0) { + // means active some time ago? (on messenger or also on web) + client = _T(FACEBOOK_CLIENT_WEB); + } + else if (vc == 8) { + client = _T(FACEBOOK_CLIENT_MESSENGER); // I was online on Miranda, but when looked at myself at messenger.com I had icon of Messenger. + } + else if (vc == 10) { + // means actually active on messenger + client = _T(FACEBOOK_CLIENT_MOBILE); + } + else { + client = _T(FACEBOOK_CLIENT_OTHER); + }*/ - // TODO: save that info to DB + ptrT oldClient(proto->getTStringA(hContact, "MirVer")); + if (!oldClient || mir_tstrcmp(oldClient, client)) + proto->setTString(hContact, "MirVer", client); } } } else if (t == "ticker_update:home") { diff --git a/protocols/FacebookRM/src/json.h b/protocols/FacebookRM/src/json.h index b900487e36..b392fb247e 100644 --- a/protocols/FacebookRM/src/json.h +++ b/protocols/FacebookRM/src/json.h @@ -30,7 +30,6 @@ class facebook_json_parser {
public:
FacebookProto* proto;
- int parse_buddy_list(std::string*, List::List< facebook_user >*);
int parse_friends(std::string*, std::map< std::string, facebook_user* >*);
int parse_notifications(std::string*, std::map< std::string, facebook_notification* >*);
int parse_messages(std::string*, std::vector< facebook_message >*, std::map< std::string, facebook_notification* >*);
diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index d9d52b0b38..313c365dc8 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -38,129 +38,8 @@ std::string getContactName(FacebookProto *proto, MCONTACT hContact, const char * return name; } -void FacebookProto::ProcessBuddyList(void*) -{ - ScopedLock s(facy.buddies_lock_); - - if (isOffline()) - return; - - facy.handle_entry("ProcessBuddyList"); - - std::string data = "user=" + facy.self_.user_id; - - data += "&cached_user_info_ids="; - int counter = 0; - for (List::Item< facebook_user >* i = facy.buddies.begin(); i != NULL; i = i->next, counter++) { - data += i->data->user_id + "%2C"; - } - - if (getByte(FACEBOOK_KEY_FETCH_MOBILE, 0) == 1) - data += "&fetch_mobile=true"; - // data += "&additional_buddies[0]=" + some_user_id; // FIXME: I'm not sure what this is for - // data += "&additional_buddies[1]=" + some_user_id; - data += "&get_now_available_list=true"; - - data += "&__user=" + facy.self_.user_id; - data += "&__dyn=" + facy.__dyn(); - data += "&__req=" + facy.__req(); - data += "&fb_dtsg=" + facy.dtsg_; - data += "&ttstamp=" + facy.ttstamp_; - data += "&__rev=" + facy.__rev(); - - // Get buddy list - http::response resp = facy.flap(REQUEST_BUDDY_LIST, &data); // NOTE: Request revised 1.9.2015 - - if (resp.code != HTTP_CODE_OK) { - facy.handle_error("buddy_list"); - return; - } - - debugLogA("*** Starting processing buddy list"); - - CODE_BLOCK_TRY - - facebook_json_parser* p = new facebook_json_parser(this); - p->parse_buddy_list(&resp.data, &facy.buddies); - delete p; - - for (List::Item< facebook_user >* i = facy.buddies.begin(); i != NULL;) - { - facebook_user* fbu = i->data; - - if (!fbu->deleted) { - if (!fbu->handle) // just been added - fbu->handle = AddToContactList(fbu, CONTACT_FRIEND); - - ptrT client(getTStringA(fbu->handle, "MirVer")); - if (!client || mir_tstrcmp(client, fbu->getMirVer())) - setTString(fbu->handle, "MirVer", fbu->getMirVer()); - - if (getDword(fbu->handle, "IdleTS", 0) != fbu->last_active) { - if ((fbu->idle || fbu->status_id == ID_STATUS_OFFLINE) && fbu->last_active > 0) - setDword(fbu->handle, "IdleTS", fbu->last_active); - else - delSetting(fbu->handle, "IdleTS"); - } - } - - if (fbu->status_id == ID_STATUS_OFFLINE || fbu->deleted) { - if (fbu->handle) - setWord(fbu->handle, "Status", ID_STATUS_OFFLINE); - - std::string to_delete(i->key); - i = i->next; - facy.buddies.erase(to_delete); - } else { - i = i->next; - - if (!fbu->handle) // just been added - fbu->handle = AddToContactList(fbu, CONTACT_FRIEND); - - if (getWord(fbu->handle, "Status", 0) != (int)fbu->status_id) - setWord(fbu->handle, "Status", fbu->status_id); - - if (getDword(fbu->handle, "LastActiveTS", 0) != fbu->last_active) { - if (fbu->last_active > 0) - setDword(fbu->handle, "LastActiveTS", fbu->last_active); - else - delSetting(fbu->handle, "LastActiveTS"); - } - - if (getByte(fbu->handle, FACEBOOK_KEY_CONTACT_TYPE, 0) != CONTACT_FRIEND) { - setByte(fbu->handle, FACEBOOK_KEY_CONTACT_TYPE, CONTACT_FRIEND); - // TODO: remove that popup and use "Contact added you" event? - } - - // Wasn't contact removed from "server-list" someday? - if (getDword(fbu->handle, FACEBOOK_KEY_DELETED, 0)) { - delSetting(fbu->handle, FACEBOOK_KEY_DELETED); - - std::string url = FACEBOOK_URL_PROFILE + fbu->user_id; - std::string contactname = getContactName(this, fbu->handle, !fbu->real_name.empty() ? fbu->real_name.c_str() : fbu->user_id.c_str()); - - ptrT szTitle(mir_utf8decodeT(contactname.c_str())); - NotifyEvent(szTitle, TranslateT("Contact is back on server-list."), fbu->handle, FACEBOOK_EVENT_FRIENDSHIP, &url); - } - - // Check avatar change - CheckAvatarChange(fbu->handle, fbu->image_url); - } - } - - debugLogA("*** Buddy list processed"); - - CODE_BLOCK_CATCH - - debugLogA("*** Error processing buddy list: %s", e.what()); - - CODE_BLOCK_END -} - void FacebookProto::ProcessFriendList(void*) { - ScopedLock s(facy.buddies_lock_); - if (isOffline()) return; @@ -1017,15 +896,15 @@ void FacebookProto::ProcessMessages(void* data) std::vector<facebook_message> messages; - facebook_json_parser* p = new facebook_json_parser(this); - p->parse_messages(resp, &messages, &facy.notifications); - delete p; + facebook_json_parser* p = new facebook_json_parser(this); + p->parse_messages(resp, &messages, &facy.notifications); + delete p; - ReceiveMessages(messages); + ReceiveMessages(messages); - ShowNotifications(); + ShowNotifications(); - debugLogA("*** Messages processed"); + debugLogA("*** Messages processed"); CODE_BLOCK_CATCH diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp index 85f25595a4..79d2f30893 100644 --- a/protocols/FacebookRM/src/proto.cpp +++ b/protocols/FacebookRM/src/proto.cpp @@ -32,7 +32,6 @@ FacebookProto::FacebookProto(const char* proto_name, const TCHAR* username) : avatar_lock_ = CreateMutex(NULL, FALSE, NULL); log_lock_ = CreateMutex(NULL, FALSE, NULL); update_loop_lock_ = CreateEvent(NULL, FALSE, FALSE, NULL); - facy.buddies_lock_ = CreateMutex(NULL, FALSE, NULL); facy.send_message_lock_ = CreateMutex(NULL, FALSE, NULL); facy.fcb_conn_lock_ = CreateMutex(NULL, FALSE, NULL); facy.notifications_lock_ = CreateMutex(NULL, FALSE, NULL); @@ -121,7 +120,6 @@ FacebookProto::~FacebookProto() WaitForSingleObject(signon_lock_, IGNORE); WaitForSingleObject(avatar_lock_, IGNORE); WaitForSingleObject(log_lock_, IGNORE); - WaitForSingleObject(facy.buddies_lock_, IGNORE); WaitForSingleObject(facy.send_message_lock_, IGNORE); WaitForSingleObject(facy.notifications_lock_, IGNORE); WaitForSingleObject(facy.cookies_lock_, IGNORE); @@ -130,7 +128,6 @@ FacebookProto::~FacebookProto() CloseHandle(avatar_lock_); CloseHandle(log_lock_); CloseHandle(update_loop_lock_); - CloseHandle(facy.buddies_lock_); CloseHandle(facy.send_message_lock_); CloseHandle(facy.fcb_conn_lock_); CloseHandle(facy.notifications_lock_); @@ -646,15 +643,6 @@ INT_PTR FacebookProto::CheckFriendRequests(WPARAM, LPARAM) return 0; } -INT_PTR FacebookProto::RefreshBuddyList(WPARAM, LPARAM) -{ - if (!isOffline()) { - facy.client_notify(TranslateT("Refreshing buddy list...")); - ForkThread(&FacebookProto::ProcessBuddyList, NULL); - } - return 0; -} - INT_PTR FacebookProto::VisitProfile(WPARAM wParam, LPARAM) { @@ -778,11 +766,12 @@ INT_PTR FacebookProto::CancelFriendship(WPARAM wParam, LPARAM lParam) std::string *val = new std::string(id); - if (deleting) { + // FIXME: Remember that we deleted this contact, so we won't accidentally add him at status change + /*if (deleting) { facebook_user *fbu = facy.buddies.find(*val); if (fbu != NULL) fbu->handle = NULL; - } + }*/ ForkThread(&FacebookProto::DeleteContactFromServer, val); } diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h index ad88a916cd..e7e3fa851c 100644 --- a/protocols/FacebookRM/src/proto.h +++ b/protocols/FacebookRM/src/proto.h @@ -125,7 +125,6 @@ public: INT_PTR __cdecl OnCancelFriendshipRequest(WPARAM, LPARAM); INT_PTR __cdecl CheckNewsfeeds(WPARAM, LPARAM); INT_PTR __cdecl CheckFriendRequests(WPARAM, LPARAM); - INT_PTR __cdecl RefreshBuddyList(WPARAM, LPARAM); INT_PTR __cdecl GetNotificationsCount(WPARAM, LPARAM); INT_PTR __cdecl OnJoinChat(WPARAM,LPARAM); @@ -161,7 +160,6 @@ public: void __cdecl UpdateLoop(void*); // Processing threads - void __cdecl ProcessBuddyList(void*); void __cdecl ProcessFriendList(void*); void __cdecl ProcessMessages(void*); void __cdecl ProcessUnreadMessages(void*); diff --git a/protocols/FacebookRM/src/theme.cpp b/protocols/FacebookRM/src/theme.cpp index 1b1e747f49..42d1b6d8e8 100644 --- a/protocols/FacebookRM/src/theme.cpp +++ b/protocols/FacebookRM/src/theme.cpp @@ -246,12 +246,6 @@ void FacebookProto::InitMenu() mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_HELP);
mi.root = m_hMenuServicesRoot = Menu_AddProtoMenuItem(&mi, m_szModuleName);
- mi.pszService = "/RefreshBuddyList";
- CreateProtoService(mi.pszService, &FacebookProto::RefreshBuddyList);
- mi.name.a = LPGEN("Refresh Buddy List");
- mi.hIcolibItem = GetIconHandle("friendship");
- Menu_AddProtoMenuItem(&mi, m_szModuleName);
-
mi.pszService = "/CheckFriendRequests";
CreateProtoService(mi.pszService, &FacebookProto::CheckFriendRequests);
mi.name.a = LPGEN("Check Friends Requests");
diff --git a/protocols/FacebookRM/src/version.h b/protocols/FacebookRM/src/version.h index 13b9e6d7fc..71ef6c5de1 100644 --- a/protocols/FacebookRM/src/version.h +++ b/protocols/FacebookRM/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 2 -#define __RELEASE_NUM 13 -#define __BUILD_NUM 1 +#define __RELEASE_NUM 14 +#define __BUILD_NUM 0 #include <stdver.h> |