diff options
author | Dr Scofield | 2008-11-14 10:50:36 +0000 |
---|---|---|
committer | Dr Scofield | 2008-11-14 10:50:36 +0000 |
commit | 62317ded9f7e426851591dd723a15b78fd0f9012 (patch) | |
tree | 8d039bfe8603ce2c049a8f26f44fa121ab372afe /OpenSim/Region/Environment/Modules/Avatar/Chat/IRCConnector.cs | |
parent | Some changes to the money module to allow a more flexible system of (diff) | |
download | opensim-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.cs | 68 |
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 | } |