From 79a0c543990352885c70dac24dff2f63da6ceea3 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Tue, 6 Jul 2021 00:51:07 -0400
Subject: [PATCH] Restore various chat options

---
 .../newview/app_settings/settings_alchemy.xml | 33 +++++++++++++++++++
 indra/newview/llimprocessing.cpp              | 31 +++++++++++++++--
 indra/newview/llvoavatar.cpp                  | 16 +++++++--
 indra/newview/llvoavatar.h                    |  1 +
 .../newview/skins/default/xui/en/strings.xml  |  2 ++
 5 files changed, 77 insertions(+), 6 deletions(-)

diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index 8daf8ea584d..b570947949e 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -211,6 +211,17 @@
       <key>Value</key>
       <string>/tp2cam</string>
     </map>
+    <key>AlchemyChatMarkUnnamedObjects</key>
+    <map>
+      <key>Comment</key>
+      <string>Marks unnamed objects in chat and IMs.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>AlchemyCinematicModeHideHoverText</key>
     <map>
       <key>Comment</key>
@@ -508,6 +519,28 @@
       <key>Value</key>
       <real>0.15</real>
     </map>
+    <key>AlchemyNearbyTypingIndicators</key>
+    <map>
+      <key>Comment</key>
+      <string>Show nearby chat typing indicator in nametags</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>AlchemyNotifyIncomingMessage</key>
+    <map>
+      <key>Comment</key>
+      <string>Notify of incoming messages by looking for typing indicator</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>AlchemyPointAtPrivate</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index cc2a0f7f32a..9dd8bfa8900 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -481,7 +481,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
 
     // make sure that we don't have an empty or all-whitespace name
     LLStringUtil::trim(name);
-    if (name.empty())
+    static const LLCachedControl<bool> sMarkUnnamedObjects(gSavedSettings, "AlchemyChatMarkUnnamedObjects", true);
+    if (sMarkUnnamedObjects && name.empty())
     {
         name = LLTrans::getString("Unnamed");
     }
@@ -668,9 +669,33 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             break;
 
         case IM_TYPING_START:
-        {
+		{
+			static LLCachedControl<bool> sNotifyIncomingMessage(gSavedSettings, "AlchemyNotifyIncomingMessage");
+			if (sNotifyIncomingMessage &&
+				!gIMMgr->hasSession(session_id) &&
+				((accept_im_from_only_friend && (is_friend || is_linden)) ||
+				(!(is_muted || is_do_not_disturb)))
+				)
+			{
+				LLStringUtil::format_map_t args;
+				args["[NAME]"] = name;
+				const std::string notify_str = LLTrans::getString("NotifyIncomingMessage", args);
+				gIMMgr->addMessage(session_id,
+					from_id,
+					LLStringUtil::null,
+					notify_str,
+					IM_ONLINE,
+					LLStringUtil::null,
+					IM_NOTHING_SPECIAL,
+					parent_estate_id,
+					region_id,
+					position,
+					false
+				);
+			}
+
             gIMMgr->processIMTypingStart(from_id, dialog);
-        }
+		}
         break;
 
         case IM_TYPING_STOP:
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6b77091bbf2..7cd59e24e00 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -639,6 +639,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
 	mIsSitting(FALSE),
 	mTimeVisible(),
 	mTyping(FALSE),
+	mTypingLast(false),
 	mMeshValid(FALSE),
 	mVisible(FALSE),
 	mLastImpostorUpdateFrameTime(0.f),
@@ -3264,6 +3265,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 	bool is_friend = (fRlvShowAvName) && isInBuddyList();
 // [/RLVa:KB]
 	bool is_cloud = getIsCloud();
+	static LLCachedControl<bool> sShowTyping(gSavedSettings, "AlchemyNearbyTypingIndicators", true);
+	bool is_typing = sShowTyping && mTyping;
 
 	if (is_appearance != mNameAppearance)
 	{
@@ -3287,13 +3290,14 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		|| is_muted != mNameMute
 		|| is_appearance != mNameAppearance 
 		|| is_friend != mNameFriend
-		|| is_cloud != mNameCloud)
+		|| is_cloud != mNameCloud
+		|| is_typing != mTypingLast)
 	{
 		LLColor4 name_tag_color = getNameTagColor(is_friend);
 
 		clearNameTag();
 
-		if (is_away || is_muted || is_do_not_disturb || is_appearance)
+		if (is_away || is_muted || is_do_not_disturb || is_appearance || is_typing)
 		{
 			std::string line;
 			if (is_away)
@@ -3321,6 +3325,11 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 				line += LLTrans::getString("LoadingData");
 				line += ", ";
 			}
+			if (is_typing)
+			{
+				line += LLTrans::getString("AvatarTyping");
+				line += ", ";
+			}
 			// trim last ", "
 			line.resize( line.length() - 2 );
 			addNameTagLine(line, name_tag_color, LLFontGL::NORMAL,
@@ -3397,6 +3406,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		mNameAppearance = is_appearance;
 		mNameFriend = is_friend;
 		mNameCloud = is_cloud;
+		mTypingLast = is_typing;
 		mTitle = title ? title->getString() : "";
 		LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
 		new_name = TRUE;
@@ -3456,7 +3466,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		}
 		mNameText->setVisibleOffScreen(TRUE);
 
-		if (mTyping)
+		if (is_typing)
 		{
 			S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
 			switch(dot_count)
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 33a3c2180ca..110138a0046 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -1040,6 +1040,7 @@ class LLVOAvatar :
 	LLFrameTimer	mTimeVisible;
 	std::deque<LLChat> mChats;
 	BOOL			mTyping;
+	bool			mTypingLast;
 	LLFrameTimer	mTypingTimer;
 
 /**                    Name
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2eb0b7e2432..2ad93683524 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4360,6 +4360,8 @@ and report the problem.
   <string name="outfit_photo_load_codec_error">Invalid image format. Please use another image</string>
 
   <!-- Alchemy Strings -->
+  <string name="NotifyIncomingMessage">Incoming message from [NAME]...</string>
+  <string name="AvatarTyping">Typing</string>
   <string name="UnknownAvatar">Unknown Avatar</string>
   
 </strings>
-- 
GitLab