Partial display name support in money transaction notifications

master
James Cook 2010-04-30 17:32:27 -07:00
parent ea7d6eab6f
commit 831dd9ca40
4 changed files with 196 additions and 165 deletions

View File

@ -116,8 +116,7 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
"ObjectGiveItem"),
PAYMENT_RECEIVED("PaymentReceived"),
// PAYMENT_RECEIVED_FOR("PaymentReceivedFor"),
// PAYMENT_SENT("PaymentSent"),
PAYMENT_SENT("PaymentSent"),
ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"),
USER_GIVE_ITEM("UserGiveItem"),
INVENTORY_ACCEPTED("InventoryAccepted"),
@ -139,8 +138,7 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
return GRANTED_MODIFY_RIGHTS == notification->getName()
|| REVOKED_MODIFY_RIGHTS == notification->getName()
|| PAYMENT_RECEIVED == notification->getName()
// || PAYMENT_RECEIVED_FOR == notification->getName()
// || PAYMENT_SENT == notification->getName()
|| PAYMENT_SENT == notification->getName()
|| OFFER_FRIENDSHIP == notification->getName()
|| FRIENDSHIP_OFFERED == notification->getName()
|| FRIENDSHIP_ACCEPTED == notification->getName()

View File

@ -132,6 +132,8 @@ extern BOOL gDebugClicks;
// function prototypes
bool check_offer_throttle(const std::string& from_name, bool check_only);
static void process_money_balance_reply_extended(LLMessageSystem* msg);
static void process_money_balance_reply_legacy(const std::string& desc);
//inventory offer throttle globals
LLFrameTimer gThrottleTimer;
@ -4588,14 +4590,66 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
S32 credit = 0;
S32 committed = 0;
std::string desc;
LLUUID tid;
msg->getUUID("MoneyData", "TransactionID", tid);
msg->getS32("MoneyData", "MoneyBalance", balance);
msg->getS32("MoneyData", "SquareMetersCredit", credit);
msg->getS32("MoneyData", "SquareMetersCommitted", committed);
msg->getStringFast(_PREHASH_MoneyData, _PREHASH_Description, desc);
LL_INFOS("Messaging") << "L$, credit, committed: " << balance << " " << credit << " "
<< committed << LL_ENDL;
if (gStatusBar)
{
gStatusBar->setBalance(balance);
gStatusBar->setLandCredit(credit);
gStatusBar->setLandCommitted(committed);
}
if (desc.empty()
|| !gSavedSettings.getBOOL("NotifyMoneyChange"))
{
// ...nothing to display
return;
}
// Suppress duplicate messages about the same transaction
static std::deque<LLUUID> recent;
if (std::find(recent.rbegin(), recent.rend(), tid) != recent.rend())
{
return;
}
// Once the 'recent' container gets large enough, chop some
// off the beginning.
const U32 MAX_LOOKBACK = 30;
const S32 POP_FRONT_SIZE = 12;
if(recent.size() > MAX_LOOKBACK)
{
LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL;
recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE);
}
//LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL;
recent.push_back(tid);
if (msg->has("TransactionInfo"))
{
// JAMESDEBUG TODO - for test, do both!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
process_money_balance_reply_legacy(desc);
// ...message has extended info for localization
process_money_balance_reply_extended(msg);
}
else
{
// *NOTE: Can remove this after server 1.40 is widely deployed.
process_money_balance_reply_legacy(desc);
}
}
static void process_money_balance_reply_extended(LLMessageSystem* msg)
{
// Added in server 1.40 and viewer 2.1, support for localization
// and agent ids for name lookup.
S32 transaction_type = 0;
@ -4605,165 +4659,152 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
BOOL is_dest_group = FALSE;
S32 amount = 0;
std::string item_description;
if (msg->has("TransactionInfo"))
{
msg->getS32("TransactionInfo", "TransactionType", transaction_type);
msg->getUUID("TransactionInfo", "SourceID", source_id);
msg->getBOOL("TransactionInfo", "IsSourceGroup", is_source_group);
msg->getUUID("TransactionInfo", "DestID", dest_id);
msg->getBOOL("TransactionInfo", "IsDestGroup", is_dest_group);
msg->getS32("TransactionInfo", "Amount", amount);
msg->getString("TransactionInfo", "ItemDescription", item_description);
LL_DEBUGS("Money") << "MoneyBalanceReply source " << source_id
<< " dest " << dest_id
<< " item " << item_description << LL_ENDL;
}
if (gStatusBar)
{
// S32 old_balance = gStatusBar->getBalance();
// This is an update, not the first transmission of balance
/* if (old_balance != 0)
{
// this is actually an update
if (balance > old_balance)
{
LLFirstUse::useBalanceIncrease(balance - old_balance);
}
else if (balance < old_balance)
{
LLFirstUse::useBalanceDecrease(balance - old_balance);
}
}
*/
gStatusBar->setBalance(balance);
gStatusBar->setLandCredit(credit);
gStatusBar->setLandCommitted(committed);
}
msg->getS32("TransactionInfo", "TransactionType", transaction_type);
msg->getUUID("TransactionInfo", "SourceID", source_id);
msg->getBOOL("TransactionInfo", "IsSourceGroup", is_source_group);
msg->getUUID("TransactionInfo", "DestID", dest_id);
msg->getBOOL("TransactionInfo", "IsDestGroup", is_dest_group);
msg->getS32("TransactionInfo", "Amount", amount);
msg->getString("TransactionInfo", "ItemDescription", item_description);
LL_INFOS("Money") << "MoneyBalanceReply source " << source_id
<< " dest " << dest_id
<< " type " << transaction_type
<< " item " << item_description << LL_ENDL;
LLUUID tid;
msg->getUUID("MoneyData", "TransactionID", tid);
static std::deque<LLUUID> recent;
if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange")
&& (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend()))
{
// Make the user confirm the transaction, since they might
// have missed something during an event.
// *TODO: Translate
LLSD args;
// this is a marker to retrieve avatar name from server message:
// "<avatar name> paid you L$"
const std::string marker = "paid you L$";
args["MESSAGE"] = desc;
// extract avatar name from system message
S32 marker_pos = desc.find(marker, 0);
std::string base_name = desc.substr(0, marker_pos);
std::string name = base_name;
LLStringUtil::trim(name);
// if name extracted and name cache contains avatar id send loggable notification
LLUUID from_id;
if(name.size() > 0 && gCacheName->getUUID(name, from_id))
{
//description always comes not localized. lets fix this
//ammount paid
std::string ammount = desc.substr(marker_pos + marker.length(),desc.length() - marker.length() - marker_pos);
const char* source_type = (is_source_group ? "group" : "agent");
std::string source_slurl =
LLSLURL::buildCommand( source_type, source_id, "about");
//reform description
LLStringUtil::format_map_t str_args;
str_args["NAME"] = LLCacheName::cleanFullName(name);
str_args["AMOUNT"] = ammount;
std::string new_description = LLTrans::getString("paid_you_ldollars", str_args);
const char* dest_type = (is_dest_group ? "group" : "agent");
std::string dest_slurl =
LLSLURL::buildCommand( dest_type, dest_id, "about");
args["MESSAGE"] = new_description;
args["NAME"] = LLCacheName::cleanFullName(name);
LLSD payload;
payload["from_id"] = from_id;
LLNotificationsUtil::add("PaymentReceived", args, payload);
}
//AD *HACK: Parsing incoming string to localize messages that come from server! EXT-5986
// It's only a temporarily and ineffective measure. It doesn't affect performance much
// because we get here only for specific type of messages, but anyway it is not right to do it!
// *TODO: Server-side changes should be made and this code removed.
else
{
if(desc.find("You paid")==0)
{
// Regular expression for message parsing- change it in case of server-side changes.
// Each set of parenthesis will later be used to find arguments of message we generate
// in the end of this if- (.*) gives us name of money receiver, (\\d+)-amount of money we pay
// and ([^$]*)- reason of payment
boost::regex expr("You paid (?:.{0}|(.*) )L\\$(\\d+)\\s?([^$]*)\\.");
boost::match_results <std::string::const_iterator> matches;
if(boost::regex_match(desc, matches, expr))
{
// Name of full localizable notification string
// there are three types of this string- with name of receiver and reason of payment,
// without name and without reason (but not simultaneously)
// example of string without name - You paid L$100 to create a group.
// example of string without reason - You paid Smdby Linden L$100.
// example of string with reason and name - You paid Smbdy Linden L$100 for a land access pass.
std::string line = "you_paid_ldollars_no_name";
//
//
// JAMESDEBUG TODO HERE!!!
//
//
// arguments of string which will be in notification
LLStringUtil::format_map_t str_args;
// extracting amount of money paid (without L$ symbols). It is always present.
str_args["[AMOUNT]"] = std::string(matches[2]);
// extracting name of person/group you are paying (it may be absent)
std::string name = std::string(matches[1]);
if(!name.empty())
{
str_args["[NAME]"] = LLCacheName::cleanFullName(name);
line = "you_paid_ldollars";
}
// extracting reason of payment (it may be absent)
std::string reason = std::string(matches[3]);
if (reason.empty())
{
line = "you_paid_ldollars_no_reason";
}
else
{
std::string localized_reason;
// if we haven't found localized string for reason of payment leave it as it was
str_args["[REASON]"] = LLTrans::findString(localized_reason, reason) ? localized_reason : reason;
}
// forming final message string by retrieving localized version from xml
// and applying previously found arguments
line = LLTrans::getString(line, str_args);
args["MESSAGE"] = line;
}
}
LLNotificationsUtil::add("SystemMessage", args);
}
// Once the 'recent' container gets large enough, chop some
// off the beginning.
const U32 MAX_LOOKBACK = 30;
const S32 POP_FRONT_SIZE = 12;
if(recent.size() > MAX_LOOKBACK)
{
LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL;
recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE);
}
//LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL;
recent.push_back(tid);
switch (transaction_type)
{
case TRANS_OBJECT_SALE:
case TRANS_LAND_SALE:
case TRANS_LAND_PASS_SALE:
case TRANS_GROUP_LAND_DEED:
case TRANS_GROUP_CREATE:
case TRANS_GROUP_JOIN:
case TRANS_UPLOAD_CHARGE:
default:
llinfos << "HERE!" << llendl;
break;
}
}
// *NOTE: This can be removed after server 1.40 is widely deployed, as it will
// send an extra TransactionInfo block to allow proper localization.
static void process_money_balance_reply_legacy(const std::string& desc)
{
LLSD args;
// this is a marker to retrieve avatar name from server message:
// "<avatar name> paid you L$"
const std::string marker = "paid you L$";
args["MESSAGE"] = desc;
// extract avatar name from system message
S32 marker_pos = desc.find(marker, 0);
std::string base_name = desc.substr(0, marker_pos);
std::string name = base_name;
LLStringUtil::trim(name);
// if name extracted and name cache contains avatar id send loggable notification
LLUUID from_id;
if(name.size() > 0 && gCacheName->getUUID(name, from_id))
{
//description always comes not localized. lets fix this
//ammount paid
std::string ammount = desc.substr(marker_pos + marker.length(),desc.length() - marker.length() - marker_pos);
//reform description
LLStringUtil::format_map_t str_args;
str_args["NAME"] = LLCacheName::cleanFullName(name);
str_args["AMOUNT"] = ammount;
std::string new_description = LLTrans::getString("paid_you_ldollars", str_args);
args["MESSAGE"] = new_description;
args["NAME"] = LLCacheName::cleanFullName(name);
LLSD payload;
payload["from_id"] = from_id;
LLNotificationsUtil::add("PaymentReceived", args, payload);
}
//AD *HACK: Parsing incoming string to localize messages that come from server! EXT-5986
// It's only a temporarily and ineffective measure. It doesn't affect performance much
// because we get here only for specific type of messages, but anyway it is not right to do it!
// *TODO: Server-side changes should be made and this code removed.
else
{
if(desc.find("You paid")==0)
{
// Regular expression for message parsing- change it in case of server-side changes.
// Each set of parenthesis will later be used to find arguments of message we generate
// in the end of this if- (.*) gives us name of money receiver, (\\d+)-amount of money we pay
// and ([^$]*)- reason of payment
boost::regex expr("You paid (?:.{0}|(.*) )L\\$(\\d+)\\s?([^$]*)\\.");
boost::match_results <std::string::const_iterator> matches;
if(boost::regex_match(desc, matches, expr))
{
// Name of full localizable notification string
// there are three types of this string- with name of receiver and reason of payment,
// without name and without reason (but not simultaneously)
// example of string without name - You paid L$100 to create a group.
// example of string without reason - You paid Smdby Linden L$100.
// example of string with reason and name - You paid Smbdy Linden L$100 for a land access pass.
std::string line = "you_paid_ldollars_no_name";
// arguments of string which will be in notification
LLStringUtil::format_map_t str_args;
// extracting amount of money paid (without L$ symbols). It is always present.
str_args["[AMOUNT]"] = std::string(matches[2]);
// extracting name of person/group you are paying (it may be absent)
std::string name = std::string(matches[1]);
if(!name.empty())
{
str_args["[NAME]"] = LLCacheName::cleanFullName(name);
line = "you_paid_ldollars";
}
// extracting reason of payment (it may be absent)
std::string reason = std::string(matches[3]);
if (reason.empty())
{
line = "you_paid_ldollars_no_reason";
}
else
{
std::string localized_reason;
// if we haven't found localized string for reason of payment leave it as it was
str_args["[REASON]"] = LLTrans::findString(localized_reason, reason) ? localized_reason : reason;
}
// forming final message string by retrieving localized version from xml
// and applying previously found arguments
line = LLTrans::getString(line, str_args);
args["MESSAGE"] = line;
}
}
LLNotificationsUtil::add("SystemMessage", args);
}
}
bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);

View File

@ -4686,21 +4686,12 @@ Please select at least one type of content to search (General, Moderate, or Adul
[MESSAGE]
</notification>
<!--
<notification
icon="notify.tga"
name="PaymentReceivedFor"
type="notify">
[NAME] paid you L$[AMOUNT] for [REASON].
</notification>
<notification
icon="notify.tga"
name="PaymentSent"
type="notify">
You paid [NAME] L$[AMOUNT][REASON].
[MESSAGE]
</notification>
-->
<notification
icon="notify.tga"

View File

@ -3054,6 +3054,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string>
<string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string>
<string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string>
<string name="for item">for [ITEM]</string>
<string name="for a parcel of land">for a parcel of land</string>
<string name="for a land access pass">for a land access pass</string>
<string name="for deeding land">for deeding land</string>