void SessionForm::OnTeamMemberAdd(const std::string& tid, const nim::TeamMemberProperty& team_member_info) { if (!IsTeamMemberType(team_member_info.GetUserType())) return; if(tid == session_id_) { team_member_info_list_[team_member_info.GetAccountID()] = team_member_info; std::wstring wid = nbase::UTF8ToUTF16(team_member_info.GetAccountID()); Control* ctrl = member_list_->FindSubControl(wid); if(ctrl == NULL) { TeamItem* item = new TeamItem; GlobalManager::FillBoxWithCache(item, L"session/team_item.xml"); member_list_->Add(item); item->InitControl(); item->SetTeamMember(team_member_info); } else { QLOG_WAR(L"OnTeamMemberAdd found the duplicate id, id={0}") << wid.c_str(); } std::wstring str = nbase::StringPrintf(L"群成员(共%d人)", member_list_->GetCount()); label_member_->SetText(str); if (LoginManager::GetInstance()->IsEqual(team_member_info.GetAccountID())) { btn_header_->SetEnabled(true); } } }
void SessionForm::OnGetTeamMemberCb(const std::string& tid, int count, const std::list<nim::TeamMemberProperty>& team_member_info_list) { team_member_info_list_.clear(); std::list<std::string> acc_list; for (auto& it : team_member_info_list) { if (IsTeamMemberType(it.GetUserType())) { team_member_info_list_[it.GetAccountID()] = it; acc_list.push_back(it.GetAccountID()); } } btn_refresh_member_->SetEnabled(true); member_list_->RemoveAll(); label_member_->SetText(nbase::StringPrintf(L"群成员(共%d人)", team_member_info_list_.size())); OnGetUserInfoCallback cb = ToWeakCallback([this](const std::list<nim::UserNameCard>& uinfos) { for (const auto &uinfo : uinfos) { nim::TeamMemberProperty tm_info = team_member_info_list_.at(uinfo.GetAccId()); std::wstring wid = nbase::UTF8ToUTF16(tm_info.GetAccountID()); Control* ctrl = member_list_->FindSubControl(wid); if (ctrl == NULL) { TeamItem* item = new TeamItem; GlobalManager::FillBoxWithCache(item, L"session/team_item.xml"); if (tm_info.GetUserType() == nim::kNIMTeamUserTypeCreator) member_list_->AddAt(item, 0); else member_list_->Add(item); item->InitControl(); item->InitInfo(tm_info); } else { QLOG_WAR(L"OnGetTeamMemberCb found the duplicate id, id={0}") << wid.c_str(); } if (tm_info.GetUserType() == nim::kNIMTeamUserTypeCreator || tm_info.GetUserType() == nim::kNIMTeamUserTypeManager) { if (LoginManager::GetInstance()->IsEqual(tm_info.GetAccountID())) { btn_new_broad_->SetVisible(true); } } } }); UserService::GetInstance()->GetUserInfoWithEffort(acc_list, cb); }
void MsgRecordForm::ShowMsg(const nim::IMMessage &msg, bool first, bool show_time) { const std::string &bubble_id = msg.client_msg_id_; if(bubble_id.empty()) { QLOG_WAR(L"msg id empty"); return; } IdBubblePair::iterator it = id_bubble_pair_.find(bubble_id); if(it != id_bubble_pair_.end()) { QLOG_WAR(L"repeat msg: {0}") <<bubble_id; return; } MsgBubbleItem* item = NULL; if (msg.type_ == nim::kNIMMessageTypeText) item = new MsgBubbleText; else if (msg.type_ == nim::kNIMMessageTypeImage) item = new MsgBubbleImage; else if (msg.type_ == nim::kNIMMessageTypeAudio) item = new MsgBubbleAudio; else if (msg.type_ == nim::kNIMMessageTypeFile) item = new MsgBubbleFile; else if (msg.type_ == nim::kNIMMessageTypeLocation) item = new MsgBubbleLocation; else if (msg.type_ == nim::kNIMMessageTypeNotification) { id_bubble_pair_[bubble_id] = NULL; MsgBubbleNotice* cell = new MsgBubbleNotice; GlobalManager::FillBoxWithCache(cell, L"session/cell_notice.xml"); if(first) msg_list_->AddAt(cell, 0); else msg_list_->Add(cell); cell->InitControl(); cell->InitInfo(msg, session_id_); return; } else if (msg.type_ == nim::kNIMMessageTypeCustom) { Json::Value json; if (StringToJson(msg.attach_, json)) { int sub_type = json["type"].asInt(); if (sub_type == CustomMsgType_Jsb) //finger { item = new MsgBubbleFinger; } else if (sub_type == CustomMsgType_SnapChat) { item = new MsgBubbleSnapChat; } else if (sub_type == CustomMsgType_Sticker) { item = new MsgBubbleSticker; } else if (sub_type == CustomMsgType_Rts) { if (json["data"].isObject()) { int flag = json["data"]["flag"].asInt(); if (flag == 0) { item = new MsgBubbleText; } else if (flag == 1) { id_bubble_pair_[bubble_id] = NULL; MsgBubbleNotice* cell = new MsgBubbleNotice; GlobalManager::FillBoxWithCache(cell, L"session/cell_notice.xml"); if (first) msg_list_->AddAt(cell, 0); else msg_list_->Add(cell); cell->InitControl(); cell->InitInfo(msg, session_id_); return; } } } } } if (item == nullptr) { QLOG_WAR(L"unknown msg: cid={0} msg_type={1}") << bubble_id << msg.type_; item = new MsgBubbleUnknown; } bool bubble_right = IsBubbleRight(msg); if(bubble_right) GlobalManager::FillBoxWithCache( item, L"session/bubble_right.xml" ); else GlobalManager::FillBoxWithCache( item, L"session/bubble_left.xml" ); if(first) msg_list_->AddAt(item, 0); else msg_list_->Add(item); id_bubble_pair_[bubble_id] = item; std::string sid = nbase::UTF16ToUTF8(GetWindowClassName()); item->InitControl(bubble_right); item->InitInfo(msg); item->SetSessionId(sid); item->SetSessionType(session_type_); item->SetActionMenu(false); item->SetShowTime(show_time); if (bubble_right || msg.session_type_ == nim::kNIMSessionTypeP2P) item->SetShowName(false, ""); else { auto iter = team_member_info_list_.find(msg.sender_accid_); if (iter != team_member_info_list_.cend() && !iter->second.GetNick().empty()) item->SetShowName(true, iter->second.GetNick()); //显示群名片 else { std::string show_name = nbase::UTF16ToUTF8(UserService::GetInstance()->GetUserName(msg.sender_accid_)); item->SetShowName(true, show_name); //显示备注名或昵称 } } if (msg.type_ == nim::kNIMMessageTypeAudio) item->SetPlayed(true); if( item->NeedDownloadResource() ) { nim::NOS::FetchMedia(msg, nbase::Bind(&MsgRecordForm::OnDownloadCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), nim::NOS::ProgressCallback()); } }