MucActiveUserSeq RoomPool::GetRoomActiveUserSeq(const MucRoomIdPtr& roomid){ MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> ROOMNAME = " << roomid->roomname); RoomMemberListPtr rmlptr; MucActiveUserSeq ans; MyUtil::IntSeq userids; rmlptr = GetMemberList(roomid); if(rmlptr){ IceUtil::RWRecMutex::RLock lock(_rwmutex); userids = rmlptr->GetAllMembersSeq(); } if(userids.empty()){ MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> userids is empty so return"); return ans; } JidSeqMap jseqmap; try{ MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> call OnlineCenterAdapter.getUsersJids userids.size = " << userids.size()); jseqmap = OnlineCenterAdapter::instance().getUsersJids(userids); } catch(Ice::Exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq-->OnlineCenter::getUserJids-->line:"<<__LINE__<<" err:"<<e); } catch(std::exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq--> call OnlineCenter.getUserJids ERR line:"<<__LINE__<<" err:"<<e.what()); } if(jseqmap.empty()){ return ans; } TalkUserMap uinfoPtr; try{ uinfoPtr = TalkCacheClient::instance().GetUserBySeqWithLoad(0, userids); }catch(Ice::Exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq-->TalkCacheClient::GetUserBySeqWithLoad-->error:" << e); } MyUtil::IntSeq::iterator uidit = userids.begin(); for(; uidit != userids.end(); ++uidit){ int userid = (*uidit); JidSeqMap::const_iterator jit = jseqmap.find(userid); if(jit == jseqmap.end()){ continue; } Permisions permision = PMember; try{ MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> CALL MucUserRoomAdapter.GetMemberPermision(" << userid << ", " << roomid->roomname << ")"); MucMemberPtr m = MucUserRoomAdapter::instance().GetMemberPermision(userid, roomid); if(m){ permision = m->permision; } else{ MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> CALL MucUserRoomAdapter.GetMemberPermision's return is NULL, it means the user is not in the room so continue!"); continue; } } catch(Ice::Exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq-->MucUserRoom::GetMemberPermision-->line:"<<__LINE__<<" err:"<<e); } catch(std::exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq--> call MucUserRoom.GetMemberPermision ERR line:"<<__LINE__<<" err:"<<e.what()); } string nickname = ""; TalkUserMap::iterator infoit = uinfoPtr.find(userid); if(infoit == uinfoPtr.end()){ //取不到用户的名称,默认用id try{ nickname = boost::lexical_cast<string>(userid); } catch (exception& e){ MCE_WARN("RoomPool::GetRoomActiveUserSeq-->boost::lexical_cast to string exception val = " << userid); } } else{ TalkUserPtr u = infoit->second; nickname = u->name; } for (size_t index = 0; index < jit->second.size(); ++index) { char endpoint = jit->second.at(index)->endpoint[0]; if(endpoint != 'T' && endpoint != 'W'){ continue; } MucRoomIdPtr roomid = new MucRoomId(); roomid->roomname = rmlptr->_roomname; roomid->domain = MUCDOMAIN; MucUserIdentityPtr identity = new MucUserIdentity(); identity->roomid = roomid; identity->nickname = makeMucNickname(jit->second.at(index), nickname); identity->userid = userid; MucActiveUserPtr activeuserptr = new MucActiveUser(); activeuserptr->jid = jit->second.at(index); activeuserptr->identity = identity; activeuserptr->permision = permision; ans.push_back(activeuserptr); } } MCE_DEBUG("RoomPool::GetRoomActiveUserSeq --> roomname = " << roomid->roomname << " ans.size = " << ans.size()); return ans; }
void IqHandlerI::changeBuddyGroupNotify(const BuddyItemPtr& bi, const Ice::Current&) { if(!bi){ return; } MCE_DEBUG("IqHandlerI::changeBuddyGroupNotify --> host:"<<bi->host); MyUtil::IntSeq buddys; for (map<int,MyUtil::StrSeq>::iterator it = bi->items.begin(); it != bi->items.end(); ++it) { buddys.push_back(it->first); } TalkUserMap buddyInfo; try{ buddyInfo = TalkCacheClient::instance().GetUserBySeqWithLoad(bi->host, buddys); if(buddyInfo.size() != buddys.size()){ MCE_INFO("IqHandlerI::changeBuddyGroupNotify --> may be warn get from TalkCacheClient size is not equal actor = " << bi->host << " ids.size = " << buddys.size() << " map.size = " << buddyInfo.size()); }else{ MCE_INFO("IqHandlerI::changeBuddyGroupNotify --> success get from TalkCacheClient size is equal actor = " << bi->host << " ids.size = " << buddys.size() << " map.size = " << buddyInfo.size()); } }catch(Ice::Exception& e){ MCE_WARN("IqHandlerI::changeBuddyGroupNotify --> TalkCacheClient err, " << e); } MessageSeq mSeq; JidSeq jids; try{ //jids = OnlineCenterAdapter::instance().getUserJids(bi->host, 4); jids = TalkFunStateAdapter::instance().getUserJids(bi->host, 4); }catch(Ice::Exception& e){ MCE_WARN("IqHandlerI::changeBuddyGroupNotify-->OnlineCenterAdapter::getUserJids-->" << e); } for (size_t j = 0; j < jids.size(); ++j) { for (map<int,MyUtil::StrSeq>::iterator it = bi->items.begin(); it != bi->items.end(); ++it) { xml_document doc; xml_node iqNode = doc.append_child(); iqNode.set_name("iq"); iqNode.append_attribute("type") = "set"; iqNode.append_attribute("id") = (int)time(NULL); iqNode.append_attribute("to") = jidToString(jids.at(j)).c_str(); xml_node queryNode = iqNode.append_child(); queryNode.set_name("query"); queryNode.append_attribute("xmlns") = "jabber:iq:roster"; xml_node itemNode = queryNode.append_child(); itemNode.set_name("item"); ostringstream jos; jos << it->first << "@talk.xiaonei.com"; itemNode.append_attribute("jid") = jos.str().c_str();//jid.c_str(); TalkUserMap::iterator oit = buddyInfo.find(it->first); if (oit != buddyInfo.end()) { itemNode.append_attribute("name") = oit->second->name.c_str(); } else { itemNode.append_attribute("name") = boost::lexical_cast<string>(it->first).c_str(); } //itemNode.append_attribute("name") = name.c_str(); itemNode.append_attribute("subscription") = "both"; for (size_t k = 0; k < it->second.size(); ++k) { xml_node groupNode = itemNode.append_child(); groupNode.set_name("group"); groupNode.append_child(node_pcdata).set_value(it->second.at(k).c_str()); } MessagePtr mPtr = new Message(); //mPtr->from = new Jid(); mPtr->from = jids.at(j); mPtr->to = jids.at(j); mPtr->type = IQ_SET; mPtr->msg = doc.xml(); mSeq.push_back(mPtr); MCE_DEBUG("IqHandlerI::changeBuddyGroupNotify --> xml:"<<doc.xml()); } } try{ TalkDeliverAdapter::instance().deliver(mSeq); }catch(Ice::Exception& e){ MCE_WARN("IqHandlerI::changeBuddyGroupNotify-->TalkDeliverAdapter::deliver-->err" << e); } }