diff options
Diffstat (limited to 'indra/newview/llgroupmgr.cpp')
| -rwxr-xr-x | indra/newview/llgroupmgr.cpp | 71 | 
1 files changed, 68 insertions, 3 deletions
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 6b4e242e3a..4d92fee04f 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -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  {  | 
