Client-side maturity handling when teleporting. Adds new notification that asks if you want to change maturity settings with a single click and automatically re-fire the teleport request.
This commit is contained in:
@@ -5930,17 +5930,35 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
|
||||
}
|
||||
}
|
||||
|
||||
bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
|
||||
bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
if (0 == option)
|
||||
{
|
||||
// set the preference to the maturity of the region we're calling
|
||||
int preferredMaturity = notification["payload"]["_region_access"].asInteger();
|
||||
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
|
||||
gAgent.sendMaturityPreferenceToServer(preferredMaturity);
|
||||
U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
|
||||
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handle_prompt_for_maturity_level_change_and_reteleport_callback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
if (0 == option)
|
||||
{
|
||||
// set the preference to the maturity of the region we're calling
|
||||
U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
|
||||
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
|
||||
gAgent.setMaturityRatingChangeDuringTeleport(preferredMaturity);
|
||||
gAgent.restartFailedTeleportRequest();
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -5949,39 +5967,148 @@ bool handle_special_notification_callback(const LLSD& notification, const LLSD&
|
||||
// some of the server notifications need special handling. This is where we do that.
|
||||
bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
|
||||
{
|
||||
int regionAccess = llsdBlock["_region_access"].asInteger();
|
||||
llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);
|
||||
|
||||
// we're going to throw the LLSD in there in case anyone ever wants to use it
|
||||
LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);
|
||||
U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
|
||||
std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
|
||||
LLStringUtil::toLower(regionMaturity);
|
||||
llsdBlock["REGIONMATURITY"] = regionMaturity;
|
||||
|
||||
bool returnValue = false;
|
||||
LLNotificationPtr maturityLevelNotification;
|
||||
std::string notifySuffix = "_Notify";
|
||||
if (regionAccess == SIM_ACCESS_MATURE)
|
||||
{
|
||||
if (gAgent.isTeen())
|
||||
{
|
||||
LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
|
||||
return true;
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
|
||||
returnValue = true;
|
||||
|
||||
notifySuffix = "_NotifyAdultsOnly";
|
||||
}
|
||||
else if (gAgent.prefersPG())
|
||||
{
|
||||
LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
|
||||
return true;
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
|
||||
{
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
else if (regionAccess == SIM_ACCESS_ADULT)
|
||||
{
|
||||
if (!gAgent.isAdult())
|
||||
{
|
||||
LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
|
||||
return true;
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
|
||||
returnValue = true;
|
||||
|
||||
notifySuffix = "_NotifyAdultsOnly";
|
||||
}
|
||||
else if (gAgent.prefersPG() || gAgent.prefersMature())
|
||||
{
|
||||
LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
|
||||
return true;
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
|
||||
{
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
|
||||
{
|
||||
// Given a simple notification if no maturityLevelNotification is set or it is ignore
|
||||
LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
// some of the server notifications need special handling. This is where we do that.
|
||||
bool handle_teleport_access_blocked(LLSD& llsdBlock)
|
||||
{
|
||||
std::string notificationID("TeleportEntryAccessBlocked");
|
||||
U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
|
||||
std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
|
||||
LLStringUtil::toLower(regionMaturity);
|
||||
llsdBlock["REGIONMATURITY"] = regionMaturity;
|
||||
|
||||
bool returnValue = false;
|
||||
LLNotificationPtr maturityLevelNotification;
|
||||
std::string notifySuffix = "_Notify";
|
||||
if (regionAccess == SIM_ACCESS_MATURE)
|
||||
{
|
||||
if (gAgent.isTeen())
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
|
||||
returnValue = true;
|
||||
|
||||
notifySuffix = "_NotifyAdultsOnly";
|
||||
}
|
||||
else if (gAgent.prefersPG())
|
||||
{
|
||||
if (gAgent.hasRestartableFailedTeleportRequest())
|
||||
{
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
else if (regionAccess == SIM_ACCESS_ADULT)
|
||||
{
|
||||
if (!gAgent.isAdult())
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
|
||||
returnValue = true;
|
||||
|
||||
notifySuffix = "_NotifyAdultsOnly";
|
||||
}
|
||||
else if (gAgent.prefersPG() || gAgent.prefersMature())
|
||||
{
|
||||
if (gAgent.hasRestartableFailedTeleportRequest())
|
||||
{
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.clearTeleportRequest();
|
||||
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
|
||||
returnValue = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
|
||||
{
|
||||
// Given a simple notification if no maturityLevelNotification is set or it is ignore
|
||||
LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
bool attempt_standard_notification(LLMessageSystem* msgsystem)
|
||||
@@ -6025,16 +6152,20 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
|
||||
|
||||
RegionEntryAccessBlocked
|
||||
RegionEntryAccessBlocked_Notify
|
||||
RegionEntryAccessBlocked_NotifyAdultsOnly
|
||||
RegionEntryAccessBlocked_Change
|
||||
RegionEntryAccessBlocked_KB
|
||||
RegionEntryAccessBlocked_AdultsOnlyContent
|
||||
RegionEntryAccessBlocked_ChangeAndReTeleport
|
||||
LandClaimAccessBlocked
|
||||
LandClaimAccessBlocked_Notify
|
||||
LandClaimAccessBlocked_NotifyAdultsOnly
|
||||
LandClaimAccessBlocked_Change
|
||||
LandClaimAccessBlocked_KB
|
||||
LandClaimAccessBlocked_AdultsOnlyContent
|
||||
LandBuyAccessBlocked
|
||||
LandBuyAccessBlocked_Notify
|
||||
LandBuyAccessBlocked_NotifyAdultsOnly
|
||||
LandBuyAccessBlocked_Change
|
||||
LandBuyAccessBlocked_KB
|
||||
LandBuyAccessBlocked_AdultsOnlyContent
|
||||
|
||||
-----------------------------------------------------------------------*/
|
||||
if (handle_special_notification(notificationID, llsdBlock))
|
||||
@@ -6086,6 +6217,30 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data)
|
||||
}
|
||||
}
|
||||
|
||||
bool handle_not_age_verified_alert(const std::string &pAlertName)
|
||||
{
|
||||
LLNotificationPtr notification = LLNotificationsUtil::add(pAlertName);
|
||||
if ((notification == NULL) || notification->isIgnored())
|
||||
{
|
||||
LLNotificationsUtil::add(pAlertName + "_Notify");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool handle_special_alerts(const std::string &pAlertName)
|
||||
{
|
||||
bool isHandled = false;
|
||||
|
||||
if (LLStringUtil::compareStrings(pAlertName, "NotAgeVerified") == 0)
|
||||
{
|
||||
|
||||
isHandled = handle_not_age_verified_alert(pAlertName);
|
||||
}
|
||||
|
||||
return isHandled;
|
||||
}
|
||||
|
||||
void process_alert_core(const std::string& message, BOOL modal)
|
||||
{
|
||||
// HACK -- handle callbacks for specific alerts
|
||||
@@ -6109,7 +6264,10 @@ void process_alert_core(const std::string& message, BOOL modal)
|
||||
// Allow the server to spawn a named alert so that server alerts can be
|
||||
// translated out of English.
|
||||
std::string alert_name(message.substr(ALERT_PREFIX.length()));
|
||||
LLNotificationsUtil::add(alert_name);
|
||||
if (!handle_special_alerts(alert_name))
|
||||
{
|
||||
LLNotificationsUtil::add(alert_name);
|
||||
}
|
||||
}
|
||||
else if (message.find(NOTIFY_PREFIX) == 0)
|
||||
{
|
||||
@@ -6410,6 +6568,7 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
|
||||
|
||||
// ...with description on top
|
||||
LLNotificationsUtil::add("DebitPermissionDetails");
|
||||
return false;
|
||||
}
|
||||
|
||||
// check whether permissions were granted or denied
|
||||
@@ -6778,7 +6937,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
|
||||
else
|
||||
{
|
||||
// change notification name in this special case
|
||||
if (handle_special_notification("RegionEntryAccessBlocked", llsd_block))
|
||||
if (handle_teleport_access_blocked(llsd_block))
|
||||
{
|
||||
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user