diff --git a/OpenSim/Region/Environment/Modules/ChatModule.cs b/OpenSim/Region/Environment/Modules/ChatModule.cs index 77e038f490..4ead3984bb 100644 --- a/OpenSim/Region/Environment/Modules/ChatModule.cs +++ b/OpenSim/Region/Environment/Modules/ChatModule.cs @@ -45,51 +45,19 @@ namespace OpenSim.Region.Environment.Modules private List m_scenes = new List(); private LogBase m_log; - private string m_server = null; - private int m_port = 6668; - private string m_user = "USER OpenSimBot 8 * :I'm a OpenSim to irc bot"; - private string m_nick = null; - private string m_channel = null; - private int m_whisperdistance = 10; private int m_saydistance = 30; private int m_shoutdistance = 100; - private NetworkStream m_stream; - private TcpClient m_irc; - private StreamWriter m_ircWriter; - private StreamReader m_ircReader; - - private Thread pingSender; - private Thread listener; - - private bool m_enable_irc = false; - private bool connected = false; + private IRCChatModule m_irc = null; public ChatModule() { - m_nick = "OSimBot" + Util.RandomClass.Next(1, 99); - m_irc = null; - m_ircWriter = null; - m_ircReader = null; - m_log = OpenSim.Framework.Console.MainLog.Instance; } public void Initialise(Scene scene, Nini.Config.IConfigSource config) { - try { - m_server = config.Configs["IRC"].GetString("server"); - m_nick = config.Configs["IRC"].GetString("nick"); - m_channel = config.Configs["IRC"].GetString("channel"); - m_port = config.Configs["IRC"].GetInt("port", m_port); - m_user = config.Configs["IRC"].GetString("username", m_user); - if (m_server != null && m_nick != null && m_channel != null) { - m_enable_irc = true; - } - } catch (Exception e) { - Console.WriteLine("No IRC config information, skipping IRC bridge configuration"); - } m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance"); m_saydistance = config.Configs["Chat"].GetInt("say_distance"); @@ -101,43 +69,21 @@ namespace OpenSim.Region.Environment.Modules scene.EventManager.OnNewClient += NewClient; scene.RegisterModuleInterface(this); } + + // setup IRC Relay + m_irc = new IRCChatModule(config); } public void PostInitialise() { - if( m_enable_irc ) { - try - { - m_irc = new TcpClient(m_server, m_port); - m_stream = m_irc.GetStream(); - m_ircReader = new StreamReader(m_stream); - m_ircWriter = new StreamWriter(m_stream); - - pingSender = new Thread(new ThreadStart(this.PingRun)); - pingSender.Start(); - - listener = new Thread(new ThreadStart(this.ListenerRun)); - listener.Start(); - - m_ircWriter.WriteLine(m_user); - m_ircWriter.Flush(); - m_ircWriter.WriteLine("NICK " + m_nick); - m_ircWriter.Flush(); - m_ircWriter.WriteLine("JOIN " + m_channel); - m_ircWriter.Flush(); - connected = true; - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - } + + if (m_irc.Enabled) { + m_irc.Connect(m_scenes); } } - public void Close() + public void Close() { - m_ircWriter.Close(); - m_ircReader.Close(); m_irc.Close(); } @@ -156,43 +102,6 @@ namespace OpenSim.Region.Environment.Modules client.OnChatFromViewer += SimChat; } - public void PingRun() - { - while (true) - { - m_ircWriter.WriteLine("PING :" + m_server); - m_ircWriter.Flush(); - Thread.Sleep(15000); - } - } - - public void ListenerRun() - { - string inputLine; - LLVector3 pos = new LLVector3(128, 128, 20); - while (true) - { - while ((inputLine = m_ircReader.ReadLine()) != null) - { - Console.WriteLine(inputLine); - if (inputLine.Contains(m_channel)) - { - string mess = inputLine.Substring(inputLine.IndexOf(m_channel)); - foreach (Scene m_scene in m_scenes) - { - m_scene.Broadcast(delegate(IClientAPI client) - { - client.SendChatMessage( - Helpers.StringToField(mess), 255, pos, "IRC:", - LLUUID.Zero); - }); - } - } - } - Thread.Sleep(50); - } - } - public void SimChat(Object sender, ChatFromViewerArgs e) { ScenePresence avatar = null; @@ -246,80 +155,212 @@ namespace OpenSim.Region.Environment.Modules m_log.Verbose("CHAT", fromName + " (" + e.Channel + " @ " + scene.RegionInfo.RegionName + ") " + typeName + ": " + e.Message); - if (connected) - { - try - { - m_ircWriter.WriteLine("PRIVMSG " + m_channel + " :" + "<" + fromName + " in " + scene.RegionInfo.RegionName + ">: " + - e.Message); - m_ircWriter.Flush(); - } - catch (IOException) - { - m_log.Error("IRC","Disconnected from IRC server."); - listener.Abort(); - pingSender.Abort(); - connected = false; - } - } + if (m_irc.Connected) + { + m_irc.PrivMsg(fromName, scene.RegionInfo.RegionName, e.Message); + } + + if (e.Channel == 0) + { + foreach (Scene m_scene in m_scenes) + { + m_scene.ForEachScenePresence(delegate(ScenePresence presence) + { + int dis = -100000; - if (e.Channel == 0) - { - foreach (Scene m_scene in m_scenes) - { - m_scene.ForEachScenePresence(delegate(ScenePresence presence) - { - int dis = -100000; + LLVector3 avatarRegionPos = presence.AbsolutePosition + new LLVector3(scene.RegionInfo.RegionLocX * 256, scene.RegionInfo.RegionLocY * 256, 0); + dis = Math.Abs((int)avatarRegionPos.GetDistanceTo(fromRegionPos)); - LLVector3 avatarRegionPos = presence.AbsolutePosition + new LLVector3(scene.RegionInfo.RegionLocX * 256, scene.RegionInfo.RegionLocY * 256, 0); - dis = Math.Abs((int)avatarRegionPos.GetDistanceTo(fromRegionPos)); - - switch (e.Type) - { - case ChatTypeEnum.Whisper: - if (dis < m_whisperdistance) - { - //should change so the message is sent through the avatar rather than direct to the ClientView - presence.ControllingClient.SendChatMessage(message, - type, - fromPos, - fromName, - fromAgentID); - } - break; - default: - case ChatTypeEnum.Say: - if (dis < m_saydistance) - { - //Console.WriteLine("sending chat"); - presence.ControllingClient.SendChatMessage(message, - type, - fromPos, - fromName, - fromAgentID); - } - break; - case ChatTypeEnum.Shout: - if (dis < m_shoutdistance) - { - presence.ControllingClient.SendChatMessage(message, - type, - fromPos, - fromName, - fromAgentID); - } - break; - - case ChatTypeEnum.Broadcast: - presence.ControllingClient.SendChatMessage(message, type, - fromPos, - fromName, - fromAgentID); - break; - } - }); + switch (e.Type) + { + case ChatTypeEnum.Whisper: + if (dis < m_whisperdistance) + { + //should change so the message is sent through the avatar rather than direct to the ClientView + presence.ControllingClient.SendChatMessage(message, + type, + fromPos, + fromName, + fromAgentID); + } + break; + case ChatTypeEnum.Say: + if (dis < m_saydistance) + { + //Console.WriteLine("sending chat"); + presence.ControllingClient.SendChatMessage(message, + type, + fromPos, + fromName, + fromAgentID); + } + break; + case ChatTypeEnum.Shout: + if (dis < m_shoutdistance) + { + presence.ControllingClient.SendChatMessage(message, + type, + fromPos, + fromName, + fromAgentID); + } + break; + + case ChatTypeEnum.Broadcast: + presence.ControllingClient.SendChatMessage(message, type, + fromPos, + fromName, + fromAgentID); + break; + default: + break; + } + }); } } } } + + class IRCChatModule { + private string m_server = null; + private int m_port = 6668; + private string m_user = "USER OpenSimBot 8 * :I'm a OpenSim to irc bot"; + private string m_nick = null; + private string m_channel = null; + + private NetworkStream m_stream; + private TcpClient m_tcp; + private StreamWriter m_writer; + private StreamReader m_reader; + + private Thread pingSender; + private Thread listener; + + private bool m_enabled = false; + private bool m_connected = false; + + private List m_scenes = null; + private LogBase m_log; + + public IRCChatModule(Nini.Config.IConfigSource config) { + m_nick = "OSimBot" + Util.RandomClass.Next(1, 99); + m_tcp = null; + m_writer = null; + m_reader = null; + + try { + m_server = config.Configs["IRC"].GetString("server"); + m_nick = config.Configs["IRC"].GetString("nick"); + m_channel = config.Configs["IRC"].GetString("channel"); + m_port = config.Configs["IRC"].GetInt("port", m_port); + m_user = config.Configs["IRC"].GetString("username", m_user); + if (m_server != null && m_nick != null && m_channel != null) { + m_enabled = true; + } + } catch (Exception e) { + Console.WriteLine("No IRC config information, skipping IRC bridge configuration"); + } + m_log = OpenSim.Framework.Console.MainLog.Instance; + } + + public bool Connect(List scenes) { + try { + m_scenes = scenes; + + m_tcp = new TcpClient(m_server, m_port); + m_log.Verbose("IRC", "Connecting..."); + m_stream = m_tcp.GetStream(); + m_log.Verbose("IRC", "Connected to " + m_server); + m_reader = new StreamReader(m_stream); + m_writer = new StreamWriter(m_stream); + + pingSender = new Thread(new ThreadStart(this.PingRun)); + pingSender.Start(); + + listener = new Thread(new ThreadStart(this.ListenerRun)); + listener.Start(); + + m_writer.WriteLine(m_user); + m_writer.Flush(); + m_writer.WriteLine("NICK " + m_nick); + m_writer.Flush(); + m_writer.WriteLine("JOIN " + m_channel); + m_writer.Flush(); + m_log.Verbose("IRC", "Connection fully established"); + m_connected = true; + } catch (Exception e) { + Console.WriteLine(e.ToString()); + } + return m_connected; + } + + public bool Enabled + { + get { return m_enabled; } + } + + public bool Connected + { + get { return m_connected; } + } + + public void PrivMsg(string from, string region, string msg) { + try { + m_writer.WriteLine("PRIVMSG {0} :<{1} in {2}>: {3}", m_channel, from, region, msg); + m_writer.Flush(); + } catch (IOException) { + m_log.Error("IRC","Disconnected from IRC server."); + listener.Abort(); + pingSender.Abort(); + m_connected = false; + } + } + + + public void PingRun() + { + while (true) + { + m_writer.WriteLine("PING :" + m_server); + m_writer.Flush(); + Thread.Sleep(15000); + } + } + + public void ListenerRun() + { + string inputLine; + LLVector3 pos = new LLVector3(128, 128, 20); + while (true) + { + while ((inputLine = m_reader.ReadLine()) != null) + { + Console.WriteLine(inputLine); + if (inputLine.Contains(m_channel)) + { + string mess = inputLine.Substring(inputLine.IndexOf(m_channel)); + foreach (Scene m_scene in m_scenes) + { + m_scene.Broadcast(delegate(IClientAPI client) + { + client.SendChatMessage( + Helpers.StringToField(mess), 255, pos, "IRC:", + LLUUID.Zero); + }); + } + } + } + Thread.Sleep(50); + } + } + + + public void Close() { + listener.Abort(); + pingSender.Abort(); + m_writer.Close(); + m_reader.Close(); + m_tcp.Close(); + } + } }