pull the IRC portions into their own class. There is still
something odd going on with multi-regions here, which I'll have to ask Adam about tomorrow. This should make it easier to just enhance the IRC portion of chat though.afrisby
							parent
							
								
									4dc8e7e0f8
								
							
						
					
					
						commit
						8e4748d914
					
				| 
						 | 
				
			
			@ -45,51 +45,19 @@ namespace OpenSim.Region.Environment.Modules
 | 
			
		|||
        private List<Scene> m_scenes = new List<Scene>();
 | 
			
		||||
        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<ISimChat>(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() 
 | 
			
		||||
        {
 | 
			
		||||
            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;
 | 
			
		||||
                                                    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;
 | 
			
		||||
                                                         }
 | 
			
		||||
                                                     });
 | 
			
		||||
                                                    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<Scene> 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<Scene> 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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue