/** * 获取群信息 * * @param pPdu 收到的packet包指针 * @param conn_uuid 该包过来的socket 描述符 */ void getGroupInfo(CImPdu* pPdu, uint32_t conn_uuid) { IM::Group::IMGroupInfoListReq msg; IM::Group::IMGroupInfoListRsp msgResp; if(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())) { CImPdu* pPduRes = new CImPdu; uint32_t nUserId = msg.user_id(); uint32_t nGroupCnt = msg.group_version_list_size(); map<uint32_t, IM::BaseDefine::GroupVersionInfo> mapGroupId; for(uint32_t i=0; i<nGroupCnt; ++i) { IM::BaseDefine::GroupVersionInfo groupInfo = msg.group_version_list(i); if(CGroupModel::getInstance()->isValidateGroupId(groupInfo.group_id())) { mapGroupId[groupInfo.group_id()] = groupInfo; } } list<IM::BaseDefine::GroupInfo> lsGroupInfo; CGroupModel::getInstance()->getGroupInfo(mapGroupId, lsGroupInfo); msgResp.set_user_id(nUserId); for(auto it=lsGroupInfo.begin(); it!=lsGroupInfo.end(); ++it) { IM::BaseDefine::GroupInfo* pGroupInfo = msgResp.add_group_info_list(); // *pGroupInfo = *it; pGroupInfo->set_group_id(it->group_id()); pGroupInfo->set_version(it->version()); pGroupInfo->set_group_name(it->group_name()); pGroupInfo->set_group_avatar(it->group_avatar()); pGroupInfo->set_group_creator_id(it->group_creator_id()); pGroupInfo->set_group_type(it->group_type()); pGroupInfo->set_shield_status(it->shield_status()); uint32_t nGroupMemberCnt = it->group_member_list_size(); for (uint32_t i=0; i<nGroupMemberCnt; ++i) { uint32_t userId = it->group_member_list(i); pGroupInfo->add_group_member_list(userId); } } log("userId=%u, requestCount=%u", nUserId, nGroupCnt); 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_INFO_RESPONSE); CProxyConn::AddResponsePdu(conn_uuid, pPduRes); } else { log("parse pb failed"); } }
void CGroupModel::getGroupInfo(map<uint32_t,IM::BaseDefine::GroupVersionInfo>& mapGroupId, list<IM::BaseDefine::GroupInfo>& lsGroupInfo) { if (!mapGroupId.empty()) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("dffxIMDB_slave"); if (pDBConn) { string strClause; bool bFirst = true; for(auto it=mapGroupId.begin(); it!=mapGroupId.end(); ++it) { if(bFirst) { bFirst = false; strClause = int2string(it->first); } else { strClause += ("," + int2string(it->first)); } } string strSql = "select * from IMGroup where id in (" + strClause + ") order by updated desc"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if(pResultSet) { while (pResultSet->Next()) { uint32_t nGroupId = pResultSet->GetInt("id"); uint32_t nVersion = pResultSet->GetInt("version"); if(mapGroupId[nGroupId].version() < nVersion) { IM::BaseDefine::GroupInfo cGroupInfo; cGroupInfo.set_group_id(nGroupId); cGroupInfo.set_version(nVersion); cGroupInfo.set_group_name(pResultSet->GetString("name")); cGroupInfo.set_group_avatar(pResultSet->GetString("avatar")); IM::BaseDefine::GroupType nGroupType = IM::BaseDefine::GroupType(pResultSet->GetInt("type")); if(IM::BaseDefine::GroupType_IsValid(nGroupType)) { cGroupInfo.set_group_type(nGroupType); cGroupInfo.set_group_creator_id(pResultSet->GetInt("creator")); lsGroupInfo.push_back(cGroupInfo); } else { log("invalid groupType. groupId=%u, groupType=%u", nGroupId, nGroupType); } } } pResultSet->Clear(); } else { log("no result set for sql:%s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); if(!lsGroupInfo.empty()) { fillGroupMember(lsGroupInfo); } } else { log("no db connection for dffxIMDB_slave"); } } else { log("no ids in map"); } }