From b8da1259ba9fa9b2afc0a2b6050b147dbf13ccb8 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Mon, 21 Oct 2024 16:35:23 -0700
Subject: Issue #2907: Process metadata sent along with chats of type
 IM_NOTHING_SPECIAL, The metadata can contain information about the bot status
 of the sender. It may also contain a system-injected notification that is
 displayed to the agent as part of the 1:1 chat window.

---
 indra/llmessage/message_prehash.cpp            |  1 +
 indra/llmessage/message_prehash.h              |  1 +
 indra/newview/llimprocessing.cpp               | 47 ++++++++++++++++++++++++--
 indra/newview/llimprocessing.h                 |  1 +
 indra/newview/llimview.cpp                     |  2 +-
 indra/newview/llviewermessage.cpp              | 18 +++++++++-
 indra/newview/skins/default/xui/da/strings.xml |  4 +++
 indra/newview/skins/default/xui/de/strings.xml |  4 +++
 indra/newview/skins/default/xui/en/strings.xml |  4 +++
 indra/newview/skins/default/xui/es/strings.xml |  4 +++
 indra/newview/skins/default/xui/fr/strings.xml |  4 +++
 indra/newview/skins/default/xui/it/strings.xml |  4 +++
 indra/newview/skins/default/xui/ja/strings.xml |  4 +++
 indra/newview/skins/default/xui/pl/strings.xml |  4 +++
 indra/newview/skins/default/xui/pt/strings.xml |  4 +++
 indra/newview/skins/default/xui/ru/strings.xml |  4 +++
 indra/newview/skins/default/xui/tr/strings.xml |  4 +++
 indra/newview/skins/default/xui/zh/strings.xml |  4 +++
 scripts/messages/message_template.msg          |  8 +++++
 scripts/messages/message_template.msg.sha1     |  2 +-
 20 files changed, 122 insertions(+), 6 deletions(-)

diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index d3b80d684f..7ab25908e2 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1404,3 +1404,4 @@ char const* const _PREHASH_ExperienceID = LLMessageStringTable::getInstance()->g
 char const* const _PREHASH_LargeGenericMessage = LLMessageStringTable::getInstance()->getString("LargeGenericMessage");
 char const* const _PREHASH_GameControlInput = LLMessageStringTable::getInstance()->getString("GameControlInput");
 char const* const _PREHASH_AxisData = LLMessageStringTable::getInstance()->getString("AxisData");
+char const* const _PREHASH_MetaData = LLMessageStringTable::getInstance()->getString("MetaData");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 5449eaf2a5..88dee7f961 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1405,5 +1405,6 @@ extern char const* const _PREHASH_ExperienceID;
 extern char const* const _PREHASH_LargeGenericMessage;
 extern char const* const _PREHASH_GameControlInput;
 extern char const* const _PREHASH_AxisData;
+extern char const* const _PREHASH_MetaData;
 
 #endif
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 590cd09a31..5d1317f00f 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -422,6 +422,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
     U8 *binary_bucket,
     S32 binary_bucket_size,
     LLHost &sender,
+    LLSD metadata,
     LLUUID aux_id)
 {
     LLChat chat;
@@ -451,6 +452,30 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
     bool is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
         LLMuteList::isLinden(name);
 
+    /***
+    * The simulator has flagged this sender as a bot, if the viewer would like to display
+    * the chat text in a different color or font, the below code is how the viewer can
+    * tell if the sender is a bot.
+    *-----------------------------------------------------
+    bool is_bot = false;
+    if (metadata.has("sender"))
+    {   // The server has identified this sender as a bot.
+        is_bot = metadata["sender"]["bot"].asBoolean();
+    }
+    *-----------------------------------------------------
+    */
+
+    bool is_system_notice = false;
+    std::string notice_id;
+    LLSD notice_args;
+    if (metadata.has("notice"))
+    {   // The server has injected a notice into the IM conversation.
+        // These will be things like bot notifications, etc.
+        is_system_notice = true;
+        notice_id = metadata["notice"]["id"].asString();
+        notice_args = metadata["notice"]["data"];
+    }
+
     chat.mMuted = is_muted;
     chat.mFromID = from_id;
     chat.mFromName = name;
@@ -544,7 +569,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else
             {
-                // standard message, not from system
+                // standard message, server may have injected a notice into the conversation.
                 std::string saved;
                 if (offline == IM_OFFLINE)
                 {
@@ -579,8 +604,16 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
                             region_message = true;
                         }
                     }
-                    gIMMgr->addMessage(
-                        session_id,
+
+                    if (is_system_notice)
+                    {   // The simulator has injected some sort of notice into the conversation.
+                        // findString will only replace the contents of buffer if the notice_id is found.
+                        LLTrans::findString(buffer, notice_id, notice_args);
+                        name   = SYSTEM_FROM;
+                        from_id = LLUUID::null;
+                    }
+
+                    gIMMgr->addMessage(session_id,
                         from_id,
                         name,
                         buffer,
@@ -592,6 +625,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
                         position,
                         region_message,
                         timestamp);
+
                 }
                 else
                 {
@@ -1627,6 +1661,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             from_group = message_data["from_group"].asString() == "Y";
         }
 
+        LLSD metadata;
+        if (message_data.has("metadata"))
+        {
+            metadata = message_data["metadata"];
+        }
+
         EInstantMessage dialog = static_cast<EInstantMessage>(message_data["dialog"].asInteger());
         LLUUID session_id = message_data["transaction-id"].asUUID();
         if (session_id.isNull() && dialog == IM_FROM_TASK)
@@ -1654,6 +1694,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
                     local_bin_bucket.data(),
                     S32(local_bin_bucket.size()),
                     local_sender,
+                    metadata,
                     message_data["asset_id"].asUUID());
             });
 
