SL-3007 Ability to report abuse from chat

master
Andrey Kleshchev 2022-01-24 23:36:56 +02:00
parent b6029c4c34
commit e129986a49
12 changed files with 90 additions and 40 deletions

View File

@ -1903,6 +1903,7 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
registrar.add("Url.SendIM", boost::bind(&LLScrollListCtrl::sendIM, id));
registrar.add("Url.AddFriend", boost::bind(&LLScrollListCtrl::addFriend, id));
registrar.add("Url.RemoveFriend", boost::bind(&LLScrollListCtrl::removeFriend, id));
registrar.add("Url.ReportAbuse", boost::bind(&LLScrollListCtrl::reportAbuse, id, is_group));
registrar.add("Url.Execute", boost::bind(&LLScrollListCtrl::showNameDetails, id, is_group));
registrar.add("Url.CopyLabel", boost::bind(&LLScrollListCtrl::copyNameToClipboard, id, is_group));
registrar.add("Url.CopyUrl", boost::bind(&LLScrollListCtrl::copySLURLToClipboard, id, is_group));
@ -1966,6 +1967,15 @@ void LLScrollListCtrl::removeFriend(std::string id)
LLUrlAction::removeFriend(slurl);
}
void LLScrollListCtrl::reportAbuse(std::string id, bool is_group)
{
if (!is_group)
{
std::string slurl = "secondlife:///app/agent/" + id + "/about";
LLUrlAction::reportAbuse(slurl);
}
}
void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)
{
// open the resident's details or the group details

View File

@ -458,6 +458,7 @@ private:
static void sendIM(std::string id);
static void addFriend(std::string id);
static void removeFriend(std::string id);
static void reportAbuse(std::string id, bool is_group);
static void showNameDetails(std::string id, bool is_group);
static void copyNameToClipboard(std::string id, bool is_group);
static void copySLURLToClipboard(std::string id, bool is_group);

View File

@ -2007,6 +2007,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));
registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));
registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));

View File

@ -196,6 +196,7 @@ public:
const LLUUID& getSourceID() const { return mSourceID; }
const LLTextSegmentPtr getPreviousSegment() const;
const LLTextSegmentPtr getLastSegment() const;
void getSelectedSegments(segment_vec_t& segments) const;
void setShowContextMenu(bool show) { mShowContextMenu = show; }

View File

@ -222,6 +222,15 @@ void LLUrlAction::removeFriend(std::string url)
}
}
void LLUrlAction::reportAbuse(std::string url)
{
std::string id_str = getUserID(url);
if (LLUUID::validate(id_str))
{
executeSLURL("secondlife:///app/agent/" + id_str + "/reportAbuse");
}
}
void LLUrlAction::blockObject(std::string url)
{
std::string object_id = getObjectId(url);

View File

@ -82,6 +82,7 @@ public:
static void sendIM(std::string url);
static void addFriend(std::string url);
static void removeFriend(std::string url);
static void reportAbuse(std::string url);
static void blockObject(std::string url);
static void unblockObject(std::string url);

View File

@ -48,6 +48,7 @@
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltrans.h"
#include "llfloaterreg.h"
#include "llfloaterreporter.h"
#include "llfloatersidepanelcontainer.h"
#include "llmutelist.h"
#include "llstylemap.h"
@ -403,6 +404,10 @@ public:
{
LLAvatarActions::pay(getAvatarId());
}
else if (level == "report_abuse")
{
LLFloaterReporter::showFromChat(mAvatarID, mFrom, getChild<LLTextBox>("time_box")->getValue().asString(), mText);
}
else if(level == "block_unblock")
{
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
@ -477,6 +482,10 @@ public:
{
return canModerate(userdata);
}
else if (level == "report_abuse")
{
return gAgentID != mAvatarID;
}
else if (level == "can_ban_member")
{
return canBanGroupMember(getAvatarId());
@ -628,6 +637,11 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
// To be able to report a message, we need a copy of it's text
// and it's easier to store text directly than trying to get
// it from a lltextsegment or chat's mEditor
mText = chat.mText;
//*TODO overly defensive thing, source type should be maintained out there
if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))
{
@ -977,6 +991,7 @@ protected:
EChatSourceType mSourceType;
std::string mFrom;
LLUUID mSessionID;
std::string mText;
S32 mMinUserNameWidth;
const LLFontGL* mUserNameFont;

View File

@ -54,6 +54,7 @@
#include "llbutton.h"
#include "llfloaterreg.h"
#include "lltexturectrl.h"
#include "lltexteditor.h"
#include "llscrolllistctrl.h"
#include "lldispatcher.h"
#include "llviewerobject.h"
@ -250,9 +251,6 @@ LLFloaterReporter::~LLFloaterReporter()
mPosition.setVec(0.0f, 0.0f, 0.0f);
std::for_each(mMCDList.begin(), mMCDList.end(), DeletePointer() );
mMCDList.clear();
delete mResourceDatap;
}
@ -661,6 +659,13 @@ void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::strin
show(avatar_id, avatar_name);
}
// static
void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, std::string& time, std::string& description)
{
show(avatar_id, avatar_name);
setDescription(time + "\n" + description);
}
void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
{
getChild<LLUICtrl>("object_name")->setValue(object_name);
@ -1029,36 +1034,12 @@ void LLFloaterReporter::onClose(bool app_quitting)
gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);
}
// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
// {
// LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
// if (self)
// {
// self->getChild<LLUICtrl>("details_edit")->setValue(description);
// for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer());
// self->mMCDList.clear();
// if (mcd)
// {
// self->mMCDList.push_back(new LLMeanCollisionData(mcd));
// }
// }
// }
// void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd)
// {
// LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
// if (self)
// {
// LLTextEditor* text = self->getChild<LLTextEditor>("details_edit");
// if (text)
// {
// text->insertText(description);
// }
// if (mcd)
// {
// self->mMCDList.push_back(new LLMeanCollisionData(mcd));
// }
// }
// }
// static
void LLFloaterReporter::setDescription(const std::string& description)
{
LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
if (self)
{
self->getChild<LLUICtrl>("details_edit")->setValue(description);
}
}

