diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Environment/Modules/ChatModule.cs | 103 |
1 files changed, 23 insertions, 80 deletions
diff --git a/OpenSim/Region/Environment/Modules/ChatModule.cs b/OpenSim/Region/Environment/Modules/ChatModule.cs index 9aea977..d6df978 100644 --- a/OpenSim/Region/Environment/Modules/ChatModule.cs +++ b/OpenSim/Region/Environment/Modules/ChatModule.cs | |||
@@ -163,12 +163,6 @@ namespace OpenSim.Region.Environment.Modules | |||
163 | fromAgentID = e.Sender.AgentId; | 163 | fromAgentID = e.Sender.AgentId; |
164 | } | 164 | } |
165 | 165 | ||
166 | // Try to reconnect to server if not connected | ||
167 | if ((m_irc.Enabled)&&(!m_irc.Connected)) | ||
168 | { | ||
169 | m_irc.Connect(m_scenes); | ||
170 | } | ||
171 | |||
172 | if (e.Message.Length > 0) | 166 | if (e.Message.Length > 0) |
173 | { | 167 | { |
174 | if (m_irc.Connected && (avatar != null)) // this is to keep objects from talking to IRC | 168 | if (m_irc.Connected && (avatar != null)) // this is to keep objects from talking to IRC |
@@ -211,7 +205,6 @@ namespace OpenSim.Region.Environment.Modules | |||
211 | private bool m_connected = false; | 205 | private bool m_connected = false; |
212 | 206 | ||
213 | private List<Scene> m_scenes = null; | 207 | private List<Scene> m_scenes = null; |
214 | private List<Scene> m_last_scenes = null; | ||
215 | private LogBase m_log; | 208 | private LogBase m_log; |
216 | 209 | ||
217 | public IRCChatModule(IConfigSource config) | 210 | public IRCChatModule(IConfigSource config) |
@@ -221,19 +214,6 @@ namespace OpenSim.Region.Environment.Modules | |||
221 | m_writer = null; | 214 | m_writer = null; |
222 | m_reader = null; | 215 | m_reader = null; |
223 | 216 | ||
224 | // configuration in OpenSim.ini | ||
225 | // [IRC] | ||
226 | // server = chat.freenode.net | ||
227 | // nick = OSimBot_mysim | ||
228 | // ;username = OSimBot_mysim | ||
229 | // channel = #opensim-regions | ||
230 | // port = 6667 | ||
231 | // | ||
232 | // Traps I/O disconnects so it does not crash the sim | ||
233 | // Trys to reconnect if disconnected and someone says something | ||
234 | // Tells IRC server "QUIT" when doing a close (just to be nice) | ||
235 | // Default port back to 6667 | ||
236 | |||
237 | try | 217 | try |
238 | { | 218 | { |
239 | m_server = config.Configs["IRC"].GetString("server"); | 219 | m_server = config.Configs["IRC"].GetString("server"); |
@@ -258,7 +238,7 @@ namespace OpenSim.Region.Environment.Modules | |||
258 | try | 238 | try |
259 | { | 239 | { |
260 | m_scenes = scenes; | 240 | m_scenes = scenes; |
261 | m_last_scenes = scenes; | 241 | |
262 | m_tcp = new TcpClient(m_server, (int) m_port); | 242 | m_tcp = new TcpClient(m_server, (int) m_port); |
263 | m_log.Verbose("IRC", "Connecting..."); | 243 | m_log.Verbose("IRC", "Connecting..."); |
264 | m_stream = m_tcp.GetStream(); | 244 | m_stream = m_tcp.GetStream(); |
@@ -310,20 +290,14 @@ namespace OpenSim.Region.Environment.Modules | |||
310 | m_log.Error("IRC", "Disconnected from IRC server."); | 290 | m_log.Error("IRC", "Disconnected from IRC server."); |
311 | listener.Abort(); | 291 | listener.Abort(); |
312 | pingSender.Abort(); | 292 | pingSender.Abort(); |
313 | m_writer.Close(); | ||
314 | m_reader.Close(); | ||
315 | m_tcp.Close(); | ||
316 | m_connected = false; | 293 | m_connected = false; |
317 | if (m_enabled) { Connect(m_last_scenes); } | ||
318 | } | 294 | } |
319 | } | 295 | } |
320 | 296 | ||
321 | private Dictionary<string, string> ExtractMsg(string input) | 297 | private Dictionary<string, string> ExtractMsg(string input) |
322 | { | 298 | { |
323 | m_log.Verbose("IRC", "ExtractMsg: " + input); | ||
324 | Dictionary<string, string> result = null; | 299 | Dictionary<string, string> result = null; |
325 | //string regex = @":(?<nick>\w*)!~(?<user>\S*) PRIVMSG (?<channel>\S+) :(?<msg>.*)"; | 300 | string regex = @":(?<nick>\w*)!~(?<user>\S*) PRIVMSG (?<channel>\S+) :(?<msg>.*)"; |
326 | string regex = @":(?<nick>\w*)!(?<user>\S*) PRIVMSG (?<channel>\S+) :(?<msg>.*)"; | ||
327 | Regex RE = new Regex(regex, RegexOptions.Multiline); | 301 | Regex RE = new Regex(regex, RegexOptions.Multiline); |
328 | MatchCollection matches = RE.Matches(input); | 302 | MatchCollection matches = RE.Matches(input); |
329 | // Get some direct matches $1 $4 is a | 303 | // Get some direct matches $1 $4 is a |
@@ -350,24 +324,10 @@ namespace OpenSim.Region.Environment.Modules | |||
350 | { | 324 | { |
351 | while (true) | 325 | while (true) |
352 | { | 326 | { |
353 | try | 327 | m_writer.WriteLine("PING :" + m_server); |
354 | { | 328 | m_writer.Flush(); |
355 | m_writer.WriteLine("PING :" + m_server); | 329 | Thread.Sleep(15000); |
356 | m_writer.Flush(); | 330 | } |
357 | Thread.Sleep(15000); | ||
358 | } | ||
359 | catch (IOException) | ||
360 | { | ||
361 | m_log.Error("IRC", "Disconnected from IRC server."); | ||
362 | listener.Abort(); | ||
363 | pingSender.Abort(); | ||
364 | m_writer.Close(); | ||
365 | m_reader.Close(); | ||
366 | m_tcp.Close(); | ||
367 | m_connected = false; | ||
368 | if (m_enabled) { Connect(m_last_scenes); } | ||
369 | } | ||
370 | } | ||
371 | } | 331 | } |
372 | 332 | ||
373 | public void ListenerRun() | 333 | public void ListenerRun() |
@@ -376,53 +336,36 @@ namespace OpenSim.Region.Environment.Modules | |||
376 | LLVector3 pos = new LLVector3(128, 128, 20); | 336 | LLVector3 pos = new LLVector3(128, 128, 20); |
377 | while (true) | 337 | while (true) |
378 | { | 338 | { |
379 | try | 339 | while ((inputLine = m_reader.ReadLine()) != null) |
380 | { | 340 | { |
381 | while ((inputLine = m_reader.ReadLine()) != null) | 341 | // Console.WriteLine(inputLine); |
342 | if (inputLine.Contains(m_channel)) | ||
382 | { | 343 | { |
383 | // Console.WriteLine(inputLine); | 344 | Dictionary<string, string> data = ExtractMsg(inputLine); |
384 | if (inputLine.Contains(m_channel)) | 345 | if (data != null) |
385 | { | 346 | { |
386 | Dictionary<string, string> data = ExtractMsg(inputLine); | 347 | foreach (Scene m_scene in m_scenes) |
387 | if (data != null) | ||
388 | { | 348 | { |
389 | foreach (Scene m_scene in m_scenes) | 349 | m_scene.ForEachScenePresence(delegate(ScenePresence avatar) |
390 | { | 350 | { |
391 | m_scene.ForEachScenePresence(delegate(ScenePresence avatar) | 351 | if (!avatar.IsChildAgent) |
392 | { | 352 | { |
393 | if (!avatar.IsChildAgent) | 353 | avatar.ControllingClient.SendChatMessage( |
394 | { | 354 | Helpers.StringToField(data["msg"]), 255, |
395 | avatar.ControllingClient.SendChatMessage( | 355 | pos, data["nick"], |
396 | Helpers.StringToField(data["msg"]), 255, | 356 | LLUUID.Zero); |
397 | pos, data["nick"], | 357 | } |
398 | LLUUID.Zero); | 358 | }); |
399 | } | ||
400 | }); | ||
401 | } | ||
402 | } | 359 | } |
403 | } | 360 | } |
404 | } | 361 | } |
405 | Thread.Sleep(50); | ||
406 | } | 362 | } |
407 | catch (IOException) | 363 | Thread.Sleep(50); |
408 | { | ||
409 | m_log.Error("IRC", "Disconnected from IRC server."); | ||
410 | listener.Abort(); | ||
411 | pingSender.Abort(); | ||
412 | m_writer.Close(); | ||
413 | m_reader.Close(); | ||
414 | m_tcp.Close(); | ||
415 | m_connected = false; | ||
416 | if (m_enabled) { Connect(m_last_scenes); } | ||
417 | } | ||
418 | |||
419 | } | 364 | } |
420 | } | 365 | } |
421 | 366 | ||
422 | public void Close() | 367 | public void Close() |
423 | { | 368 | { |
424 | m_writer.WriteLine("QUIT :" + m_nick+" to "+m_channel+" wormhole with "+m_server+" closing"); | ||
425 | m_writer.Flush(); | ||
426 | listener.Abort(); | 369 | listener.Abort(); |
427 | pingSender.Abort(); | 370 | pingSender.Abort(); |
428 | m_writer.Close(); | 371 | m_writer.Close(); |
@@ -430,4 +373,4 @@ namespace OpenSim.Region.Environment.Modules | |||
430 | m_tcp.Close(); | 373 | m_tcp.Close(); |
431 | } | 374 | } |
432 | } | 375 | } |
433 | } | 376 | } \ No newline at end of file |