#4385 show agent name next to @ mention url in chat logs

master
Maxim Nikolenko 2025-07-29 18:47:44 +03:00 committed by GitHub
parent 3b8b408b90
commit 514b658fde
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 3 deletions

View File

@ -142,6 +142,16 @@ void LLUrlAction::copyLabelToClipboard(std::string url)
}
}
std::string LLUrlAction::getURLLabel(std::string url)
{
LLUrlMatch match;
if (LLUrlRegistry::instance().findUrl(url, match))
{
return match.getLabel();
}
return "";
}
void LLUrlAction::showProfile(std::string url)
{
// Get id from 'secondlife:///app/{cmd}/{id}/{action}'

View File

@ -72,6 +72,8 @@ public:
/// copy a Url to the clipboard
static void copyURLToClipboard(std::string url);
static std::string getURLLabel(std::string url);
/// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
static void showProfile(std::string url);
static std::string getUserID(std::string url);

View File

@ -42,8 +42,6 @@
#include "message.h"
#include "llexperiencecache.h"
#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
// Utility functions
std::string localize_slapp_label(const std::string& url, const std::string& full_name);

View File

@ -42,6 +42,8 @@
class LLAvatarName;
#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
typedef boost::signals2::signal<void (const std::string& url,
const std::string& label,
const std::string& icon)> LLUrlLabelSignal;

View File

@ -32,6 +32,8 @@
#include "lllogchat.h"
#include "llregex.h"
#include "lltrans.h"
#include "llurlaction.h"
#include "llurlentry.h"
#include "llviewercontrol.h"
#include "lldiriterator.h"
@ -358,13 +360,29 @@ void LLLogChat::saveHistory(const std::string& filename,
return;
}
std::string altered_line = line;
// avoid costly regex calls
if (line.find("/mention") != std::string::npos)
{
static const boost::regex mention_regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase);
// replace mention URL with [@username](URL)
altered_line = boost::regex_replace(line, mention_regex, [](const boost::smatch& match) -> std::string
{
std::string url = match[0].str();
std::string username = LLUrlAction::getURLLabel(url);
return "[" + username + "](" + url + ")";
});
}
LLSD item;
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
item["time"] = LLLogChat::timestamp2LogString(0, gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
item["from_id"] = from_id;
item["message"] = line;
item["message"] = altered_line;
//adding "Second Life:" for all system messages to make chat log history parsing more reliable
if (from.empty() && from_id.isNull())
@ -470,6 +488,19 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
std::string line(remove_utf8_bom(buffer));
// fast heuristic test for a mention URL in a string
// this is used to avoid costly regex calls
if (line.find("/mention)") != std::string::npos)
{
// restore original mention URL from [@username](URL) format
static const boost::regex altered_mention_regex("\\[@([^\\]]+)\\]\\((" APP_HEADER_REGEX "/agent/[\\da-f-]+/mention)\\)",
boost::regex::perl | boost::regex::icase);
// $2 captures the URL part
line = boost::regex_replace(line, altered_mention_regex, "$2");
}
//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
{