From eec9743cc90715180fec9b184ae343dc5083e780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Thu, 16 May 2013 14:55:16 +0000 Subject: Facebook: - fixed getting login error message - cleanup of close_chat method and related things - added Poke support (contact menu) - support for sending "Seen" info (add in db "MarkRead" (byte) with value "1") - support for language specific fb errors (add in db "Locale" (string) with locale value ("en_US", "cs_CZ" etc.) - mir_a2t_cp(..., CP_UTF8) changed to mir_utf8decodeT(...) git-svn-id: http://svn.miranda-ng.org/main/trunk@4677 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/FacebookRM/facebook_10.vcxproj | 2 + protocols/FacebookRM/facebook_10.vcxproj.filters | 6 ++ protocols/FacebookRM/res/facebook.rc | 5 +- protocols/FacebookRM/src/chat.cpp | 4 -- protocols/FacebookRM/src/client.h | 3 - protocols/FacebookRM/src/communication.cpp | 74 ++++++++---------------- protocols/FacebookRM/src/constants.h | 6 +- protocols/FacebookRM/src/contacts.cpp | 36 ++++++++++++ protocols/FacebookRM/src/db.h | 5 +- protocols/FacebookRM/src/entities.h | 4 +- protocols/FacebookRM/src/json.cpp | 15 +++-- protocols/FacebookRM/src/messages.cpp | 41 ++++++++----- protocols/FacebookRM/src/process.cpp | 41 ++++++------- protocols/FacebookRM/src/proto.cpp | 15 +++++ protocols/FacebookRM/src/proto.h | 4 +- protocols/FacebookRM/src/resource.h | 6 +- protocols/FacebookRM/src/theme.cpp | 23 ++++++-- protocols/FacebookRM/src/theme.h | 3 +- 18 files changed, 179 insertions(+), 114 deletions(-) (limited to 'protocols') diff --git a/protocols/FacebookRM/facebook_10.vcxproj b/protocols/FacebookRM/facebook_10.vcxproj index 042a5b54da..4bb69be9b0 100644 --- a/protocols/FacebookRM/facebook_10.vcxproj +++ b/protocols/FacebookRM/facebook_10.vcxproj @@ -222,6 +222,8 @@ + + diff --git a/protocols/FacebookRM/facebook_10.vcxproj.filters b/protocols/FacebookRM/facebook_10.vcxproj.filters index 326a245303..ceabb2ebb4 100644 --- a/protocols/FacebookRM/facebook_10.vcxproj.filters +++ b/protocols/FacebookRM/facebook_10.vcxproj.filters @@ -157,6 +157,12 @@ Resource Files + + Resource Files + + + Resource Files + diff --git a/protocols/FacebookRM/res/facebook.rc b/protocols/FacebookRM/res/facebook.rc index 5570e9482b..12ceaf1738 100644 --- a/protocols/FacebookRM/res/facebook.rc +++ b/protocols/FacebookRM/res/facebook.rc @@ -56,6 +56,8 @@ IDI_MIND ICON "mind.ico" IDI_AUTH_GRANT ICON "auth_grant.ico" IDI_AUTH_ASK ICON "auth_ask.ico" IDI_AUTH_REVOKE ICON "auth_revoke.ico" +IDI_POKE ICON "poke.ico" +IDI_NOTIFICATION ICON "notification.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -259,8 +261,7 @@ END // // Generated from the TEXTINCLUDE 3 resource. // - - + ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED diff --git a/protocols/FacebookRM/src/chat.cpp b/protocols/FacebookRM/src/chat.cpp index 5bfb562713..01279a9df9 100644 --- a/protocols/FacebookRM/src/chat.cpp +++ b/protocols/FacebookRM/src/chat.cpp @@ -45,10 +45,6 @@ void FacebookProto::UpdateChat(const char *chat_id, const char *id, const char * mir_free(const_cast(gce.ptszNick)); mir_free(const_cast(gce.ptszText)); mir_free(const_cast(gcd.ptszID)); - - - // Close chat window, if set - ForkThread(&FacebookProto::MessagingWorker, this, new send_messaging(chat_id, FACEBOOK_SEND_MESSAGE)); } int FacebookProto::OnChatOutgoing(WPARAM wParam,LPARAM lParam) diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h index 62a9a7f2c0..214e5a81ce 100644 --- a/protocols/FacebookRM/src/client.h +++ b/protocols/FacebookRM/src/client.h @@ -149,9 +149,6 @@ public: bool channel(); bool send_message(std::string message_recipient, std::string message_text, std::string *error_text, int method); - void close_chat(std::string message_recipient); - void chat_mark_read(std::string message_recipient); - //////////////////////////////////////////////////////////// // Status handling diff --git a/protocols/FacebookRM/src/communication.cpp b/protocols/FacebookRM/src/communication.cpp index 48fc76e741..e86519a85f 100644 --- a/protocols/FacebookRM/src/communication.cpp +++ b/protocols/FacebookRM/src/communication.cpp @@ -243,8 +243,9 @@ DWORD facebook_client::choose_security_level(int request_type) // case FACEBOOK_REQUEST_THREAD_INFO: // case FACEBOOK_REQUEST_MESSAGES_RECEIVE: // case FACEBOOK_REQUEST_VISIBILITY: -// case FACEBOOK_REQUEST_TABS: +// case FACEBOOK_REQUEST_POKE: // case FACEBOOK_REQUEST_ASYNC: +// case FACEBOOK_REQUEST_MARK_READ: // case FACEBOOK_REQUEST_UNREAD_MESSAGES: // case FACEBOOK_REQUEST_TYPING_SEND: default: @@ -264,8 +265,9 @@ int facebook_client::choose_method(int request_type) case FACEBOOK_REQUEST_MESSAGE_SEND2: case FACEBOOK_REQUEST_THREAD_INFO: case FACEBOOK_REQUEST_VISIBILITY: - case FACEBOOK_REQUEST_TABS: + case FACEBOOK_REQUEST_POKE: case FACEBOOK_REQUEST_ASYNC: + case FACEBOOK_REQUEST_MARK_READ: case FACEBOOK_REQUEST_TYPING_SEND: case FACEBOOK_REQUEST_LOGOUT: case FACEBOOK_REQUEST_DELETE_FRIEND: @@ -331,8 +333,9 @@ std::string facebook_client::choose_server(int request_type, std::string* data, // case FACEBOOK_REQUEST_MESSAGE_SEND2: // case FACEBOOK_REQUEST_THREAD_INFO: // case FACEBOOK_REQUEST_VISIBILITY: -// case FACEBOOK_REQUEST_TABS: +// case FACEBOOK_REQUEST_POKE: // case FACEBOOK_REQUEST_ASYNC: +// case FACEBOOK_REQUEST_MARK_READ: // case FACEBOOK_REQUEST_TYPING_SEND: // case FACEBOOK_REQUEST_SETUP_MACHINE: // case FACEBOOK_REQUEST_DELETE_FRIEND: @@ -478,8 +481,8 @@ std::string facebook_client::choose_action(int request_type, std::string* data, case FACEBOOK_REQUEST_VISIBILITY: return "/ajax/chat/privacy/visibility.php?__a=1"; - case FACEBOOK_REQUEST_TABS: - return "/ajax/chat/tabs.php?__a=1"; + case FACEBOOK_REQUEST_POKE: + return "/ajax/poke_dialog.php?__a=1"; case FACEBOOK_REQUEST_ASYNC: { @@ -490,6 +493,9 @@ std::string facebook_client::choose_action(int request_type, std::string* data, return action; } + case FACEBOOK_REQUEST_MARK_READ: + return "/ajax/mercury/change_read_status.php?__a=1"; + case FACEBOOK_REQUEST_TYPING_SEND: return "/ajax/messaging/typ.php?__a=1"; @@ -608,9 +614,13 @@ bool facebook_client::login(const std::string &username,const std::string &passw flap(FACEBOOK_REQUEST_HOME, NULL); // Prepare login data - std::string data = "charset_test=%e2%82%ac%2c%c2%b4%2c%e2%82%ac%2c%c2%b4%2c%e6%b0%b4%2c%d0%94%2c%d0%84&locale=en&pass_placeHolder=Password&login=Login&persistent=1"; + std::string data = "charset_test=%e2%82%ac%2c%c2%b4%2c%e2%82%ac%2c%c2%b4%2c%e6%b0%b4%2c%d0%94%2c%d0%84&pass_placeHolder=Password&login=Login&persistent=1"; data += "&email=" + utils::url::encode(username); - data += "&pass=" + utils::url::encode(password); + data += "&pass=" + utils::url::encode(password); + + mir_ptr locale = db_get_sa(NULL, parent->m_szModuleName, FACEBOOK_KEY_LOCALE); + if (locale != NULL) + data += "&locale=" + std::string(locale); // Send validation http::response resp = flap(FACEBOOK_REQUEST_LOGIN, &data); @@ -707,16 +717,14 @@ bool facebook_client::login(const std::string &username,const std::string &passw utils::text::special_expressions_decode( utils::text::remove_html( utils::text::edit_html( - utils::text::source_get_value(&resp.data, 3, "login_error_box", "

", "

"))))); - - if (!error_str.length()) - error_str = Translate("Unknown login error"); - parent->Log(" ! ! Login error: %s", error_str.c_str()); - - std::string message = Translate("Login error: ") + error_str; - TCHAR* tmessage = mir_a2t(message.c_str()); - client_notify(tmessage); - mir_free(tmessage); + utils::text::source_get_value(&resp.data, 4, "login_error_box", "", ""))))); + + parent->Log(" ! ! Login error: %s", error_str.length() ? error_str.c_str() : "Unknown error"); + + TCHAR buf[200]; + mir_sntprintf(buf, SIZEOF(buf), TranslateT("Login error: %s"), + (!error_str.length()) ? TranslateT("Unknown error") : mir_ptr(mir_utf8decodeT(error_str.c_str()))); + client_notify(buf); } case HTTP_CODE_FORBIDDEN: // Forbidden case HTTP_CODE_NOT_FOUND: // Not Found @@ -1165,38 +1173,6 @@ bool facebook_client::send_message(std::string message_recipient, std::string me } } -void facebook_client::close_chat(std::string message_recipient) -{ - // TODO RM: better optimalization for close_chat - // add items to list and then checking every x seconds -/* if ((::time(NULL) - parent->facy.last_close_chat_time_) < 8) - return;*/ - // parent->facy.last_close_chat_time_ = ::time(NULL); - - /* Wait some time before close window, because sometimes facebook - can't close it so soon. But maybe this didnt help also. */ - Sleep(300); - - std::string data = "close_chat=" + message_recipient; - data += "&window_id=0"; - data += "&fb_dtsg=" + (this->dtsg_.length() ? this->dtsg_ : "0"); - data += "&__user=" + self_.user_id; - - http::response resp = flap(FACEBOOK_REQUEST_TABS, &data); -} - -void facebook_client::chat_mark_read(std::string message_recipient) -{ - // TODO RM: optimalization? - - std::string data = "action=chatMarkRead"; - data += "&other_user=" + message_recipient; - data += "&fb_dtsg=" + (this->dtsg_.length() ? this->dtsg_ : "0"); - data += "&lsd=&__user=" + self_.user_id; - - http::response resp = flap(FACEBOOK_REQUEST_ASYNC, &data); -} - bool facebook_client::set_status(const std::string &status_text) { handle_entry("set_status"); diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h index f70ba28f40..647576a4a9 100644 --- a/protocols/FacebookRM/src/constants.h +++ b/protocols/FacebookRM/src/constants.h @@ -103,12 +103,10 @@ along with this program. If not, see . #define FACEBOOK_REQUEST_MESSAGES_RECEIVE 302 // receiving messages #define FACEBOOK_REQUEST_TYPING_SEND 304 // sending typing notification #define FACEBOOK_REQUEST_VISIBILITY 305 // setting chat visibility -#define FACEBOOK_REQUEST_TABS 306 // closing message window #define FACEBOOK_REQUEST_ASYNC 307 // marking messages read and getting other things +#define FACEBOOK_REQUEST_MARK_READ 308 // marking messages read (new) #define FACEBOOK_REQUEST_THREAD_INFO 310 // getting thread info - -#define FACEBOOK_RECV_MESSAGE 1 -#define FACEBOOK_SEND_MESSAGE 2 +#define FACEBOOK_REQUEST_POKE 311 // sending pokes // Send message types #define MESSAGE_INBOX 0 diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 0fd4a2b1e9..d1eaad91cd 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -321,6 +321,42 @@ void FacebookProto::CancelFriendsRequest(void *data) facy.handle_error("CancelFriendsRequest"); } +void FacebookProto::SendPokeWorker(void *p) +{ + facy.handle_entry("SendPokeWorker"); + + if (p == NULL) + return; + + std::string id = (*(std::string*)p); + delete p; + + std::string data = "uid=" + id; + data += "&phstamp=0&pokeback=0&ask_for_confirm=0"; + data += "&fb_dtsg=" + facy.dtsg_; + data += "&__user=" + facy.self_.user_id; + + // Send poke + http::response resp = facy.flap(FACEBOOK_REQUEST_POKE, &data); + + // Process result data + facy.validate_response(&resp); + + if (resp.data.find("\"payload\":null", 0) != std::string::npos) { + + std::string message = utils::text::special_expressions_decode( + utils::text::remove_html( + utils::text::slashu_to_utf8( + utils::text::source_get_value(&resp.data, 3, "\"body\":", "__html\":\"", "\"}")))); + + TCHAR* tmessage = mir_utf8decodeT(message.c_str()); + NotifyEvent(m_tszUserName, tmessage, NULL, FACEBOOK_EVENT_OTHER, NULL); + mir_free(tmessage); + } + + facy.handle_success("SendPokeWorker"); +} + HANDLE FacebookProto::GetAwayMsg(HANDLE hContact) { diff --git a/protocols/FacebookRM/src/db.h b/protocols/FacebookRM/src/db.h index 373bf8163a..f8d0e857ac 100644 --- a/protocols/FacebookRM/src/db.h +++ b/protocols/FacebookRM/src/db.h @@ -61,12 +61,15 @@ along with this program. If not, see . #define FACEBOOK_KEY_MAP_STATUSES "MapStatuses" #define FACEBOOK_KEY_LOAD_MOBILE "LoadMobile" #define FACEBOOK_KEY_CUSTOM_SMILEYS "CustomSmileys" +#define FACEBOOK_KEY_MESSAGE_ID "LastMessageId" #define FACEBOOK_KEY_POLL_RATE "PollRate" // [HIDDEN] #define FACEBOOK_KEY_TIMEOUTS_LIMIT "TimeoutsLimit" // [HIDDEN] #define FACEBOOK_KEY_DISABLE_LOGOUT "DisableLogout" // [HIDDEN] #define FACEBOOK_KEY_VALIDATE_RESPONSE "ValidateResponse" // [HIDDEN] - 0 = standard, 1 = always, 2 = never -#define FACEBOOK_KEY_LOCAL_TIMESTAMP "UseLocalTimestamp" // [HIDDEN] +#define FACEBOOK_KEY_LOCAL_TIMESTAMP "UseLocalTimestamp" // [HIDDEN] - 0 = use facebook timestamps for messages, 1 = use local timestamps +#define FACEBOOK_KEY_MARK_READ "MarkRead" // [HIDDEN] - 0 = marking messages as read without "Seen" info, 1 = with "Seen" info +#define FACEBOOK_KEY_LOCALE "Locale" // [HIDDEN] - en_US, cs_CZ, etc. #define FACEBOOK_KEY_EVENT_NOTIFICATIONS_ENABLE "EventNotificationsEnable" #define FACEBOOK_KEY_EVENT_FEEDS_ENABLE "EventFeedsEnable" diff --git a/protocols/FacebookRM/src/entities.h b/protocols/FacebookRM/src/entities.h index a5e85d23a6..76fe5cf965 100644 --- a/protocols/FacebookRM/src/entities.h +++ b/protocols/FacebookRM/src/entities.h @@ -64,11 +64,12 @@ struct facebook_message std::string user_id; std::string message_text; std::string sender_name; + std::string message_id; DWORD time; facebook_message() { - this->user_id = this->message_text = this->sender_name = ""; + this->user_id = this->message_text = this->sender_name = this->message_id = ""; this->time = 0; } @@ -77,6 +78,7 @@ struct facebook_message this->user_id = msg.user_id; this->message_text = msg.message_text; this->sender_name = msg.sender_name; + this->message_id = msg.message_id; this->time = msg.time; } }; diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index 34660bc1d6..b07f6244b2 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -303,6 +303,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa const Object& messageContent = objMember["msg"]; const String& text = messageContent["text"]; + const String& message_id = messageContent["messageId"]; //"tab_type":"friend", objMember["tab_type"] const Number& time_sent = messageContent["time"]; @@ -317,10 +318,10 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa } else if (last_msg != text.Value()) { last_msg = text.Value(); facebook_message* message = new facebook_message(); - message->message_text = utils::text::special_expressions_decode( - utils::text::slashu_to_utf8(text.Value())); + message->message_text = utils::text::special_expressions_decode(utils::text::slashu_to_utf8(text.Value())); message->time = utils::time::fix_timestamp(time_sent.Value()); message->user_id = was_id; + message->message_id = message_id; messages->push_back(message); } else { @@ -359,6 +360,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa const String& sender_name = messageContent["sender_name"]; const String& text = messageContent["body"]; const String& tid = messageContent["tid"]; + const String& mid = messageContent["mid"]; const Number& time_sent = messageContent["timestamp"]; char was_id[32]; @@ -384,7 +386,8 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa message->time = utils::time::fix_timestamp(time_sent.Value()); message->user_id = was_id; // TODO: Check if we have contact with this ID in friendlist and otherwise do something different? - + message->message_id = mid.Value(); + messages->push_back(message); } else { std::string msg = "????? Got duplicit inbox message?\n"; @@ -430,9 +433,9 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa proto->Log(" Got multichat message"); - TCHAR* szTitle = mir_a2t_cp(title.c_str(), CP_UTF8); - TCHAR* szText = mir_a2t_cp(popup_text.c_str(), CP_UTF8); - TCHAR* szUrl = mir_a2t_cp(url.c_str(), CP_UTF8); + TCHAR* szTitle = mir_utf8decodeT(title.c_str()); + TCHAR* szText = mir_utf8decodeT(popup_text.c_str()); + TCHAR* szUrl = mir_utf8decodeT(url.c_str()); proto->NotifyEvent(szTitle,szText,NULL,FACEBOOK_EVENT_OTHER, szUrl); mir_free(szTitle); mir_free(szText); diff --git a/protocols/FacebookRM/src/messages.cpp b/protocols/FacebookRM/src/messages.cpp index 0ef3bdb325..29fbbcdcca 100644 --- a/protocols/FacebookRM/src/messages.cpp +++ b/protocols/FacebookRM/src/messages.cpp @@ -24,14 +24,7 @@ along with this program. If not, see . int FacebookProto::RecvMsg(HANDLE hContact, PROTORECVEVENT *pre) { - DBVARIANT dbv; - - if (!db_get_s(hContact,m_szModuleName,FACEBOOK_KEY_ID,&dbv)) - { - ForkThread(&FacebookProto::MessagingWorker, this, new send_messaging(dbv.pszVal, FACEBOOK_RECV_MESSAGE)); - db_free(&dbv); - } - + ForkThread(&FacebookProto::ReadMessageWorker, this, hContact); CallService(MS_PROTO_CONTACTISTYPING, (WPARAM)hContact, (LPARAM)PROTOTYPE_CONTACTTYPING_OFF); return Proto_RecvMessage(hContact, pre); @@ -66,7 +59,6 @@ void FacebookProto::SendMsgWorker(void *p) if (result) { ProtoBroadcastAck(m_szModuleName,data->hContact,ACKTYPE_MESSAGE,ACKRESULT_SUCCESS, data->msgid,0); CallService(MS_MSG_SETSTATUSTEXT, (WPARAM)data->hContact, NULL); - MessagingWorker(new send_messaging(dbv.pszVal, FACEBOOK_SEND_MESSAGE)); } else { char *err = mir_utf8decodeA(error_text.c_str()); ProtoBroadcastAck(m_szModuleName,data->hContact,ACKTYPE_MESSAGE,ACKRESULT_FAILED, data->msgid,(LPARAM)err); @@ -171,17 +163,38 @@ void FacebookProto::SendTypingWorker(void *p) delete typing; } -void FacebookProto::MessagingWorker(void *p) +void FacebookProto::ReadMessageWorker(void *p) { if (p == NULL) return; - send_messaging *data = static_cast(p); + return; - if (data->type == FACEBOOK_RECV_MESSAGE) - facy.chat_mark_read(data->user_id); + HANDLE hContact = static_cast(p); - delete data; + if (!db_get_b(NULL, m_szModuleName, FACEBOOK_KEY_MARK_READ, 0)) { + // old variant - no seen info updated + mir_ptr id = db_get_sa(hContact, m_szModuleName, FACEBOOK_KEY_ID); + if (id == NULL) return; + + std::string data = "action=chatMarkRead"; + data += "&other_user=" + std::string(id); + data += "&fb_dtsg=" + (facy.dtsg_.length() ? facy.dtsg_ : "0"); + data += "&lsd=&__user=" + facy.self_.user_id; + + http::response resp = facy.flap(FACEBOOK_REQUEST_ASYNC, &data); + } else { + // new variant - with seen info + mir_ptr mid = db_get_sa(hContact, m_szModuleName, FACEBOOK_KEY_MESSAGE_ID); + if (mid == NULL) return; + + std::string data = "ids[" + std::string(mid) + "]=true"; + data += "&fb_dtsg=" + (facy.dtsg_.length() ? facy.dtsg_ : "0"); + data += "&__user=" + facy.self_.user_id; + data += "&__a=1&__dyn=&__req=j&phstamp=0"; + + http::response resp = facy.flap(FACEBOOK_REQUEST_MARK_READ, &data); + } } void FacebookProto::parseSmileys(std::string message, HANDLE hContact) diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index da46e3c8f0..321d4a66d2 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -124,8 +124,8 @@ void FacebookProto::ProcessBuddyList(void* data) 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); + TCHAR* szTitle = mir_utf8decodeT(fbu->real_name.c_str()); + TCHAR* szUrl = mir_utf8decodeT(url.c_str()); 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 @@ -215,8 +215,8 @@ void FacebookProto::ProcessFriendList(void* data) 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); + TCHAR* szTitle = mir_utf8decodeT(fbu->real_name.c_str()); + TCHAR* szUrl = mir_utf8decodeT(url.c_str()); 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 @@ -246,8 +246,8 @@ void FacebookProto::ProcessFriendList(void* data) std::string url = FACEBOOK_URL_PROFILE + id; - TCHAR* szTitle = mir_a2t_cp(contactname.c_str(), CP_UTF8); - TCHAR* szUrl = mir_a2t_cp(url.c_str(), CP_UTF8); + TCHAR* szTitle = mir_utf8decodeT(contactname.c_str()); + TCHAR* szUrl = mir_utf8decodeT(url.c_str()); 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 @@ -477,6 +477,7 @@ void FacebookProto::ProcessMessages(void* data) fbu.user_id = messages[i]->user_id; HANDLE hContact = AddToContactList(&fbu, FACEBOOK_CONTACT_NONE, false, messages[i]->sender_name.c_str()); + db_set_s(hContact, m_szModuleName, FACEBOOK_KEY_MESSAGE_ID, messages[i]->message_id.c_str()); // TODO: if contact is newly added, get his user info // TODO: maybe create new "receiveMsg" function and use it for offline and channel messages? @@ -496,9 +497,9 @@ void FacebookProto::ProcessMessages(void* data) for(std::vector::size_type i=0; itext.c_str()); - TCHAR* szTitle = mir_a2t_cp(this->m_szModuleName, CP_UTF8); - TCHAR* szText = mir_a2t_cp(notifications[i]->text.c_str(), CP_UTF8); - TCHAR* szUrl = mir_a2t_cp(notifications[i]->link.c_str(), CP_UTF8); + TCHAR* szTitle = mir_utf8decodeT(this->m_szModuleName); + TCHAR* szText = mir_utf8decodeT(notifications[i]->text.c_str()); + TCHAR* szUrl = mir_utf8decodeT(notifications[i]->link.c_str()); NotifyEvent(szTitle, szText, ContactIDToHContact(notifications[i]->user_id), FACEBOOK_EVENT_NOTIFICATION, szUrl); mir_free(szTitle); mir_free(szText); @@ -556,9 +557,9 @@ void FacebookProto::ProcessNotifications(void*) for(std::vector::size_type i=0; itext.c_str()); - TCHAR* szTitle = mir_a2t_cp(this->m_szModuleName, CP_UTF8); - TCHAR* szText = mir_a2t_cp(notifications[i]->text.c_str(), CP_UTF8); - TCHAR* szUrl = mir_a2t_cp(notifications[i]->link.c_str(), CP_UTF8); + TCHAR* szTitle = mir_utf8decodeT(this->m_szModuleName); + TCHAR* szText = mir_utf8decodeT(notifications[i]->text.c_str()); + TCHAR* szUrl = mir_utf8decodeT(notifications[i]->link.c_str()); NotifyEvent(szTitle, szText, ContactIDToHContact(notifications[i]->user_id), FACEBOOK_EVENT_NOTIFICATION, szUrl); mir_free(szTitle); mir_free(szText); @@ -752,9 +753,9 @@ void FacebookProto::ProcessFeeds(void* data) for(std::vector::size_type i=0; ititle.c_str(), news[i]->text.c_str()); - TCHAR* szTitle = mir_a2t_cp(news[i]->title.c_str(), CP_UTF8); - TCHAR* szText = mir_a2t_cp(news[i]->text.c_str(), CP_UTF8); - TCHAR* szUrl = mir_a2t_cp(news[i]->link.c_str(), CP_UTF8); + TCHAR* szTitle = mir_utf8decodeT(news[i]->title.c_str()); + TCHAR* szText = mir_utf8decodeT(news[i]->text.c_str()); + TCHAR* szUrl = mir_utf8decodeT(news[i]->link.c_str()); NotifyEvent(szTitle,szText,this->ContactIDToHContact(news[i]->user_id),FACEBOOK_EVENT_NEWSFEED, szUrl); mir_free(szTitle); mir_free(szText); @@ -832,11 +833,11 @@ void FacebookProto::SearchAckThread(void *targ) if (id.empty() || id == facy.self_.user_id) continue; - TCHAR* tid = mir_a2t_cp(id.c_str(), CP_UTF8); - TCHAR* tname = mir_a2t_cp(name.c_str(), CP_UTF8); - TCHAR* tsurname = mir_a2t_cp(surname.c_str(), CP_UTF8); - TCHAR* tnick = mir_a2t_cp(nick.c_str(), CP_UTF8); - TCHAR* tcommon = mir_a2t_cp(common.c_str(), CP_UTF8); + TCHAR* tid = mir_utf8decodeT(id.c_str()); + TCHAR* tname = mir_utf8decodeT(name.c_str()); + TCHAR* tsurname = mir_utf8decodeT(surname.c_str()); + TCHAR* tnick = mir_utf8decodeT(nick.c_str()); + TCHAR* tcommon = mir_utf8decodeT(common.c_str()); PROTOSEARCHRESULT isr = {0}; isr.cbSize = sizeof(isr); diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp index 61d07d41b2..59c4261bc9 100644 --- a/protocols/FacebookRM/src/proto.cpp +++ b/protocols/FacebookRM/src/proto.cpp @@ -491,6 +491,21 @@ int FacebookProto::VisitFriendship(WPARAM wParam,LPARAM lParam) return 0; } +int FacebookProto::Poke(WPARAM wParam,LPARAM lParam) +{ + if (wParam == NULL || isOffline()) + return 1; + + HANDLE hContact = reinterpret_cast(wParam); + + mir_ptr id = db_get_sa(hContact, m_szModuleName, FACEBOOK_KEY_ID); + if (id == NULL) + return 1; + + ForkThread(&FacebookProto::SendPokeWorker, this, new std::string(id)); + return 0; +} + int FacebookProto::CancelFriendship(WPARAM wParam,LPARAM lParam) { if (wParam == NULL || isOffline()) diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h index 3383be21a7..c0cf2fc56b 100644 --- a/protocols/FacebookRM/src/proto.h +++ b/protocols/FacebookRM/src/proto.h @@ -107,6 +107,7 @@ public: int __cdecl GetAvatarCaps(WPARAM, LPARAM); int __cdecl VisitProfile(WPARAM, LPARAM); int __cdecl VisitFriendship(WPARAM, LPARAM); + int __cdecl Poke(WPARAM, LPARAM); int __cdecl CancelFriendship(WPARAM, LPARAM); int __cdecl RequestFriendship(WPARAM, LPARAM); int __cdecl ApproveFriendship(WPARAM, LPARAM); @@ -154,11 +155,12 @@ public: void __cdecl SendMsgWorker(void*); void __cdecl SendChatMsgWorker(void*); void __cdecl SendTypingWorker(void*); - void __cdecl MessagingWorker(void*); + void __cdecl ReadMessageWorker(void*); void __cdecl DeleteContactFromServer(void*); void __cdecl AddContactToServer(void*); void __cdecl ApproveContactToServer(void*); void __cdecl CancelFriendsRequest(void*); + void __cdecl SendPokeWorker(void*); // Contacts handling bool IsMyContact(HANDLE, bool include_chat = false); diff --git a/protocols/FacebookRM/src/resource.h b/protocols/FacebookRM/src/resource.h index 5e1fa69790..a888e45a8d 100644 --- a/protocols/FacebookRM/src/resource.h +++ b/protocols/FacebookRM/src/resource.h @@ -1,6 +1,6 @@ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. -// Used by Z:\Myranda\trunk\protocols\FacebookRM\res\facebook.rc +// Used by D:\Development\Miranda NG\protocols\FacebookRM\res\facebook.rc // #define IDI_FACEBOOK 101 #define IDI_MIND 102 @@ -12,6 +12,8 @@ #define IDD_OPTIONS 113 #define IDD_OPTIONS_EVENTS 114 #define IDD_OPTIONS_ADVANCED 115 +#define IDI_POKE 127 +#define IDI_NOTIFICATION 128 #define IDC_UN 1001 #define IDC_PW 1002 #define IDC_NEWACCOUNTLINK 1003 @@ -60,7 +62,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 126 +#define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1202 #define _APS_NEXT_SYMED_VALUE 131 diff --git a/protocols/FacebookRM/src/theme.cpp b/protocols/FacebookRM/src/theme.cpp index 31eb90cb70..e514da51b2 100644 --- a/protocols/FacebookRM/src/theme.cpp +++ b/protocols/FacebookRM/src/theme.cpp @@ -26,16 +26,18 @@ extern OBJLIST g_Instances; static IconItem icons[] = { - { LPGEN("Facebook Icon"), "facebook", IDI_FACEBOOK }, + { LPGEN("Facebook icon"), "facebook", IDI_FACEBOOK }, { LPGEN("Mind"), "mind", IDI_MIND }, + { LPGEN("Poke"), "poke", IDI_POKE }, + { LPGEN("Notification"), "notification", IDI_NOTIFICATION }, { LPGEN("Cancel friendship"), "authRevoke", IDI_AUTH_REVOKE }, { LPGEN("Cancel friendship request"), "authRevokeReq", IDI_AUTH_REVOKE }, { LPGEN("Request friendship"), "authAsk", IDI_AUTH_ASK }, { LPGEN("Approve friendship"), "authGrant", IDI_AUTH_GRANT }, - { LPGEN("Visit Profile"), "homepage", 0 }, - { LPGEN("Friendship Details"), "friendship", 0 }, + { LPGEN("Visit profile"), "homepage", 0 }, + { LPGEN("Visit friendship details"), "friendship", 0 }, }; // TODO: uninit @@ -117,27 +119,34 @@ void InitContactMenus() g_hContactMenuItems[CMI_VISIT_FRIENDSHIP] = Menu_AddContactMenuItem(&mi); mi.position=-2000006002; + mi.icolibItem = GetIconHandle("poke"); + mi.pszName = GetIconDescription("poke"); + mi.pszService = "FacebookProto/Poke"; + CreateServiceFunction(mi.pszService,GlobalService<&FacebookProto::Poke>); + g_hContactMenuItems[CMI_POKE] = Menu_AddContactMenuItem(&mi); + + mi.position=-2000006010; mi.icolibItem = GetIconHandle("authRevoke"); mi.pszName = GetIconDescription("authRevoke"); mi.pszService = "FacebookProto/CancelFriendship"; CreateServiceFunction(mi.pszService,GlobalService<&FacebookProto::CancelFriendship>); g_hContactMenuItems[CMI_AUTH_REVOKE] = Menu_AddContactMenuItem(&mi); - mi.position=-2000006003; + mi.position=-2000006011; mi.icolibItem = GetIconHandle("authRevokeReq"); mi.pszName = GetIconDescription("authRevokeReq"); mi.pszService = "FacebookProto/CancelFriendshipRequest"; CreateServiceFunction(mi.pszService,GlobalService<&FacebookProto::OnCancelFriendshipRequest>); g_hContactMenuItems[CMI_AUTH_CANCEL] = Menu_AddContactMenuItem(&mi); - mi.position=-2000006004; + mi.position=-2000006012; mi.icolibItem = GetIconHandle("authAsk"); mi.pszName = GetIconDescription("authAsk"); mi.pszService = "FacebookProto/RequestFriendship"; CreateServiceFunction(mi.pszService,GlobalService<&FacebookProto::RequestFriendship>); g_hContactMenuItems[CMI_AUTH_ASK] = Menu_AddContactMenuItem(&mi); - mi.position=-2000006005; + mi.position=-2000006013; mi.icolibItem = GetIconHandle("authGrant"); mi.pszName = GetIconDescription("authGrant"); mi.pszService = "FacebookProto/ApproveFriendship"; @@ -168,6 +177,8 @@ int FacebookProto::OnPrebuildContactMenu(WPARAM wParam,LPARAM lParam) Menu_ShowItem(g_hContactMenuItems[CMI_AUTH_GRANT], ctrlPressed || type == FACEBOOK_CONTACT_APPROVE); Menu_ShowItem(g_hContactMenuItems[CMI_AUTH_REVOKE], ctrlPressed || type == FACEBOOK_CONTACT_FRIEND); Menu_ShowItem(g_hContactMenuItems[CMI_AUTH_CANCEL], ctrlPressed || type == FACEBOOK_CONTACT_REQUEST); + + Menu_ShowItem(g_hContactMenuItems[CMI_POKE], true); } return 0; diff --git a/protocols/FacebookRM/src/theme.h b/protocols/FacebookRM/src/theme.h index f472b4f9ce..12984682f4 100644 --- a/protocols/FacebookRM/src/theme.h +++ b/protocols/FacebookRM/src/theme.h @@ -35,5 +35,6 @@ void UninitContactMenus(void); #define CMI_AUTH_ASK 3 #define CMI_AUTH_GRANT 4 #define CMI_AUTH_CANCEL 5 +#define CMI_POKE 6 -#define CMITEMS_COUNT 6 \ No newline at end of file +#define CMITEMS_COUNT 7 \ No newline at end of file -- cgit v1.2.3