void CGroupChat::HandleClientGroupChangeMemberRequest(CImPdu* pPdu, CMsgConn* pFromConn) { IM::Group::IMGroupChangeMemberReq msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t change_type = msg.change_type(); uint32_t req_user_id = pFromConn->GetUserId(); uint32_t group_id = msg.group_id(); uint32_t user_cnt = msg.member_id_list_size(); log("HandleClientChangeMemberReq, change_type=%u, req_id=%u, group_id=%u, user_cnt=%u ", change_type, req_user_id, group_id, user_cnt); CDBServConn* pDbConn = get_db_serv_conn(); if (pDbConn) { CDbAttachData attach_data(ATTACH_TYPE_HANDLE, pFromConn->GetHandle(), 0); msg.set_user_id(req_user_id); msg.set_attach_data(attach_data.GetBuffer(), attach_data.GetLength()); pPdu->SetPBMsg(&msg); pDbConn->SendPdu(pPdu); } else { log("no DB connection "); IM::Group::IMGroupChangeMemberRsp msg2; msg2.set_user_id(req_user_id); msg2.set_change_type((IM::BaseDefine::GroupModifyType)change_type); msg2.set_result_code(1); msg2.set_group_id(group_id); CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_GROUP); pdu.SetCommandId(CID_GROUP_CHANGE_MEMBER_RESPONSE); pdu.SetSeqNum(pPdu->GetSeqNum()); pFromConn->SendPdu(&pdu); } }
/** * 修改群成员,增加或删除 * * @param pPdu 收到的packet包指针 * @param conn_uuid 该包过来的socket 描述符 */ void modifyMember(CImPdu* pPdu, uint32_t conn_uuid) { IM::Group::IMGroupChangeMemberReq msg; IM::Group::IMGroupChangeMemberRsp msgResp; if(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())) { uint32_t nUserId = msg.user_id(); uint32_t nGroupId = msg.group_id(); IM::BaseDefine::GroupModifyType nType = msg.change_type(); if (IM::BaseDefine::GroupModifyType_IsValid(nType) && CGroupModel::getInstance()->isValidateGroupId(nGroupId)) { CImPdu* pPduRes = new CImPdu; uint32_t nCnt = msg.member_id_list_size(); set<uint32_t> setUserId; for(uint32_t i=0; i<nCnt;++i) { setUserId.insert(msg.member_id_list(i)); } list<uint32_t> lsCurUserId; bool bRet = CGroupModel::getInstance()->modifyGroupMember(nUserId, nGroupId, nType, setUserId, lsCurUserId); msgResp.set_user_id(nUserId); msgResp.set_group_id(nGroupId); msgResp.set_change_type(nType); msgResp.set_result_code(bRet?0:1); if(bRet) { for(auto it=setUserId.begin(); it!=setUserId.end(); ++it) { msgResp.add_chg_user_id_list(*it); } for(auto it=lsCurUserId.begin(); it!=lsCurUserId.end(); ++it) { msgResp.add_cur_user_id_list(*it); } } log("userId=%u, groupId=%u, result=%u, changeCount:%u, currentCount=%u",nUserId, nGroupId, bRet?0:1, msgResp.chg_user_id_list_size(), msgResp.cur_user_id_list_size()); msgResp.set_attach_data(msg.attach_data()); pPduRes->SetPBMsg(&msgResp); pPduRes->SetSeqNum(pPdu->GetSeqNum()); pPduRes->SetServiceId(IM::BaseDefine::SID_GROUP); pPduRes->SetCommandId(IM::BaseDefine::CID_GROUP_CHANGE_MEMBER_RESPONSE); CProxyConn::AddResponsePdu(conn_uuid, pPduRes); } else { log("invalid groupModifyType or groupId. userId=%u, groupId=%u, groupModifyType=%u", nUserId, nGroupId, nType); } } else { log("parse pb failed"); } }