diff --git a/indra/newview/llimprocessing.h b/indra/newview/llimprocessing.h
index 030d28b198..66ffc59ae0 100644
--- a/indra/newview/llimprocessing.h
+++ b/indra/newview/llimprocessing.h
@@ -48,6 +48,7 @@ public:
         U8 *binary_bucket,
         S32 binary_bucket_size,
         LLHost &sender,
+        LLSD metadata,
         LLUUID aux_id = LLUUID::null);
 
     // Either receives list of offline messages from 'ReadOfflineMsgs' capability
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 1402cc8c37..8a54267292 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3143,7 +3143,7 @@ void LLIMMgr::addMessage(
     const LLUUID& region_id,
     const LLVector3& position,
     bool is_region_msg,
-    U32 timestamp)      // May be zero
+    U32 timestamp) // May be zero
 {
     LLUUID other_participant_id = target_id;
 
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 33d9b5eb67..d722851851 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2139,6 +2139,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
     EInstantMessage dialog = (EInstantMessage)d;
     LLHost sender = msg->getSender();
 
+    LLSD metadata;
+    if (msg->getNumberOfBlocksFast(_PREHASH_MetaData) > 0)
+    {
+        S32 metadata_size = msg->getSizeFast(_PREHASH_MetaData, 0, _PREHASH_Data);
+        std::string metadata_buffer;
+        metadata_buffer.resize(metadata_size, 0);
+
+        msg->getBinaryDataFast(_PREHASH_MetaData, _PREHASH_Data, &metadata_buffer[0], metadata_size, 0, metadata_size );
+        std::stringstream metadata_stream(metadata_buffer);
+        if (LLSDSerialize::fromBinary(metadata, metadata_stream, metadata_size) == LLSDParser::PARSE_FAILURE)
+        {
+            metadata.clear();
+        }
+    }
+
     LLIMProcessing::processNewMessage(from_id,
         from_group,
         to_id,
@@ -2153,7 +2168,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
         position,
         binary_bucket,
         binary_bucket_size,
-        sender);
+        sender,
+        metadata);
 }
 
 void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id)
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index e4f99d14e9..c4275d43f7 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -3723,6 +3723,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
 	<string name="conference-title-incoming">
 		Konference med [AGENT_NAME]
 	</string>
+	<string name="bot_warning">
+Du chatter med en bot, [NAME]. Del ikke personlige oplysninger.
+Læs mere på https://second.life/scripted-agents.
+	</string>
 	<string name="no_session_message">
 		(IM session eksisterer ikke)
 	</string>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 8464bd9b0c..dd003e72d9 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1613,6 +1613,10 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
 	<string name="conference-title-incoming">Konferenz mit [AGENT_NAME]</string>
 	<string name="inventory_item_offered-im">Inventarobjekt „[ITEM_NAME]“ angeboten</string>
 	<string name="inventory_folder_offered-im">Inventarordner „[ITEM_NAME]“ angeboten</string>
