From da0fa4253bc190390a92900833182737778bce23 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Tue, 29 Jan 2008 04:35:01 +0000 Subject: Thanks kinoc for your improved IRC Gateway patch as referenced in mantis issue 390. --- OpenSim/Region/Environment/Modules/ChatModule.cs | 103 ++++++++++++++++++----- 1 file changed, 80 insertions(+), 23 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Environment/Modules/ChatModule.cs b/OpenSim/Region/Environment/Modules/ChatModule.cs index d6df978..9aea977 100644 --- a/OpenSim/Region/Environment/Modules/ChatModule.cs +++ b/OpenSim/Region/Environment/Modules/ChatModule.cs @@ -163,6 +163,12 @@ namespace OpenSim.Region.Environment.Modules fromAgentID = e.Sender.AgentId; } + // Try to reconnect to server if not connected + if ((m_irc.Enabled)&&(!m_irc.Connected)) + { + m_irc.Connect(m_scenes); + } + if (e.Message.Length > 0) { if (m_irc.Connected && (avatar != null)) // this is to keep objects from talking to IRC @@ -205,6 +211,7 @@ namespace OpenSim.Region.Environment.Modules private bool m_connected = false; private List m_scenes = null; + private List m_last_scenes = null; private LogBase m_log; public IRCChatModule(IConfigSource config) @@ -214,6 +221,19 @@ namespace OpenSim.Region.Environment.Modules m_writer = null; m_reader = null; + // configuration in OpenSim.ini + // [IRC] + // server = chat.freenode.net + // nick = OSimBot_mysim + // ;username = OSimBot_mysim + // channel = #opensim-regions + // port = 6667 + // + // Traps I/O disconnects so it does not crash the sim + // Trys to reconnect if disconnected and someone says something + // Tells IRC server "QUIT" when doing a close (just to be nice) + // Default port back to 6667 + try { m_server = config.Configs["IRC"].GetString("server"); @@ -238,7 +258,7 @@ namespace OpenSim.Region.Environment.Modules try { m_scenes = scenes; - + m_last_scenes = scenes; m_tcp = new TcpClient(m_server, (int) m_port); m_log.Verbose("IRC", "Connecting..."); m_stream = m_tcp.GetStream(); @@ -290,14 +310,20 @@ namespace OpenSim.Region.Environment.Modules m_log.Error("IRC", "Disconnected from IRC server."); listener.Abort(); pingSender.Abort(); + m_writer.Close(); + m_reader.Close(); + m_tcp.Close(); m_connected = false; + if (m_enabled) { Connect(m_last_scenes); } } } private Dictionary ExtractMsg(string input) { + m_log.Verbose("IRC", "ExtractMsg: " + input); Dictionary result = null; - string regex = @":(?\w*)!~(?\S*) PRIVMSG (?\S+) :(?.*)"; + //string regex = @":(?\w*)!~(?\S*) PRIVMSG (?\S+) :(?.*)"; + string regex = @":(?\w*)!(?\S*) PRIVMSG (?\S+) :(?.*)"; Regex RE = new Regex(regex, RegexOptions.Multiline); MatchCollection matches = RE.Matches(input); // Get some direct matches $1 $4 is a @@ -324,10 +350,24 @@ namespace OpenSim.Region.Environment.Modules { while (true) { - m_writer.WriteLine("PING :" + m_server); - m_writer.Flush(); - Thread.Sleep(15000); - } + try + { + m_writer.WriteLine("PING :" + m_server); + m_writer.Flush(); + Thread.Sleep(15000); + } + catch (IOException) + { + m_log.Error("IRC", "Disconnected from IRC server."); + listener.Abort(); + pingSender.Abort(); + m_writer.Close(); + m_reader.Close(); + m_tcp.Close(); + m_connected = false; + if (m_enabled) { Connect(m_last_scenes); } + } + } } public void ListenerRun() @@ -336,36 +376,53 @@ namespace OpenSim.Region.Environment.Modules LLVector3 pos = new LLVector3(128, 128, 20); while (true) { - while ((inputLine = m_reader.ReadLine()) != null) + try { - // Console.WriteLine(inputLine); - if (inputLine.Contains(m_channel)) + while ((inputLine = m_reader.ReadLine()) != null) { - Dictionary data = ExtractMsg(inputLine); - if (data != null) + // Console.WriteLine(inputLine); + if (inputLine.Contains(m_channel)) { - foreach (Scene m_scene in m_scenes) + Dictionary data = ExtractMsg(inputLine); + if (data != null) { - m_scene.ForEachScenePresence(delegate(ScenePresence avatar) - { - if (!avatar.IsChildAgent) + foreach (Scene m_scene in m_scenes) + { + m_scene.ForEachScenePresence(delegate(ScenePresence avatar) { - avatar.ControllingClient.SendChatMessage( - Helpers.StringToField(data["msg"]), 255, - pos, data["nick"], - LLUUID.Zero); - } - }); + if (!avatar.IsChildAgent) + { + avatar.ControllingClient.SendChatMessage( + Helpers.StringToField(data["msg"]), 255, + pos, data["nick"], + LLUUID.Zero); + } + }); + } } } } + Thread.Sleep(50); } - Thread.Sleep(50); + catch (IOException) + { + m_log.Error("IRC", "Disconnected from IRC server."); + listener.Abort(); + pingSender.Abort(); + m_writer.Close(); + m_reader.Close(); + m_tcp.Close(); + m_connected = false; + if (m_enabled) { Connect(m_last_scenes); } + } + } } public void Close() { + m_writer.WriteLine("QUIT :" + m_nick+" to "+m_channel+" wormhole with "+m_server+" closing"); + m_writer.Flush(); listener.Abort(); pingSender.Abort(); m_writer.Close(); @@ -373,4 +430,4 @@ namespace OpenSim.Region.Environment.Modules m_tcp.Close(); } } -} \ No newline at end of file +} -- cgit v1.1