diff options
| author | Todd Stinson <stinson@lindenlab.com> | 2012-06-08 18:28:19 -0700 | 
|---|---|---|
| committer | Todd Stinson <stinson@lindenlab.com> | 2012-06-08 18:28:19 -0700 | 
| commit | 68c3d1bb2ef19550d1549342b4bd597938c473b7 (patch) | |
| tree | 7b8ef6a0e2bb35ff738bcb1b3e308f00a8470e1a | |
| parent | 9aeae2a87e79a8e612fa052a5db2866489cb6fae (diff) | |
EXP-1953: First pass at implementing the maturity flow during a teleport via lure.
| -rw-r--r-- | indra/newview/llnotificationhandlerutil.cpp | 20 | ||||
| -rw-r--r-- | indra/newview/lltoastnotifypanel.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/llviewermessage.cpp | 193 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 46 | 
4 files changed, 242 insertions, 19 deletions
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 7c6287967a..16c51138a9 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -128,6 +128,8 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),  						FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),  						SERVER_OBJECT_MESSAGE("ServerObjectMessage"),  						TELEPORT_OFFERED("TeleportOffered"), +						TELEPORT_OFFERED_MATURITY_EXCEEDED("TeleportOffered_MaturityExceeded"), +						TELEPORT_OFFERED_MATURITY_BLOCKED("TeleportOffered_MaturityBlocked"),  						TELEPORT_OFFER_SENT("TeleportOfferSent"),  						IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip"); @@ -149,6 +151,8 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)  			|| INVENTORY_DECLINED == notification->getName()  			|| USER_GIVE_ITEM == notification->getName()  			|| TELEPORT_OFFERED == notification->getName() +			|| TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName() +			|| TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName()  			|| TELEPORT_OFFER_SENT == notification->getName()  			|| IM_SYSTEM_MESSAGE_TIP == notification->getName();  } @@ -169,7 +173,9 @@ bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)  {  	return OFFER_FRIENDSHIP == notification->getName()  			|| USER_GIVE_ITEM == notification->getName() -			|| TELEPORT_OFFERED == notification->getName(); +			|| TELEPORT_OFFERED == notification->getName() +			|| TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName() +			|| TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();  }  // static @@ -177,7 +183,9 @@ bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)  {  	return OFFER_FRIENDSHIP == notification->getName()  					|| USER_GIVE_ITEM == notification->getName() -					|| TELEPORT_OFFERED == notification->getName(); +					|| TELEPORT_OFFERED == notification->getName() +					|| TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName() +					|| TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();  }  // static @@ -185,7 +193,9 @@ bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification  {  	return OFFER_FRIENDSHIP == notification->getName()  		|| USER_GIVE_ITEM == notification->getName() -		|| TELEPORT_OFFERED == notification->getName(); +		|| TELEPORT_OFFERED == notification->getName() +		|| TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName() +		|| TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();  }  // static @@ -212,7 +222,9 @@ bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)  	if(OFFER_FRIENDSHIP == notification->getName()  		|| USER_GIVE_ITEM == notification->getName() -		|| TELEPORT_OFFERED == notification->getName()) +		|| TELEPORT_OFFERED == notification->getName() +		|| TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName() +		|| TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName())  	{  		// When ANY offer arrives, show toast, unless IM window is already open - EXT-5904  		return ! isIMFloaterOpened(notification); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index a8060649ba..4e7444311a 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -457,7 +457,7 @@ button_name_set_t getButtonDisableList(const std::string& notification_name, con  	{  		search_map = user_give_item_disable_map;  	} -	else if("TeleportOffered" == notification_name) +	else if(("TeleportOffered" == notification_name) || ("TeleportOffered_MaturityExceeded" == notification_name))  	{  		search_map = teleport_offered_disable_map;  	} diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 4a0de81eb1..7891e98cff 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1994,6 +1994,46 @@ bool lure_callback(const LLSD& notification, const LLSD& response)  }  static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback); +bool mature_lure_callback(const LLSD& notification, const LLSD& response) +{ +	S32 option = 0; +	if (response.isInteger())  +	{ +		option = response.asInteger(); +	} +	else +	{ +		option = LLNotificationsUtil::getSelectedOption(notification, response); +	} +	 +	LLUUID from_id = notification["payload"]["from_id"].asUUID(); +	LLUUID lure_id = notification["payload"]["lure_id"].asUUID(); +	BOOL godlike = notification["payload"]["godlike"].asBoolean(); +	U8 region_access = static_cast<U8>(notification["payload"]["region_maturity"].asInteger()); + +	switch(option) +	{ +	case 0: +		{ +			// accept +			gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(region_access)); +			gAgent.setMaturityRatingChangeDuringTeleport(region_access); +			gAgent.teleportViaLure(lure_id, godlike); +		} +		break; +	case 1: +	default: +		// decline +		send_simple_im(from_id, +					   LLStringUtil::null, +					   IM_LURE_DECLINED, +					   lure_id); +		break; +	} +	return false; +} +static LLNotificationFunctorRegistration mature_lure_callback_reg("TeleportOffered_MaturityExceeded", mature_lure_callback); +  bool goto_url_callback(const LLSD& notification, const LLSD& response)  {  	std::string url = notification["payload"]["url"].asString(); @@ -2881,15 +2921,54 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{  				LLVector3 pos, look_at;  				U64 region_handle(0); -				U8 region_access(0); +				U8 region_access(SIM_ACCESS_MIN);  				std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);  				std::string region_access_str = LLStringUtil::null;  				std::string region_access_icn = LLStringUtil::null; +				std::string region_access_lc  = LLStringUtil::null; + +				bool canUserAccessDstRegion = true; +				bool doesUserRequireMaturityIncrease = false;  				if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))  				{  					region_access_str = LLViewerRegion::accessToString(region_access);  					region_access_icn = LLViewerRegion::getAccessIcon(region_access); +					region_access_lc  = region_access_str; +					LLStringUtil::toLower(region_access_lc); + +					if (!gAgent.isGodlike()) +					{ +						switch (region_access) +						{ +						case SIM_ACCESS_MIN : +						case SIM_ACCESS_PG : +							break; +						case SIM_ACCESS_MATURE : +							if (gAgent.isTeen()) +							{ +								canUserAccessDstRegion = false; +							} +							else if (gAgent.prefersPG()) +							{ +								doesUserRequireMaturityIncrease = true; +							} +							break; +						case SIM_ACCESS_ADULT : +							if (!gAgent.isAdult()) +							{ +								canUserAccessDstRegion = false; +							} +							else if (!gAgent.prefersAdult()) +							{ +								doesUserRequireMaturityIncrease = true; +							} +							break; +						default : +							llassert(0); +							break; +						} +					}  				}  				LLSD args; @@ -2898,28 +2977,126 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				args["MESSAGE"] = message;  				args["MATURITY_STR"] = region_access_str;  				args["MATURITY_ICON"] = region_access_icn; +				args["REGION_CONTENT_MATURITY"] = region_access_lc;  				LLSD payload;  				payload["from_id"] = from_id;  				payload["lure_id"] = session_id;  				payload["godlike"] = FALSE; +				payload["region_maturity"] = region_access; + +				if (!canUserAccessDstRegion) +				{ +					LLNotification::Params params("TeleportOffered_MaturityBlocked"); +					params.substitutions = args; +					params.payload = payload; +					LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false); +				} +				else if (doesUserRequireMaturityIncrease) +				{ +					LLNotification::Params params("TeleportOffered_MaturityExceeded"); +					params.substitutions = args; +					params.payload = payload; +					LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false); +				} +				else +				{ +					LLNotification::Params params("TeleportOffered"); +					params.substitutions = args; +					params.payload = payload; +					LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false); +				} -			    LLNotification::Params params("TeleportOffered"); -			    params.substitutions = args; -			    params.payload = payload; -			    LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false);  			}  		}  		break;  	case IM_GODLIKE_LURE_USER:  		{ +			LLVector3 pos, look_at; +			U64 region_handle(0); +			U8 region_access(SIM_ACCESS_MIN); +			std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size); +			std::string region_access_str = LLStringUtil::null; +			std::string region_access_icn = LLStringUtil::null; +			std::string region_access_lc  = LLStringUtil::null; + +			bool canUserAccessDstRegion = true; +			bool doesUserRequireMaturityIncrease = false; + +			if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) +			{ +				region_access_str = LLViewerRegion::accessToString(region_access); +				region_access_icn = LLViewerRegion::getAccessIcon(region_access); +				region_access_lc  = region_access_str; +				LLStringUtil::toLower(region_access_lc); + +				if (!gAgent.isGodlike()) +				{ +					switch (region_access) +					{ +					case SIM_ACCESS_MIN : +					case SIM_ACCESS_PG : +						break; +					case SIM_ACCESS_MATURE : +						if (gAgent.isTeen()) +						{ +							canUserAccessDstRegion = false; +						} +						else if (gAgent.prefersPG()) +						{ +							doesUserRequireMaturityIncrease = true; +						} +						break; +					case SIM_ACCESS_ADULT : +						if (!gAgent.isAdult()) +						{ +							canUserAccessDstRegion = false; +						} +						else if (!gAgent.prefersAdult()) +						{ +							doesUserRequireMaturityIncrease = true; +						} +						break; +					default : +						llassert(0); +						break; +					} +				} +			} + +			LLSD args; +			// *TODO: Translate -> [FIRST] [LAST] (maybe) +			args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString(); +			args["MESSAGE"] = message; +			args["MATURITY_STR"] = region_access_str; +			args["MATURITY_ICON"] = region_access_icn; +			args["REGION_CONTENT_MATURITY"] = region_access_lc;  			LLSD payload;  			payload["from_id"] = from_id;  			payload["lure_id"] = session_id;  			payload["godlike"] = TRUE; -			// do not show a message box, because you're about to be -			// teleported. -			LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0); +			payload["region_maturity"] = region_access; + +			if (!canUserAccessDstRegion) +			{ +				LLNotification::Params params("TeleportOffered_MaturityBlocked"); +				params.substitutions = args; +				params.payload = payload; +				LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false); +			} +			else if (doesUserRequireMaturityIncrease) +			{ +				LLNotification::Params params("TeleportOffered_MaturityExceeded"); +				params.substitutions = args; +				params.payload = payload; +				LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false); +			} +			else +			{ +				// do not show a message box, because you're about to be +				// teleported. +				LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0); +			}  		}  		break; diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 458b164ce0..4d78014ffd 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4090,7 +4090,7 @@ Are you sure you want to change the Estate Covenant?       name="okcancelignore"       yestext="Go to Knowledge Base"  	 notext="Close" -	 ignoretext="Region crossing: The region you're trying to visit contains content, which is accessible to adults only."/> +	 ignoretext="Region crossing: The region you're trying to visit contains content which is accessible to adults only."/>    </notification>    <notification @@ -4106,7 +4106,7 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu     name="RegionEntryAccessBlocked_NotifyAdultsOnly"     type="notifytip">      <tag>fail</tag> -    The region you're trying to visit contains content, which is accessible to adults only. +    The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.    </notification>    <notification @@ -4166,7 +4166,7 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu       name="okcancelignore"       yestext="Go to Knowledge Base"  	 notext="Close" -	 ignoretext="Teleport: The region you're trying to visit contains content, which is accessible to adults only."/> +	 ignoretext="Teleport: The region you're trying to visit contains content which is accessible to adults only."/>    </notification>    <notification @@ -4182,7 +4182,7 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu     name="RegionEntryAccessBlocked_NotifyAdultsOnly"     type="notifytip">      <tag>fail</tag> -    The region you're trying to visit contains content, which is accessible to adults only. +    The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.    </notification>    <notification @@ -4301,7 +4301,7 @@ You won't receive any more notifications that you're about to visit a region wit     name="LandClaimAccessBlocked_NotifyAdultsOnly"     type="notifytip">      <tag>fail</tag> -    The land you're trying to claim contains content, which is accessible to adults only. +    The land you're trying to claim contains [REGIONMATURITY] content, which is accessible to adults only.    </notification>    <notification @@ -4366,7 +4366,7 @@ You won't receive any more notifications that you're about to visit a region wit     name="LandBuyAccessBlocked_NotifyAdultsOnly"     type="notifytip">      <tag>fail</tag> -    The land you're trying to buy contains content, which is accessible to adults only. +    The land you're trying to buy contains [REGIONMATURITY] content, which is accessible to adults only.    </notification>    <notification @@ -6286,6 +6286,40 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th    <notification     icon="notify.tga" +   name="TeleportOffered_MaturityExceeded" +   type="offer"> +[NAME_SLURL] has offered to teleport you to their location: + +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + +However, this region contains [REGION_CONTENT_MATURITY] content, but your current preferences are set to exclude [REGION_CONTENT_MATURITY] content.  We can change your preferences and continue with the teleport, or you can cancel this teleport. +    <tag>confirm</tag> +    <form name="form"> +      <button +       index="0" +       name="Teleport" +       text="Change and Continue"/> +      <button +       index="1" +       name="Cancel" +       text="Cancel"/> +    </form> +  </notification> + +  <notification +   icon="notify.tga" +   name="TeleportOffered_MaturityBlocked" +   type="notifytip"> +[NAME_SLURL] has offered to teleport you to their location: + +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + +However, this region contains [REGION_CONTENT_MATURITY] content, which is accessible to adults only. +    <tag>fail</tag> +  </notification> + +  <notification +   icon="notify.tga"     name="TeleportOfferSent"     type="offer">  	Teleport offer sent to [TO_NAME]  | 