+	<string name="bot_warning">
+	Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter.
+Erfahren Sie mehr unter https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">Objekte aus dem Inventar hier her ziehen</string>
 	<string name="facebook_post_success">Sie haben auf Facebook gepostet.</string>
 	<string name="flickr_post_success">Sie haben auf Flickr gepostet.</string>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 3ec4b7205b..9be4a8f737 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3720,6 +3720,10 @@ Please reinstall viewer from  https://secondlife.com/support/downloads/ and cont
   <string name="inventory_folder_offered-im">
     Inventory folder '[ITEM_NAME]' offered
   </string>
+  <string name="bot_warning">
+  You are chatting with a bot, [NAME]. Do not share any personal information.
+Learn more at https://second.life/scripted-agents.
+  </string>
   <string name="share_alert">
     Drag items from inventory here
   </string>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 9fcfc2daa5..97e86e994c 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1584,6 +1584,10 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].</string>
 	<string name="conference-title-incoming">Conferencia con [AGENT_NAME]</string>
 	<string name="inventory_item_offered-im">Ítem del inventario '[ITEM_NAME]' ofrecido</string>
 	<string name="inventory_folder_offered-im">Carpeta del inventario '[ITEM_NAME]' ofrecida</string>
+	<string name="bot_warning">
+Estás conversando con un bot, [NAME]. No compartas información personal.
+Más información en https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">Arrastra los ítems desde el invenbtario hasta aquí</string>
 	<string name="facebook_post_success">Has publicado en Facebook.</string>
 	<string name="flickr_post_success">Has publicado en Flickr.</string>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 55f6209fe1..60916ef92b 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1614,6 +1614,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string>
 	<string name="conference-title-incoming">Conférence avec [AGENT_NAME]</string>
 	<string name="inventory_item_offered-im">Objet de l’inventaire [ITEM_NAME] offert</string>
 	<string name="inventory_folder_offered-im">Dossier de l’inventaire [ITEM_NAME] offert</string>
+	<string name="bot_warning">
+Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles.
+En savoir plus sur https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">Faire glisser les objets de l'inventaire ici</string>
 	<string name="facebook_post_success">Vous avez publié sur Facebook.</string>
 	<string name="flickr_post_success">Vous avez publié sur Flickr.</string>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index f77ab1062a..88708a2b4d 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1586,6 +1586,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].</string>
 	<string name="conference-title-incoming">Chiamata in conferenza con [AGENT_NAME]</string>
 	<string name="inventory_item_offered-im">Offerto oggetto di inventario &quot;[ITEM_NAME]&quot;</string>
 	<string name="inventory_folder_offered-im">Offerta cartella di inventario &quot;[ITEM_NAME]&quot;</string>
+	<string name="bot_warning">
+Stai parlando con un bot, [NAME]. Non condividere informazioni personali.
+Scopri di più su https://second.life/scripted-agents.
+	</string>
 	<string name="facebook_post_success">Hai pubblicato su Facebook.</string>
 	<string name="flickr_post_success">Hai pubblicato su Flickr.</string>
 	<string name="twitter_post_success">Hai pubblicato su Twitter.</string>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index fa6c329fe7..ff3b1a53a2 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -6150,6 +6150,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
 	<string name="inventory_folder_offered-im">
 		フォルダ「[ITEM_NAME]」がインベントリに送られてきました。
 	</string>
+	<string name="bot_warning">
+[NAME]とチャットしています。個人情報を共有しないでください。
+詳細は https://second.life/scripted-agents をご覧ください。
+	</string>
 	<string name="share_alert">
 		インベントリからここにアイテムをドラッグします。
 	</string>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 8032443020..65b487e1b3 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -4412,6 +4412,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
 	<string name="inventory_folder_offered-im">
 		Zaoferowano folder: '[ITEM_NAME]'
 	</string>
+	<string name="bot_warning">
+Rozmawiasz z botem [NAME]. Nie udostępniaj żadnych danych osobowych.
+Dowiedz się więcej na https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">
 		Przeciągaj tutaj rzeczy z Szafy
 	</string>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 4ce1e6d2ec..9e66777b5a 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1549,6 +1549,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].</string>
 	<string name="conference-title-incoming">Conversa com [AGENT_NAME]</string>
 	<string name="inventory_item_offered-im">Item do inventário '[ITEM_NAME]' oferecido</string>
 	<string name="inventory_folder_offered-im">Pasta do inventário '[ITEM_NAME]' oferecida</string>
