bool facebook_client::logout() { if (parent->getByte(FACEBOOK_KEY_DISABLE_LOGOUT, 0)) return true; handle_entry("logout"); std::string data = "fb_dtsg=" + (!this->dtsg_.empty() ? this->dtsg_ : "0"); data += "&ref=mb&h=" + this->logout_hash_; http::response resp = flap(REQUEST_LOGOUT, &data); if (hFcbCon) Netlib_CloseHandle(hFcbCon); hFcbCon = NULL; // Process result username_ = password_ = self_.user_id = ""; switch (resp.code) { case HTTP_CODE_OK: case HTTP_CODE_FOUND: return handle_success("logout"); default: return false; // Logout not finished properly, but..okay, who cares :P } }
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="; data += message_recipient; data += "&window_id=0"; data += "&post_form_id="; data += ( post_form_id_.length( ) ) ? post_form_id_ : "0"; data += "&post_form_id_source=AsyncRequest"; data += "&fb_dtsg="; data += ( this->dtsg_.length( ) ) ? this->dtsg_ : "0"; data += "&__user="; data += self_.user_id; http::response resp = flap( FACEBOOK_REQUEST_TABS, &data ); }
bool Omegle_client::stop( ) { if ( parent->isOffline()) return true; handle_entry( "stop" ); std::string data = "id=" + this->chat_id_; http::response resp = flap( OMEGLE_REQUEST_STOP, &data ); if (hConnection) Netlib_CloseHandle(hConnection); hConnection = NULL; if (hEventsConnection) Netlib_CloseHandle(hEventsConnection); hEventsConnection = NULL; if (resp.data == "win") { return handle_success( "stop" ); } else { return handle_error( "stop" ); } /* switch ( resp.code ) { case HTTP_CODE_OK: case HTTP_CODE_FOUND: default: }*/ }
bool facebook_client::feeds( ) { handle_entry( "feeds" ); // Get feeds http::response resp = flap( FACEBOOK_REQUEST_FEEDS ); // Process result data validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: if (resp.data.find("\"num_stories\":0") == std::string::npos) { std::string* response_data = new std::string( resp.data ); ForkThread( &FacebookProto::ProcessFeeds, this->parent, ( void* )response_data ); } return handle_success( "feeds" ); case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "feeds" ); } }
bool facebook_client::set_status(const std::string &status_text) { handle_entry( "set_status" ); std::string data = "post_form_id_source=AsyncRequest&post_form_id="; data += ( this->post_form_id_.length( ) ) ? this->post_form_id_ : "0"; data += "&fb_dtsg="; data += ( this->dtsg_.length( ) ) ? this->dtsg_ : "0"; data += "&target_id="; data += this->self_.user_id; if ( status_text.length( ) ) { data += "&action=PROFILE_UPDATE&app_id=&hey_kid_im_a_composer=true&display_context=profile&_log_display_context=profile&ajax_log=1&status="; data += utils::url::encode( status_text ); data += "&profile_id="; data += this->self_.user_id; } http::response resp = flap( FACEBOOK_REQUEST_STATUS_SET, &data ); validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: return handle_success( "set_status" ); case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "set_status" ); } }
void model::update_model( double time, double dt ) { cg::geo_base_3 cur_pos = pos(); if (phys_ && phys_flock_) // callback to phys pos { const cg::geo_base_3& base = phys_->get_base(*phys_zone_); decart_position phys_pos = phys_flock_->get_position(); geo_position glb_phys_pos(phys_pos, base); auto const& settings = _spawner->settings(); double dist = cg::distance(glb_phys_pos.pos, desired_position_/*cur_pos*/); //Soar Timeout - Limits how long a bird can soar if(_soar && settings._soarMaxTime > 0){ if(_soarTimer >settings._soarMaxTime){ flap(); _soarTimer = 0; }else { _soarTimer+=dt; } } if(!_landingSpotted && dist < settings._waypointDistance +_stuckCounter){ wander(0); //create a new waypoint _stuckCounter=0; }else{ _stuckCounter += dt; } } }
bool facebook_client::logout( ) { if ( DBGetContactSettingByte(NULL, parent->m_szModuleName, FACEBOOK_KEY_DISABLE_LOGOUT, 0) ) return true; handle_entry( "logout" ); std::string data = "post_form_id="; data += ( this->post_form_id_.length( ) ) ? this->post_form_id_ : "0"; data += "&fb_dtsg="; data += ( this->dtsg_.length( ) ) ? this->dtsg_ : "0"; data += "&ref=mb&h="; data += this->logout_hash_; http::response resp = flap( FACEBOOK_REQUEST_LOGOUT, &data ); if (hFcbCon) Netlib_CloseHandle(hFcbCon); hFcbCon = NULL; // Process result username_ = password_ = self_.user_id = ""; switch ( resp.code ) { case HTTP_CODE_OK: case HTTP_CODE_FOUND: return handle_success( "logout" ); default: return false; // Logout not finished properly, but..okay, who cares :P } }
bool facebook_client::reconnect() { handle_entry("reconnect"); // Request reconnect http::response resp = flap(REQUEST_RECONNECT); switch (resp.code) { case HTTP_CODE_OK: { this->chat_channel_ = utils::text::source_get_value(&resp.data, 2, "\"user_channel\":\"", "\""); parent->debugLogA(" Got self channel: %s", this->chat_channel_.c_str()); this->chat_channel_partition_ = utils::text::source_get_value2(&resp.data, "\"partition\":", ",}"); parent->debugLogA(" Got self channel partition: %s", this->chat_channel_partition_.c_str()); this->chat_channel_host_ = utils::text::source_get_value(&resp.data, 2, "\"host\":\"", "\""); parent->debugLogA(" Got self channel host: %s", this->chat_channel_host_.c_str()); 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()); this->chat_conn_num_ = utils::text::source_get_value2(&resp.data, "\"max_conn\":", ",}"); parent->debugLogA(" Got self max_conn: %s", this->chat_conn_num_.c_str()); return handle_success("reconnect"); } default: return handle_error("reconnect", FORCE_DISCONNECT); } }
void __cdecl CAimProto::aim_avatar_negotiation(void*) { HANDLE hServerPacketRecver = (HANDLE)CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)m_hAvatarConn, 2048 * 8); NETLIBPACKETRECVER packetRecv = { 0 }; packetRecv.cbSize = sizeof(packetRecv); packetRecv.dwTimeout = 300000;//5 minutes connected for (;;) { int recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)hServerPacketRecver, (LPARAM)& packetRecv); if (recvResult == 0) break; if (recvResult == SOCKET_ERROR) break; if (recvResult > 0) { unsigned short flap_length = 0; for (; packetRecv.bytesUsed < packetRecv.bytesAvailable; packetRecv.bytesUsed = flap_length) { if (!packetRecv.buffer) break; FLAP flap((char*)&packetRecv.buffer[packetRecv.bytesUsed], packetRecv.bytesAvailable - packetRecv.bytesUsed); if (!flap.len()) break; flap_length += FLAP_SIZE + flap.len(); if (flap.cmp(0x01)) { aim_send_cookie(m_hAvatarConn, m_avatar_seqno, AVATAR_COOKIE_LENGTH, AVATAR_COOKIE); // cookie challenge mir_free(AVATAR_COOKIE); AVATAR_COOKIE = NULL; AVATAR_COOKIE_LENGTH = 0; } else if (flap.cmp(0x02)) { SNAC snac(flap.val(), flap.snaclen()); if (snac.cmp(0x0001)) { snac_supported_families(snac, m_hAvatarConn, m_avatar_seqno); snac_supported_family_versions(snac, m_hAvatarConn, m_avatar_seqno); snac_avatar_rate_limitations(snac, m_hAvatarConn, m_avatar_seqno); snac_error(snac); } if (snac.cmp(0x0010)) { snac_retrieve_avatar(snac); snac_upload_reply_avatar(snac); } } else if (flap.cmp(0x04)) goto exit; } } } exit: Netlib_CloseHandle(hServerPacketRecver); Netlib_CloseHandle(m_hAvatarConn); m_hAvatarConn = NULL; ResetEvent(m_hAvatarEvent); debugLogA("Avatar Server Connection has ended"); }
void ICQClient::snac(unsigned short fam, unsigned short type, bool msgId) { flap(ICQ_CHNxDATA); writeBuffer << fam; writeBuffer << type; writeBuffer << 0x0000; writeBuffer << (msgId ? m_nMsgSequence++ : 0x0000); writeBuffer << type; }
void OscarConnection::processCloseConnection() { TLVMap tlvs = flap().read<TLVMap>(); if (tlvs.contains(0x0009)) { setError(AnotherClientLogined); } else if (tlvs.contains(0x0008)) { DataUnit data(tlvs.value(0x0008)); setError(static_cast<ConnectionError>(data.read<quint16>())); } //AbstractConnection::processCloseConnection(); }
void ICQClient::close() { if (listener){ listener->remove(); listener = NULL; } if (m_fd != -1){ if (m_state == Logged){ flap(ICQ_CHNxCLOSE); sendPacket(); } } ClientSocket::close(); }
bool facebook_client::chat_state(bool online) { handle_entry("chat_state"); std::string data = (online ? "visibility=1" : "visibility=0"); data += "&window_id=0"; data += "&fb_dtsg=" + (!dtsg_.empty() ? dtsg_ : "0"); data += "&phstamp=0&__user="******"chat_state"); return handle_success("chat_state"); }
void facebook_client::chat_mark_read( std::string message_recipient ) { // TODO RM: optimalization? std::string data = "action=chatMarkRead&other_user="******"&post_form_id="; data += ( post_form_id_.length( ) ) ? post_form_id_ : "0"; data += "&fb_dtsg="; data += ( this->dtsg_.length( ) ) ? this->dtsg_ : "0"; data += "&post_form_id_source=AsyncRequest&lsd=&__user="; data += self_.user_id; http::response resp = flap( FACEBOOK_REQUEST_ASYNC, &data ); }
bool facebook_client::chat_state( bool online ) { handle_entry( "chat_state" ); std::string data = "visibility="; data += ( online ) ? "1" : "0"; data += "&window_id=0"; data += "&post_form_id="; data += ( post_form_id_.length( ) ) ? post_form_id_ : "0"; data += "&post_form_id_source=AsyncRequest"; data += "&fb_dtsg=" + this->dtsg_; data += "&lsd=&phstamp=0&__user="******"chat_state" ); }
void ICQClient::idle() { time_t now; time(&now); if (m_state == Logged){ processInfoRequestQueue(); processPhoneRequestQueue(0); processResponseRequestQueue(0); if (now <= m_lastTime + PING_TIMEOUT) return; flap(ICQ_CHNxPING); sendPacket(); return; } if (m_state == Reconnect){ if (now <= m_reconnectTime) return; setStatus(m_nLogonStatus); } }
std::string Omegle_client::get_page( const int request_type ) { handle_entry( "get_page" ); http::response resp = flap( OMEGLE_REQUEST_COUNT ); switch ( resp.code ) { case HTTP_CODE_OK: handle_success( "get_page" ); break; case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: handle_error( "get_page" ); } return resp.data; }
std::string Omegle_client::get_page(const int request_type) { HANDLE_ENTRY; http::response resp = flap(request_type); switch (resp.code) { case HTTP_CODE_OK: HANDLE_SUCCESS; break; case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: HANDLE_ERROR(false); } return resp.data; }
bool facebook_client::buddy_list( ) { handle_entry( "buddy_list" ); // Prepare update data std::string data = "user="******"&fetch_mobile=true&post_form_id=" + this->post_form_id_ + "&fb_dtsg=" + this->dtsg_ + "&lsd=&post_form_id_source=AsyncRequest&__user="******"&available_user_info_ids["; data += utils::conversion::to_string(&counter, UTILS_CONV_UNSIGNED_NUMBER); data += "]="; data += i->data->user_id; } } // Get buddy list http::response resp = flap( FACEBOOK_REQUEST_BUDDY_LIST, &data ); // Process result data validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: { std::string* response_data = new std::string( resp.data ); ForkThread( &FacebookProto::ProcessBuddyList, this->parent, ( void* )response_data ); return handle_success( "buddy_list" ); } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "buddy_list" ); } }
void model::wander(float delay) { auto const& settings = _spawner->settings(); // yield(WaitForSeconds(delay)); _damping = rnd_.random_range(settings._minDamping, settings._maxDamping); _targetSpeed = rnd_.random_range(settings._minSpeed, settings._maxSpeed); _lerpCounter = 0; double r = rnd_.random_range(0.0, 1.0); if(/*!settings._soarAnimation.empty() &&*/!_flatFlyDown && !_dived && r < settings._soarFrequency){ soar(); }else if(!_flatFlyDown && !_dived && rnd_.random_range(0.0, 1.0) < settings._diveFrequency){ dive(); }else{ if(!_landing){ flap(); } } }
void OscarConnection::processNewConnection() { AbstractConnection::processNewConnection(); const ClientInfo &info = clientInfo(); FLAP flap(0x01); flap.append<quint32>(0x01); flap.appendTLV<QByteArray>(0x0006, m_auth_cookie); flap.appendTLV<QByteArray>(0x0003, info.id_string); flap.appendTLV<quint16>(0x0017, info.major_version); flap.appendTLV<quint16>(0x0018, info.minor_version); flap.appendTLV<quint16>(0x0019, info.lesser_version); flap.appendTLV<quint16>(0x001a, info.build_number); flap.appendTLV<quint16>(0x0016, info.id_number); flap.appendTLV<quint32>(0x0014, info.distribution_number); flap.appendTLV<QByteArray>(0x000f, info.language); flap.appendTLV<QByteArray>(0x000e, info.country); // Unknown shit flap.appendTLV<quint8>(0x0094, 0x00); flap.appendTLV<quint32>(0x8003, 0x00100000); send(flap); }
bool Omegle_client::typing_stop() { handle_entry( "typing_stop" ); std::string data = "id=" + this->chat_id_; http::response resp = flap( OMEGLE_REQUEST_TYPING_STOP, &data ); switch ( resp.code ) { case HTTP_CODE_OK: if (resp.data == "win") { return handle_success( "typing_stop" ); } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "typing_stop" ); } }
bool Omegle_client::typing_stop() { HANDLE_ENTRY; std::string data = "id=" + this->chat_id_; http::response resp = flap(OMEGLE_REQUEST_TYPING_STOP, &data); switch (resp.code) { case HTTP_CODE_OK: if (resp.data == "win") { return HANDLE_SUCCESS; } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return HANDLE_ERROR(false); } }
bool facebook_client::reconnect( ) { handle_entry( "reconnect" ); // Request reconnect http::response resp = flap( FACEBOOK_REQUEST_RECONNECT ); // Process result data validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: { this->chat_channel_jslogger_ = utils::text::source_get_value( &resp.data, 2, "\"jslogger_suffix\":\"", "\"" ); parent->Log(" Got self channel jslogger: %s", this->chat_channel_jslogger_.c_str()); this->chat_channel_partition_ = utils::text::source_get_value2( &resp.data, "\"partition\":", ",}" ); parent->Log(" Got self channel partition: %s", this->chat_channel_partition_.c_str()); this->chat_channel_host_ = utils::text::source_get_value( &resp.data, 2, "\"host\":\"", "\"" ); parent->Log(" Got self channel host: %s", this->chat_channel_host_.c_str()); this->chat_sequence_num_ = utils::text::source_get_value2( &resp.data, "\"seq\":", ",}" ); parent->Log(" Got self sequence number: %s", this->chat_sequence_num_.c_str()); if (this->chat_channel_jslogger_.empty()) { if (!atoi(this->chat_channel_host_.substr(0, this->chat_channel_host_.find(".")).c_str())) { this->chat_channel_jslogger_ = "SOMETHING"; parent->Log(" Got no jslogger, changed."); } } return handle_success( "reconnect" ); } default: return handle_error( "reconnect", FORCE_DISCONNECT ); } }
bool Omegle_client::send_message(const std::string &message_text) { HANDLE_ENTRY; std::string data = "msg=" + utils::url::encode(message_text); data += "&id=" + this->chat_id_; http::response resp = flap(OMEGLE_REQUEST_SEND, &data); switch (resp.code) { case HTTP_CODE_OK: if (resp.data == "win") { return HANDLE_SUCCESS; } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return HANDLE_ERROR(false); } }
bool Omegle_client::send_message( std::string message_text ) { handle_entry( "send_message" ); std::string data = "msg=" + utils::url::encode( message_text ); data += "&id=" + this->chat_id_; http::response resp = flap( OMEGLE_REQUEST_SEND, &data ); switch ( resp.code ) { case HTTP_CODE_OK: if (resp.data == "win") { return handle_success( "send_message" ); } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "send_message" ); } }
bool Omegle_client::recaptcha() { // TODO: Implement! handle_entry( "recaptcha" ); // data:{id:this.clientID,challenge:b,response:a}} //std::string data = "?id=...&challenge= ..., &response= ..."; http::response resp = flap( OMEGLE_REQUEST_RECAPTCHA ); switch ( resp.code ) { case HTTP_CODE_OK: /* if (resp.data == "win") { return handle_success( "typing_start" ); }*/ case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "typing_start" ); } }
bool facebook_client::load_friends( ) { handle_entry( "load_friends" ); // Get buddy list http::response resp = flap( FACEBOOK_REQUEST_LOAD_FRIENDS ); // Process result data validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: { std::string* response_data = new std::string( resp.data ); ForkThread( &FacebookProto::ProcessFriendList, this->parent, ( void* )response_data ); return handle_success( "load_friends" ); } case HTTP_CODE_FAKE_ERROR: case HTTP_CODE_FAKE_DISCONNECTED: default: return handle_error( "load_friends" ); } }
void ICQClient::chn_login() { if (m_cookie.size()){ flap(ICQ_CHNxNEW); m_socket->writeBuffer << 0x00000001L; m_socket->writeBuffer.tlv(6, m_cookie.data(), (unsigned short)(m_cookie.size())); m_cookie.init(0); sendPacket(); return; } if (data.owner.Uin.value){ string pswd = cryptPassword(); log(L_DEBUG, "Login %lu [%s]", data.owner.Uin, pswd.c_str()); char uin[20]; sprintf(uin, "%lu", data.owner.Uin.value); flap(ICQ_CHNxNEW); m_socket->writeBuffer << 0x00000001L; m_socket->writeBuffer.tlv(0x0001, uin); m_socket->writeBuffer.tlv(0x0002, pswd.c_str(), pswd.length()); m_socket->writeBuffer.tlv(0x0003, "3ICQ Inc. - Product of ICQ (TM).2003b.5.56.1.3916.85"); m_socket->writeBuffer.tlv(0x0016, 0x010A); m_socket->writeBuffer.tlv(0x0017, 0x0002); m_socket->writeBuffer.tlv(0x0018, 0x0038); m_socket->writeBuffer.tlv(0x0019, 0x0001); m_socket->writeBuffer.tlv(0x001A, 0x0F4C); m_socket->writeBuffer.tlv(0x0014, 0x00000055L); m_socket->writeBuffer.tlv(0x000f, "en"); m_socket->writeBuffer.tlv(0x000e, "us"); sendPacket(); return; } if (data.owner.Screen.ptr && *data.owner.Screen.ptr){ flap(ICQ_CHNxNEW); m_socket->writeBuffer << 0x00000001L; sendPacket(); snac(ICQ_SNACxFAM_LOGIN, ICQ_SNACxLOGIN_AUTHxREQUEST, false, false); m_socket->writeBuffer.tlv(0x0001, data.owner.Screen.ptr); m_socket->writeBuffer.tlv(0x004B); m_socket->writeBuffer.tlv(0x005A); sendPacket(); return; } flap(ICQ_CHNxNEW); m_socket->writeBuffer << 0x00000001L; sendPacket(); snac(ICQ_SNACxFAM_LOGIN, ICQ_SNACxLOGIN_REGISTERxREQ); Buffer msg; msg << 0x00000000L << 0x28000300L << 0x00000000L << 0x00000000L << 0x94680000L << 0x94680000L << 0x00000000L << 0x00000000L << 0x00000000L << 0x00000000L; string pswd = getContacts()->fromUnicode(NULL, getPassword()); unsigned short len = (unsigned short)(pswd.length() + 1); msg.pack(len); msg.pack(pswd.c_str(), len); msg << 0x94680000L << 0x00000602L; m_socket->writeBuffer.tlv(0x0001, msg); sendPacket(); }
bool facebook_client::home( ) { handle_entry( "home" ); http::response resp = flap( FACEBOOK_REQUEST_HOME ); // Process result data validate_response(&resp); switch ( resp.code ) { case HTTP_CODE_OK: { if ( resp.data.find( "id=\"navAccountName\"" ) != std::string::npos ) { // Backup for old fb version // Get real_name this->self_.real_name = utils::text::remove_html( utils::text::special_expressions_decode( utils::text::source_get_value( &resp.data, 2, " id=\"navAccountName\">", "</a" ) ) ); DBWriteContactSettingUTF8String(NULL,parent->m_szModuleName,FACEBOOK_KEY_NAME,this->self_.real_name.c_str()); DBWriteContactSettingUTF8String(NULL,parent->m_szModuleName,FACEBOOK_KEY_NICK,this->self_.real_name.c_str()); parent->Log(" Got self real name: %s", this->self_.real_name.c_str()); } else if ( resp.data.find("id=\"pageNav\"") != std::string::npos ) { // Get real_name this->self_.real_name = utils::text::remove_html( utils::text::special_expressions_decode( utils::text::source_get_value( &resp.data, 3, " class=\"headerTinymanName\"", ">", "</a" ) ) ); DBWriteContactSettingUTF8String(NULL,parent->m_szModuleName,FACEBOOK_KEY_NAME,this->self_.real_name.c_str()); DBWriteContactSettingUTF8String(NULL,parent->m_szModuleName,FACEBOOK_KEY_NICK,this->self_.real_name.c_str()); parent->Log(" Got self real name: %s", this->self_.real_name.c_str()); } else { client_notify(TranslateT("Something happened to Facebook. Maybe there was some major update so you should wait for an update.")); return handle_error( "home", FORCE_DISCONNECT ); } // Get avatar std::string avatar = utils::text::source_get_value( &resp.data, 3, "class=\\\"fbxWelcomeBoxImg", "src=\\\"", "\\\"" ); if (avatar.empty()) avatar = utils::text::source_get_value( &resp.data, 3, "class=\"fbxWelcomeBoxImg", "src=\"", "\"" ); this->self_.image_url = utils::text::trim( utils::text::special_expressions_decode( avatar ) ); parent->Log(" Got self avatar: %s", this->self_.image_url.c_str()); parent->CheckAvatarChange(NULL, this->self_.image_url); // Get post_form_id this->post_form_id_ = utils::text::source_get_value( &resp.data, 3, "name=\"post_form_id\"", "value=\"", "\"" ); parent->Log(" Got self post form id: %s", this->post_form_id_.c_str()); // Get dtsg this->dtsg_ = utils::text::source_get_value( &resp.data, 3, "name=\"fb_dtsg\"", "value=\"", "\"" ); parent->Log(" Got self dtsg: %s", this->dtsg_.c_str()); // Get logout hash this->logout_hash_ = utils::text::source_get_value( &resp.data, 2, "<input type=\"hidden\" autocomplete=\"off\" name=\"h\" value=\"", "\"" ); parent->Log(" Got self logout hash: %s", this->logout_hash_.c_str()); // TODO: DIrectly get that friend requests // Get friend requests count and notify it std::string str_count = utils::text::source_get_value( &resp.data, 2, "<span id=\"requestsCountValue\">", "</span>" ); if ( str_count.length() && str_count != std::string( "0" ) ) { std::string message = Translate("Got new friend requests: ") + str_count; TCHAR* tmessage = mir_a2t(message.c_str()); parent->NotifyEvent( parent->m_tszUserName, tmessage, NULL, FACEBOOK_EVENT_OTHER, TEXT(FACEBOOK_URL_REQUESTS) ); mir_free( tmessage ); } if (!DBGetContactSettingByte(NULL,parent->m_szModuleName,FACEBOOK_KEY_PARSE_MESSAGES, DEFAULT_PARSE_MESSAGES)) { str_count = utils::text::source_get_value( &resp.data, 2, "<span id=\"messagesCountValue\">", "</span>" ); if ( str_count.length() && str_count != std::string( "0" ) ) { std::string message = Translate("Got new messages: ") + str_count; TCHAR* tmessage = mir_a2t(message.c_str()); parent->NotifyEvent( parent->m_tszUserName, tmessage, NULL, FACEBOOK_EVENT_OTHER, TEXT(FACEBOOK_URL_MESSAGES) ); mir_free( tmessage ); } } str_count = utils::text::source_get_value( &resp.data, 2, "<span id=\"notificationsCountValue\">", "</span>" ); if ( str_count.length() && str_count != std::string( "0" ) ) { // Parse notifications directly to popups ForkThread( &FacebookProto::ProcessNotifications, this->parent, NULL ); } if (DBGetContactSettingByte(NULL, parent->m_szModuleName, FACEBOOK_KEY_ENABLE_GROUPCHATS, DEFAULT_ENABLE_GROUPCHATS)) { // Get group chats std::string favorites = utils::text::source_get_value( &resp.data, 2, "<div id=\"leftCol\"", "<div id=\"contentCol\"" ); std::string::size_type pos = 0; while ((pos = favorites.find("href=\"/groups/",pos)) != std::string::npos) { pos += 14; std::string item = favorites.substr(pos, favorites.find("</a>", pos) - pos); std::string id = item.substr(0, item.find("/")); if (!id.empty()) { std::string name = utils::text::source_get_value( &item, 3, "class=\"linkWrap", ">", "</div>" ); name = utils::text::special_expressions_decode(utils::text::slashu_to_utf8( name ) ); parent->Log(" Got new group chat: %s (id: %s)", name.c_str(), id.c_str()); if (!name.empty()) parent->AddChat(id.c_str(), name.c_str()); } } } return handle_success( "home" ); } case HTTP_CODE_FOUND: // Work-around for replica_down, f**king hell what's that? parent->Log(" REPLICA_DOWN is back in force!"); return this->home(); default: return handle_error( "home", FORCE_DISCONNECT ); } }