llmutelist.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmutelist.h
  3.  * @brief Management of list of muted players
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_MUTELIST_H
  33. #define LL_MUTELIST_H
  34. #include "llstring.h"
  35. #include "lluuid.h"
  36. class LLViewerObject;
  37. class LLMessageSystem;
  38. class LLMuteListObserver;
  39. // An entry in the mute list.
  40. class LLMute
  41. {
  42. public:
  43. // Legacy mutes are BY_NAME and have null UUID.
  44. enum EType { BY_NAME = 0, AGENT = 1, OBJECT = 2, GROUP = 3, COUNT = 4 };
  45. // Bits in the mute flags.  For backwards compatibility (since any mute list entries that were created before the flags existed
  46. // will have a flags field of 0), some of the flags are "inverted".
  47. // Note that it's possible, through flags, to completely disable an entry in the mute list.  The code should detect this case
  48. // and remove the mute list entry instead.
  49. enum 
  50. {
  51. flagTextChat = 0x00000001, // If set, don't mute user's text chat
  52. flagVoiceChat = 0x00000002, // If set, don't mute user's voice chat
  53. flagParticles = 0x00000004, // If set, don't mute user's particles
  54. flagObjectSounds  = 0x00000008, // If set, mute user's object sounds
  55. flagAll = 0x0000000F // Mask of all currently defined flags
  56. };
  57. LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0);
  58. // Returns name + suffix based on type
  59. // For example:  "James Tester (resident)"
  60. std::string getDisplayName() const;
  61. // Converts a UI name into just the agent or object name
  62. // For example: "James Tester (resident)" sets the name to "James Tester"
  63. // and the type to AGENT.
  64. void setFromDisplayName(const std::string& display_name);
  65. public:
  66. LLUUID mID; // agent or object id
  67. std::string mName; // agent or object name
  68. EType mType; // needed for UI display of existing mutes
  69. U32 mFlags; // flags pertaining to this mute entry
  70. };
  71. class LLMuteList : public LLSingleton<LLMuteList>
  72. {
  73. public:
  74. // reasons for auto-unmuting a resident
  75. enum EAutoReason 
  76. AR_IM = 0, // agent IMed a muted resident
  77. AR_MONEY = 1, // agent paid L$ to a muted resident
  78. AR_INVENTORY = 2, // agent offered inventory to a muted resident
  79. AR_COUNT // enum count
  80. };
  81. LLMuteList();
  82. ~LLMuteList();
  83. // Implemented locally so that we can perform some delayed initialization. 
  84. // Callers should be careful to call this one and not LLSingleton<LLMuteList>::getInstance()
  85. // which would circumvent that mechanism. -MG
  86. static LLMuteList* getInstance();
  87. void addObserver(LLMuteListObserver* observer);
  88. void removeObserver(LLMuteListObserver* observer);
  89. // Add either a normal or a BY_NAME mute, for any or all properties.
  90. BOOL add(const LLMute& mute, U32 flags = 0);
  91. // Remove both normal and legacy mutes, for any or all properties.
  92. BOOL remove(const LLMute& mute, U32 flags = 0);
  93. BOOL autoRemove(const LLUUID& agent_id, const EAutoReason reason, const std::string& first_name = LLStringUtil::null, const std::string& last_name = LLStringUtil::null);
  94. // Name is required to test against legacy text-only mutes.
  95. BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
  96. // Alternate (convenience) form for places we don't need to pass the name, but do need flags
  97. BOOL isMuted(const LLUUID& id, U32 flags) const { return isMuted(id, LLStringUtil::null, flags); };
  98. BOOL isLinden(const std::string& name) const;
  99. BOOL isLoaded() const { return mIsLoaded; }
  100. std::vector<LLMute> getMutes() const;
  101. // request the mute list
  102. void requestFromServer(const LLUUID& agent_id);
  103. // call this method on logout to save everything.
  104. void cache(const LLUUID& agent_id);
  105. private:
  106. BOOL loadFromFile(const std::string& filename);
  107. BOOL saveToFile(const std::string& filename);
  108. void setLoaded();
  109. void notifyObservers();
  110. void updateAdd(const LLMute& mute);
  111. void updateRemove(const LLMute& mute);
  112. // TODO: NULL out mute_id in database
  113. static void processMuteListUpdate(LLMessageSystem* msg, void**);
  114. static void processUseCachedMuteList(LLMessageSystem* msg, void**);
  115. static void onFileMuteList(void** user_data, S32 code, LLExtStat ext_status);
  116. private:
  117. struct compare_by_name
  118. {
  119. bool operator()(const LLMute& a, const LLMute& b) const
  120. {
  121. std::string name1 = a.mName;
  122. std::string name2 = b.mName;
  123. LLStringUtil::toUpper(name1);
  124. LLStringUtil::toUpper(name2);
  125. return name1 < name2;
  126. }
  127. };
  128. struct compare_by_id
  129. {
  130. bool operator()(const LLMute& a, const LLMute& b) const
  131. {
  132. return a.mID < b.mID;
  133. }
  134. };
  135. typedef std::set<LLMute, compare_by_id> mute_set_t;
  136. mute_set_t mMutes;
  137. typedef std::set<std::string> string_set_t;
  138. string_set_t mLegacyMutes;
  139. typedef std::set<LLMuteListObserver*> observer_set_t;
  140. observer_set_t mObservers;
  141. BOOL mIsLoaded;
  142. friend class LLDispatchEmptyMuteList;
  143. };
  144. class LLMuteListObserver
  145. {
  146. public:
  147. virtual ~LLMuteListObserver() { }
  148. virtual void onChange() = 0;
  149. };
  150. #endif //LL_MUTELIST_H