View File

@ -93,6 +93,7 @@ public:
static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null);
static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
static void showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, std::string& time, std::string& description);
static void showFromExperience(const LLUUID& experience_id);
static void onClickSend (void *userdata);
@ -101,8 +102,6 @@ public:
void onClickSelectAbuser ();
static void closePickTool (void *userdata);
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
@ -129,6 +128,8 @@ private:
void setFromAvatarID(const LLUUID& avatar_id);
void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
static void setDescription(const std::string& description);
static void requestAbuseCategoriesCoro(std::string url, LLHandle<LLFloater> handle);
static void finishedARPost(const LLSD &);
@ -144,7 +145,6 @@ private:
BOOL mPicking;
LLVector3 mPosition;
BOOL mCopyrightWarningSeen;
std::list<LLMeanCollisionData*> mMCDList;
std::string mDefaultSummary;
LLResourceData* mResourceDatap;
boost::signals2::connection mAvatarNameCacheConnection;

View File

@ -30,6 +30,7 @@
#include "llagent.h"
#include "llavataractions.h"
#include "llfloaterreg.h"
#include "llfloaterreporter.h"
#include "llcommandhandler.h"
#include "llnotificationsutil.h"
#include "llpanelpicks.h"
@ -178,6 +179,22 @@ public:
}
return true;
}
// reportAbuse is here due to convoluted avatar handling
// in LLScrollListCtrl and LLTextBase
if (verb == "reportAbuse" && web == NULL)
{
LLAvatarName av_name;
if (LLAvatarNameCache::get(avatar_id, &av_name))
{
LLFloaterReporter::showFromAvatar(avatar_id, av_name.getCompleteName());
}
else
{
LLFloaterReporter::showFromAvatar(avatar_id, "not avaliable");
}
return true;
}
return false;
}
};

View File

@ -96,6 +96,13 @@
name="Pay">
<on_click function="AvatarIcon.Action" parameter="pay" />
</menu_item_call>
<menu_item_call
label="Report Abuse"
layout="topleft"
name="Report Abuse">
<on_click function="AvatarIcon.Action" parameter="report_abuse" />
<on_enable function="AvatarIcon.Enable" parameter="report_abuse" />
</menu_item_call>
<menu_item_check
label="Block Voice"
layout="topleft"

View File

@ -29,7 +29,14 @@
name="remove_friend">
<menu_item_call.on_click
function="Url.RemoveFriend" />
</menu_item_call>
</menu_item_call>
<menu_item_call
label="Report Abuse"
layout="topleft"
name="report_abuse">
<menu_item_call.on_click
function="Url.ReportAbuse" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call