aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs')
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs198
1 files changed, 122 insertions, 76 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs
index 34a604e..5ee07ff 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Chat/ChatModule.cs
@@ -48,6 +48,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
48 48
49 private const int DEBUG_CHANNEL = 2147483647; 49 private const int DEBUG_CHANNEL = 2147483647;
50 50
51 private bool m_enabled = true;
51 private int m_saydistance = 30; 52 private int m_saydistance = 30;
52 private int m_shoutdistance = 100; 53 private int m_shoutdistance = 100;
53 private int m_whisperdistance = 10; 54 private int m_whisperdistance = 10;
@@ -56,23 +57,15 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
56 internal object m_syncInit = new object(); 57 internal object m_syncInit = new object();
57 58
58 #region IRegionModule Members 59 #region IRegionModule Members
59 public void Initialise(Scene scene, IConfigSource config) 60 public virtual void Initialise(Scene scene, IConfigSource config)
60 { 61 {
61 lock (m_syncInit)
62 {
63 if (!m_scenes.Contains(scene))
64 {
65 m_scenes.Add(scene);
66 scene.EventManager.OnNewClient += OnNewClient;
67 scene.EventManager.OnChatFromWorld += OnChatFromWorld;
68 scene.EventManager.OnChatBroadcast += OnChatBroadcast;
69 }
70 }
71
72 // wrap this in a try block so that defaults will work if 62 // wrap this in a try block so that defaults will work if
73 // the config file doesn't specify otherwise. 63 // the config file doesn't specify otherwise.
74 try 64 try
75 { 65 {
66 m_enabled = config.Configs["Chat"].GetBoolean("enabled", m_enabled);
67 if (!m_enabled) return;
68
76 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); 69 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance);
77 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); 70 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance);
78 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); 71 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance);
@@ -80,23 +73,35 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
80 catch (Exception) 73 catch (Exception)
81 { 74 {
82 } 75 }
76
77 lock (m_syncInit)
78 {
79 if (!m_scenes.Contains(scene))
80 {
81 m_scenes.Add(scene);
82 scene.EventManager.OnNewClient += OnNewClient;
83 scene.EventManager.OnChatFromWorld += OnChatFromWorld;
84 scene.EventManager.OnChatBroadcast += OnChatBroadcast;
85 }
86 }
87
83 m_log.InfoFormat("[CHAT] initialized for {0} w:{1} s:{2} S:{3}", scene.RegionInfo.RegionName, 88 m_log.InfoFormat("[CHAT] initialized for {0} w:{1} s:{2} S:{3}", scene.RegionInfo.RegionName,
84 m_whisperdistance, m_saydistance, m_shoutdistance); 89 m_whisperdistance, m_saydistance, m_shoutdistance);
85 } 90 }
86 public void PostInitialise() 91 public virtual void PostInitialise()
87 { 92 {
88 } 93 }
89 94
90 public void Close() 95 public virtual void Close()
91 { 96 {
92 } 97 }
93 98
94 public string Name 99 public virtual string Name
95 { 100 {
96 get { return "ChatModule"; } 101 get { return "ChatModule"; }
97 } 102 }
98 103
99 public bool IsSharedModule 104 public virtual bool IsSharedModule
100 { 105 {
101 get { return true; } 106 get { return true; }
102 } 107 }
@@ -104,16 +109,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
104 #endregion 109 #endregion
105 110
106 111
107 public void OnNewClient(IClientAPI client) 112 public virtual void OnNewClient(IClientAPI client)
108 { 113 {
109 try 114 client.OnChatFromClient += OnChatFromClient;
110 {
111 client.OnChatFromClient += OnChatFromClient;
112 }
113 catch (Exception ex)
114 {
115 m_log.Error("[CHAT]: NewClient exception trap:" + ex.ToString());
116 }
117 } 115 }
118 116
119 public virtual void OnChatFromClient(Object sender, OSChatMessage e) 117 public virtual void OnChatFromClient(Object sender, OSChatMessage e)
@@ -132,45 +130,76 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
132 return; 130 return;
133 } 131 }
134 132
135 string message = e.Message; 133 // string message = e.Message;
136 if (e.Channel == DEBUG_CHANNEL) e.Type = ChatTypeEnum.DebugChannel; 134 // if (e.Channel == DEBUG_CHANNEL) e.Type = ChatTypeEnum.DebugChannel;
137 135
138 ScenePresence avatar = scene.GetScenePresence(e.Sender.AgentId); 136 // ScenePresence avatar = scene.GetScenePresence(e.Sender.AgentId);
139 Vector3 fromPos = avatar.AbsolutePosition; 137 // Vector3 fromPos = avatar.AbsolutePosition;
140 Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize, 138 // Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize,
141 scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); 139 // scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
142 string fromName = avatar.Firstname + " " + avatar.Lastname; 140 // string fromName = avatar.Firstname + " " + avatar.Lastname;
143 UUID fromID = e.Sender.AgentId; 141 // UUID fromID = e.Sender.AgentId;
144 142
145 DeliverChatToAvatars(fromPos, regionPos, fromID, fromName, e.Type, ChatSourceType.Agent, message); 143 // DeliverChatToAvatars(fromPos, regionPos, fromID, fromName, e.Type, ChatSourceType.Agent, message);
144 DeliverChatToAvatars(ChatSourceType.Agent, e);
146 } 145 }
147 146
148 public void OnChatFromWorld(Object sender, OSChatMessage e) 147 public virtual void OnChatFromWorld(Object sender, OSChatMessage e)
149 { 148 {
150 Scene scene = (Scene) e.Scene;
151
152 // early return if not on public or debug channel 149 // early return if not on public or debug channel
153 if (e.Channel != 0 && e.Channel != DEBUG_CHANNEL) return; 150 if (e.Channel != 0 && e.Channel != DEBUG_CHANNEL) return;
154 151
155 // Filled in since it's easier than rewriting right now. 152 // // Filled in since it's easier than rewriting right now.
156 Vector3 fromPos = e.Position; 153 // Vector3 fromPos = e.Position;
157 Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize, 154 // Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize,
158 scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); 155 // scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
159 156
160 string fromName = e.From; 157 // string fromName = e.From;
161 string message = e.Message; 158 // string message = e.Message;
162 UUID fromID = e.SenderUUID; 159 // UUID fromID = e.SenderUUID;
163 160
164 if (e.Channel == DEBUG_CHANNEL) 161 // if (e.Channel == DEBUG_CHANNEL)
165 e.Type = ChatTypeEnum.DebugChannel; 162 // e.Type = ChatTypeEnum.DebugChannel;
166 163
167 DeliverChatToAvatars(fromPos, regionPos, fromID, fromName, e.Type, ChatSourceType.Object, message); 164 // DeliverChatToAvatars(fromPos, regionPos, fromID, fromName, e.Type, ChatSourceType.Object, message);
165 DeliverChatToAvatars(ChatSourceType.Object, e);
168 } 166 }
169 167
170 protected void DeliverChatToAvatars(Vector3 pos, Vector3 regionPos, UUID uuid, string name, 168 protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c)
171 ChatTypeEnum chatType, ChatSourceType sourceType, string message)
172 { 169 {
173 // iterate over message 170 string fromName = c.From;
171 UUID fromID = UUID.Zero;
172 string message = c.Message;
173 IScene scene = c.Scene;
174 Vector3 fromPos = c.Position;
175 Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize,
176 scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
177
178 if (c.Channel == DEBUG_CHANNEL) c.Type = ChatTypeEnum.DebugChannel;
179
180 switch (sourceType)
181 {
182 case ChatSourceType.Agent:
183 if (!(scene is Scene))
184 {
185 m_log.WarnFormat("[CHAT] scene {0} is not a Scene object, cannot obtain scene presence for {1}",
186 scene.RegionInfo.RegionName, c.Sender.AgentId);
187 return;
188 }
189 ScenePresence avatar = (scene as Scene).GetScenePresence(c.Sender.AgentId);
190 fromPos = avatar.AbsolutePosition;
191 fromName = avatar.Firstname + " " + avatar.Lastname;
192 fromID = c.Sender.AgentId;
193
194 break;
195
196 case ChatSourceType.Object:
197 fromID = c.SenderUUID;
198
199 break;
200 }
201
202 // TODO: iterate over message
174 if (message.Length >= 1000) // libomv limit 203 if (message.Length >= 1000) // libomv limit
175 message = message.Substring(0, 1000); 204 message = message.Substring(0, 1000);
176 205
@@ -178,20 +207,42 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
178 { 207 {
179 s.ForEachScenePresence(delegate(ScenePresence presence) 208 s.ForEachScenePresence(delegate(ScenePresence presence)
180 { 209 {
181 TrySendChatMessage(presence, pos, regionPos, uuid, name, 210 TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName,
182 chatType, message, sourceType); 211 c.Type, message, sourceType);
183 }); 212 });
184 } 213 }
185 } 214 }
186 215
187 216 // protected virtual void DeliverChatToAvatars(Vector3 pos, Vector3 regionPos, UUID uuid, string name,
188 public void OnChatBroadcast(Object sender, OSChatMessage c) 217 // ChatTypeEnum chatType, ChatSourceType sourceType, string message)
218 // {
219 // // iterate over message
220 // if (message.Length >= 1000) // libomv limit
221 // message = message.Substring(0, 1000);
222
223 // foreach (Scene s in m_scenes)
224 // {
225 // s.ForEachScenePresence(delegate(ScenePresence presence)
226 // {
227 // TrySendChatMessage(presence, pos, regionPos, uuid, name,
228 // chatType, message, sourceType);
229 // });
230 // }
231 // }
232
233
234 public virtual void OnChatBroadcast(Object sender, OSChatMessage c)
189 { 235 {
190 // We only want to relay stuff on channel 0 and on the debug channel 236 // unless the chat to be broadcast is of type Region, we
191 if (c.Channel != 0 && c.Channel != DEBUG_CHANNEL) return; 237 // drop it if its channel is neither 0 nor DEBUG_CHANNEL
238 if (c.Channel != 0 && c.Channel != DEBUG_CHANNEL && c.Type != ChatTypeEnum.Region) return;
192 239
240 ChatTypeEnum cType = c.Type;
193 if (c.Channel == DEBUG_CHANNEL) 241 if (c.Channel == DEBUG_CHANNEL)
194 c.Type = ChatTypeEnum.DebugChannel; 242 cType = ChatTypeEnum.DebugChannel;
243
244 if (cType == ChatTypeEnum.Region)
245 cType = ChatTypeEnum.Say;
195 246
196 if (c.Message.Length > 1100) 247 if (c.Message.Length > 1100)
197 c.Message = c.Message.Substring(0, 1000); 248 c.Message = c.Message.Substring(0, 1000);
@@ -199,6 +250,15 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
199 // broadcast chat works by redistributing every incoming chat 250 // broadcast chat works by redistributing every incoming chat
200 // message to each avatar in the scene. 251 // message to each avatar in the scene.
201 Vector3 pos = new Vector3(128, 128, 30); 252 Vector3 pos = new Vector3(128, 128, 30);
253
254 UUID fromID = UUID.Zero;
255 ChatSourceType sourceType = ChatSourceType.Object;
256 if (null != c.Sender)
257 {
258 fromID = c.Sender.AgentId;
259 sourceType = ChatSourceType.Agent;
260 }
261
202 ((Scene)c.Scene).ForEachScenePresence( 262 ((Scene)c.Scene).ForEachScenePresence(
203 delegate(ScenePresence presence) 263 delegate(ScenePresence presence)
204 { 264 {
@@ -214,29 +274,15 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
214 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) 274 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId))
215 return; 275 return;
216 276
217 if (null == c.SenderObject) 277 client.SendChatMessage(c.Message, (byte)cType, pos, c.From, fromID,
218 { 278 (byte)sourceType, (byte)ChatAudibleLevel.Fully);
219 // chat from agent (avatar)
220 client.SendChatMessage(c.Message, (byte)c.Type,
221 pos, c.From, UUID.Zero,
222 (byte)ChatSourceType.Agent,
223 (byte)ChatAudibleLevel.Fully);
224 }
225 else
226 {
227 // chat from object
228 client.SendChatMessage(c.Message, (byte)c.Type,
229 pos, c.From, UUID.Zero,
230 (byte)ChatSourceType.Object,
231 (byte)ChatAudibleLevel.Fully);
232 }
233 }); 279 });
234 } 280 }
235 281
236 282
237 private void TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, 283 protected virtual void TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
238 UUID fromAgentID, string fromName, ChatTypeEnum type, 284 UUID fromAgentID, string fromName, ChatTypeEnum type,
239 string message, ChatSourceType src) 285 string message, ChatSourceType src)
240 { 286 {
241 // don't send stuff to child agents 287 // don't send stuff to child agents
242 if (presence.IsChildAgent) return; 288 if (presence.IsChildAgent) return;