aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs
diff options
context:
space:
mode:
authorDr Scofield2008-11-14 10:50:36 +0000
committerDr Scofield2008-11-14 10:50:36 +0000
commit62317ded9f7e426851591dd723a15b78fd0f9012 (patch)
tree8d039bfe8603ce2c049a8f26f44fa121ab372afe /OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs
parentSome changes to the money module to allow a more flexible system of (diff)
downloadopensim-SC_OLD-62317ded9f7e426851591dd723a15b78fd0f9012.zip
opensim-SC_OLD-62317ded9f7e426851591dd723a15b78fd0f9012.tar.gz
opensim-SC_OLD-62317ded9f7e426851591dd723a15b78fd0f9012.tar.bz2
opensim-SC_OLD-62317ded9f7e426851591dd723a15b78fd0f9012.tar.xz
From: Alan Webb (alan_webb@us.ibm.com)
Fixed the IRC code so that it deals with regions coming and going.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs68
1 files changed, 53 insertions, 15 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs b/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs
index c52375d..636e9bf 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs
@@ -57,6 +57,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
57 private const int WD_INTERVAL = 1000; // base watchdog interval 57 private const int WD_INTERVAL = 1000; // base watchdog interval
58 private static int PING_PERIOD = 15; // WD intervals per PING 58 private static int PING_PERIOD = 15; // WD intervals per PING
59 private static int ICCD_PERIOD = 10; // WD intervals between Connects 59 private static int ICCD_PERIOD = 10; // WD intervals between Connects
60 private static int L_TIMEOUT = 10; // Login time out interval
60 61
61 private static int _idk_ = 0; // core connector identifier 62 private static int _idk_ = 0; // core connector identifier
62 private static int _pdk_ = 0; // ping interval counter 63 private static int _pdk_ = 0; // ping interval counter
@@ -118,6 +119,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
118 } 119 }
119 120
120 private bool m_connected = false; // connection status 121 private bool m_connected = false; // connection status
122 private bool m_pending = false; // login disposition
123 private int m_timeout = L_TIMEOUT; // login timeout counter
121 public bool Connected 124 public bool Connected
122 { 125 {
123 get { return m_connected; } 126 get { return m_connected; }
@@ -326,6 +329,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
326 if (m_connected) return; 329 if (m_connected) return;
327 330
328 m_connected = true; 331 m_connected = true;
332 m_pending = true;
333 m_timeout = L_TIMEOUT;
329 334
330 m_tcp = new TcpClient(m_server, (int)m_port); 335 m_tcp = new TcpClient(m_server, (int)m_port);
331 m_stream = m_tcp.GetStream(); 336 m_stream = m_tcp.GetStream();
@@ -349,8 +354,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
349 m_writer.WriteLine(String.Format("JOIN {0}", m_ircChannel)); 354 m_writer.WriteLine(String.Format("JOIN {0}", m_ircChannel));
350 m_writer.Flush(); 355 m_writer.Flush();
351 356
352 m_log.InfoFormat("[IRC-Connector-{0}]: {1} has joined {2}", idn, m_nick, m_ircChannel); 357 m_log.InfoFormat("[IRC-Connector-{0}]: {1} has asked to join {2}", idn, m_nick, m_ircChannel);
353 m_log.InfoFormat("[IRC-Connector-{0}] Connected", idn);
354 358
355 } 359 }
356 catch (Exception e) 360 catch (Exception e)
@@ -358,6 +362,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
358 m_log.ErrorFormat("[IRC-Connector-{0}] cannot connect {1} to {2}:{3}: {4}", 362 m_log.ErrorFormat("[IRC-Connector-{0}] cannot connect {1} to {2}:{3}: {4}",
359 idn, m_nick, m_server, m_port, e.Message); 363 idn, m_nick, m_server, m_port, e.Message);
360 m_connected = false; 364 m_connected = false;
365 m_pending = false;
361 } 366 }
362 367
363 } 368 }
@@ -396,6 +401,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
396 try { m_tcp.Close(); } catch (Exception) {} 401 try { m_tcp.Close(); } catch (Exception) {}
397 402
398 m_connected = false; 403 m_connected = false;
404 m_pending = false;
399 405
400 } 406 }
401 407
@@ -516,7 +522,12 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
516 // m_log.Debug(e); 522 // m_log.Debug(e);
517 } 523 }
518 524
525 // This is potentially circular, but harmless if so.
526 // The connection is marked as not connected the first time
527 // through reconnect.
528
519 if (m_enabled) Reconnect(); 529 if (m_enabled) Reconnect();
530
520 } 531 }
521 532
522 private Regex RE = new Regex(@":(?<nick>[\w-]*)!(?<user>\S*) PRIVMSG (?<channel>\S+) :(?<msg>.*)", 533 private Regex RE = new Regex(@":(?<nick>[\w-]*)!(?<user>\S*) PRIVMSG (?<channel>\S+) :(?<msg>.*)",
@@ -615,7 +626,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
615 case "003" : // Welcome ... 626 case "003" : // Welcome ...
616 break; 627 break;
617 case "004" : // Server information 628 case "004" : // Server information
618 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 629 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
619 commArgs = parms.Split(CS_SPACE); 630 commArgs = parms.Split(CS_SPACE);
620 c_server = commArgs[1]; 631 c_server = commArgs[1];
621 m_server = c_server; 632 m_server = c_server;
@@ -639,10 +650,10 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
639 case "366" : // End-of-Name list marker 650 case "366" : // End-of-Name list marker
640 case "372" : // MOTD body 651 case "372" : // MOTD body
641 case "375" : // MOTD start 652 case "375" : // MOTD start
642 m_log.InfoFormat("[IRC-Connector-{0}] {1}", idn, parms.Split(CS_SPACE,2)[1]); 653 m_log.InfoFormat("[IRC-Connector-{0}] [{1}] {2}", idn, cmd, parms.Split(CS_SPACE,2)[1]);
643 break; 654 break;
644 case "376" : // MOTD end 655 case "376" : // MOTD end
645 m_log.InfoFormat("[IRC-Connector-{0}] {1}", idn, parms.Split(CS_SPACE,2)[1]); 656 m_log.InfoFormat("[IRC-Connector-{0}] [{1}] {2}", idn, cmd, parms.Split(CS_SPACE,2)[1]);
646 motd = true; 657 motd = true;
647 break; 658 break;
648 case "451" : // Not registered 659 case "451" : // Not registered
@@ -650,7 +661,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
650 case "433" : // Nickname in use 661 case "433" : // Nickname in use
651 // Gen a new name 662 // Gen a new name
652 m_nick = m_baseNick + Util.RandomClass.Next(1, 99); 663 m_nick = m_baseNick + Util.RandomClass.Next(1, 99);
653 m_log.ErrorFormat("[IRC-Connector-{0}]: IRC SERVER reports NicknameInUse, trying {1}", idn, m_nick); 664 m_log.ErrorFormat("[IRC-Connector-{0}]: [{1}] IRC SERVER reports NicknameInUse, trying {2}", idn, cmd, m_nick);
654 // Retry 665 // Retry
655 m_writer.WriteLine(String.Format("NICK {0}", m_nick)); 666 m_writer.WriteLine(String.Format("NICK {0}", m_nick));
656 m_writer.Flush(); 667 m_writer.Flush();
@@ -659,43 +670,57 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
659 m_writer.WriteLine(String.Format("JOIN {0}", m_ircChannel)); 670 m_writer.WriteLine(String.Format("JOIN {0}", m_ircChannel));
660 m_writer.Flush(); 671 m_writer.Flush();
661 break; 672 break;
673 case "479" : // Bad channel name, etc. This will never work, so disable the connection
674 m_log.ErrorFormat("[IRC-Connector-{0}] [{1}] {2}", idn, cmd, parms.Split(CS_SPACE,2)[1]);
675 m_log.ErrorFormat("[IRC-Connector-{0}] [{1}] Connector disabled", idn, cmd);
676 m_enabled = false;
677 m_connected = false;
678 m_pending = false;
679 break;
662 case "NOTICE" : 680 case "NOTICE" :
663 m_log.WarnFormat("[IRC-Connector-{0}] {1}", idn, parms.Split(CS_SPACE,2)[1]); 681 m_log.WarnFormat("[IRC-Connector-{0}] [{1}] {2}", idn, cmd, parms.Split(CS_SPACE,2)[1]);
664 break; 682 break;
665 case "ERROR" : 683 case "ERROR" :
666 m_log.ErrorFormat("[IRC-Connector-{0}] {1}", idn, parms.Split(CS_SPACE,2)[1]); 684 m_log.ErrorFormat("[IRC-Connector-{0}] [{1}] {2}", idn, cmd, parms.Split(CS_SPACE,2)[1]);
667 if (parms.Contains("reconnect too fast")) 685 if (parms.Contains("reconnect too fast"))
668 ICCD_PERIOD++; 686 ICCD_PERIOD++;
687 m_pending = false;
688 Reconnect();
669 break; 689 break;
670 case "PING" : 690 case "PING" :
671 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 691 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
672 m_writer.WriteLine(String.Format("PONG {0}", parms)); 692 m_writer.WriteLine(String.Format("PONG {0}", parms));
673 m_writer.Flush(); 693 m_writer.Flush();
674 break; 694 break;
675 case "PONG" : 695 case "PONG" :
676 break; 696 break;
677 case "JOIN": 697 case "JOIN":
678 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 698 if (m_pending)
699 {
700 m_log.InfoFormat("[IRC-Connector-{0}] [{1}] Connected", idn, cmd);
701 m_pending = false;
702 }
703 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
679 eventIrcJoin(pfx, cmd, parms); 704 eventIrcJoin(pfx, cmd, parms);
680 break; 705 break;
681 case "PART": 706 case "PART":
682 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 707 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
683 eventIrcPart(pfx, cmd, parms); 708 eventIrcPart(pfx, cmd, parms);
684 break; 709 break;
685 case "MODE": 710 case "MODE":
686 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 711 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
687 eventIrcMode(pfx, cmd, parms); 712 eventIrcMode(pfx, cmd, parms);
688 break; 713 break;
689 case "NICK": 714 case "NICK":
690 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 715 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
691 eventIrcNickChange(pfx, cmd, parms); 716 eventIrcNickChange(pfx, cmd, parms);
692 break; 717 break;
693 case "KICK": 718 case "KICK":
694 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 719 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
695 eventIrcKick(pfx, cmd, parms); 720 eventIrcKick(pfx, cmd, parms);
696 break; 721 break;
697 case "QUIT": 722 case "QUIT":
698 m_log.DebugFormat("[IRC-Connector-{0}] parms = <{1}>", idn, parms); 723 m_log.DebugFormat("[IRC-Connector-{0}] [{1}] parms = <{2}>", idn, cmd, parms);
699 eventIrcQuit(pfx, cmd, parms); 724 eventIrcQuit(pfx, cmd, parms);
700 break; 725 break;
701 default : 726 default :
@@ -813,6 +838,18 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
813 } 838 }
814 else 839 else
815 { 840 {
841
842 if (connector.m_pending)
843 {
844 if (connector.m_timeout == 0)
845 {
846 m_log.ErrorFormat("[IRC-Watchdog] Login timed-out for connector {0}, reconnecting", connector.idn);
847 connector.Reconnect();
848 }
849 else
850 connector.m_timeout--;
851 }
852
816 if (_pdk_ == 0) 853 if (_pdk_ == 0)
817 { 854 {
818 try 855 try
@@ -827,6 +864,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat
827 connector.Reconnect(); 864 connector.Reconnect();
828 } 865 }
829 } 866 }
867
830 } 868 }
831 } 869 }
832 } 870 }