From e94c705bb01c662d934c0096480bc9a732d0e1ec Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 19 Jan 2012 12:21:27 +0000 Subject: FacebookRM: Version bump Version 0.0.7.0 + Support for group chats (EXPERIMENTAL!) - enable it in options ! Fixed loading contact list ! Fixed potential freeze. Total downloads: (None or statistics not available yet) Version 0.0.6.1a Reuploaded. Total downloads: (None or statistics not available yet) Version 0.0.6.1 + Returned option to close chat windows (on website) + New option to map non-standard statuses to Invisible (insetad of Online) + New option to load contacts, which have "On the Phone" status ! Fixed changing chat visibility ! Very long messages are no longer received duplicitely ! Changes and fixes related to multiuser messages and messages from people, which are not in server-list Total downloads: (None or statistics not available yet) git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@261 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- FacebookRM/process.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 12 deletions(-) (limited to 'FacebookRM/process.cpp') diff --git a/FacebookRM/process.cpp b/FacebookRM/process.cpp index e6c965c..48430df 100644 --- a/FacebookRM/process.cpp +++ b/FacebookRM/process.cpp @@ -70,14 +70,32 @@ void FacebookProto::ProcessBuddyList( void* data ) if (!fbu->handle) { // just been added fbu->handle = AddToContactList(fbu); - DBWriteContactSettingUTF8String(fbu->handle,m_szModuleName,FACEBOOK_KEY_NAME,fbu->real_name.c_str()); - DBWriteContactSettingUTF8String(fbu->handle,m_szModuleName,"Nick",fbu->real_name.c_str()); + if (!fbu->real_name.empty()) { + DBWriteContactSettingUTF8String(fbu->handle,m_szModuleName,FACEBOOK_KEY_NAME,fbu->real_name.c_str()); + DBWriteContactSettingUTF8String(fbu->handle,m_szModuleName,FACEBOOK_KEY_NICK,fbu->real_name.c_str()); + } + } + + if (DBGetContactSettingWord(fbu->handle,m_szModuleName,"Status", 0) != fbu->status_id ) { + DBWriteContactSettingWord(fbu->handle,m_szModuleName,"Status", fbu->status_id ); } - if (DBGetContactSettingWord(fbu->handle,m_szModuleName,"Status", 0) != ID_STATUS_ONLINE) { - DBWriteContactSettingWord(fbu->handle,m_szModuleName,"Status", ID_STATUS_ONLINE ); + if (DBGetContactSettingByte(fbu->handle,m_szModuleName,FACEBOOK_KEY_CONTACT_TYPE, 0)) { + DBDeleteContactSetting(fbu->handle,m_szModuleName,FACEBOOK_KEY_CONTACT_TYPE); // Set type "on server-list" contact } + // Wasn't contact removed from "server-list" someday? + if ( DBGetContactSettingDword(fbu->handle, m_szModuleName, FACEBOOK_KEY_DELETED, 0) ) { + DBDeleteContactSetting(fbu->handle, m_szModuleName, FACEBOOK_KEY_DELETED); + + std::string url = FACEBOOK_URL_PROFILE + fbu->user_id; + + TCHAR* szTitle = mir_a2t_cp(fbu->real_name.c_str(), CP_UTF8); + TCHAR* szUrl = mir_a2t_cp(url.c_str(), CP_UTF8); + NotifyEvent(szTitle, TranslateT("Contact is back on server-list."), fbu->handle, FACEBOOK_EVENT_OTHER, szUrl); + mir_free( szTitle ); + // mir_free( szUrl ); // url is free'd in popup procedure + } // Check avatar change CheckAvatarChange(fbu->handle, fbu->image_url); @@ -96,6 +114,66 @@ exit: delete resp; } +void FacebookProto::ProcessFacepiles( void* data ) +{ + if ( data == NULL ) + return; + + send_chat *resp = static_cast(data); + + if ( isOffline() ) + goto exit; + + LOG("***** Starting processing facepiles"); + + CODE_BLOCK_TRY + + std::map< std::string, std::string > facepiles; + + facebook_json_parser* p = new facebook_json_parser( this ); + p->parse_facepiles( &(resp->msg), &facepiles ); + delete p; + + std::map< std::string, std::string >::iterator iter; + + char *chat_users = this->GetChatUsers(resp->chat_id.c_str()); + std::string users = chat_users; + mir_free(chat_users); + + std::vector users_list; + utils::text::explode(users, " ", &users_list); + + for( std::vector::size_type i=0; iRemoveChatContact(resp->chat_id.c_str(), users_list[i].c_str()); + LOG(" Now offline facepile (%s): [%s]", resp->chat_id.c_str(), users_list[i].c_str()); + } else { + facepiles.erase(iter); + } + } + + for ( iter = facepiles.begin( ); iter != facepiles.end(); ++iter ) + { + // These contacts are newly online, add them... + this->AddChatContact(resp->chat_id.c_str(), iter->first.c_str(), iter->second.c_str()); + LOG(" Now online facepile (%s): [%s] %s", resp->chat_id.c_str(), iter->first.c_str(), iter->second.c_str()); + } + + LOG("***** Facepiles processed"); + + CODE_BLOCK_CATCH + + LOG("***** Error processing facepiles: %s", e.what()); + + CODE_BLOCK_END + +exit: + delete resp; +} + + void FacebookProto::ProcessFriendList( void* data ) { if ( data == NULL ) @@ -151,7 +229,11 @@ void FacebookProto::ProcessFriendList( void* data ) if ( update_required ) { DBWriteContactSettingUTF8String(hContact, m_szModuleName, FACEBOOK_KEY_NAME, fbu->real_name.c_str()); - DBWriteContactSettingUTF8String(hContact, m_szModuleName, "Nick", fbu->real_name.c_str()); + DBWriteContactSettingUTF8String(hContact, m_szModuleName, FACEBOOK_KEY_NICK, fbu->real_name.c_str()); + } + + if (DBGetContactSettingByte(fbu->handle,m_szModuleName,FACEBOOK_KEY_CONTACT_TYPE, 0)) { + DBDeleteContactSetting(fbu->handle,m_szModuleName,FACEBOOK_KEY_CONTACT_TYPE); // Has type "on server-list" contact } // Wasn't contact removed from "server-list" someday? @@ -162,7 +244,7 @@ void FacebookProto::ProcessFriendList( void* data ) TCHAR* szTitle = mir_a2t_cp(fbu->real_name.c_str(), CP_UTF8); TCHAR* szUrl = mir_a2t_cp(url.c_str(), CP_UTF8); - NotifyEvent(szTitle, TranslateT("Contact is back on server-list."), hContact, FACEBOOK_EVENT_CLIENT, szUrl); + NotifyEvent(szTitle, TranslateT("Contact is back on server-list."), hContact, FACEBOOK_EVENT_OTHER, szUrl); mir_free( szTitle ); // mir_free( szUrl ); // url is free'd in popup procedure } @@ -176,7 +258,9 @@ void FacebookProto::ProcessFriendList( void* data ) // Contact was removed from "server-list", notify it // Wasnt we already been notified about this contact? - if ( !DBGetContactSettingDword(hContact, m_szModuleName, FACEBOOK_KEY_DELETED, 0) ) { + if ( !DBGetContactSettingDword(hContact, m_szModuleName, FACEBOOK_KEY_DELETED, 0) + && !DBGetContactSettingByte(hContact, m_szModuleName, FACEBOOK_KEY_CONTACT_TYPE, 0) ) { // And is this contact "on-server" contact? + DBWriteContactSettingDword(hContact, m_szModuleName, FACEBOOK_KEY_DELETED, ::time(NULL)); std::string contactname = id; @@ -189,7 +273,7 @@ void FacebookProto::ProcessFriendList( void* data ) TCHAR* szTitle = mir_a2t_cp(contactname.c_str(), CP_UTF8); TCHAR* szUrl = mir_a2t_cp(url.c_str(), CP_UTF8); - NotifyEvent(szTitle, TranslateT("Contact is no longer on server-list."), hContact, FACEBOOK_EVENT_CLIENT, szUrl); + NotifyEvent(szTitle, TranslateT("Contact is no longer on server-list."), hContact, FACEBOOK_EVENT_OTHER, szUrl); mir_free( szTitle ); // mir_free( szUrl ); // url is free'd in popup procedure } @@ -206,7 +290,7 @@ void FacebookProto::ProcessFriendList( void* data ) DBWriteContactSettingByte(hContact, m_szModuleName, "Gender", fbu->gender ); DBWriteContactSettingUTF8String(hContact, m_szModuleName, FACEBOOK_KEY_NAME, fbu->real_name.c_str()); - DBWriteContactSettingUTF8String(hContact, m_szModuleName, "Nick", fbu->real_name.c_str()); + DBWriteContactSettingUTF8String(hContact, m_szModuleName, FACEBOOK_KEY_NICK, fbu->real_name.c_str()); DBWriteContactSettingString(hContact, m_szModuleName, FACEBOOK_KEY_AV_URL, fbu->image_url.c_str()); // DBWriteContactSettingWord(hContact, m_szModuleName, "Status", ID_STATUS_OFFLINE ); } @@ -266,7 +350,7 @@ void FacebookProto::ProcessUnreadMessages( void* ) std::string user_id = utils::text::source_get_value( &messageslist, 2, "single_thread_id\":", "," ); if (user_id.empty()) { - LOG(" !! !! Thread id is empty - this is groupchat message."); // todo remove as this is not such 'error' + LOG(" !! !! Thread id is empty - this is groupchat message."); // TODO: remove as this is not such 'error' continue; } @@ -336,8 +420,8 @@ void FacebookProto::ProcessMessages( void* data ) facebook_user fbu; fbu.user_id = messages[i]->user_id; - HANDLE hContact = AddToContactList(&fbu); - + HANDLE hContact = AddToContactList(&fbu, false, messages[i]->sender_name.c_str()); + PROTORECVEVENT recv = {0}; CCSDATA ccs = {0}; -- cgit v1.2.3