void CLoginConn::_HandleMsgServRequest(CImPdu* pPdu) { IM::Login::IMMsgServReq msg; msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()); log("HandleMsgServReq. "); // no MessageServer available if (g_msg_serv_info.size() == 0) { IM::Login::IMMsgServRsp msg; msg.set_result_code(::IM::BaseDefine::REFUSE_REASON_NO_MSG_SERVER); CImPdu pdu; pdu.SetPBMsg(&msg); pdu.SetServiceId(SID_LOGIN); pdu.SetCommandId(CID_LOGIN_RES_MSGSERVER); pdu.SetSeqNum(pPdu->GetSeqNum()); SendPdu(&pdu); Close(); return; } // return a message server with minimum concurrent connection count msg_serv_info_t* pMsgServInfo; uint32_t min_user_cnt = (uint32_t)-1; map<uint32_t, msg_serv_info_t*>::iterator it_min_conn = g_msg_serv_info.end(),it; for (it = g_msg_serv_info.begin() ; it != g_msg_serv_info.end(); it++) { pMsgServInfo = it->second; if ( (pMsgServInfo->cur_conn_cnt < pMsgServInfo->max_conn_cnt) && (pMsgServInfo->cur_conn_cnt < min_user_cnt)) { it_min_conn = it; min_user_cnt = pMsgServInfo->cur_conn_cnt; } } if (it_min_conn == g_msg_serv_info.end()) { log("All TCP MsgServer are full "); IM::Login::IMMsgServRsp msg; msg.set_result_code(::IM::BaseDefine::REFUSE_REASON_MSG_SERVER_FULL); CImPdu pdu; pdu.SetPBMsg(&msg); pdu.SetServiceId(SID_LOGIN); pdu.SetCommandId(CID_LOGIN_RES_MSGSERVER); pdu.SetSeqNum(pPdu->GetSeqNum()); SendPdu(&pdu); } else { IM::Login::IMMsgServRsp msg; msg.set_result_code(::IM::BaseDefine::REFUSE_REASON_NONE); msg.set_prior_ip(it_min_conn->second->ip_addr1); msg.set_backip_ip(it_min_conn->second->ip_addr2); msg.set_port(it_min_conn->second->port); CImPdu pdu; pdu.SetPBMsg(&msg); pdu.SetServiceId(SID_LOGIN); pdu.SetCommandId(CID_LOGIN_RES_MSGSERVER); pdu.SetSeqNum(pPdu->GetSeqNum()); SendPdu(&pdu); } Close(); // after send MsgServResponse, active close the connection }
void getDevicesToken(CImPdu* pPdu, uint32_t conn_uuid) { IM::Server::IMGetDeviceTokenReq msg; IM::Server::IMGetDeviceTokenRsp msgResp; if(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())) { CacheManager* pCacheManager = CacheManager::getInstance(); CacheConn* pCacheConn = pCacheManager->GetCacheConn("token"); CImPdu* pPduResp = new CImPdu; uint32_t nCnt = msg.user_id_size(); if (pCacheConn) { vector<string> vecTokens; for (uint32_t i=0; i<nCnt; ++i) { string strKey = "device_"+int2string(msg.user_id(i)); vecTokens.push_back(strKey); } map<string, string> mapTokens; bool bRet = pCacheConn->mget(vecTokens, mapTokens); pCacheManager->RelCacheConn(pCacheConn); if(bRet) { for (auto it=mapTokens.begin(); it!=mapTokens.end(); ++it) { string strKey = it->first; size_t nPos = strKey.find("device_"); if( nPos != string::npos) { string strUserId = strKey.substr(nPos + strlen("device_")); uint32_t nUserId = string2int(strUserId); string strValue = it->second; nPos = strValue.find(":"); if(nPos!=string::npos) { string strType = strValue.substr(0, nPos); string strToken = strValue.substr(nPos + 1); IM::BaseDefine::ClientType nClientType = IM::BaseDefine::ClientType(0); if(strType == "ios") { nClientType = IM::BaseDefine::CLIENT_TYPE_IOS; } else if(strType == "android") { nClientType = IM::BaseDefine::CLIENT_TYPE_ANDROID; } if(IM::BaseDefine::ClientType_IsValid(nClientType)) { IM::BaseDefine::UserTokenInfo* pToken = msgResp.add_user_token_info(); pToken->set_user_id(nUserId); pToken->set_token(strToken); pToken->set_user_type(nClientType); uint32_t nTotalCnt = 0; CMessageModel::getInstance()->getUnReadCntAll(nUserId, nTotalCnt); CGroupMessageModel::getInstance()->getUnReadCntAll(nUserId, nTotalCnt); pToken->set_push_count(nTotalCnt); pToken->set_push_type(1); } else { log("invalid clientType.clientType=%u", nClientType); } } else { log("invalid value. value=%s", strValue.c_str()); } } else { log("invalid key.key=%s", strKey.c_str()); } } } else { log("mget failed!"); } } else { log("no cache connection for token"); } log("req devices token.reqCnt=%u, resCnt=%u", nCnt, msgResp.user_token_info_size()); msgResp.set_attach_data(msg.attach_data()); pPduResp->SetPBMsg(&msgResp); pPduResp->SetSeqNum(pPdu->GetSeqNum()); pPduResp->SetServiceId(IM::BaseDefine::SID_OTHER); pPduResp->SetCommandId(IM::BaseDefine::CID_OTHER_GET_DEVICE_TOKEN_RSP); CProxyConn::AddResponsePdu(conn_uuid, pPduResp); } else { log("parse pb failed"); } }
void CDBServConn::_HandleGetDeviceTokenResponse(CImPdu *pPdu) { IM::Server::IMGetDeviceTokenRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); IM::Message::IMMsgData msg2; CHECK_PB_PARSE_MSG(msg2.ParseFromArray(msg.attach_data().c_str(), msg.attach_data().length())); string msg_data = msg2.msg_data(); uint32_t msg_type = msg2.msg_type(); uint32_t from_id = msg2.from_user_id(); uint32_t to_id = msg2.to_session_id(); if (msg_type == IM::BaseDefine::MSG_TYPE_SINGLE_TEXT || msg_type == IM::BaseDefine::MSG_TYPE_GROUP_TEXT) { //msg_data = char* msg_out = NULL; uint32_t msg_out_len = 0; if (pAes->Decrypt(msg_data.c_str(), msg_data.length(), &msg_out, msg_out_len) == 0) { msg_data = string(msg_out, msg_out_len); } else { log("HandleGetDeviceTokenResponse, decrypt msg failed, from_id: %u, to_id: %u, msg_type: %u.", from_id, to_id, msg_type); return; } pAes->Free(msg_out); } build_ios_push_flash(msg_data, msg2.msg_type(), from_id); //{ // "msg_type": 1, // "from_id": "1345232", // "group_type": "12353", //} jsonxx::Object json_obj; json_obj << "msg_type" << (uint32_t)msg2.msg_type(); json_obj << "from_id" << from_id; if (CHECK_MSG_TYPE_GROUP(msg2.msg_type())) { json_obj << "group_id" << to_id; } uint32_t user_token_cnt = msg.user_token_info_size(); log("HandleGetDeviceTokenResponse, user_token_cnt = %u.", user_token_cnt); IM::Server::IMPushToUserReq msg3; for (uint32_t i = 0; i < user_token_cnt; i++) { IM::BaseDefine::UserTokenInfo user_token = msg.user_token_info(i); uint32_t user_id = user_token.user_id(); string device_token = user_token.token(); uint32_t push_cnt = user_token.push_count(); uint32_t client_type = user_token.user_type(); //自己发得消息不给自己发推送 if (from_id == user_id) { continue; } log("HandleGetDeviceTokenResponse, user_id = %u, device_token = %s, push_cnt = %u, client_type = %u.", user_id, device_token.c_str(), push_cnt, client_type); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (pUser) { msg3.set_flash(msg_data); msg3.set_data(json_obj.json()); IM::BaseDefine::UserTokenInfo* user_token_tmp = msg3.add_user_token_list(); user_token_tmp->set_user_id(user_id); user_token_tmp->set_user_type((IM::BaseDefine::ClientType)client_type); user_token_tmp->set_token(device_token); user_token_tmp->set_push_count(push_cnt); //pc client登录,则为勿打扰式推送 if (pUser->GetPCLoginStatus() == IM_PC_LOGIN_STATUS_ON) { user_token_tmp->set_push_type(IM_PUSH_TYPE_SILENT); log("HandleGetDeviceTokenResponse, user id: %d, push type: silent.", user_id); } else { user_token_tmp->set_push_type(IM_PUSH_TYPE_NORMAL); log("HandleGetDeviceTokenResponse, user id: %d, push type: normal.", user_id); } } else { IM::Server::IMPushToUserReq msg4; msg4.set_flash(msg_data); msg4.set_data(json_obj.json()); IM::BaseDefine::UserTokenInfo* user_token_tmp = msg4.add_user_token_list(); user_token_tmp->set_user_id(user_id); user_token_tmp->set_user_type((IM::BaseDefine::ClientType)client_type); user_token_tmp->set_token(device_token); user_token_tmp->set_push_count(push_cnt); user_token_tmp->set_push_type(IM_PUSH_TYPE_NORMAL); CImPdu pdu; pdu.SetPBMsg(&msg4); pdu.SetServiceId(SID_OTHER); pdu.SetCommandId(CID_OTHER_PUSH_TO_USER_REQ); CPduAttachData attach_data(ATTACH_TYPE_PDU_FOR_PUSH, 0, pdu.GetBodyLength(), pdu.GetBodyData()); IM::Buddy::IMUsersStatReq msg5; msg5.set_user_id(0); msg5.add_user_id_list(user_id); msg5.set_attach_data(attach_data.GetBuffer(), attach_data.GetLength()); CRouteServConn* route_conn = get_route_serv_conn(); if (route_conn) { route_conn->SendPdu(SID_BUDDY_LIST, CID_BUDDY_LIST_USERS_STATUS_REQUEST, msg5); } } } if (msg3.user_token_list_size() > 0) { CPushServConn* PushConn = get_push_serv_conn(); if (PushConn) { PushConn->SendPdu(SID_OTHER, CID_OTHER_PUSH_TO_USER_REQ, msg3); } } }
void CDBServConn::_HandleMsgData(CImPdu *pPdu) { IM::Message::IMMsgData msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); if (CHECK_MSG_TYPE_GROUP(msg.msg_type())) { s_group_chat->HandleGroupMessage(pPdu); return; } uint32_t from_user_id = msg.from_user_id(); uint32_t to_user_id = msg.to_session_id(); uint32_t msg_id = msg.msg_id(); if (msg_id == 0) { log("HandleMsgData, write db failed, %u->%u.", from_user_id, to_user_id); return; } uint8_t msg_type = msg.msg_type(); CDbAttachData attach_data((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length()); uint32_t handle = attach_data.GetHandle(); log("HandleMsgData, from_user_id=%u, to_user_id=%u, msg_id=%u.", from_user_id, to_user_id, msg_id); CMsgConn* pMsgConn = CImUserManager::GetInstance()->GetMsgConnByHandle(from_user_id, attach_data.GetHandle()); if (pMsgConn) { IM::Message::IMMsgDataAck msg2; msg2.set_user_id(from_user_id); msg2.set_msg_id(msg_id); msg2.set_session_id(to_user_id); msg2.set_session_type(::IM::BaseDefine::SESSION_TYPE_SINGLE); CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_MSG); pdu.SetCommandId(CID_MSG_DATA_ACK); pdu.SetSeqNum(pPdu->GetSeqNum()); pMsgConn->SendPdu(&pdu); } CRouteServConn* pRouteConn = get_route_serv_conn(); if (pRouteConn) { pRouteConn->SendPdu(pPdu); } msg.clear_attach_data(); pPdu->SetPBMsg(&msg); CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(from_user_id); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); pPdu->SetSeqNum(0); if (pFromImUser) { pFromImUser->BroadcastClientMsgData(pPdu, msg_id, pMsgConn, from_user_id); } if (pToImUser) { pToImUser->BroadcastClientMsgData(pPdu, msg_id, NULL, from_user_id); } IM::Server::IMGetDeviceTokenReq msg3; msg3.add_user_id(to_user_id); msg3.set_attach_data(pPdu->GetBodyData(), pPdu->GetBodyLength()); CImPdu pdu2; pdu2.SetPBMsg(&msg3); pdu2.SetServiceId(SID_OTHER); pdu2.SetCommandId(CID_OTHER_GET_DEVICE_TOKEN_REQ); SendPdu(&pdu2); }
void CDBServConn::_HandleValidateResponse(CImPdu* pPdu) { IM::Server::IMValidateRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); string login_name = msg.user_name(); uint32_t result = msg.result_code(); string result_string = msg.result_string(); CDbAttachData attach_data((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length()); log("HandleValidateResp, user_name=%s, result=%d", login_name.c_str(), result); CImUser* pImUser = CImUserManager::GetInstance()->GetImUserByLoginName(login_name); CMsgConn* pMsgConn = NULL; if (!pImUser) { log("ImUser for user_name=%s not exist", login_name.c_str()); return; } else { pMsgConn = pImUser->GetUnValidateMsgConn(attach_data.GetHandle()); if (!pMsgConn || pMsgConn->IsOpen()) { log("no such conn is validated, user_name=%s", login_name.c_str()); return; } } if (result != 0) { result = IM::BaseDefine::REFUSE_REASON_DB_VALIDATE_FAILED; } if (result == 0) { IM::BaseDefine::UserInfo user_info = msg.user_info(); uint32_t user_id = user_info.user_id(); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (pUser) { pUser->AddUnValidateMsgConn(pMsgConn); pImUser->DelUnValidateMsgConn(pMsgConn); if (pImUser->IsMsgConnEmpty()) { CImUserManager::GetInstance()->RemoveImUserByLoginName(login_name); delete pImUser; } } else { pUser = pImUser; } pUser->SetUserId(user_id); pUser->SetNickName(user_info.user_nick_name()); pUser->SetValidated(); CImUserManager::GetInstance()->AddImUserById(user_id, pUser); pUser->KickOutSameClientType(pMsgConn->GetClientType(), IM::BaseDefine::KICK_REASON_DUPLICATE_USER, pMsgConn); CRouteServConn* pRouteConn = get_route_serv_conn(); if (pRouteConn) { IM::Server::IMServerKickUser msg2; msg2.set_user_id(user_id); msg2.set_client_type((::IM::BaseDefine::ClientType)pMsgConn->GetClientType()); msg2.set_reason(1); CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_OTHER); pdu.SetCommandId(CID_OTHER_SERVER_KICK_USER); pRouteConn->SendPdu(&pdu); } log("user_name: %s, uid: %d", login_name.c_str(), user_id); pMsgConn->SetUserId(user_id); pMsgConn->SetOpen(); pMsgConn->SendUserStatusUpdate(IM::BaseDefine::USER_STATUS_ONLINE); pUser->ValidateMsgConn(pMsgConn->GetHandle(), pMsgConn); IM::Login::IMLoginRes msg3; msg3.set_server_time(time(NULL)); msg3.set_result_code(IM::BaseDefine::REFUSE_REASON_NONE); msg3.set_result_string(result_string); msg3.set_online_status((IM::BaseDefine::UserStatType)pMsgConn->GetOnlineStatus()); IM::BaseDefine::UserInfo* user_info_tmp = msg3.mutable_user_info(); user_info_tmp->set_user_id(user_info.user_id()); user_info_tmp->set_user_gender(user_info.user_gender()); user_info_tmp->set_user_nick_name(user_info.user_nick_name()); user_info_tmp->set_avatar_url(user_info.avatar_url()); user_info_tmp->set_department_id(user_info.department_id()); user_info_tmp->set_email(user_info.email()); user_info_tmp->set_user_real_name(user_info.user_real_name()); user_info_tmp->set_user_tel(user_info.user_tel()); user_info_tmp->set_user_domain(user_info.user_domain()); user_info_tmp->set_status(user_info.status()); CImPdu pdu2; pdu2.SetPBMsg(&msg3); pdu2.SetServiceId(SID_LOGIN); pdu2.SetCommandId(CID_LOGIN_RES_USERLOGIN); pdu2.SetSeqNum(pPdu->GetSeqNum()); pMsgConn->SendPdu(&pdu2); } else { IM::Login::IMLoginRes msg4; msg4.set_server_time(time(NULL)); msg4.set_result_code((IM::BaseDefine::ResultType)result); msg4.set_result_string(result_string); CImPdu pdu3; pdu3.SetPBMsg(&msg4); pdu3.SetServiceId(SID_LOGIN); pdu3.SetCommandId(CID_LOGIN_RES_USERLOGIN); pdu3.SetSeqNum(pPdu->GetSeqNum()); pMsgConn->SendPdu(&pdu3); pMsgConn->Close(); } }
void CRouteServConn::_HandleUsersStatusResponse(CImPdu* pPdu) { IM::Buddy::IMUsersStatRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t user_id = msg.user_id(); uint32_t result_count = msg.user_stat_list_size(); log("HandleUsersStatusResp, user_id=%u, query_count=%u ", user_id, result_count); CPduAttachData attach_data((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length()); if (attach_data.GetType() == ATTACH_TYPE_HANDLE) { uint32_t handle = attach_data.GetHandle(); CMsgConn* pConn = CImUserManager::GetInstance()->GetMsgConnByHandle(user_id, handle); if (pConn) { msg.clear_attach_data(); pPdu->SetPBMsg(&msg); pConn->SendPdu(pPdu); } } else if (attach_data.GetType() == ATTACH_TYPE_PDU_FOR_PUSH) { IM::BaseDefine::UserStat user_stat = msg.user_stat_list(0); IM::Server::IMPushToUserReq msg2; CHECK_PB_PARSE_MSG(msg2.ParseFromArray(attach_data.GetPdu(), attach_data.GetPduLength())); IM::BaseDefine::UserTokenInfo* user_token = msg2.mutable_user_token_list(0); //pc client登录,则为勿打扰式推送 if (user_stat.status() == IM::BaseDefine::USER_STATUS_ONLINE) { user_token->set_push_type(IM_PUSH_TYPE_SILENT); log("HandleUsersStatusResponse, user id: %d, push type: normal. ", user_stat.user_id()); } else { user_token->set_push_type(IM_PUSH_TYPE_NORMAL); log("HandleUsersStatusResponse, user id: %d, push type: normal. ", user_stat.user_id()); } CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_OTHER); pdu.SetCommandId(CID_OTHER_PUSH_TO_USER_REQ); CPushServConn* PushConn = get_push_serv_conn(); if (PushConn) { PushConn->SendPdu(&pdu); } } else if (attach_data.GetType() == ATTACH_TYPE_HANDLE_AND_PDU_FOR_FILE) { IM::BaseDefine::UserStat user_stat = msg.user_stat_list(0); IM::Server::IMFileTransferReq msg3; CHECK_PB_PARSE_MSG(msg3.ParseFromArray(attach_data.GetPdu(), attach_data.GetPduLength())); uint32_t handle = attach_data.GetHandle(); IM::BaseDefine::FileType trans_mode = IM::BaseDefine::FILE_TYPE_OFFLINE; if (user_stat.status() == IM::BaseDefine::USER_STATUS_ONLINE) { trans_mode = IM::BaseDefine::FILE_TYPE_ONLINE; } msg3.set_trans_mode(trans_mode); CImPdu pdu; pdu.SetPBMsg(&msg3); pdu.SetServiceId(SID_OTHER); pdu.SetCommandId(CID_OTHER_FILE_TRANSFER_REQ); pdu.SetSeqNum(pPdu->GetSeqNum()); CFileServConn* pConn = get_random_file_serv_conn(); if (pConn) { pConn->SendPdu(&pdu); } else { log("no file server "); IM::File::IMFileRsp msg4; msg4.set_result_code(1); msg4.set_from_user_id(msg3.from_user_id()); msg4.set_to_user_id(msg3.to_user_id()); msg4.set_file_name(msg3.file_name()); msg4.set_task_id(""); msg4.set_trans_mode(msg3.trans_mode()); CImPdu pdu2; pdu2.SetPBMsg(&msg4); pdu2.SetServiceId(SID_FILE); pdu2.SetCommandId(CID_FILE_RESPONSE); pdu2.SetSeqNum(pPdu->GetSeqNum()); CMsgConn* pMsgConn = CImUserManager::GetInstance()->GetMsgConnByHandle(msg3.from_user_id(),handle); if (pMsgConn) { pMsgConn->SendPdu(&pdu2); } } } }
void CDBServConn::_HandleValidateResponse(CImPdu* pPdu) { IM::Server::IMValidateRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); string login_name = msg.user_name(); uint32_t result = msg.result_code(); string result_string = msg.result_string(); CDbAttachData attach_data((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length()); struct timeval now; gettimeofday(&now, NULL); uint32_t rand_num = rand(); string strKey = int2string(now.tv_usec % 10000) + int2string(now.tv_sec) + int2string(rand_num); strKey += strKey; uint32_t nKeyLen = strKey.length(); if (nKeyLen < 32) { for (uint32_t i=nKeyLen; i<32; i++) strKey += '0'; } else { strKey = strKey.substr(0, 32); } log("HandleValidateResp, user_name=%s, result=%d, key=%s", login_name.c_str(), result, strKey.c_str()); CImUser* pImUser = CImUserManager::GetInstance()->GetImUserByLoginName(login_name); CMsgConn* pMsgConn = NULL; if (!pImUser) { log("ImUser for user_name=%s not exist", login_name.c_str()); return; } else { pMsgConn = pImUser->GetUnValidateMsgConn(attach_data.GetHandle()); if (!pMsgConn || pMsgConn->IsOpen()) { log("no such conn is validated, user_name=%s", login_name.c_str()); return; } log("_HandleValidateResponse, user=%s(%p) conn=%p", login_name.c_str(), pImUser, pMsgConn); } if (result != 0) { result = IM::BaseDefine::REFUSE_REASON_DB_VALIDATE_FAILED; } log("_HandleValidateResponse, login_user=%s key=%s %p ", login_name.c_str(), strKey.c_str(), pMsgConn); total_users++; switch(pMsgConn->GetClientType()) { case IM::BaseDefine::CLIENT_TYPE_WINDOWS: case IM::BaseDefine::CLIENT_TYPE_MAC: pc_total_users++; break; case IM::BaseDefine::CLIENT_TYPE_ANDROID: android_total_users++; break; case IM::BaseDefine::CLIENT_TYPE_IOS: ios_total_users++; break; case IM::BaseDefine::CLIENT_TYPE_WEB: web_total_users++; break; } if (result == 0) { IM::BaseDefine::UserInfo user_info = msg.user_info(); uint32_t user_id = user_info.user_id(); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (pUser) { log("_HandleValidateResponse, get user %u(%p) key=%s %p", user_id, pUser, strKey.c_str(), pMsgConn); pUser->AddUnValidateMsgConn(pMsgConn); pImUser->DelUnValidateMsgConn(pMsgConn); if (pImUser->IsMsgConnEmpty()) { CImUserManager::GetInstance()->RemoveImUserByLoginName(login_name); delete pImUser; } } else { pUser = pImUser; log("_HandleValidateResponse, use login user %u(%p) key=%s %p", user_id, pUser, strKey.c_str(), pMsgConn); } pUser->SetUserId(user_id); pUser->SetNickName(user_info.user_nick_name()); pUser->SetValidated(); CImUserManager::GetInstance()->AddImUserById(user_id, pUser); log("user_name: %s, uid: %d(%p)", login_name.c_str(), user_id, pMsgConn); pMsgConn->SetKey(strKey); pMsgConn->SetUserId(user_id); pMsgConn->SetOpen(); pMsgConn->SendUserStatusUpdate(IM::BaseDefine::USER_STATUS_ONLINE); CRouteServConn* pRouteConn = get_route_serv_conn(); if (pRouteConn) { IM::Server::IMServerKickUser msg2; msg2.set_user_id(user_id); msg2.set_client_type((::IM::BaseDefine::ClientType)pMsgConn->GetClientType()); msg2.set_reason(1); CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_OTHER); pdu.SetCommandId(CID_OTHER_SERVER_KICK_USER); pRouteConn->SendPdu(&pdu); } pUser->ValidateMsgConn(pMsgConn->GetHandle(), pMsgConn); //pUser->KickOutSameClientType(pMsgConn->GetClientType(), IM::BaseDefine::KICK_REASON_DUPLICATE_USER, user_id); pUser->KickOutSameClientType(pMsgConn->GetClientType(), IM::BaseDefine::KICK_REASON_DUPLICATE_USER, pMsgConn); IM::Login::IMLoginRes msg3; msg3.set_server_time(time(NULL)); msg3.set_result_code(IM::BaseDefine::REFUSE_REASON_NONE); msg3.set_result_string(result_string); msg3.set_online_status((IM::BaseDefine::UserStatType)pMsgConn->GetOnlineStatus()); msg3.set_client_key(strKey); IM::BaseDefine::UserInfo* user_info_tmp = msg3.mutable_user_info(); user_info_tmp->set_user_id(user_info.user_id()); user_info_tmp->set_user_gender(user_info.user_gender()); user_info_tmp->set_user_nick_name(user_info.user_nick_name()); user_info_tmp->set_avatar_url(user_info.avatar_url()); user_info_tmp->set_sign_info(user_info.sign_info()); user_info_tmp->set_department_id(user_info.department_id()); user_info_tmp->set_email(user_info.email()); user_info_tmp->set_user_real_name(user_info.user_real_name()); user_info_tmp->set_user_tel(user_info.user_tel()); user_info_tmp->set_user_domain(user_info.user_domain()); user_info_tmp->set_status(user_info.status()); user_info_tmp->set_user_type(user_info.user_type()); log("id:%u gender:%u nick:%s avatar:%s sign:%s depid:%u email:%s name:%s tel:%s uname:%s status:%u type:%u", user_info.user_id(), user_info.user_gender(), user_info.user_nick_name().c_str(), user_info.avatar_url().c_str(), user_info.sign_info().c_str(), user_info.department_id(), user_info.email().c_str(), user_info.user_real_name().c_str(), user_info.user_tel().c_str(), user_info.user_domain().c_str(), user_info.status(), user_info.user_type()); CImPdu pdu2; pdu2.SetPBMsg(&msg3); pdu2.SetServiceId(SID_LOGIN); pdu2.SetCommandId(CID_LOGIN_RES_USERLOGIN); pdu2.SetSeqNum(pPdu->GetSeqNum()); pMsgConn->SendPdu(&pdu2); } else { fail_users++; IM::Login::IMLoginRes msg4; msg4.set_server_time(time(NULL)); msg4.set_result_code((IM::BaseDefine::ResultType)result); msg4.set_result_string(result_string); CImPdu pdu3; pdu3.SetPBMsg(&msg4); pdu3.SetServiceId(SID_LOGIN); pdu3.SetCommandId(CID_LOGIN_RES_USERLOGIN); pdu3.SetSeqNum(pPdu->GetSeqNum()); pMsgConn->SendPdu(&pdu3); pMsgConn->Close(); } }