+	<string name="bot_warning">
+Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais.
+Saiba mais em https://second.life/scripted-agents.
+	</string>
 	<string name="facebook_post_success">Você publicou no Facebook.</string>
 	<string name="flickr_post_success">Você publicou no Flickr.</string>
 	<string name="twitter_post_success">Você publicou no Twitter.</string>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 0079309ba2..174999ea36 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -4576,6 +4576,10 @@ support@secondlife.com.
 	<string name="inventory_folder_offered-im">
 		Предложена папка инвентаря «[ITEM_NAME]»
 	</string>
+	<string name="bot_warning">
+Вы общаетесь с ботом [NAME]. Не передавайте личные данные.
+Подробнее на https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">
 		Перетаскивайте вещи из инвентаря сюда
 	</string>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index fa2fd3a802..6c1f6506a2 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -4579,6 +4579,10 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
 	<string name="inventory_folder_offered-im">
 		&quot;[ITEM_NAME]&quot; envanter klasörü sunuldu
 	</string>
+	<string name="bot_warning">
+Bir bot ile sohbet ediyorsunuz, [NAME]. Kişisel bilgilerinizi paylaşmayın.
+Daha fazla bilgi için: https://second.life/scripted-agents.
+	</string>
 	<string name="share_alert">
 		Envanterinizden buraya öğeler sürükleyin
 	</string>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index bdb16c9bf1..a3a9915dc4 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -4573,6 +4573,10 @@ http://secondlife.com/support 求助解決問題。
 	<string name="inventory_folder_offered-im">
 		收納區資料夾&apos;[ITEM_NAME]&apos;已向人提供
 	</string>
+	<string name="bot_warning">
+您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。
+了解更多:https://second.life/scripted-agents。
+	</string>
 	<string name="share_alert">
 		將收納區物品拖曳到這裡
 	</string>
diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg
index f167df8636..d7cdb28f2c 100755
--- a/scripts/messages/message_template.msg
+++ b/scripts/messages/message_template.msg
@@ -5668,6 +5668,14 @@ version 2.0
 		{	Message			Variable	2	}
 		{	BinaryBucket	Variable	2	}
 	}
+	{
+		EstateBlock			Single
+		{	EstateID		U32	}
+	}
+	{
+		MetaData			Variable
+		{	Data			Variable	2	}
+	}
 }
 
 // RetrieveInstantMessages - used to get instant messages that
diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1
index eb436d0627..f7f26d3cf6 100755
--- a/scripts/messages/message_template.msg.sha1
+++ b/scripts/messages/message_template.msg.sha1
@@ -1 +1 @@
-b98fc0af5fa88601f5afa4f3c83f08188316e9a8
\ No newline at end of file
+0d9706a9dfe23358140642a21db48980b3d016b2
\ No newline at end of file
-- 
cgit v1.2.3


From 1f4b1dc174625d32bfdbd0e93847bd478f06f47f Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 23 Oct 2024 11:31:29 -0700
Subject: Issue #2907: Code review comments.

---
 indra/newview/llimprocessing.cpp | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 5d1317f00f..f5b149335b 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -453,7 +453,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
         LLMuteList::isLinden(name);
 
     /***
-    * The simulator has flagged this sender as a bot, if the viewer would like to display
+    * The simulator may have flagged this sender as a bot, if the viewer would like to display
     * the chat text in a different color or font, the below code is how the viewer can
     * tell if the sender is a bot.
     *-----------------------------------------------------
@@ -465,14 +465,12 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
     *-----------------------------------------------------
     */
 
-    bool is_system_notice = false;
-    std::string notice_id;
+    std::string notice_name;
     LLSD notice_args;
     if (metadata.has("notice"))
     {   // The server has injected a notice into the IM conversation.
         // These will be things like bot notifications, etc.
-        is_system_notice = true;
-        notice_id = metadata["notice"]["id"].asString();
+        notice_name = metadata["notice"]["id"].asString();
         notice_args = metadata["notice"]["data"];
     }
 
@@ -605,10 +603,10 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
                         }
                     }
 
-                    if (is_system_notice)
+                    if (!notice_name.empty())
                     {   // The simulator has injected some sort of notice into the conversation.
                         // findString will only replace the contents of buffer if the notice_id is found.
-                        LLTrans::findString(buffer, notice_id, notice_args);
+                        LLTrans::findString(buffer, notice_name, notice_args);
                         name   = SYSTEM_FROM;
                         from_id = LLUUID::null;
                     }
-- 
cgit v1.2.3