Files
2024-05-20 23:46:53 +02:00

203 lines
5.4 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file exogroupmutelist.cpp
* @brief Persistently stores groups to ignore.
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Copyright (C) 2012 Katharine Berry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "exogroupmutelist.h"
#include "llagent.h"
#include "lldir.h"
#include "llfile.h"
#include "llgroupactions.h"
#include "llimview.h"
#include "llmutelist.h"
#include "llsdserialize.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
exoGroupMuteList::exoGroupMuteList()
: mMuted()
{
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
loadMuteList();
}
#endif
}
bool exoGroupMuteList::isMuted(const LLUUID& group) const
{
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
return mMuted.count(group);
}
#endif
return (bool)LLMuteList::instance().isMuted(LLUUID::null, getMutelistString(group));
}
bool exoGroupMuteList::isLoaded() const
{
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
return true;
}
#endif
return LLMuteList::instance().isLoaded();
}
void exoGroupMuteList::add(const LLUUID& group)
{
LLGroupActions::endIM(group); // Actually kill ongoing conversation
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
if (mMuted.insert(group).second)
{
saveMuteList();
}
return;
}
#endif
LLMuteList::instance().add(LLMute(LLUUID::null, getMutelistString(group), LLMute::BY_NAME));
}
void exoGroupMuteList::remove(const LLUUID& group)
{
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
if (mMuted.erase(group))
{
saveMuteList();
}
return;
}
#endif
LLMuteList::instance().remove(LLMute(LLUUID::null, getMutelistString(group), LLMute::BY_NAME));
}
bool exoGroupMuteList::loadMuteList()
{
std::string path = getFilePath();
if (!LLFile::isfile(path))
{
// We consider the absence of a mute file to be a successful load
// because it won't exist if the user's never muted a group.
LL_INFOS("GroupMute") << "Mute file doesn't exist; skipping load." << LL_ENDL;
return true;
}
llifstream file(path.c_str());
if (!file.is_open())
{
LL_WARNS("GroupMute") << "Failed to open group muting list." << LL_ENDL;
return false;
}
LLSD data;
LLSDSerialize::fromXMLDocument(data, file);
file.close();
std::copy(data.beginArray(), data.endArray(), inserter(mMuted, mMuted.begin()));
return true;
}
bool exoGroupMuteList::saveMuteList()
{
LLSD data;
// LLSD doesn't seem to expose insertion using iterators.
for (auto& it : mMuted)
{
data.append(it);
}
llofstream file(getFilePath().c_str());
if (!file.is_open())
{
LL_WARNS("GroupMute") << "Unable to save group muting list!" << LL_ENDL;
return false;
}
LLSDSerialize::toPrettyXML(data, file);
file.close();
return true;
}
std::string exoGroupMuteList::getFilePath() const
{
return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "muted_groups.xml");
}
void exoGroupMuteList::addDeferredGroupChat(const LLUUID& group)
{
if (mDeferredGroupChatSessionIDs.find(group) == mDeferredGroupChatSessionIDs.end())
{
mDeferredGroupChatSessionIDs.insert(group);
}
}
bool exoGroupMuteList::restoreDeferredGroupChat(const LLUUID& group)
{
if (!isLoaded())
{
return false;
}
auto groupIt = mDeferredGroupChatSessionIDs.find(group);
if (groupIt != mDeferredGroupChatSessionIDs.end())
{
mDeferredGroupChatSessionIDs.erase(groupIt);
LLGroupData groupData;
if (gAgent.getGroupData(group, groupData))
{
if (!isMuted(group))
{
LL_INFOS() << "Restoring group chat from " << groupData.mName << " (" << group.asString() << ")" << LL_ENDL;
gIMMgr->addSession(groupData.mName, IM_SESSION_INVITE, group);
uuid_vec_t ids;
LLIMModel::sendStartSession(group, group, ids, IM_SESSION_GROUP_START, true);
if (!gAgent.isDoNotDisturb() && gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession") != 0)
{
make_ui_sound("UISndNewIncomingGroupIMSession");
}
return true;
}
else
{
LL_INFOS() << "NOT restoring group chat from " << groupData.mName << " (" << group.asString() << ") because the group is muted" << LL_ENDL;
gIMMgr->clearPendingInvitation(group);
gIMMgr->clearPendingAgentListUpdates(group);
LLIMModel::getInstance()->sendLeaveSession(group, group);
return false;
}
}
}
return false;
}
std::string exoGroupMuteList::getMutelistString(const LLUUID& group) const
{
return std::string("Group:" + group.asString());
}