MAINT-5219 FIXED "Ban Member" from the group chatters list context menu is greyed out

when you have the ability to manage the ban list
meow-7.2.2
AndreyL ProductEngine 2015-08-13 07:53:38 +03:00
parent 7172b76f0e
commit 9e64435bd2
3 changed files with 89 additions and 27 deletions

View File

@ -1909,22 +1909,28 @@ bool LLFloaterIMContainer::canBanSelectedMember(const LLUUID& participant_uuid)
return false;
}
if (!gdatap->mMembers.size())
if (gdatap->mPendingBanRequest)
{
return false;
}
LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
if (mi == gdatap->mMembers.end())
if (gdatap->isRoleMemberDataComplete())
{
return false;
}
if (!gdatap->mMembers.size())
{
return false;
}
LLGroupMemberData* member_data = (*mi).second;
// Is the member an owner?
if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
{
return false;
LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
if (mi != gdatap->mMembers.end())
{
LLGroupMemberData* member_data = (*mi).second;
// Is the member an owner?
if (member_data && member_data->isInRole(gdatap->mOwnerRole))
{
return false;
}
}
}
if( gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER) &&
@ -1952,20 +1958,8 @@ void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid)
LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
return;
}
std::vector<LLUUID> ids;
ids.push_back(participant_uuid);
LLGroupBanData ban_data;
gdatap->createBanEntry(participant_uuid, ban_data);
LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, group_uuid, LLGroupMgr::BAN_CREATE, ids);
LLGroupMgr::getInstance()->sendGroupMemberEjects(group_uuid, ids);
LLGroupMgr::getInstance()->sendGroupMembersRequest(group_uuid);
LLSD args;
std::string name;
gCacheName->getFullName(participant_uuid, name);
args["AVATAR_NAME"] = name;
args["GROUP_NAME"] = gdatap->mName;
LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
gdatap->banMemberById(participant_uuid);
}

View File

@ -239,7 +239,8 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
mRoleMemberDataComplete(false),
mGroupPropertiesDataComplete(false),
mPendingRoleMemberRequest(false),
mAccessTime(0.0f)
mAccessTime(0.0f),
mPendingBanRequest(false)
{
mMemberVersion.generate();
}
@ -761,8 +762,69 @@ void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id)
mBanList.erase(ban_id);
}
void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
{
if (!mMemberDataComplete ||
!mRoleDataComplete ||
!(mRoleMemberDataComplete && mMembers.size()))
{
LL_WARNS() << "No Role-Member data yet, setting ban request to pending." << LL_ENDL;
mPendingBanRequest = true;
mPendingBanMemberID = participant_uuid;
if (!mMemberDataComplete)
{
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mID);
}
if (!mRoleDataComplete)
{
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mID);
}
return;
}
LLGroupMgrGroupData::member_list_t::iterator mi = mMembers.find((participant_uuid));
if (mi == mMembers.end())
{
if (!mPendingBanRequest)
{
mPendingBanRequest = true;
mPendingBanMemberID = participant_uuid;
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mID); // member isn't in members list, request reloading
}
else
{
mPendingBanRequest = false;
}
return;
}
mPendingBanRequest = false;
LLGroupMemberData* member_data = (*mi).second;
if (member_data && member_data->isInRole(mOwnerRole))
{
return; // can't ban group owner
}
std::vector<LLUUID> ids;
ids.push_back(participant_uuid);
LLGroupBanData ban_data;
createBanEntry(participant_uuid, ban_data);
LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mID, LLGroupMgr::BAN_CREATE, ids);
LLGroupMgr::getInstance()->sendGroupMemberEjects(mID, ids);
LLGroupMgr::getInstance()->sendGroupMembersRequest(mID);
LLSD args;
std::string name;
gCacheName->getFullName(participant_uuid, name);
args["AVATAR_NAME"] = name;
args["GROUP_NAME"] = mName;
LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
}
//
// LLGroupMgr
@ -1245,6 +1307,11 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_MEMBER_DATA);
if (group_datap->mPendingBanRequest)
{
group_datap->banMemberById(group_datap->mPendingBanMemberID);
}
}
// static
@ -1993,8 +2060,6 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
}
// Responder class for capability group management
class GroupMemberDataResponder : public LLHTTPClient::Responder
{

View File

@ -269,8 +269,8 @@ public:
void createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data = LLGroupBanData());
void removeBanEntry(const LLUUID& ban_id);
void banMemberById(const LLUUID& participant_uuid);
public:
typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
@ -302,6 +302,9 @@ public:
S32 mMemberCount;
S32 mRoleCount;
bool mPendingBanRequest;
LLUUID mPendingBanMemberID;
protected:
void sendRoleChanges();
void cancelRoleChanges();