implemented EXT-2889 "Incoming "grant modify rights" message should trigger

notify toast and adding record to IM history";
fixed avatar icon in IM-floater when message added to IM-session;
avoided popup of IM-tast when message added to IM-session;

--HG--
branch : product-engine
master
Alexei Arabadji 2009-11-28 17:43:21 +02:00
parent 1cc80c60ca
commit f0426b924f
9 changed files with 139 additions and 39 deletions

View File

@ -292,6 +292,7 @@ set(viewer_SOURCE_FILES
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
llnotificationhandlerutil.cpp
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp

View File

@ -633,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
{
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
{
std::string first, last;
std::string name;
LLSD args;
if(gCacheName->getName(agent_id, first, last))
if(gCacheName->getFullName(agent_id, name))
{
args["FIRST_NAME"] = first;
args["LAST_NAME"] = last;
args["NAME"] = name;
}
LLSD payload;
payload["from_id"] = agent_id;
if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
{
LLNotificationsUtil::add("GrantedModifyRights",args);
LLNotificationsUtil::add("GrantedModifyRights",args, payload);
}
else
{
LLNotificationsUtil::add("RevokedModifyRights",args);
LLNotificationsUtil::add("RevokedModifyRights",args, payload);
}
}
(mBuddyInfo[agent_id])->setRightsFrom(new_rights);

View File

@ -476,19 +476,17 @@ bool LLIMModel::proccessOnlineOfflineNotification(
}
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
const std::string& utf8_text, bool log2file /* = true */) {
const std::string& utf8_text, bool log2file /* = true */)
{
LLIMSession* session = findIMSession(session_id);
if (!session)
if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
return false;
}
addToHistory(session_id, from, from_id, utf8_text);
if (log2file) logToFile(session_id, from, from_id, utf8_text);
session->mNumUnread++;
addMessageSilently(*session, from, from_id, utf8_text, log2file);
// notify listeners
LLSD arg;
@ -503,6 +501,15 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
return true;
}
void LLIMModel::addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& from_id,
const std::string& utf8_text, bool log2file /* = true */)
{
addToHistory(session.mSessionID, from, from_id, utf8_text);
if (log2file) logToFile(session.mSessionID, from, from_id, utf8_text);
session.mNumUnread++;
}
const std::string& LLIMModel::getName(const LLUUID& session_id) const
{

View File

@ -145,6 +145,11 @@ public:
*/
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
/**
* Adds message without new message notification.
*/
void addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
/**
* Add a system message to an IM Model
*/

View File

@ -39,6 +39,7 @@
//#include "llnotificationsutil.h"
#include "llchannelmanager.h"
#include "llchat.h"
#include "llnotificationptr.h"
namespace LLNotificationsUI
{
@ -256,6 +257,20 @@ protected:
void onRejectToast(LLUUID& id);
};
class LLHandlerUtil
{
public:
/**
* Checks sufficient conditions to log notification message to IM session.
*/
static bool canLogToIM(const LLNotificationPtr& notification);
/**
* Writes notification message to IM session.
*/
static void logToIM(const LLNotificationPtr& notification);
};
}
#endif

View File

@ -0,0 +1,88 @@
/**
* @file llnotificationofferhandler.cpp
* @brief Provides set of utility methods for notifications processing.
*
* $LicenseInfo:firstyear=2000&license=viewergpl$
*
* Copyright (c) 2000-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h" // must be first include
#include "llnotificationhandler.h"
#include "llnotifications.h"
#include "llimview.h"
using namespace LLNotificationsUI;
const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
"ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
"ObjectGiveItemUnknownUser");
// static
bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
{
return GRANTED_MODIFY_RIGHTS == notification->getName()
|| REVOKED_MODIFY_RIGHTS == notification->getName();
}
// static
void LLHandlerUtil::logToIM(const LLNotificationPtr& notification)
{
// add message to IM
const std::string
name =
notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
: notification->getSubstitutions()["[NAME]"];
// don't create IM session with objects, it's necessary condition to log
if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
!= OBJECT_GIVE_ITEM_UNKNOWN_USER)
{
LLUUID from_id = notification->getPayload()["from_id"];
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
from_id);
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
if (session == NULL)
{
session_id = LLIMMgr::instance().addSession(name,
IM_NOTHING_SPECIAL, from_id);
session = LLIMModel::instance().findIMSession(session_id);
}
if (session == NULL)
{
llerrs << "session " << session_id << "does not exist " << llendl;
return;
}
LLIMModel::instance().addMessageSilently(*session, name, from_id,
notification->getMessage());
}
}

View File

@ -37,8 +37,6 @@
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llimview.h"
#include "llimfloater.h"
#include "llnotificationmanager.h"
#include "llnotifications.h"
@ -92,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
// add message to IM
const std::string
name =
notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
: notification->getSubstitutions()["[NAME]"];
// don't create IM session with objects
if (notification->getName() != "ObjectGiveItem"
&& notification->getName() != "ObjectGiveItemUnknownUser")
{
LLUUID from_id = notification->getPayload()["from_id"];
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
from_id);
if (!LLIMMgr::instance().hasSession(session_id))
{
session_id = LLIMMgr::instance().addSession(name,
IM_NOTHING_SPECIAL, from_id);
}
LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
notification->getMessage());
}
LLHandlerUtil::logToIM(notification);
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);

View File

@ -96,6 +96,11 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
if (LLHandlerUtil::canLogToIM(notification))
{
LLHandlerUtil::logToIM(notification);
}
if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
{
LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());

View File

@ -2382,15 +2382,15 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="GrantedModifyRights"
type="alertmodal">
[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
type="notify">
[NAME] has given you permission to edit their objects.
</notification>
<notification
icon="alertmodal.tga"
name="RevokedModifyRights"
type="alertmodal">
Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
type="notify">
Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
<notification