コード例 #1
0
ファイル: RouteServConn.cpp プロジェクト: 9618211/TTServer
void CRouteServConn::_HandleFriendStatusList(CImPduFriendStatusList* pPdu)
{
	uint32_t user_id = pPdu->GetFromUserId();
	uint32_t friend_cnt = pPdu->GetFriendCnt();
	user_stat_t* friend_status_list = pPdu->GetFriendStatList();
	string user_id_url = idtourl(user_id);

	log("HandleOnlineFriendList, from_id=%d\n", user_id);

    CImUser* pImUser = CImUserManager::GetInstance()->GetImUserById(user_id);
    if (!pImUser) {
        return;
    }

	// send online friend status list to client
	CImPduClientOnlineFriendList pduCOFL(pPdu->GetRequestType(), friend_cnt, friend_status_list);
    pImUser->BroadcastPdu(&pduCOFL);
    
    // user don't need to send self status to friend list
	if (pPdu->GetRequestType() == ONLINE_LIST_TYPE_FRIEND_LIST) {
		return;
	}
    
	// send online friend notify packet to the client in the same message server
	CImPduClientFriendNotify pduCFN(user_id_url.c_str(), pImUser->GetIMOnlineStatus());
	for (uint32_t i = 0; i < friend_cnt; i++) {
		pImUser->AddOnlineFriend(friend_status_list[i].user_id);

        CImUser* pFriendUser = CImUserManager::GetInstance()->GetImUserById(friend_status_list[i].user_id);
		if (pFriendUser) {
			//log("notify %u online to %u\n", user_id, friend_status_list[i].user_id);
            pFriendUser->BroadcastPdu(&pduCFN);
			pFriendUser->AddOnlineFriend(user_id);
		}
	}
}
コード例 #2
0
ファイル: DBServConn.cpp プロジェクト: 3x032/TTServer
void CDBServConn::_HandleValidateResponse(CImPduValidateResponse* pPdu)
{
    string user_name(pPdu->GetUserName(), pPdu->GetUserNameLen());
	uint32_t result = pPdu->GetResult();
    CDbAttachData attach_data(pPdu->GetAttachData(), pPdu->GetAttachLen());
	log("HandleValidateResp, user_name=%s, result=%d\n", user_name.c_str(), result);

    CImUser* pImUser = CImUserManager::GetInstance()->GetImUserByName(user_name);
	CMsgConn* pMsgConn = NULL;
	if (!pImUser) {
		// can not find the client connection,
		// maybe the client is closed before the DB response arrived
		// do nothing
		log("ImUser for user_name=%s not exist\n", user_name.c_str());
		return;
	} else {
        pMsgConn = pImUser->GetUnValidateMsgConn(attach_data.GetHandle());
		if (!pMsgConn || pMsgConn->IsOpen()) {
			log("no such connection or is validated, user_name=%s\n", user_name.c_str());
			return;
		}
	}

	if (result != 0) {
		result = REFUSE_REASON_DB_VALIDATE_FAILED;
	}
    
	// validate OK, set client validate past, and send FriendListRequest to db storage server
	// else close the client connection
	if (result == 0) {
        user_info_t* user = pPdu->GetUserInfo();
        pImUser->SetUser(user);
        pImUser->SetValidated();
        
        uint32_t user_id = user->user_id;
        CImUserManager::GetInstance()->AddImUserById(user_id, pImUser);
        pImUser->KickOutSameClientType(pMsgConn->GetClientType(), pMsgConn);
        
        CRouteServConn* pRouteConn = get_route_serv_conn();
        if (pRouteConn) {
            CImPduServerKickUser kickPdu(user_id, pMsgConn->GetClientType(), KICK_REASON_DUPLICATE_USER);
            pRouteConn->SendPdu(&kickPdu);
        }
        
        string token = create_uuid();
        log("user_name: %s, uid: %d, token:%s\n", user_name.c_str(), user->user_id, token.c_str());
        pMsgConn->SetToken(token);
        pMsgConn->SetOpen();
        pMsgConn->SendUserActionLog(USER_ACTION_TYPE_LOGIN);
        pMsgConn->SendUserStatusUpdate(USER_STATUS_ONLINE);
        pImUser->ValidateMsgConn(token, pMsgConn);

        CImPduLoginResponse pduLR(result, pImUser->GetIMOnlineStatus(), user, (char*)token.c_str());
        pduLR.SetReserved(pPdu->GetReserved());
        pMsgConn->SendPdu(&pduLR);
	} else {
        CImPduLoginResponse pduLR(result);
        pduLR.SetReserved(pPdu->GetReserved());
        pMsgConn->SendPdu(&pduLR);
        //pMsgConn->Close();
	}
}