diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs | 181 |
1 files changed, 139 insertions, 42 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs index d9730dd..6cc622e 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Concierge/ConciergeModule.cs | |||
@@ -38,24 +38,28 @@ using OpenMetaverse; | |||
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Region.Environment.Interfaces; | 39 | using OpenSim.Region.Environment.Interfaces; |
40 | using OpenSim.Region.Environment.Scenes; | 40 | using OpenSim.Region.Environment.Scenes; |
41 | using OpenSim.Region.Environment.Modules.Avatar.Chat; | ||
41 | 42 | ||
42 | namespace OpenSim.Region.Environment.Modules.Avatar.Concierge | 43 | namespace OpenSim.Region.Environment.Modules.Avatar.Concierge |
43 | { | 44 | { |
44 | public class ConciergeModule : IRegionModule | 45 | public class ConciergeModule : ChatModule, IRegionModule |
45 | { | 46 | { |
46 | private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
47 | 48 | ||
48 | private const int DEBUG_CHANNEL = 2147483647; | 49 | private const int DEBUG_CHANNEL = 2147483647; |
49 | 50 | ||
50 | private int _conciergeChannel = 42; | 51 | private int _conciergeChannel = 42; |
51 | private List<Scene> _scenes = new List<Scene>(); | 52 | private List<IScene> _scenes = new List<IScene>(); |
53 | private List<IScene> _conciergedScenes = new List<IScene>(); | ||
52 | private IConfig _config; | 54 | private IConfig _config; |
53 | private string _whoami = "conferencier"; | 55 | private string _whoami = "conferencier"; |
56 | private bool _replacingChatModule = false; | ||
57 | private Regex _regions = null; | ||
54 | 58 | ||
55 | internal object _syncy = new object(); | 59 | internal object _syncy = new object(); |
56 | 60 | ||
57 | #region IRegionModule Members | 61 | #region IRegionModule Members |
58 | public void Initialise(Scene scene, IConfigSource config) | 62 | public override void Initialise(Scene scene, IConfigSource config) |
59 | { | 63 | { |
60 | try | 64 | try |
61 | { | 65 | { |
@@ -78,25 +82,58 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Concierge | |||
78 | return; | 82 | return; |
79 | } | 83 | } |
80 | 84 | ||
81 | if (_config != null) | 85 | // check whether ChatModule has been disabled: if yes, |
86 | // then we'll "stand in" | ||
87 | try | ||
88 | { | ||
89 | if (config.Configs["Chat"] == null) | ||
90 | { | ||
91 | _replacingChatModule = false; | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | _replacingChatModule = !config.Configs["Chat"].GetBoolean("enabled", true); | ||
96 | } | ||
97 | } | ||
98 | catch (Exception) | ||
82 | { | 99 | { |
83 | _conciergeChannel = config.Configs["Concierge"].GetInt("concierge_channel", _conciergeChannel); | 100 | _replacingChatModule = false; |
84 | _whoami = _config.GetString("whoami", "conferencier"); | ||
85 | } | 101 | } |
102 | _log.InfoFormat("[Concierge] {0} ChatModule", _replacingChatModule ? "replacing" : "not replacing"); | ||
103 | |||
104 | |||
105 | // take note of concierge channel and of identity | ||
106 | _conciergeChannel = config.Configs["Concierge"].GetInt("concierge_channel", _conciergeChannel); | ||
107 | _whoami = _config.GetString("whoami", "conferencier"); | ||
86 | _log.InfoFormat("[Concierge] reporting as \"{0}\" to our users", _whoami); | 108 | _log.InfoFormat("[Concierge] reporting as \"{0}\" to our users", _whoami); |
87 | 109 | ||
110 | // calculate regions Regex | ||
111 | if (_regions == null) | ||
112 | { | ||
113 | string regions = _config.GetString("regions", String.Empty); | ||
114 | if (!String.IsNullOrEmpty(regions)) | ||
115 | { | ||
116 | _regions = new Regex(regions, RegexOptions.Compiled | RegexOptions.IgnoreCase); | ||
117 | } | ||
118 | } | ||
119 | |||
88 | lock (_syncy) | 120 | lock (_syncy) |
89 | { | 121 | { |
90 | if (!_scenes.Contains(scene)) | 122 | if (!_scenes.Contains(scene)) |
91 | { | 123 | { |
92 | _scenes.Add(scene); | 124 | _scenes.Add(scene); |
125 | |||
126 | if (_regions.IsMatch(scene.RegionInfo.RegionName)) | ||
127 | _conciergedScenes.Add(scene); | ||
128 | |||
93 | // subscribe to NewClient events | 129 | // subscribe to NewClient events |
94 | scene.EventManager.OnNewClient += OnNewClient; | 130 | scene.EventManager.OnNewClient += OnNewClient; |
95 | scene.EventManager.OnNewClient += OnNewClient; | ||
96 | 131 | ||
97 | // subscribe to *Chat events and FilterChat* events | 132 | // subscribe to *Chat events |
98 | scene.EventManager.OnChatFromWorld += OnSimChat; | 133 | scene.EventManager.OnChatFromWorld += OnChatFromWorld; |
99 | scene.EventManager.OnChatBroadcast += OnSimBroadcast; | 134 | if (!_replacingChatModule) |
135 | scene.EventManager.OnChatFromClient += OnChatFromClient; | ||
136 | scene.EventManager.OnChatBroadcast += OnChatBroadcast; | ||
100 | 137 | ||
101 | // subscribe to agent change events | 138 | // subscribe to agent change events |
102 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; | 139 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; |
@@ -106,20 +143,20 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Concierge | |||
106 | _log.InfoFormat("[Concierge] initialized for {0}", scene.RegionInfo.RegionName); | 143 | _log.InfoFormat("[Concierge] initialized for {0}", scene.RegionInfo.RegionName); |
107 | } | 144 | } |
108 | 145 | ||
109 | public void PostInitialise() | 146 | public override void PostInitialise() |
110 | { | 147 | { |
111 | } | 148 | } |
112 | 149 | ||
113 | public void Close() | 150 | public override void Close() |
114 | { | 151 | { |
115 | } | 152 | } |
116 | 153 | ||
117 | public string Name | 154 | public override string Name |
118 | { | 155 | { |
119 | get { return "ConciergeModule"; } | 156 | get { return "ConciergeModule"; } |
120 | } | 157 | } |
121 | 158 | ||
122 | public bool IsSharedModule | 159 | public override bool IsSharedModule |
123 | { | 160 | { |
124 | get { return true; } | 161 | get { return true; } |
125 | } | 162 | } |
@@ -127,44 +164,90 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Concierge | |||
127 | #endregion | 164 | #endregion |
128 | 165 | ||
129 | #region ISimChat Members | 166 | #region ISimChat Members |
130 | public void OnSimBroadcast(Object sender, OSChatMessage c) | 167 | public override void OnChatBroadcast(Object sender, OSChatMessage c) |
131 | { | 168 | { |
132 | // log to buffer? | 169 | if (_replacingChatModule) |
170 | { | ||
171 | // distribute chat message to each and every avatar in | ||
172 | // the region | ||
173 | base.OnChatBroadcast(sender, c); | ||
174 | } | ||
175 | |||
176 | // TODO: capture logic | ||
133 | return; | 177 | return; |
134 | } | 178 | } |
135 | 179 | ||
136 | public void OnSimChat(Object sender, OSChatMessage c) | 180 | public override void OnChatFromClient(Object sender, OSChatMessage c) |
137 | { | 181 | { |
138 | if (_conciergeChannel == c.Channel) | 182 | if (_replacingChatModule) |
139 | { | ||
140 | // concierge request: interpret | ||
141 | return; | ||
142 | } | ||
143 | |||
144 | if (0 == c.Channel || DEBUG_CHANNEL == c.Channel) | ||
145 | { | 183 | { |
146 | // if (_amplify) | 184 | if (_conciergedScenes.Contains(c.Scene)) |
147 | // { | 185 | { |
148 | 186 | // replacing ChatModule: need to redistribute | |
149 | // } | 187 | // ChatFromClient to interested subscribers |
188 | Scene scene = (Scene)c.Scene; | ||
189 | scene.EventManager.TriggerOnChatFromClient(sender, c); | ||
190 | |||
191 | // when we are replacing ChatModule, we treat | ||
192 | // OnChatFromClient like OnChatBroadcast for | ||
193 | // concierged regions, effectively extending the | ||
194 | // range of chat to cover the whole | ||
195 | // region. however, we don't do this for whisper | ||
196 | // (got to have some privacy) | ||
197 | if (c.Type != ChatTypeEnum.Whisper) | ||
198 | { | ||
199 | base.OnChatBroadcast(sender, c); | ||
200 | return; | ||
201 | } | ||
202 | } | ||
150 | 203 | ||
151 | // log as avatar/prim chat | 204 | // redistribution will be done by base class |
152 | return; | 205 | base.OnChatFromClient(sender, c); |
153 | } | 206 | } |
154 | 207 | ||
208 | // TODO: capture chat | ||
155 | return; | 209 | return; |
156 | } | 210 | } |
157 | 211 | ||
212 | public override void OnChatFromWorld(Object sender, OSChatMessage c) | ||
213 | { | ||
214 | if (_replacingChatModule) | ||
215 | { | ||
216 | if (_conciergedScenes.Contains(c.Scene)) | ||
217 | { | ||
218 | // when we are replacing ChatModule, we treat | ||
219 | // OnChatFromClient like OnChatBroadcast for | ||
220 | // concierged regions, effectively extending the | ||
221 | // range of chat to cover the whole | ||
222 | // region. however, we don't do this for whisper | ||
223 | // (got to have some privacy) | ||
224 | if (c.Type != ChatTypeEnum.Whisper) | ||
225 | { | ||
226 | base.OnChatBroadcast(sender, c); | ||
227 | return; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | base.OnChatFromWorld(sender, c); | ||
232 | } | ||
233 | return; | ||
234 | } | ||
158 | #endregion | 235 | #endregion |
159 | 236 | ||
160 | 237 | ||
161 | public void OnNewClient(IClientAPI client) | 238 | public override void OnNewClient(IClientAPI client) |
162 | { | 239 | { |
163 | client.OnLogout += OnClientLoggedOut; | 240 | client.OnLogout += OnClientLoggedOut; |
164 | client.OnConnectionClosed += OnClientLoggedOut; | 241 | client.OnConnectionClosed += OnClientLoggedOut; |
242 | if (_replacingChatModule) | ||
243 | client.OnChatFromClient += OnChatFromClient; | ||
165 | 244 | ||
166 | _log.DebugFormat("[Concierge] {0} logs on to {1}", client.Name, client.Scene.RegionInfo.RegionName); | 245 | if (_conciergedScenes.Contains(client.Scene)) |
167 | AnnounceToAgentsRegion(client, String.Format("{0} logs on to {1}", client.Name, client.Scene.RegionInfo.RegionName)); | 246 | { |
247 | _log.DebugFormat("[Concierge] {0} logs on to {1}", client.Name, client.Scene.RegionInfo.RegionName); | ||
248 | AnnounceToAgentsRegion(client, String.Format("{0} logs on to {1}", client.Name, | ||
249 | client.Scene.RegionInfo.RegionName)); | ||
250 | } | ||
168 | } | 251 | } |
169 | 252 | ||
170 | public void OnClientLoggedOut(IClientAPI client) | 253 | public void OnClientLoggedOut(IClientAPI client) |
@@ -172,32 +255,46 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Concierge | |||
172 | client.OnLogout -= OnClientLoggedOut; | 255 | client.OnLogout -= OnClientLoggedOut; |
173 | client.OnConnectionClosed -= OnClientLoggedOut; | 256 | client.OnConnectionClosed -= OnClientLoggedOut; |
174 | 257 | ||
175 | _log.DebugFormat("[Concierge] {0} logs off from {1}", client.Name, client.Scene.RegionInfo.RegionName); | 258 | if (_conciergedScenes.Contains(client.Scene)) |
176 | AnnounceToAgentsRegion(client, String.Format("{0} logs off from {1}", client.Name, client.Scene.RegionInfo.RegionName)); | 259 | { |
260 | _log.DebugFormat("[Concierge] {0} logs off from {1}", client.Name, client.Scene.RegionInfo.RegionName); | ||
261 | AnnounceToAgentsRegion(client, String.Format("{0} logs off from {1}", client.Name, | ||
262 | client.Scene.RegionInfo.RegionName)); | ||
263 | } | ||
177 | } | 264 | } |
178 | 265 | ||
179 | 266 | ||
180 | public void OnMakeRootAgent(ScenePresence agent) | 267 | public void OnMakeRootAgent(ScenePresence agent) |
181 | { | 268 | { |
182 | _log.DebugFormat("[Concierge] {0} enters {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | 269 | if (_conciergedScenes.Contains(agent.Scene)) |
183 | AnnounceToAgentsRegion(agent, String.Format("{0} enters {1}", agent.Name, agent.Scene.RegionInfo.RegionName)); | 270 | { |
271 | _log.DebugFormat("[Concierge] {0} enters {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | ||
272 | AnnounceToAgentsRegion(agent, String.Format("{0} enters {1}", agent.Name, | ||
273 | agent.Scene.RegionInfo.RegionName)); | ||
274 | } | ||
184 | } | 275 | } |
185 | 276 | ||
186 | 277 | ||
187 | public void OnMakeChildAgent(ScenePresence agent) | 278 | public void OnMakeChildAgent(ScenePresence agent) |
188 | { | 279 | { |
189 | _log.DebugFormat("[Concierge] {0} leaves {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | 280 | if (_conciergedScenes.Contains(agent.Scene)) |
190 | AnnounceToAgentsRegion(agent, String.Format("{0} leaves {1}", agent.Name, agent.Scene.RegionInfo.RegionName)); | 281 | { |
282 | _log.DebugFormat("[Concierge] {0} leaves {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | ||
283 | AnnounceToAgentsRegion(agent, String.Format("{0} leaves {1}", agent.Name, | ||
284 | agent.Scene.RegionInfo.RegionName)); | ||
285 | } | ||
191 | } | 286 | } |
192 | 287 | ||
193 | 288 | ||
194 | public void ClientLoggedOut(IClientAPI client) | 289 | public void ClientLoggedOut(IClientAPI client) |
195 | { | 290 | { |
196 | _log.DebugFormat("[Concierge] {0} logs out of {1}", client.Name, client.Scene.RegionInfo.RegionName); | 291 | if (_conciergedScenes.Contains(client.Scene)) |
197 | AnnounceToAgentsRegion(client, String.Format("{0} logs out of {1}", client.Name, client.Scene.RegionInfo.RegionName)); | 292 | { |
293 | _log.DebugFormat("[Concierge] {0} logs out of {1}", client.Name, client.Scene.RegionInfo.RegionName); | ||
294 | AnnounceToAgentsRegion(client, String.Format("{0} logs out of {1}", client.Name, client.Scene.RegionInfo.RegionName)); | ||
295 | } | ||
198 | } | 296 | } |
199 | 297 | ||
200 | |||
201 | static private Vector3 posOfGod = new Vector3(128, 128, 9999); | 298 | static private Vector3 posOfGod = new Vector3(128, 128, 9999); |
202 | 299 | ||
203 | protected void AnnounceToAgentsRegion(IClientAPI client, string msg) | 300 | protected void AnnounceToAgentsRegion(IClientAPI client, string msg) |