MAINT-4178 FIXED [Group Bans] The viewer allows you to attempt to ban when the ban list already contains 500 entries, which fails.
parent
be2f4ecdb4
commit
854c251fef
|
|
@ -49,6 +49,8 @@ enum LLGroupChange
|
|||
GC_ALL
|
||||
};
|
||||
|
||||
const U32 GB_MAX_BANNED_AGENTS = 500;
|
||||
|
||||
class LLGroupMgrObserver
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ BOOL LLPanelGroupBulkBan::postBuild()
|
|||
|
||||
mImplementation->mTooManySelected = getString("ban_selection_too_large");
|
||||
mImplementation->mBanNotPermitted = getString("ban_not_permitted");
|
||||
mImplementation->mBanLimitFail = getString("ban_limit_fail");
|
||||
mImplementation->mCannotBanYourself = getString("cant_ban_yourself");
|
||||
|
||||
update();
|
||||
|
|
@ -122,13 +123,23 @@ void LLPanelGroupBulkBan::submit()
|
|||
{
|
||||
if (!gAgent.hasPowerInGroup(mImplementation->mGroupID, GP_GROUP_BAN_ACCESS))
|
||||
{
|
||||
// Fail! Agent no longer have ban rights.
|
||||
// Fail! Agent no longer have ban rights. Permissions could have changed after button was pressed.
|
||||
LLSD msg;
|
||||
msg["MESSAGE"] = mImplementation->mBanNotPermitted;
|
||||
LLNotificationsUtil::add("GenericAlert", msg);
|
||||
(*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
|
||||
return;
|
||||
}
|
||||
LLGroupMgrGroupData * group_datap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
|
||||
if (group_datap && group_datap->mBanList.size() >= GB_MAX_BANNED_AGENTS)
|
||||
{
|
||||
// Fail! Size limit exceeded. List could have updated after button was pressed.
|
||||
LLSD msg;
|
||||
msg["MESSAGE"] = mImplementation->mBanLimitFail;
|
||||
LLNotificationsUtil::add("GenericAlert", msg);
|
||||
(*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
|
||||
return;
|
||||
}
|
||||
std::vector<LLUUID> banned_agent_list;
|
||||
std::vector<LLScrollListItem*> agents = mImplementation->mBulkAgentList->getAllData();
|
||||
std::vector<LLScrollListItem*>::iterator iter = agents.begin();
|
||||
|
|
@ -138,8 +149,8 @@ void LLPanelGroupBulkBan::submit()
|
|||
banned_agent_list.push_back(agent->getUUID());
|
||||
}
|
||||
|
||||
const S32 MAX_GROUP_BANS = 100; // Max invites per request. 100 to match server cap.
|
||||
if (banned_agent_list.size() > MAX_GROUP_BANS)
|
||||
const S32 MAX_BANS_PER_REQUEST = 100; // Max bans per request. 100 to match server cap.
|
||||
if (banned_agent_list.size() > MAX_BANS_PER_REQUEST)
|
||||
{
|
||||
// Fail!
|
||||
LLSD msg;
|
||||
|
|
@ -151,6 +162,7 @@ void LLPanelGroupBulkBan::submit()
|
|||
|
||||
// remove already banned users and yourself from request.
|
||||
std::vector<LLAvatarName> banned_avatar_names;
|
||||
std::vector<LLAvatarName> out_of_limit_names;
|
||||
bool banning_self = FALSE;
|
||||
std::vector<LLUUID>::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), gAgent.getID());
|
||||
if (conflict != banned_agent_list.end())
|
||||
|
|
@ -158,7 +170,6 @@ void LLPanelGroupBulkBan::submit()
|
|||
banned_agent_list.erase(conflict);
|
||||
banning_self = TRUE;
|
||||
}
|
||||
LLGroupMgrGroupData * group_datap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
|
||||
if (group_datap)
|
||||
{
|
||||
BOOST_FOREACH(const LLGroupMgrGroupData::ban_list_t::value_type& group_ban_pair, group_datap->mBanList)
|
||||
|
|
@ -178,8 +189,23 @@ void LLPanelGroupBulkBan::submit()
|
|||
}
|
||||
}
|
||||
}
|
||||
// this check should always be the last one before we send the request.
|
||||
// Otherwise we have a possibility of cutting more then we need to.
|
||||
if (banned_agent_list.size() > GB_MAX_BANNED_AGENTS - group_datap->mBanList.size())
|
||||
{
|
||||
std::vector<LLUUID>::iterator exeedes_limit = banned_agent_list.begin() + GB_MAX_BANNED_AGENTS - group_datap->mBanList.size();
|
||||
for (std::vector<LLUUID>::iterator itor = exeedes_limit ;
|
||||
itor != banned_agent_list.end(); ++itor)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get(*itor, &av_name);
|
||||
out_of_limit_names.push_back(av_name);
|
||||
}
|
||||
banned_agent_list.erase(exeedes_limit,banned_agent_list.end());
|
||||
}
|
||||
}
|
||||
|
||||
// sending request and ejecting members
|
||||
if (banned_agent_list.size() != 0)
|
||||
{
|
||||
LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mImplementation->mGroupID, LLGroupMgr::BAN_CREATE | LLGroupMgr::BAN_UPDATE, banned_agent_list);
|
||||
|
|
@ -187,16 +213,12 @@ void LLPanelGroupBulkBan::submit()
|
|||
}
|
||||
|
||||
// building notification
|
||||
if (banned_avatar_names.size() > 0 || banning_self)
|
||||
if (banned_avatar_names.size() > 0 || banning_self || out_of_limit_names.size() > 0)
|
||||
{
|
||||
std::string reasons;
|
||||
if(banned_avatar_names.size() > 0)
|
||||
{
|
||||
std::string names_string;
|
||||
LLAvatarActions::buildResidentsString(banned_avatar_names, names_string);
|
||||
LLStringUtil::format_map_t reason_args;
|
||||
reason_args["[RESIDENTS]"] = names_string;
|
||||
reasons = "\n " + getString("residents_already_banned", reason_args);
|
||||
reasons = "\n " + buildResidentsArgument(banned_avatar_names, "residents_already_banned");
|
||||
}
|
||||
|
||||
if(banning_self)
|
||||
|
|
@ -204,6 +226,11 @@ void LLPanelGroupBulkBan::submit()
|
|||
reasons += "\n " + mImplementation->mCannotBanYourself;
|
||||
}
|
||||
|
||||
if(out_of_limit_names.size() > 0)
|
||||
{
|
||||
reasons += "\n " + buildResidentsArgument(out_of_limit_names, "ban_limit_reached");
|
||||
}
|
||||
|
||||
LLStringUtil::format_map_t msg_args;
|
||||
msg_args["[REASONS]"] = reasons;
|
||||
LLSD msg;
|
||||
|
|
@ -222,3 +249,11 @@ void LLPanelGroupBulkBan::submit()
|
|||
(*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
|
||||
}
|
||||
|
||||
std::string LLPanelGroupBulkBan::buildResidentsArgument(std::vector<LLAvatarName> avatar_names, const std::string &format)
|
||||
{
|
||||
std::string names_string;
|
||||
LLAvatarActions::buildResidentsString(avatar_names, names_string);
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[RESIDENTS]"] = names_string;
|
||||
return getString(format, args);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ public:
|
|||
|
||||
static void callbackClickSubmit(void* userdata);
|
||||
virtual void submit();
|
||||
private:
|
||||
std::string buildResidentsArgument(std::vector<LLAvatarName> avatar_names, const std::string &format);
|
||||
};
|
||||
|
||||
#endif // LL_LLPANELGROUPBULKBAN_H
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ public:
|
|||
std::string mLoadingText;
|
||||
std::string mTooManySelected;
|
||||
std::string mBanNotPermitted;
|
||||
std::string mBanLimitFail;
|
||||
std::string mCannotBanYourself;
|
||||
|
||||
std::set<LLUUID> mInviteeIDs;
|
||||
|
|
|
|||
|
|
@ -2844,8 +2844,9 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root)
|
|||
mCreateBanButton = parent->getChild<LLButton>("ban_create", recurse);
|
||||
mDeleteBanButton = parent->getChild<LLButton>("ban_delete", recurse);
|
||||
mRefreshBanListButton = parent->getChild<LLButton>("ban_refresh", recurse);
|
||||
mBanCountText = parent->getChild<LLTextBase>("ban_count", recurse);
|
||||
|
||||
if(!mBanList || !mCreateBanButton || !mDeleteBanButton || !mRefreshBanListButton)
|
||||
if(!mBanList || !mCreateBanButton || !mDeleteBanButton || !mRefreshBanListButton || !mBanCountText)
|
||||
return FALSE;
|
||||
|
||||
mBanList->setCommitOnSelectionChange(TRUE);
|
||||
|
|
@ -2860,6 +2861,8 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root)
|
|||
mRefreshBanListButton->setClickedCallback(onRefreshBanList, this);
|
||||
mRefreshBanListButton->setEnabled(FALSE);
|
||||
|
||||
setBanCount(0);
|
||||
|
||||
mBanList->setOnNameListCompleteCallback(boost::bind(&LLPanelGroupBanListSubTab::onBanListCompleted, this, _1));
|
||||
|
||||
populateBanList();
|
||||
|
|
@ -2875,7 +2878,18 @@ void LLPanelGroupBanListSubTab::activate()
|
|||
mBanList->deselectAllItems();
|
||||
mDeleteBanButton->setEnabled(FALSE);
|
||||
|
||||
mCreateBanButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS));
|
||||
LLGroupMgrGroupData * group_datap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if (group_datap)
|
||||
{
|
||||
mCreateBanButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS) &&
|
||||
group_datap->mBanList.size() < GB_MAX_BANNED_AGENTS);
|
||||
setBanCount(group_datap->mBanList.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
mCreateBanButton->setEnabled(FALSE);
|
||||
setBanCount(0);
|
||||
}
|
||||
|
||||
// BAKER: Should I really request everytime activate() is called?
|
||||
// Perhaps I should only do it on a force refresh, or if an action on the list happens...
|
||||
|
|
@ -2993,6 +3007,10 @@ void LLPanelGroupBanListSubTab::handleDeleteBanEntry()
|
|||
// the button anymore until we reselect another entry.
|
||||
mDeleteBanButton->setEnabled(FALSE);
|
||||
}
|
||||
|
||||
// update ban-count related elements
|
||||
mCreateBanButton->setEnabled(TRUE);
|
||||
setBanCount(gdatap->mBanList.size());
|
||||
|
||||
LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mGroupID, LLGroupMgr::BAN_DELETE, ban_ids);
|
||||
}
|
||||
|
|
@ -3021,6 +3039,14 @@ void LLPanelGroupBanListSubTab::onBanListCompleted(bool isComplete)
|
|||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupBanListSubTab::setBanCount(U32 ban_count)
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[COUNT]"] = llformat("%d", ban_count);
|
||||
args["[LIMIT]"] = llformat("%d", GB_MAX_BANNED_AGENTS);
|
||||
mBanCountText->setText(getString("ban_count_template", args));
|
||||
}
|
||||
|
||||
void LLPanelGroupBanListSubTab::populateBanList()
|
||||
{
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
|
|
@ -3060,6 +3086,9 @@ void LLPanelGroupBanListSubTab::populateBanList()
|
|||
}
|
||||
|
||||
mRefreshBanListButton->setEnabled(TRUE);
|
||||
mCreateBanButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS) &&
|
||||
gdatap->mBanList.size() < GB_MAX_BANNED_AGENTS);
|
||||
setBanCount(gdatap->mBanList.size());
|
||||
}
|
||||
|
||||
void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id)
|
||||
|
|
|
|||
|
|
@ -347,6 +347,7 @@ public:
|
|||
void onBanListCompleted(bool isComplete);
|
||||
|
||||
protected:
|
||||
void setBanCount(U32 ban_count);
|
||||
void populateBanList();
|
||||
|
||||
public:
|
||||
|
|
@ -357,6 +358,7 @@ protected:
|
|||
LLButton* mCreateBanButton;
|
||||
LLButton* mDeleteBanButton;
|
||||
LLButton* mRefreshBanListButton;
|
||||
LLTextBase* mBanCountText;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -15,28 +15,36 @@
|
|||
name="ban_selection_too_large">
|
||||
Group bans not sent: too many Residents selected. Group bans are limited to 100 per request.
|
||||
</panel.string>
|
||||
<panel.string
|
||||
<panel.string
|
||||
name="ban_not_permitted">
|
||||
Group ban not sent: you do not have 'Manage ban list' ability.
|
||||
</panel.string>
|
||||
<panel.string
|
||||
Group ban not sent: you do not have 'Manage ban list' ability.
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="ban_limit_fail">
|
||||
Group ban not sent: your group have reached limit of allowed ban records.
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="partial_ban">
|
||||
Some group bans were not sent:
|
||||
Some group bans were not sent:
|
||||
[REASONS]
|
||||
</panel.string>
|
||||
<panel.string
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="ban_failed">
|
||||
Group bans were not sent:
|
||||
Group bans were not sent:
|
||||
[REASONS]
|
||||
</panel.string>
|
||||
<panel.string
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="residents_already_banned">
|
||||
- The following resident(s) are already banned: [RESIDENTS].
|
||||
</panel.string>
|
||||
<panel.string
|
||||
- The following resident(s) are already banned: [RESIDENTS].
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="ban_limit_reached">
|
||||
- Ban limit reached, following agents not banned: [RESIDENTS].
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="cant_ban_yourself">
|
||||
- You cannot ban yourself from a group.
|
||||
</panel.string>
|
||||
- You cannot ban yourself from a group.
|
||||
</panel.string>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
|
|||
|
|
@ -304,6 +304,10 @@ clicking on their names.
|
|||
name="help_text">
|
||||
Any resident on the ban list will be unable to join the group.
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="ban_count_template">
|
||||
Ban count: [COUNT]/[LIMIT]
|
||||
</panel.string>
|
||||
<name_list
|
||||
column_padding="0"
|
||||
draw_heading="true"
|
||||
|
|
@ -355,6 +359,15 @@ clicking on their names.
|
|||
name="ban_refresh"
|
||||
tool_tip="Refresh the ban list"
|
||||
/>
|
||||
<text
|
||||
type="string"
|
||||
height="18"
|
||||
left_pad="5"
|
||||
follows="top|left"
|
||||
layout="topleft"
|
||||
name="ban_count"
|
||||
width="100">
|
||||
</text>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<panel
|
||||
|
|
|
|||
Loading…
Reference in New Issue