Advertisement
Guest User

Untitled

a guest
Jun 20th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 78.70 KB | None | 0 0
  1.  
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Specialized;
  5. using System.Text.RegularExpressions;
  6.  
  7. namespace SebBot_3
  8. {
  9.    
  10.     public class IrcClient : IrcCommands
  11.     {
  12.         private string           _Nickname                = string.Empty;
  13.         private string[]         _NicknameList;
  14.         private int              _CurrentNickname;
  15.         private string           _Realname                = string.Empty;
  16.         private string           _Usermode                = string.Empty;
  17.         private int              _IUsermode;
  18.         private string           _Username                = string.Empty;
  19.         private string           _Password                = string.Empty;
  20.         private bool             _IsAway;
  21.         private string           _CtcpVersion;
  22.         private bool             _ActiveChannelSyncing;
  23.         private bool             _PassiveChannelSyncing;
  24.         private bool             _AutoJoinOnInvite;
  25.         private bool             _AutoRejoin;
  26.         private StringDictionary _AutoRejoinChannels      = new StringDictionary();
  27.         private bool             _AutoRejoinChannelsWithKeys;
  28.         private bool             _AutoRejoinOnKick;
  29.         private bool             _AutoRelogin;
  30.         private bool             _AutoNickHandling        = true;
  31.         private bool             _SupportNonRfc;
  32.         private bool             _SupportNonRfcLocked;
  33.         private StringCollection _Motd                    = new StringCollection();
  34.         private bool             _MotdReceived;
  35.         private Array            _ReplyCodes              = Enum.GetValues(typeof(ReplyCode));
  36.         private StringCollection _JoinedChannels          = new StringCollection();
  37.         private Hashtable        _Channels                = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer()));
  38.         private Hashtable        _IrcUsers                = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer()));
  39.         private static Regex     _ReplyCodeRegex          = new Regex("^:[^ ]+? ([0-9]{3}) .+$", RegexOptions.Compiled);
  40.         private static Regex     _PingRegex               = new Regex("^PING :.*", RegexOptions.Compiled);
  41.         private static Regex     _ErrorRegex              = new Regex("^ERROR :.*", RegexOptions.Compiled);
  42.         private static Regex     _ActionRegex             = new Regex("^:.*? PRIVMSG (.).* :"+"\x1"+"ACTION .*"+"\x1"+"$", RegexOptions.Compiled);
  43.         private static Regex     _CtcpRequestRegex        = new Regex("^:.*? PRIVMSG .* :"+"\x1"+".*"+"\x1"+"$", RegexOptions.Compiled);
  44.         private static Regex     _MessageRegex            = new Regex("^:.*? PRIVMSG (.).* :.*$", RegexOptions.Compiled);
  45.         private static Regex     _CtcpReplyRegex          = new Regex("^:.*? NOTICE .* :"+"\x1"+".*"+"\x1"+"$", RegexOptions.Compiled);
  46.         private static Regex     _NoticeRegex             = new Regex("^:.*? NOTICE (.).* :.*$", RegexOptions.Compiled);
  47.         private static Regex     _InviteRegex             = new Regex("^:.*? INVITE .* .*$", RegexOptions.Compiled);
  48.         private static Regex     _JoinRegex               = new Regex("^:.*? JOIN .*$", RegexOptions.Compiled);
  49.         private static Regex     _TopicRegex              = new Regex("^:.*? TOPIC .* :.*$", RegexOptions.Compiled);
  50.         private static Regex     _NickRegex               = new Regex("^:.*? NICK .*$", RegexOptions.Compiled);
  51.         private static Regex     _KickRegex               = new Regex("^:.*? KICK .* .*$", RegexOptions.Compiled);
  52.         private static Regex     _PartRegex               = new Regex("^:.*? PART .*$", RegexOptions.Compiled);
  53.         private static Regex     _ModeRegex               = new Regex("^:.*? MODE (.*) .*$", RegexOptions.Compiled);
  54.         private static Regex     _QuitRegex               = new Regex("^:.*? QUIT :.*$", RegexOptions.Compiled);
  55.  
  56.         public event EventHandler               OnRegistered;
  57.         public event PingEventHandler           OnPing;
  58.         public event PongEventHandler           OnPong;
  59.         public event IrcEventHandler            OnRawMessage;
  60.         public event ErrorEventHandler          OnError;
  61.         public event IrcEventHandler            OnErrorMessage;
  62.         public event JoinEventHandler           OnJoin;
  63.         public event NamesEventHandler          OnNames;
  64.         public event PartEventHandler           OnPart;
  65.         public event QuitEventHandler           OnQuit;
  66.         public event KickEventHandler           OnKick;
  67.         public event AwayEventHandler           OnAway;
  68.         public event IrcEventHandler            OnUnAway;
  69.         public event IrcEventHandler            OnNowAway;
  70.         public event InviteEventHandler         OnInvite;
  71.         public event BanEventHandler            OnBan;
  72.         public event UnbanEventHandler          OnUnban;
  73.         public event OpEventHandler             OnOp;
  74.         public event DeopEventHandler           OnDeop;
  75.         public event HalfopEventHandler         OnHalfop;
  76.         public event DehalfopEventHandler       OnDehalfop;
  77.         public event VoiceEventHandler          OnVoice;
  78.         public event DevoiceEventHandler        OnDevoice;
  79.         public event WhoEventHandler            OnWho;
  80.         public event MotdEventHandler           OnMotd;
  81.         public event TopicEventHandler          OnTopic;
  82.         public event TopicChangeEventHandler    OnTopicChange;
  83.         public event NickChangeEventHandler     OnNickChange;
  84.         public event IrcEventHandler            OnModeChange;
  85.         public event IrcEventHandler            OnUserModeChange;
  86.         public event IrcEventHandler            OnChannelModeChange;
  87.         public event IrcEventHandler            OnChannelMessage;
  88.         public event ActionEventHandler         OnChannelAction;
  89.         public event IrcEventHandler            OnChannelNotice;
  90.         public event IrcEventHandler            OnChannelActiveSynced;
  91.         public event IrcEventHandler            OnChannelPassiveSynced;
  92.         public event IrcEventHandler            OnQueryMessage;
  93.         public event ActionEventHandler         OnQueryAction;
  94.         public event IrcEventHandler            OnQueryNotice;
  95.         public event CtcpEventHandler           OnCtcpRequest;
  96.         public event CtcpEventHandler           OnCtcpReply;
  97.  
  98.        
  99.         public bool ActiveChannelSyncing {
  100.             get {
  101.                 return _ActiveChannelSyncing;
  102.             }
  103.             set {
  104.                 _ActiveChannelSyncing = value;
  105.             }
  106.         }
  107.  
  108.      
  109.         public bool PassiveChannelSyncing {
  110.             get {
  111.                 return _PassiveChannelSyncing;
  112.             }
  113.         }
  114.        
  115.        
  116.         public string CtcpVersion {
  117.             get {
  118.                 return _CtcpVersion;
  119.             }
  120.             set {
  121.                 _CtcpVersion = value;
  122.             }
  123.         }
  124.  
  125.      
  126.         public bool AutoJoinOnInvite {
  127.             get {
  128.                 return _AutoJoinOnInvite;
  129.             }
  130.             set {
  131.                 _AutoJoinOnInvite = value;
  132.             }
  133.         }
  134.  
  135.      
  136.         public bool AutoRejoin {
  137.             get {
  138.                 return _AutoRejoin;
  139.             }
  140.             set {
  141.                 _AutoRejoin = value;
  142.             }
  143.         }
  144.        
  145.    
  146.         public bool AutoRejoinOnKick {
  147.             get {
  148.                 return _AutoRejoinOnKick;
  149.             }
  150.             set {
  151.                 _AutoRejoinOnKick = value;
  152.             }
  153.         }
  154.  
  155.         public bool AutoRelogin {
  156.             get {
  157.                 return _AutoRelogin;
  158.             }
  159.             set {
  160.                 _AutoRelogin = value;
  161.             }
  162.         }
  163.  
  164.         public bool AutoNickHandling {
  165.             get {
  166.                 return _AutoNickHandling;
  167.             }
  168.             set {
  169.                 _AutoNickHandling = value;
  170.             }
  171.         }
  172.        
  173.         public bool SupportNonRfc {
  174.             get {
  175.                 return _SupportNonRfc;
  176.             }
  177.             set {
  178.                 if (_SupportNonRfcLocked) {
  179.                     return;
  180.                 }
  181.                 _SupportNonRfc = value;
  182.             }
  183.         }
  184.  
  185.      
  186.         public string Nickname {
  187.             get {
  188.                 return _Nickname;
  189.             }
  190.         }
  191.        
  192.        
  193.         public string[] NicknameList {
  194.             get {
  195.                 return _NicknameList;
  196.             }
  197.         }
  198.      
  199.        
  200.         public string Realname {
  201.             get {
  202.                 return _Realname;
  203.             }
  204.         }
  205.  
  206.         public string Username {
  207.             get {
  208.                 return _Username;
  209.             }
  210.         }
  211.  
  212.      
  213.         public string Usermode {
  214.             get {
  215.                 return _Usermode;
  216.             }
  217.         }
  218.  
  219.        
  220.         public int IUsermode {
  221.             get {
  222.                 return _IUsermode;
  223.             }
  224.         }
  225.  
  226.        
  227.         public bool IsAway {
  228.             get {
  229.                 return _IsAway;
  230.             }
  231.         }
  232.        
  233.        
  234.         public string Password {
  235.             get {
  236.                 return _Password;
  237.             }
  238.         }
  239.  
  240.      
  241.         public StringCollection JoinedChannels {
  242.             get {
  243.                 return _JoinedChannels;
  244.             }
  245.         }
  246.        
  247.        
  248.         public StringCollection Motd {
  249.             get {
  250.                 return _Motd;
  251.             }
  252.         }
  253.        
  254.        
  255.         public IrcClient()
  256.         {
  257.             OnReadLine        += new ReadLineEventHandler(_Worker);
  258.             OnDisconnected    += new EventHandler(_OnDisconnected);
  259.             OnConnectionError += new EventHandler(_OnConnectionError);
  260.         }
  261.  
  262.        
  263.         public new void Connect(string[] addresslist, int port)
  264.         {
  265.             _SupportNonRfcLocked = true;
  266.             base.Connect( port);
  267.         }
  268.      
  269.         public void Reconnect(bool login, bool channels)
  270.         {
  271.             if (channels) {
  272.                 _StoreChannelsToRejoin();
  273.             }
  274.             base.Reconnect();
  275.             if (login) {
  276.                 //reset the nick to the original nicklist
  277.                 _CurrentNickname = 0;
  278.                 Login(_NicknameList, Realname, IUsermode, Username, Password);
  279.             }
  280.             if (channels) {
  281.                 _RejoinChannels();
  282.             }
  283.         }
  284.  
  285.        
  286.         public void Reconnect(bool login)
  287.         {
  288.             Reconnect(login, true);
  289.         }
  290.  
  291.        
  292.         public void Login(string[] nicklist, string realname, int usermode, string username, string password)
  293.         {
  294.             _NicknameList = (string[])nicklist.Clone();
  295.             // here we set the nickname which we will try first
  296.             _Nickname = _NicknameList[0].Replace(" ", "");
  297.             _Realname = realname;
  298.             _IUsermode = usermode;
  299.  
  300.             if (username != null && username.Length > 0) {
  301.                 _Username = username.Replace(" ", "");
  302.             } else {
  303.                 _Username = Environment.UserName.Replace(" ", "");
  304.             }
  305.  
  306.             if (password != null && password.Length > 0) {
  307.                 _Password = password;
  308.                 RfcPass(Password, Priority.Critical);
  309.             }
  310.  
  311.             RfcNick(Nickname, Priority.Critical);
  312.             RfcUser(Username, IUsermode, Realname, Priority.Critical);
  313.         }
  314.  
  315.        
  316.         public void Login(string[] nicklist, string realname, int usermode, string username)
  317.         {
  318.             Login(nicklist, realname, usermode, username, "");
  319.         }
  320.        
  321.        
  322.         public void Login(string[] nicklist, string realname, int usermode)
  323.         {
  324.             Login(nicklist, realname, usermode, "", "");
  325.         }
  326.        
  327.         public void Login(string[] nicklist, string realname)
  328.         {
  329.             Login(nicklist, realname, 0, "", "");
  330.         }
  331.        
  332.         public void Login(string nick, string realname, int usermode, string username, string password)
  333.         {
  334.             Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, username, password);
  335.         }
  336.  
  337.          
  338.         public void Login(string nick, string realname, int usermode, string username)
  339.         {
  340.             Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, username, "");
  341.         }
  342.  
  343.        
  344.         public void Login(string nick, string realname, int usermode)
  345.         {
  346.             Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, "", "");
  347.         }
  348.  
  349.        
  350.         public void Login(string nick, string realname)
  351.         {
  352.             Login(new string[] {nick, nick+"_", nick+"__"}, realname, 0, "", "");
  353.         }
  354.        
  355.      
  356.         public bool IsMe(string nickname)
  357.         {
  358.             return (Nickname == nickname);
  359.         }
  360.  
  361.        
  362.         public bool IsJoined(string channelname)
  363.         {
  364.             return IsJoined(channelname, Nickname);
  365.         }
  366.  
  367.        
  368.         public bool IsJoined(string channelname, string nickname)
  369.         {
  370.             if (channelname == null) {
  371.                 throw new System.ArgumentNullException("channelname");
  372.             }
  373.  
  374.             if (nickname == null) {
  375.                 throw new System.ArgumentNullException("nickname");
  376.             }
  377.            
  378.             Channel channel = GetChannel(channelname);
  379.             if (channel != null &&
  380.                 channel.UnsafeUsers != null &&
  381.                 channel.UnsafeUsers.ContainsKey(nickname)) {
  382.                 return true;
  383.             }
  384.            
  385.             return false;
  386.         }
  387.  
  388.      
  389.         public IrcUser GetIrcUser(string nickname)
  390.         {
  391.             if (nickname == null) {
  392.                 throw new System.ArgumentNullException("nickname");
  393.             }
  394.  
  395.             return (IrcUser)_IrcUsers[nickname];
  396.         }
  397.  
  398.         // par sebbasstt
  399.         public void GetIrcUser(string nickname, ref IrcUser user)
  400.         {
  401.             if (nickname == null)
  402.             {
  403.                 throw new System.ArgumentNullException("nickname");
  404.             }
  405.  
  406.             user = (IrcUser)_IrcUsers[nickname];
  407.         }
  408.         //**
  409.  
  410.         public ChannelUser GetChannelUser(string channelname, string nickname)
  411.         {
  412.             if (channelname == null) {
  413.                 throw new System.ArgumentNullException("channel");
  414.             }
  415.  
  416.             if (nickname == null) {
  417.                 throw new System.ArgumentNullException("nickname");
  418.             }
  419.            
  420.             Channel channel = GetChannel(channelname);
  421.             if (channel != null) {
  422.                 return (ChannelUser)channel.UnsafeUsers[nickname];
  423.             } else {
  424.                 return null;
  425.             }
  426.         }
  427.  
  428.         public Channel GetChannel(string channelname)
  429.         {
  430.             if (channelname == null) {
  431.                 throw new System.ArgumentNullException("channelname");
  432.             }
  433.            
  434.             return (Channel)_Channels[channelname];
  435.         }
  436.  
  437.         public string[] GetChannels()
  438.         {
  439.             string[] channels = new string[_Channels.Values.Count];
  440.             int i = 0;
  441.             foreach (Channel channel in _Channels.Values) {
  442.                 channels[i++] = channel.Name;
  443.             }
  444.  
  445.             return channels;
  446.         }
  447.        
  448.         public IrcMessageData MessageParser(string rawline)
  449.         {
  450.             string         line;
  451.             string[]       linear;
  452.             string         messagecode;
  453.             string         from;
  454.             string         nick = null;
  455.             string         ident = null;
  456.             string         host = null;
  457.             string         channel = null;
  458.             string         message = null;
  459.             ReceiveType    type;
  460.             ReplyCode      replycode;
  461.             int            exclamationpos;
  462.             int            atpos;
  463.             int            colonpos;
  464.            
  465.             if (rawline[0] == ':') {
  466.                 line = rawline.Substring(1);
  467.             } else {
  468.                 line = rawline;
  469.             }
  470.  
  471.             linear = line.Split(new char[] {' '});
  472.  
  473.             // conform to RFC 2812
  474.             from = linear[0];
  475.             messagecode = linear[1];
  476.             exclamationpos = from.IndexOf("!");
  477.             atpos = from.IndexOf("@");
  478.             colonpos = line.IndexOf(" :");
  479.             if (colonpos != -1) {
  480.                 // we want the exact position of ":" not beginning from the space
  481.                 colonpos += 1;
  482.             }
  483.             if (exclamationpos != -1) {
  484.                 nick = from.Substring(0, exclamationpos);
  485.             }
  486.             if ((atpos != -1) &&
  487.                 (exclamationpos != -1)) {
  488.                 ident = from.Substring(exclamationpos+1, (atpos - exclamationpos)-1);
  489.             }
  490.             if (atpos != -1) {
  491.                 host = from.Substring(atpos+1);
  492.             }
  493.  
  494.             try {
  495.                 replycode = (ReplyCode)int.Parse(messagecode);
  496.             } catch (FormatException) {
  497.                 replycode = ReplyCode.Null;
  498.             }
  499.             type = _GetMessageType(rawline);
  500.             if (colonpos != -1) {
  501.                 message = line.Substring(colonpos+1);
  502.             }
  503.  
  504.             switch (type)
  505.             {
  506.                 case ReceiveType.Join:
  507.                 case ReceiveType.Kick:
  508.                 case ReceiveType.Part:
  509.                 case ReceiveType.TopicChange:
  510.                 case ReceiveType.ChannelModeChange:
  511.                 case ReceiveType.ChannelMessage:
  512.                 case ReceiveType.ChannelAction:
  513.                 case ReceiveType.ChannelNotice:
  514.                     channel = linear[2];
  515.                 break;
  516.                 case ReceiveType.Who:
  517.                 case ReceiveType.Topic:
  518.                 case ReceiveType.Invite:
  519.                 case ReceiveType.BanList:
  520.                 case ReceiveType.ChannelMode:
  521.                     channel = linear[3];
  522.                 break;
  523.                 case ReceiveType.Name:
  524.                     channel = linear[4];
  525.                 break;
  526.             }
  527.  
  528.             if ((channel != null) &&
  529.                 (channel[0] == ':')) {
  530.                     channel = channel.Substring(1);
  531.             }
  532.  
  533.             IrcMessageData data;
  534.             data = new IrcMessageData(this, from, nick, ident, host, channel, message, rawline, type, replycode);
  535.             return data;
  536.         }
  537.        
  538.         private void _Worker(object sender, ReadLineEventArgs e)
  539.         {
  540.             // lets see if we have events or internal messagehandler for it
  541.             _HandleEvents(MessageParser(e.Line));
  542.         }
  543.  
  544.         private void _OnDisconnected(object sender, EventArgs e)
  545.         {
  546.             if (AutoRejoin) {
  547.                 _StoreChannelsToRejoin();
  548.             }
  549.             _SyncingCleanup();
  550.         }
  551.        
  552.         private void _OnConnectionError(object sender, EventArgs e)
  553.         {
  554.             // AutoReconnect is handled in IrcConnection._OnConnectionError
  555.             if (AutoRelogin) {
  556.                 Login(_NicknameList, Realname, IUsermode, Username, Password);
  557.             }
  558.             if (AutoRejoin) {
  559.                 _RejoinChannels();
  560.             }
  561.         }
  562.        
  563.         private void _StoreChannelsToRejoin()
  564.         {
  565.             if (ActiveChannelSyncing || PassiveChannelSyncing)
  566.             {
  567.                 // store the key using channel sync
  568.                 foreach (Channel channel in _Channels.Values)
  569.                 {
  570.                     if (channel.Key.Length > 0)
  571.                     {
  572.                         _AutoRejoinChannels.Add(channel.Name, channel.Key);
  573.                         _AutoRejoinChannelsWithKeys = true;
  574.                     }
  575.                     else
  576.                     {
  577.                         _AutoRejoinChannels.Add(channel.Name, "nokey");
  578.                     }
  579.                 }
  580.             }
  581.             else
  582.             {
  583.                 foreach (string channel in _JoinedChannels)
  584.                 {
  585.                     _AutoRejoinChannels.Add(channel, "nokey");
  586.                 }
  587.             }
  588.         }
  589.        
  590.         private void _RejoinChannels()
  591.         {
  592.             int chan_count = _AutoRejoinChannels.Count;
  593.            
  594.             string[] names = new string[chan_count];
  595.             _AutoRejoinChannels.Keys.CopyTo(names, 0);
  596.            
  597.             if (_AutoRejoinChannelsWithKeys) {
  598.                 string[] keys = new string[chan_count];
  599.                 _AutoRejoinChannels.Values.CopyTo(keys, 0);
  600.                
  601.                 RfcJoin(names, keys, Priority.High);
  602.             } else {
  603.                 RfcJoin(names, Priority.High);
  604.             }
  605.                
  606.             _AutoRejoinChannelsWithKeys = false;
  607.             _AutoRejoinChannels.Clear();
  608.         }
  609.        
  610.         private void _SyncingCleanup()
  611.         {
  612.             // lets clean it baby, powered by Mr. Proper
  613.             _JoinedChannels.Clear();
  614.             if (ActiveChannelSyncing) {
  615.                 _Channels.Clear();
  616.                 _IrcUsers.Clear();
  617.             }
  618.            
  619.             _IsAway = false;
  620.            
  621.             _MotdReceived = false;
  622.             _Motd.Clear();
  623.         }
  624.        
  625.      
  626.         private string _NextNickname()
  627.         {
  628.             _CurrentNickname++;
  629.             //if we reach the end stay there
  630.             if (_CurrentNickname >= _NicknameList.Length) {
  631.                 _CurrentNickname--;
  632.             }
  633.             return NicknameList[_CurrentNickname];
  634.         }
  635.        
  636.         private ReceiveType _GetMessageType(string rawline)
  637.         {
  638.             Match found = _ReplyCodeRegex.Match(rawline);
  639.             if (found.Success) {
  640.                 string code = found.Groups[1].Value;
  641.                 ReplyCode replycode = (ReplyCode)int.Parse(code);
  642.  
  643.                 // check if this replycode is known in the RFC
  644.                 if (Array.IndexOf(_ReplyCodes, replycode) == -1) {
  645.  
  646.                     return ReceiveType.Unknown;
  647.                 }
  648.  
  649.                 switch (replycode) {
  650.                     case ReplyCode.Welcome:
  651.                     case ReplyCode.YourHost:
  652.                     case ReplyCode.Created:
  653.                     case ReplyCode.MyInfo:
  654.                     case ReplyCode.Bounce:
  655.                         return ReceiveType.Login;
  656.                     case ReplyCode.LuserClient:
  657.                     case ReplyCode.LuserOp:
  658.                     case ReplyCode.LuserUnknown:
  659.                     case ReplyCode.LuserMe:
  660.                     case ReplyCode.LuserChannels:
  661.                         return ReceiveType.Info;
  662.                     case ReplyCode.MotdStart:
  663.                     case ReplyCode.Motd:
  664.                     case ReplyCode.EndOfMotd:
  665.                         return ReceiveType.Motd;
  666.                     case ReplyCode.NamesReply:
  667.                     case ReplyCode.EndOfNames:
  668.                         return ReceiveType.Name;
  669.                     case ReplyCode.WhoReply:
  670.                     case ReplyCode.EndOfWho:
  671.                         return ReceiveType.Who;
  672.                     case ReplyCode.ListStart:
  673.                     case ReplyCode.List:
  674.                     case ReplyCode.ListEnd:
  675.                         return ReceiveType.List;
  676.                     case ReplyCode.BanList:
  677.                     case ReplyCode.EndOfBanList:
  678.                         return ReceiveType.BanList;
  679.                     case ReplyCode.Topic:
  680.                     case ReplyCode.NoTopic:
  681.                         return ReceiveType.Topic;
  682.                     case ReplyCode.WhoIsUser:
  683.                     case ReplyCode.WhoIsServer:
  684.                     case ReplyCode.WhoIsOperator:
  685.                     case ReplyCode.WhoIsIdle:
  686.                     case ReplyCode.WhoIsChannels:
  687.                     case ReplyCode.EndOfWhoIs:
  688.                         return ReceiveType.WhoIs;
  689.                     case ReplyCode.WhoWasUser:
  690.                     case ReplyCode.EndOfWhoWas:
  691.                         return ReceiveType.WhoWas;
  692.                     case ReplyCode.UserModeIs:
  693.                         return ReceiveType.UserMode;
  694.                     case ReplyCode.ChannelModeIs:
  695.                         return ReceiveType.ChannelMode;
  696.                     default:
  697.                         if (((int)replycode >= 400) &&
  698.                             ((int)replycode <= 599)) {
  699.                             return ReceiveType.ErrorMessage;
  700.                         } else {
  701. #if LOG4NET
  702.                             Logger.MessageTypes.Warn("replycode unknown ("+code+"): \""+rawline+"\"");
  703. #endif
  704.                             return ReceiveType.Unknown;
  705.                         }                        
  706.                 }
  707.             }
  708.  
  709.             found = _PingRegex.Match(rawline);
  710.             if (found.Success) {
  711.                 return ReceiveType.Unknown;
  712.             }
  713.  
  714.             found = _ErrorRegex.Match(rawline);
  715.             if (found.Success) {
  716.                 return ReceiveType.Error;
  717.             }
  718.  
  719.             found = _ActionRegex.Match(rawline);
  720.             if (found.Success) {
  721.                 switch (found.Groups[1].Value) {
  722.                     case "#":
  723.                     case "!":
  724.                     case "&":
  725.                     case "+":
  726.                         return ReceiveType.ChannelAction;
  727.                     default:
  728.                         return ReceiveType.QueryAction;
  729.                 }
  730.             }
  731.  
  732.             found = _CtcpRequestRegex.Match(rawline);
  733.             if (found.Success) {
  734.                 return ReceiveType.CtcpRequest;
  735.             }
  736.  
  737.             found = _MessageRegex.Match(rawline);
  738.             if (found.Success) {
  739.                 switch (found.Groups[1].Value) {
  740.                     case "#":
  741.                     case "!":
  742.                     case "&":
  743.                     case "+":
  744.                         return ReceiveType.ChannelMessage;
  745.                     default:
  746.                         return ReceiveType.QueryMessage;
  747.                 }
  748.             }
  749.  
  750.             found = _CtcpReplyRegex.Match(rawline);
  751.             if (found.Success) {
  752.                 return ReceiveType.CtcpReply;
  753.             }
  754.  
  755.             found = _NoticeRegex.Match(rawline);
  756.             if (found.Success) {
  757.                 switch (found.Groups[1].Value) {
  758.                     case "#":
  759.                     case "!":
  760.                     case "&":
  761.                     case "+":
  762.                         return ReceiveType.ChannelNotice;
  763.                     default:
  764.                         return ReceiveType.QueryNotice;
  765.                 }
  766.             }
  767.  
  768.             found = _InviteRegex.Match(rawline);
  769.             if (found.Success) {
  770.                 return ReceiveType.Invite;
  771.             }
  772.  
  773.             found = _JoinRegex.Match(rawline);
  774.             if (found.Success) {
  775.                 return ReceiveType.Join;
  776.             }
  777.  
  778.             found = _TopicRegex.Match(rawline);
  779.             if (found.Success) {
  780.                 return ReceiveType.TopicChange;
  781.             }
  782.  
  783.             found = _NickRegex.Match(rawline);
  784.             if (found.Success) {
  785.                 return ReceiveType.NickChange;
  786.             }
  787.  
  788.             found = _KickRegex.Match(rawline);
  789.             if (found.Success) {
  790.                 return ReceiveType.Kick;
  791.             }
  792.  
  793.             found = _PartRegex.Match(rawline);
  794.             if (found.Success) {
  795.                 return ReceiveType.Part;
  796.             }
  797.  
  798.             found = _ModeRegex.Match(rawline);
  799.             if (found.Success) {
  800.                 if (found.Groups[1].Value == _Nickname) {
  801.                     return ReceiveType.UserModeChange;
  802.                 } else {
  803.                     return ReceiveType.ChannelModeChange;
  804.                 }
  805.             }
  806.  
  807.             found = _QuitRegex.Match(rawline);
  808.             if (found.Success) {
  809.                 return ReceiveType.Quit;
  810.             }
  811.  
  812. #if LOG4NET
  813.             Logger.MessageTypes.Warn("messagetype unknown: \""+rawline+"\"");
  814. #endif
  815.             return ReceiveType.Unknown;
  816.         }
  817.        
  818.         private void _HandleEvents(IrcMessageData ircdata)
  819.         {
  820.             if (OnRawMessage != null) {
  821.                 OnRawMessage(this, new IrcEventArgs(ircdata));
  822.             }
  823.  
  824.             string code;
  825.             // special IRC messages
  826.             code = ircdata.RawMessageArray[0];
  827.             switch (code) {
  828.                 case "PING":
  829.                     _Event_PING(ircdata);
  830.                 break;
  831.                 case "ERROR":
  832.                     _Event_ERROR(ircdata);
  833.                 break;
  834.             }
  835.  
  836.             code = ircdata.RawMessageArray[1];
  837.             switch (code) {
  838.                 case "PRIVMSG":
  839.                     _Event_PRIVMSG(ircdata);
  840.                 break;
  841.                 case "NOTICE":
  842.                     _Event_NOTICE(ircdata);
  843.                 break;
  844.                 case "JOIN":
  845.                     _Event_JOIN(ircdata);
  846.                 break;
  847.                 case "PART":
  848.                     _Event_PART(ircdata);
  849.                 break;
  850.                 case "KICK":
  851.                     _Event_KICK(ircdata);
  852.                 break;
  853.                 case "QUIT":
  854.                     _Event_QUIT(ircdata);
  855.                 break;
  856.                 case "TOPIC":
  857.                     _Event_TOPIC(ircdata);
  858.                 break;
  859.                 case "NICK":
  860.                     _Event_NICK(ircdata);
  861.                 break;
  862.                 case "INVITE":
  863.                     _Event_INVITE(ircdata);
  864.                 break;
  865.                 case "MODE":
  866.                     _Event_MODE(ircdata);
  867.                 break;
  868.                 case "PONG":
  869.                     _Event_PONG(ircdata);
  870.                 break;
  871.             }
  872.  
  873.             if (ircdata.ReplyCode != ReplyCode.Null) {
  874.                 switch (ircdata.ReplyCode) {
  875.                     case ReplyCode.Welcome:
  876.                         _Event_RPL_WELCOME(ircdata);
  877.                     break;
  878.                     case ReplyCode.Topic:
  879.                         _Event_RPL_TOPIC(ircdata);
  880.                     break;
  881.                     case ReplyCode.NoTopic:
  882.                         _Event_RPL_NOTOPIC(ircdata);
  883.                     break;
  884.                     case ReplyCode.NamesReply:
  885.                         _Event_RPL_NAMREPLY(ircdata);
  886.                     break;
  887.                     case ReplyCode.EndOfNames:
  888.                         _Event_RPL_ENDOFNAMES(ircdata);
  889.                     break;
  890.                     case ReplyCode.WhoReply:
  891.                         _Event_RPL_WHOREPLY(ircdata);
  892.                     break;
  893.                     case ReplyCode.ChannelModeIs:
  894.                         _Event_RPL_CHANNELMODEIS(ircdata);
  895.                     break;
  896.                     case ReplyCode.BanList:
  897.                         _Event_RPL_BANLIST(ircdata);
  898.                     break;
  899.                     case ReplyCode.EndOfBanList:
  900.                         _Event_RPL_ENDOFBANLIST(ircdata);
  901.                     break;
  902.                     case ReplyCode.Motd:
  903.                         _Event_RPL_MOTD(ircdata);
  904.                     break;
  905.                     case ReplyCode.EndOfMotd:
  906.                         _Event_RPL_ENDOFMOTD(ircdata);
  907.                     break;
  908.                     case ReplyCode.Away:
  909.                         _Event_RPL_AWAY(ircdata);
  910.                     break;
  911.                     case ReplyCode.UnAway:
  912.                         _Event_RPL_UNAWAY(ircdata);
  913.                     break;
  914.                     case ReplyCode.NowAway:
  915.                         _Event_RPL_NOWAWAY(ircdata);
  916.                     break;
  917.                     case ReplyCode.ErrorNicknameInUse:
  918.                         _Event_ERR_NICKNAMEINUSE(ircdata);
  919.                     break;
  920.                 }
  921.             }
  922.            
  923.             if (ircdata.Type == ReceiveType.ErrorMessage) {
  924.                 _Event_ERR(ircdata);
  925.             }
  926.         }
  927.  
  928.         /// <summary>
  929.         /// Removes a specified user from all channel lists
  930.         /// </summary>
  931.         /// <param name="nickname">The users 'nick' name which may NOT contain spaces</param>
  932.         private bool _RemoveIrcUser(string nickname)
  933.         {
  934.             if (GetIrcUser(nickname).JoinedChannels.Length == 0) {
  935.                 // he is nowhere else, lets kill him
  936.                 _IrcUsers.Remove(nickname);
  937.                 return true;
  938.             }
  939.  
  940.             return false;
  941.         }
  942.        
  943.         /// <summary>
  944.         /// Removes a specified user from a specified channel list
  945.         /// </summary>
  946.         /// <param name="channelname">The name of the channel you wish to query</param>
  947.         /// <param name="nickname">The users 'nick' name which may NOT contain spaces</param>
  948.         private void _RemoveChannelUser(string channelname, string nickname)
  949.         {
  950.             Channel chan = GetChannel(channelname);
  951.             chan.UnsafeUsers.Remove(nickname);
  952.             chan.UnsafeOps.Remove(nickname);
  953.             chan.UnsafeVoices.Remove(nickname);
  954.             if (SupportNonRfc) {
  955.                 NonRfcChannel nchan = (NonRfcChannel)chan;
  956.                 nchan.UnsafeHalfops.Remove(nickname);
  957.             }
  958.         }
  959.  
  960.         /// <summary>
  961.         ///
  962.         /// </summary>
  963.         /// <param name="ircdata">Message data containing channel mode information</param>
  964.         /// <param name="mode">Channel mode</param>
  965.         /// <param name="parameter">List of supplied paramaters</param>
  966.         private void _InterpretChannelMode(IrcMessageData ircdata, string mode, string parameter)
  967.         {
  968.             string[] parameters = parameter.Split(new char[] {' '});
  969.             bool add       = false;
  970.             bool remove    = false;
  971.             int modelength = mode.Length;
  972.             string temp;
  973.             Channel channel = null;
  974.             if (ActiveChannelSyncing) {
  975.                 channel = GetChannel(ircdata.Channel);
  976.             }
  977.             IEnumerator parametersEnumerator = parameters.GetEnumerator();
  978.             // bring the enumerator to the 1. element
  979.             parametersEnumerator.MoveNext();
  980.             for (int i = 0; i < modelength; i++) {
  981.                 switch(mode[i]) {
  982.                     case '-':
  983.                         add = false;
  984.                         remove = true;
  985.                     break;
  986.                     case '+':
  987.                         add = true;
  988.                         remove = false;
  989.                     break;
  990.                     case 'o':
  991.                         temp = (string)parametersEnumerator.Current;
  992.                         parametersEnumerator.MoveNext();
  993.                        
  994.                         if (add) {
  995.                             if (ActiveChannelSyncing) {
  996.                                 // sanity check
  997.                                 if (GetChannelUser(ircdata.Channel, temp) != null) {
  998.                                     // update the op list
  999.                                     try {
  1000.                                         channel.UnsafeOps.Add(temp, GetIrcUser(temp));
  1001. #if LOG4NET
  1002.                                         Logger.ChannelSyncing.Debug("added op: "+temp+" to: "+ircdata.Channel);
  1003. #endif
  1004.                                     } catch (ArgumentException) {
  1005. #if LOG4NET
  1006.                                         Logger.ChannelSyncing.Debug("duplicate op: "+temp+" in: "+ircdata.Channel+" not added");
  1007. #endif
  1008.                                     }
  1009.                                    
  1010.                                     // update the user op status
  1011.                                     ChannelUser cuser = GetChannelUser(ircdata.Channel, temp);
  1012.                                     cuser.IsOp = true;
  1013. #if LOG4NET
  1014.                                     Logger.ChannelSyncing.Debug("set op status: " + temp + " for: "+ircdata.Channel);
  1015. #endif
  1016.                                 } else {
  1017. #if LOG4NET
  1018.                                     Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1019. #endif
  1020.                                 }
  1021.                             }
  1022.                            
  1023.                             if (OnOp != null) {
  1024.                                 OnOp(this, new OpEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1025.                             }
  1026.                         }
  1027.                         if (remove) {
  1028.                             if (ActiveChannelSyncing) {
  1029.                                 // sanity check
  1030.                                 if (GetChannelUser(ircdata.Channel, temp) != null) {
  1031.                                     // update the op list
  1032.                                     channel.UnsafeOps.Remove(temp);
  1033. #if LOG4NET
  1034.                                     Logger.ChannelSyncing.Debug("removed op: "+temp+" from: "+ircdata.Channel);
  1035. #endif
  1036.                                     // update the user op status
  1037.                                     ChannelUser cuser = GetChannelUser(ircdata.Channel, temp);
  1038.                                     cuser.IsOp = false;
  1039. #if LOG4NET
  1040.                                     Logger.ChannelSyncing.Debug("unset op status: " + temp + " for: "+ircdata.Channel);
  1041. #endif
  1042.                                 } else {
  1043. #if LOG4NET
  1044.                                     Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1045. #endif
  1046.                                 }
  1047.                             }
  1048.                            
  1049.                             if (OnDeop != null) {
  1050.                                 OnDeop(this, new DeopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1051.                             }
  1052.                         }
  1053.                     break;
  1054.                     case 'h':
  1055.                         if (SupportNonRfc) {
  1056.                             temp = (string)parametersEnumerator.Current;
  1057.                             parametersEnumerator.MoveNext();
  1058.                            
  1059.                             if (add) {
  1060.                                 if (ActiveChannelSyncing) {
  1061.                                     // sanity check
  1062.                                     if (GetChannelUser(ircdata.Channel, temp) != null) {
  1063.                                         // update the halfop list
  1064.                                         try {
  1065.                                             ((NonRfcChannel)channel).UnsafeHalfops.Add(temp, GetIrcUser(temp));
  1066. #if LOG4NET
  1067.                                             Logger.ChannelSyncing.Debug("added halfop: "+temp+" to: "+ircdata.Channel);
  1068. #endif
  1069.                                         } catch (ArgumentException) {
  1070. #if LOG4NET
  1071.                                             Logger.ChannelSyncing.Debug("duplicate halfop: "+temp+" in: "+ircdata.Channel+" not added");
  1072. #endif
  1073.                                         }
  1074.                                        
  1075.                                         // update the user halfop status
  1076.                                         NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp);
  1077.                                         cuser.IsHalfop = true;
  1078. #if LOG4NET
  1079.                                         Logger.ChannelSyncing.Debug("set halfop status: " + temp + " for: "+ircdata.Channel);
  1080. #endif
  1081.                                     } else {
  1082. #if LOG4NET
  1083.                                         Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1084. #endif
  1085.                                     }
  1086.                                 }
  1087.                                
  1088.                                 if (OnHalfop != null) {
  1089.                                     OnHalfop(this, new HalfopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1090.                                 }
  1091.                             }
  1092.                             if (remove) {
  1093.                                 if (ActiveChannelSyncing) {
  1094.                                     // sanity check
  1095.                                     if (GetChannelUser(ircdata.Channel, temp) != null) {
  1096.                                         // update the halfop list
  1097.                                         ((NonRfcChannel)channel).UnsafeHalfops.Remove(temp);
  1098. #if LOG4NET
  1099.                                         Logger.ChannelSyncing.Debug("removed halfop: "+temp+" from: "+ircdata.Channel);
  1100. #endif
  1101.                                         // update the user halfop status
  1102.                                         NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp);
  1103.                                         cuser.IsHalfop = false;
  1104. #if LOG4NET
  1105.                                         Logger.ChannelSyncing.Debug("unset halfop status: " + temp + " for: "+ircdata.Channel);
  1106. #endif
  1107.                                     } else {
  1108. #if LOG4NET
  1109.                                         Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1110. #endif
  1111.                                     }
  1112.                                 }
  1113.                                
  1114.                                 if (OnDehalfop != null) {
  1115.                                     OnDehalfop(this, new DehalfopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1116.                                 }
  1117.                             }
  1118.                         }
  1119.                     break;
  1120.                     case 'v':
  1121.                         temp = (string)parametersEnumerator.Current;
  1122.                         parametersEnumerator.MoveNext();
  1123.                        
  1124.                         if (add) {
  1125.                             if (ActiveChannelSyncing) {
  1126.                                 // sanity check
  1127.                                 if (GetChannelUser(ircdata.Channel, temp) != null) {
  1128.                                     // update the voice list
  1129.                                     try {
  1130.                                         channel.UnsafeVoices.Add(temp, GetIrcUser(temp));
  1131. #if LOG4NET
  1132.                                         Logger.ChannelSyncing.Debug("added voice: "+temp+" to: "+ircdata.Channel);
  1133. #endif
  1134.                                     } catch (ArgumentException) {
  1135. #if LOG4NET
  1136.                                         Logger.ChannelSyncing.Debug("duplicate voice: "+temp+" in: "+ircdata.Channel+" not added");
  1137. #endif
  1138.                                     }
  1139.                                    
  1140.                                     // update the user voice status
  1141.                                     ChannelUser cuser = GetChannelUser(ircdata.Channel, temp);
  1142.                                     cuser.IsVoice = true;
  1143. #if LOG4NET
  1144.                                     Logger.ChannelSyncing.Debug("set voice status: " + temp + " for: "+ircdata.Channel);
  1145. #endif
  1146.                                 } else {
  1147. #if LOG4NET
  1148.                                     Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1149. #endif
  1150.                                 }
  1151.                             }
  1152.                            
  1153.                             if (OnVoice != null) {
  1154.                                 OnVoice(this, new VoiceEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1155.                             }
  1156.                         }
  1157.                         if (remove) {
  1158.                             if (ActiveChannelSyncing) {
  1159.                                 // sanity check
  1160.                                 if (GetChannelUser(ircdata.Channel, temp) != null) {
  1161.                                     // update the voice list
  1162.                                     channel.UnsafeVoices.Remove(temp);
  1163. #if LOG4NET
  1164.                                     Logger.ChannelSyncing.Debug("removed voice: "+temp+" from: "+ircdata.Channel);
  1165. #endif
  1166.                                     // update the user voice status
  1167.                                     ChannelUser cuser = GetChannelUser(ircdata.Channel, temp);
  1168.                                     cuser.IsVoice = false;
  1169. #if LOG4NET
  1170.                                     Logger.ChannelSyncing.Debug("unset voice status: " + temp + " for: "+ircdata.Channel);
  1171. #endif
  1172.                                 } else {
  1173. #if LOG4NET
  1174.                                     Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring...");
  1175. #endif
  1176.                                 }
  1177.                             }
  1178.                            
  1179.                             if (OnDevoice != null) {
  1180.                                 OnDevoice(this, new DevoiceEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1181.                             }
  1182.                         }
  1183.                     break;
  1184.                     case 'b':
  1185.                         temp = (string)parametersEnumerator.Current;
  1186.                         parametersEnumerator.MoveNext();
  1187.                         if (add) {
  1188.                             if (ActiveChannelSyncing) {
  1189.                                 try {
  1190.                                     channel.Bans.Add(temp);
  1191. #if LOG4NET
  1192.                                     Logger.ChannelSyncing.Debug("added ban: "+temp+" to: "+ircdata.Channel);
  1193. #endif
  1194.                                 } catch (ArgumentException) {
  1195. #if LOG4NET
  1196.                                     Logger.ChannelSyncing.Debug("duplicate ban: "+temp+" in: "+ircdata.Channel+" not added");
  1197. #endif
  1198.                                 }
  1199.                             }
  1200.                             if (OnBan != null) {
  1201.                                OnBan(this, new BanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1202.                             }
  1203.                         }
  1204.                         if (remove) {
  1205.                             if (ActiveChannelSyncing) {
  1206.                                 channel.Bans.Remove(temp);
  1207. #if LOG4NET
  1208.                                 Logger.ChannelSyncing.Debug("removed ban: "+temp+" from: "+ircdata.Channel);
  1209. #endif
  1210.                             }
  1211.                             if (OnUnban != null) {
  1212.                                 OnUnban(this, new UnbanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp));
  1213.                             }
  1214.                         }
  1215.                     break;
  1216.                     case 'l':
  1217.                         temp = (string)parametersEnumerator.Current;
  1218.                         parametersEnumerator.MoveNext();
  1219.                         if (add) {
  1220.                             if (ActiveChannelSyncing) {
  1221.                                 try {
  1222.                                     channel.UserLimit = int.Parse(temp);
  1223. #if LOG4NET
  1224.                                     Logger.ChannelSyncing.Debug("stored user limit for: "+ircdata.Channel);
  1225. #endif
  1226.                                 } catch (FormatException) {
  1227. #if LOG4NET
  1228.                                     Logger.ChannelSyncing.Error("could not parse user limit: "+temp+" channel: "+ircdata.Channel);
  1229. #endif
  1230.                                 }
  1231.                             }
  1232.                         }
  1233.                         if (remove) {
  1234.                             if (ActiveChannelSyncing) {
  1235.                                 channel.UserLimit = 0;
  1236. #if LOG4NET
  1237.                                 Logger.ChannelSyncing.Debug("removed user limit for: "+ircdata.Channel);
  1238. #endif
  1239.                             }
  1240.                         }
  1241.                     break;
  1242.                         // 28/03/2010  seb bug ici... si nous avons le mode +l 12 et que l'on l'enleve en meme temps que l'on met +k lol   ca plante !
  1243.                     case 'k':
  1244.                     {
  1245.                         try
  1246.                         {
  1247.                             temp = (string)parametersEnumerator.Current;
  1248.                             parametersEnumerator.MoveNext();
  1249.                             if (add)
  1250.                             {
  1251.                                 if (ActiveChannelSyncing)
  1252.                                 {
  1253.                                     channel.Key = temp;
  1254. #if LOG4NET
  1255.                                     Logger.ChannelSyncing.Debug("stored channel key for: "+ircdata.Channel);
  1256. #endif
  1257.                                 }
  1258.                             }
  1259.                             if (remove)
  1260.                             {
  1261.                                 if (ActiveChannelSyncing)
  1262.                                 {
  1263.                                     channel.Key = "";
  1264. #if LOG4NET
  1265.                                     Logger.ChannelSyncing.Debug("removed channel key for: "+ircdata.Channel);
  1266. #endif
  1267.                                 }
  1268.                             }
  1269.                         }
  1270.                         catch (Exception ex)
  1271.                         {
  1272.                             // evite de planter..
  1273.                         }
  1274.                     }
  1275.                     break;
  1276.                         default:
  1277.                             if (add) {
  1278.                                 if (ActiveChannelSyncing) {
  1279.                                     channel.Mode += mode[i];
  1280. #if LOG4NET
  1281.                                     Logger.ChannelSyncing.Debug("added channel mode ("+mode[i]+") for: "+ircdata.Channel);
  1282. #endif
  1283.                                 }
  1284.                             }
  1285.                             if (remove) {
  1286.                                 if (ActiveChannelSyncing) {
  1287.                                     channel.Mode = channel.Mode.Replace(mode[i], new char());
  1288. #if LOG4NET
  1289.                                     Logger.ChannelSyncing.Debug("removed channel mode ("+mode[i]+") for: "+ircdata.Channel);
  1290. #endif
  1291.                                 }
  1292.                             }
  1293.                         break;
  1294.                     }
  1295.                 }
  1296.         }
  1297.        
  1298.         // <internal messagehandler>
  1299.  
  1300.         /// <summary>
  1301.         /// Event handler for ping messages
  1302.         /// </summary>
  1303.         /// <param name="ircdata">Message data containing ping information</param>
  1304.         private void _Event_PING(IrcMessageData ircdata)
  1305.         {
  1306.             string server = ircdata.RawMessageArray[1].Substring(1);
  1307. #if LOG4NET
  1308.             Logger.Connection.Debug("Ping? Pong!");
  1309. #endif
  1310.             RfcPong(server, Priority.Critical);
  1311.  
  1312.             if (OnPing != null) {
  1313.                 OnPing(this, new PingEventArgs(ircdata, server));
  1314.             }
  1315.         }
  1316.  
  1317.         /// <summary>
  1318.         /// Event handler for PONG messages
  1319.         /// </summary>
  1320.         /// <param name="ircdata">Message data containing pong information</param>
  1321.         private void _Event_PONG(IrcMessageData ircdata)    
  1322.         {
  1323.             if (OnPong != null) {
  1324.                 OnPong(this, new PongEventArgs(ircdata, ircdata.Irc.Lag));
  1325.             }
  1326.         }
  1327.  
  1328.         private void _Event_ERROR(IrcMessageData ircdata)
  1329.         {
  1330.             string message = ircdata.Message;
  1331.  
  1332.             if (OnError != null)
  1333.             {
  1334.                 //OnError(this, new ErrorEventHandler(ircdata, message));
  1335.             }
  1336.         }
  1337.  
  1338.         private void _Event_JOIN(IrcMessageData ircdata)
  1339.         {
  1340.             string who = ircdata.Nick;
  1341.             string channelname = ircdata.Channel;
  1342.  
  1343.             if (IsMe(who)) {
  1344.                 _JoinedChannels.Add(channelname);
  1345.             }
  1346.  
  1347.             if (ActiveChannelSyncing) {
  1348.                 Channel channel;
  1349.                 if (IsMe(who)) {
  1350.                     // we joined the channel
  1351.  
  1352.                     if (SupportNonRfc) {
  1353.                         channel = new NonRfcChannel(channelname);
  1354.                     } else {
  1355.                         channel = new Channel(channelname);
  1356.                     }
  1357.                     _Channels.Add(channelname, channel);
  1358.                     // request channel mode
  1359.                     RfcMode(channelname);
  1360.                     // request wholist
  1361.                     RfcWho(channelname);
  1362.                     // request banlist
  1363.                     Ban(channelname);
  1364.                 } else {
  1365.                     // someone else joined the channel
  1366.                     // request the who data
  1367.                     RfcWho(who);
  1368.                 }
  1369.  
  1370.  
  1371.                 channel = GetChannel(channelname);
  1372.                 IrcUser ircuser = GetIrcUser(who);
  1373.  
  1374.                 if (ircuser == null) {
  1375.                     ircuser = new IrcUser(who, this);
  1376.                     ircuser.Ident = ircdata.Ident;
  1377.                     ircuser.Host  = ircdata.Host;
  1378.                     _IrcUsers.Add(who, ircuser);
  1379.                 }
  1380.  
  1381.                 ChannelUser channeluser;
  1382.                 if (SupportNonRfc) {
  1383.                     channeluser = new NonRfcChannelUser(channelname, ircuser);
  1384.                 } else {
  1385.                     channeluser = new ChannelUser(channelname, ircuser);
  1386.                 }
  1387.                 try
  1388.                 {
  1389.  
  1390.                     channel.UnsafeUsers.Add(who, channeluser);
  1391.                 }
  1392.                 catch (Exception ex)
  1393.                 {
  1394.                     int a = 10;
  1395.                 }
  1396.             }
  1397.  
  1398.             if (OnJoin != null) {
  1399.                 OnJoin(this, new JoinEventArgs(ircdata, channelname, who));
  1400.             }
  1401.         }
  1402.  
  1403.         private void _Event_PART(IrcMessageData ircdata)
  1404.         {
  1405.             string who = ircdata.Nick;
  1406.             string channel = ircdata.Channel;
  1407.             string partmessage = ircdata.Message;
  1408.  
  1409.             if (IsMe(who)) {
  1410.                 _JoinedChannels.Remove(channel);
  1411.             }
  1412.  
  1413.             if (ActiveChannelSyncing) {
  1414.                 if (IsMe(who)) {
  1415.  
  1416.                     _Channels.Remove(channel);
  1417.                 } else {
  1418.  
  1419.                     _RemoveChannelUser(channel, who);
  1420.                     _RemoveIrcUser(who);
  1421.                 }
  1422.             }
  1423.  
  1424.             if (OnPart != null) {
  1425.                 OnPart(this, new PartEventArgs(ircdata, channel, who, partmessage));
  1426.             }
  1427.         }
  1428.  
  1429.         private void _Event_KICK(IrcMessageData ircdata)
  1430.         {
  1431.             string channelname = ircdata.Channel;
  1432.             string who = ircdata.Nick;
  1433.             string whom = ircdata.RawMessageArray[3];
  1434.             string reason = ircdata.Message;
  1435.             bool isme = IsMe(whom);          
  1436.            
  1437.             if (isme) {
  1438.                 _JoinedChannels.Remove(channelname);
  1439.             }
  1440.            
  1441.             if (ActiveChannelSyncing) {
  1442.                 if (isme) {
  1443.                     Channel channel = GetChannel(channelname);
  1444.                     _Channels.Remove(channelname);
  1445.                     if (_AutoRejoinOnKick) {
  1446.                         RfcJoin(channel.Name, channel.Key);
  1447.                     }
  1448.                 } else {
  1449.                     _RemoveChannelUser(channelname, whom);
  1450.                     _RemoveIrcUser(whom);
  1451.                 }
  1452.             } else {
  1453.                 if (isme && AutoRejoinOnKick) {
  1454.                     RfcJoin(channelname);
  1455.                 }
  1456.             }
  1457.            
  1458.             if (OnKick != null) {
  1459.                 OnKick(this, new KickEventArgs(ircdata, channelname, who, whom, reason));
  1460.             }
  1461.         }
  1462.  
  1463.         private void _Event_QUIT(IrcMessageData ircdata)
  1464.         {
  1465.             string who = ircdata.Nick;
  1466.             string reason = ircdata.Message;
  1467.            
  1468.             // no need to handle if we quit, disconnect event will take care
  1469.            
  1470.             if (ActiveChannelSyncing)
  1471.             {
  1472.                 // sanity checks, freshirc is very broken about RFC
  1473.                 IrcUser user = GetIrcUser(who);
  1474.                 if (user != null)
  1475.                 {
  1476.                     string[] joined_channels = user.JoinedChannels;
  1477.                     if (joined_channels != null)
  1478.                     {
  1479.                         foreach (string channel in joined_channels)
  1480.                         {
  1481.                             _RemoveChannelUser(channel, who);
  1482.                         }
  1483.                         _RemoveIrcUser(who);
  1484.                     }
  1485.                 }
  1486.             }
  1487.  
  1488.             if (OnQuit != null)
  1489.             {
  1490.                 OnQuit(this, new QuitEventArgs(ircdata, who, reason));
  1491.             }
  1492.         }
  1493.  
  1494.         private void _Event_PRIVMSG(IrcMessageData ircdata)
  1495.         {
  1496.             // new by Sebbasstt 9/9/2010
  1497.             IrcUser usr = null;
  1498.             GetIrcUser(ircdata.Nick, ref usr);
  1499.             //**
  1500.             if (ircdata.Type == ReceiveType.CtcpRequest) {
  1501.                 if (ircdata.Message.StartsWith("\x1"+"PING")) {
  1502.                     if (ircdata.Message.Length > 7) {
  1503.                         SendMessage(SendType.CtcpReply, ircdata.Nick, "PING "+ircdata.Message.Substring(6, (ircdata.Message.Length-7)));
  1504.                     } else {
  1505.                         SendMessage(SendType.CtcpReply, ircdata.Nick, "PING");
  1506.                     }
  1507.                 } else if (ircdata.Message.StartsWith("\x1"+"VERSION")) {
  1508.                     string versionstring;
  1509.                     if (_CtcpVersion == null) {
  1510.                         versionstring = VersionString;
  1511.                     } else {
  1512.                         versionstring = _CtcpVersion;
  1513.                     }
  1514.                     SendMessage(SendType.CtcpReply, ircdata.Nick, "VERSION "+versionstring);
  1515.                 } else if (ircdata.Message.StartsWith("\x1"+"CLIENTINFO")) {
  1516.                     SendMessage(SendType.CtcpReply, ircdata.Nick, "CLIENTINFO PING VERSION CLIENTINFO");
  1517.                 }
  1518.             }
  1519.  
  1520.             switch (ircdata.Type)
  1521.             {
  1522.                 case ReceiveType.ChannelMessage:
  1523.                     // add par Sebbasstt 9/9/2010
  1524.                     Security_AntiRepeat_1.AddMessage(ref usr, ircdata.Message);
  1525.                     Security_AntiRepeat_2.AddMessage(ref usr, ircdata.Message);
  1526.                     //***
  1527.                     if (OnChannelMessage != null)
  1528.                     {
  1529.                         OnChannelMessage(this, new IrcEventArgs(ircdata));
  1530.                     }
  1531.                     break;
  1532.                 case ReceiveType.ChannelAction:
  1533.                     // add par Sebbasstt 9/9/2010
  1534.                     Security_AntiRepeat_1.AddMessage(ref usr, ircdata.Message);
  1535.                     Security_AntiRepeat_2.AddMessage(ref usr, ircdata.Message);
  1536.                     //***
  1537.                     if (OnChannelAction != null)
  1538.                     {
  1539.                         string action = ircdata.Message.Substring(7, ircdata.Message.Length-8);
  1540.                         OnChannelAction(this, new ActionEventArgs(ircdata, action));
  1541.                     }
  1542.                     break;
  1543.                 case ReceiveType.QueryMessage:
  1544.                     if (OnQueryMessage != null)
  1545.                     {
  1546.                         OnQueryMessage(this, new IrcEventArgs(ircdata));
  1547.                     }
  1548.                     break;
  1549.                 case ReceiveType.QueryAction:
  1550.                     if (OnQueryAction != null)
  1551.                     {
  1552.                         string action = ircdata.Message.Substring(7, ircdata.Message.Length-8);
  1553.                         OnQueryAction(this, new ActionEventArgs(ircdata, action));
  1554.                     }
  1555.                     break;
  1556.                 case ReceiveType.CtcpRequest:
  1557.                     if (OnCtcpRequest != null)
  1558.                     {
  1559.                         int space_pos = ircdata.Message.IndexOf(' ');
  1560.                         string cmd = "";
  1561.                         string param = "";
  1562.                         if (space_pos != -1)
  1563.                         {
  1564.                             cmd = ircdata.Message.Substring(1, space_pos - 1);
  1565.                             param = ircdata.Message.Substring(space_pos + 1,
  1566.                                         ircdata.Message.Length - space_pos - 2);
  1567.                         }
  1568.                         else
  1569.                         {
  1570.                             cmd = ircdata.Message.Substring(1, ircdata.Message.Length - 2);
  1571.                         }
  1572.                         OnCtcpRequest(this, new CtcpEventArgs(ircdata, cmd, param));
  1573.                     }
  1574.                     break;
  1575.             }
  1576.         }
  1577.  
  1578.         private void _Event_NOTICE(IrcMessageData ircdata)
  1579.         {
  1580.             switch (ircdata.Type)
  1581.             {
  1582.                 case ReceiveType.ChannelNotice:
  1583.                     if (OnChannelNotice != null)
  1584.                     {
  1585.                         OnChannelNotice(this, new IrcEventArgs(ircdata));
  1586.                     }
  1587.                     break;
  1588.                 case ReceiveType.QueryNotice:
  1589.                     if (OnQueryNotice != null)
  1590.                     {
  1591.                         OnQueryNotice(this, new IrcEventArgs(ircdata));
  1592.                     }
  1593.                     break;
  1594.                 case ReceiveType.CtcpReply:
  1595.                     if (OnCtcpReply != null)
  1596.                     {
  1597.                         int space_pos = ircdata.Message.IndexOf(' ');
  1598.                         string cmd = "";
  1599.                         string param = "";
  1600.                         if (space_pos != -1) {
  1601.                             cmd = ircdata.Message.Substring(1, space_pos - 1);
  1602.                             param = ircdata.Message.Substring(space_pos + 1,
  1603.                                         ircdata.Message.Length - space_pos - 2);
  1604.                         } else {
  1605.                             cmd = ircdata.Message.Substring(1, ircdata.Message.Length - 2);
  1606.                         }
  1607.                         OnCtcpReply(this, new CtcpEventArgs(ircdata, cmd, param));
  1608.                     }
  1609.                     break;
  1610.             }
  1611.         }
  1612.  
  1613.         private void _Event_TOPIC(IrcMessageData ircdata)
  1614.         {
  1615.             string who = ircdata.Nick;
  1616.             string channel = ircdata.Channel;
  1617.             string newtopic = ircdata.Message;
  1618.  
  1619.             if (ActiveChannelSyncing && IsJoined(channel))
  1620.             {
  1621.                 GetChannel(channel).Topic = newtopic;
  1622.             }
  1623.             if (OnTopicChange != null)
  1624.             {
  1625.                 OnTopicChange(this, new TopicChangeEventArgs(ircdata, channel, who, newtopic));
  1626.             }
  1627.         }
  1628.  
  1629.         private void _Event_NICK(IrcMessageData ircdata)
  1630.         {
  1631.             string oldnickname = ircdata.Nick;
  1632.             string newnickname = ircdata.Message;
  1633.  
  1634.             if (IsMe(ircdata.Nick)) {
  1635.                 // nickname change is your own
  1636.                 _Nickname = newnickname;
  1637.             }
  1638.  
  1639.             if (ActiveChannelSyncing) {
  1640.                 IrcUser ircuser = GetIrcUser(oldnickname);
  1641.                
  1642.                 // if we don't have any info about him, don't update him!
  1643.                 // (only queries or ourself in no channels)
  1644.                 if (ircuser != null) {
  1645.                     string[] joinedchannels = ircuser.JoinedChannels;
  1646.  
  1647.                     // update his nickname
  1648.                     ircuser.Nick = newnickname;
  1649.                     // remove the old entry
  1650.                     // remove first to avoid duplication, Foo -> foo
  1651.                     _IrcUsers.Remove(oldnickname);
  1652.                     // add him as new entry and new nickname as key
  1653.                     _IrcUsers.Add(newnickname, ircuser);
  1654.  
  1655.                     // now the same for all channels he is joined
  1656.                     Channel     channel;
  1657.                     ChannelUser channeluser;
  1658.                     foreach (string channelname in joinedchannels)
  1659.                     {
  1660.                         channel     = GetChannel(channelname);
  1661.                         channeluser = GetChannelUser(channelname, oldnickname);
  1662.                         // remove first to avoid duplication, Foo -> foo
  1663.                         channel.UnsafeUsers.Remove(oldnickname);
  1664.                         channel.UnsafeUsers.Add(newnickname, channeluser);
  1665.                         if (channeluser.IsOp)
  1666.                         {
  1667.                             channel.UnsafeOps.Remove(oldnickname);
  1668.                             channel.UnsafeOps.Add(newnickname, channeluser);
  1669.                         }
  1670.                         if (SupportNonRfc && ((NonRfcChannelUser)channeluser).IsHalfop)
  1671.                         {
  1672.                             NonRfcChannel nchannel = (NonRfcChannel)channel;
  1673.                             nchannel.UnsafeHalfops.Remove(oldnickname);
  1674.                             nchannel.UnsafeHalfops.Add(newnickname, channeluser);
  1675.                         }
  1676.                         if (channeluser.IsVoice) {
  1677.                             channel.UnsafeVoices.Remove(oldnickname);
  1678.                             channel.UnsafeVoices.Add(newnickname, channeluser);
  1679.                         }
  1680.                     }
  1681.                 }
  1682.             }
  1683.            
  1684.             if (OnNickChange != null) {
  1685.                 OnNickChange(this, new NickChangeEventArgs(ircdata, oldnickname, newnickname));
  1686.             }
  1687.         }
  1688.  
  1689.         private void _Event_INVITE(IrcMessageData ircdata)
  1690.         {
  1691.             string channel = ircdata.Channel;
  1692.             string inviter = ircdata.Nick;
  1693.            
  1694.             if (AutoJoinOnInvite) {
  1695.                 if (channel.Trim() != "0") {
  1696.                     RfcJoin(channel);
  1697.                 }
  1698.             }
  1699.            
  1700.             if (OnInvite != null) {
  1701.                 OnInvite(this, new InviteEventArgs(ircdata, channel, inviter));
  1702.             }
  1703.         }
  1704.  
  1705.         private void _Event_MODE(IrcMessageData ircdata)
  1706.         {
  1707.             if (IsMe(ircdata.RawMessageArray[2])) {
  1708.                 // my user mode changed
  1709.                 _Usermode = ircdata.RawMessageArray[3].Substring(1);
  1710.             } else {
  1711.                 // channel mode changed
  1712.                 string mode = ircdata.RawMessageArray[3];
  1713.                 string parameter = String.Join(" ", ircdata.RawMessageArray, 4, ircdata.RawMessageArray.Length-4);
  1714.                 _InterpretChannelMode(ircdata, mode, parameter);
  1715.             }
  1716.            
  1717.             if ((ircdata.Type == ReceiveType.UserModeChange) &&
  1718.                 (OnUserModeChange != null)) {
  1719.                 OnUserModeChange(this, new IrcEventArgs(ircdata));
  1720.             }
  1721.  
  1722.             if ((ircdata.Type == ReceiveType.ChannelModeChange) &&
  1723.                 (OnChannelModeChange != null)) {
  1724.                 OnChannelModeChange(this, new IrcEventArgs(ircdata));
  1725.             }
  1726.  
  1727.             if (OnModeChange != null) {
  1728.                 OnModeChange(this, new IrcEventArgs(ircdata));
  1729.             }
  1730.         }
  1731.  
  1732.         private void _Event_RPL_CHANNELMODEIS(IrcMessageData ircdata)
  1733.         {
  1734.             if (ActiveChannelSyncing &&
  1735.                 IsJoined(ircdata.Channel)) {
  1736.                 string mode = ircdata.RawMessageArray[4];
  1737.                 string parameter = String.Join(" ", ircdata.RawMessageArray, 5, ircdata.RawMessageArray.Length-5);
  1738.                 _InterpretChannelMode(ircdata, mode, parameter);
  1739.             }
  1740.         }
  1741.        
  1742.         private void _Event_RPL_WELCOME(IrcMessageData ircdata)
  1743.         {
  1744.             // updating our nickname, that we got (maybe cutted...)
  1745.             _Nickname = ircdata.RawMessageArray[2];
  1746.  
  1747.             if (OnRegistered != null)
  1748.             {
  1749.                 OnRegistered(this, EventArgs.Empty);
  1750.             }
  1751.         }
  1752.  
  1753.         private void _Event_RPL_TOPIC(IrcMessageData ircdata)
  1754.         {
  1755.             string topic   = ircdata.Message;
  1756.             string channel = ircdata.Channel;
  1757.  
  1758.             if (ActiveChannelSyncing && IsJoined(channel))
  1759.             {
  1760.                 GetChannel(channel).Topic = topic;
  1761.             }
  1762.             if (OnTopic != null)
  1763.             {
  1764.                 OnTopic(this, new TopicEventArgs(ircdata, channel, topic));
  1765.             }
  1766.         }
  1767.  
  1768.         private void _Event_RPL_NOTOPIC(IrcMessageData ircdata)
  1769.         {
  1770.             string channel = ircdata.Channel;
  1771.  
  1772.             if (ActiveChannelSyncing && IsJoined(channel))
  1773.             {
  1774.                 GetChannel(channel).Topic = "";
  1775.             }
  1776.  
  1777.             if (OnTopic != null)
  1778.             {
  1779.                 OnTopic(this, new TopicEventArgs(ircdata, channel, ""));
  1780.             }
  1781.         }
  1782.  
  1783.         private void _Event_RPL_NAMREPLY(IrcMessageData ircdata)
  1784.         {
  1785.             string   channelname  = ircdata.Channel;
  1786.             string[] userlist     = ircdata.MessageArray;
  1787.             if (ActiveChannelSyncing &&
  1788.                 IsJoined(channelname)) {
  1789.                 string nickname;
  1790.                 bool   op;
  1791.                 bool   halfop;
  1792.                 bool   voice;
  1793.                 foreach (string user in userlist)
  1794.                 {
  1795.                     if (user.Length <= 0)
  1796.                     {
  1797.                         continue;
  1798.                     }
  1799.  
  1800.                     op = false;
  1801.                     halfop = false;
  1802.                     voice = false;
  1803.                     switch (user[0])
  1804.                     {
  1805.                         case '@':
  1806.                             op = true;
  1807.                             nickname = user.Substring(1);
  1808.                         break;
  1809.                         case '+':
  1810.                             voice = true;
  1811.                             nickname = user.Substring(1);
  1812.                         break;
  1813.                         // RFC VIOLATION
  1814.                         // some IRC network do this and break our channel sync...
  1815.                         case '&':
  1816.                             nickname = user.Substring(1);
  1817.                         break;
  1818.                         case '%':
  1819.                             halfop = true;
  1820.                             nickname = user.Substring(1);
  1821.                         break;
  1822.                         case '~':
  1823.                             nickname = user.Substring(1);
  1824.                         break;
  1825.                         default:
  1826.                             nickname = user;
  1827.                         break;
  1828.                     }
  1829.  
  1830.                     IrcUser     ircuser     = GetIrcUser(nickname);
  1831.                     ChannelUser channeluser = GetChannelUser(channelname, nickname);
  1832.  
  1833.                     if (ircuser == null)
  1834.                     {
  1835.                         ircuser = new IrcUser(nickname, this);
  1836.                         _IrcUsers.Add(nickname, ircuser);
  1837.                     }
  1838.  
  1839.                     if (channeluser == null)
  1840.                     {
  1841.                         if (SupportNonRfc)
  1842.                         {
  1843.                             channeluser = new NonRfcChannelUser(channelname, ircuser);
  1844.                         }
  1845.                         else
  1846.                         {
  1847.                             channeluser = new ChannelUser(channelname, ircuser);
  1848.                         }
  1849.                         Channel channel = GetChannel(channelname);
  1850.                        
  1851.                         channel.UnsafeUsers.Add(nickname, channeluser);
  1852.                         if (op)
  1853.                         {
  1854.                             channel.UnsafeOps.Add(nickname, channeluser);
  1855.                         }
  1856.                         if (SupportNonRfc && halfop)
  1857.                         {
  1858.                             ((NonRfcChannel)channel).UnsafeHalfops.Add(nickname, channeluser);
  1859.                         }
  1860.                         if (voice)
  1861.                         {
  1862.                             channel.UnsafeVoices.Add(nickname, channeluser);
  1863.                         }
  1864.                     }
  1865.  
  1866.                     channeluser.IsOp    = op;
  1867.                     channeluser.IsVoice = voice;
  1868.                     if (SupportNonRfc) {
  1869.                         ((NonRfcChannelUser)channeluser).IsHalfop = halfop;
  1870.                     }
  1871.                 }
  1872.             }
  1873.            
  1874.             if (OnNames != null) {
  1875.                 OnNames(this, new NamesEventArgs(ircdata, channelname, userlist));
  1876.             }
  1877.         }
  1878.        
  1879.         private void _Event_RPL_ENDOFNAMES(IrcMessageData ircdata)
  1880.         {
  1881.             string channelname = ircdata.RawMessageArray[3];
  1882.             if (ActiveChannelSyncing &&
  1883.                 IsJoined(channelname))
  1884.             {
  1885.  
  1886.                 if (OnChannelPassiveSynced != null) {
  1887.                     OnChannelPassiveSynced(this, new IrcEventArgs(ircdata));
  1888.                 }
  1889.             }
  1890.         }
  1891.  
  1892.         private void _Event_RPL_AWAY(IrcMessageData ircdata)
  1893.         {
  1894.             string who = ircdata.RawMessageArray[3];
  1895.             string awaymessage = ircdata.Message;
  1896.  
  1897.             if (ActiveChannelSyncing)
  1898.             {
  1899.                 IrcUser ircuser  = GetIrcUser(who);
  1900.                 if (ircuser != null)
  1901.                 {
  1902.                     ircuser.IsAway = true;
  1903.                 }
  1904.             }
  1905.             if (OnAway != null)
  1906.             {
  1907.                 OnAway(this, new AwayEventArgs(ircdata, who, awaymessage));
  1908.             }
  1909.         }
  1910.        
  1911.         private void _Event_RPL_UNAWAY(IrcMessageData ircdata)
  1912.         {
  1913.             _IsAway = false;
  1914.            
  1915.             if (OnUnAway != null) {
  1916.                 OnUnAway(this, new IrcEventArgs(ircdata));
  1917.             }
  1918.         }
  1919.  
  1920.         private void _Event_RPL_NOWAWAY(IrcMessageData ircdata)
  1921.         {
  1922.             _IsAway = true;
  1923.  
  1924.             if (OnNowAway != null) {
  1925.                 OnNowAway(this, new IrcEventArgs(ircdata));
  1926.             }
  1927.         }
  1928.  
  1929.         private void _Event_RPL_WHOREPLY(IrcMessageData ircdata)
  1930.         {
  1931.             string channel  = ircdata.Channel;
  1932.             string ident    = ircdata.RawMessageArray[4];
  1933.             string host     = ircdata.RawMessageArray[5];
  1934.             string server   = ircdata.RawMessageArray[6];
  1935.             string nick     = ircdata.RawMessageArray[7];
  1936.             string usermode = ircdata.RawMessageArray[8];
  1937.             string realname = ircdata.Message.Substring(2);
  1938.             int    hopcount = 0;
  1939.             string temp     = ircdata.RawMessageArray[9].Substring(1);
  1940.             try
  1941.             {
  1942.                 hopcount = int.Parse(temp);
  1943.             }
  1944.             catch (FormatException)
  1945.             {
  1946.  
  1947.             }
  1948.  
  1949.             bool op = false;
  1950.             bool voice = false;
  1951.             bool ircop = false;
  1952.             bool away = false;
  1953.             int usermodelength = usermode.Length;
  1954.             for (int i = 0; i < usermodelength; i++) {
  1955.                 switch (usermode[i]) {
  1956.                     case 'H':
  1957.                         away = false;
  1958.                     break;
  1959.                     case 'G':
  1960.                         away = true;
  1961.                     break;
  1962.                     case '@':
  1963.                         op = true;
  1964.                     break;
  1965.                     case '+':
  1966.                         voice = true;
  1967.                     break;
  1968.                     case '*':
  1969.                         ircop = true;
  1970.                     break;
  1971.                 }
  1972.             }
  1973.  
  1974.             if (ActiveChannelSyncing && IsJoined(channel))
  1975.             {
  1976.                 // checking the irc and channel user I only do for sanity!
  1977.                 // according to RFC they must be known to us already via RPL_NAMREPLY
  1978.                 // psyBNC is not very correct with this... maybe other bouncers too
  1979.                 IrcUser ircuser  = GetIrcUser(nick);
  1980.                 ChannelUser channeluser = GetChannelUser(channel, nick);
  1981.  
  1982.                 if (ircuser != null)
  1983.                 {                                
  1984.                     ircuser.Ident    = ident;
  1985.                     ircuser.Host     = host;
  1986.                     ircuser.Server   = server;
  1987.                     ircuser.Nick     = nick;
  1988.                     ircuser.HopCount = hopcount;
  1989.                     ircuser.Realname = realname;
  1990.                     ircuser.IsAway   = away;
  1991.                     ircuser.IsIrcOp  = ircop;
  1992.                
  1993.                     switch (channel[0])
  1994.                     {
  1995.                         case '#':
  1996.                         case '!':
  1997.                         case '&':
  1998.                         case '+':
  1999.                             // this channel may not be where we are joined!
  2000.                             // see RFC 1459 and RFC 2812, it must return a channelname
  2001.                             // we use this channel info when possible...
  2002.                             if (channeluser != null) {
  2003.                                 channeluser.IsOp    = op;
  2004.                                 channeluser.IsVoice = voice;
  2005.                             }
  2006.                         break;
  2007.                     }
  2008.                 }
  2009.             }
  2010.            
  2011.             if (OnWho != null)
  2012.             {
  2013.                 OnWho(this, new WhoEventArgs(ircdata, channel, nick, ident, host, realname, away, op, voice, ircop, server, hopcount));
  2014.             }
  2015.         }
  2016.        
  2017.         private void _Event_RPL_MOTD(IrcMessageData ircdata)
  2018.         {
  2019.             if (!_MotdReceived) {
  2020.                 _Motd.Add(ircdata.Message);
  2021.             }
  2022.            
  2023.             if (OnMotd != null) {
  2024.                 OnMotd(this, new MotdEventArgs(ircdata, ircdata.Message));
  2025.             }
  2026.         }
  2027.        
  2028.         private void _Event_RPL_ENDOFMOTD(IrcMessageData ircdata)
  2029.         {
  2030.             _MotdReceived = true;
  2031.         }
  2032.        
  2033.         // TODO, need to sync with the banlist!
  2034.         private void _Event_RPL_BANLIST(IrcMessageData ircdata)
  2035.         {
  2036.  
  2037.         }
  2038.        
  2039.         private void _Event_RPL_ENDOFBANLIST(IrcMessageData ircdata)
  2040.         {
  2041.             string channelname = ircdata.Channel;
  2042.             if (ActiveChannelSyncing &&
  2043.                 IsJoined(channelname)) {
  2044.                 Channel channel = GetChannel(channelname);
  2045.                 channel.ActiveSyncStop = DateTime.Now;
  2046.  
  2047.                 if (OnChannelActiveSynced != null) {
  2048.                     OnChannelActiveSynced(this, new IrcEventArgs(ircdata));
  2049.                 }
  2050.             }
  2051.         }
  2052.        
  2053.         private void _Event_ERR(IrcMessageData ircdata)
  2054.         {
  2055.             if (OnErrorMessage != null) {
  2056.                 OnErrorMessage(this, new IrcEventArgs(ircdata));
  2057.             }
  2058.         }
  2059.        
  2060.         private void _Event_ERR_NICKNAMEINUSE(IrcMessageData ircdata)
  2061.         {
  2062.             if (!AutoNickHandling) {
  2063.                 return;
  2064.             }
  2065.            
  2066.             string nickname;
  2067.             // if a nicklist has been given loop through the nicknames
  2068.             // if the upper limit of this list has been reached and still no nickname has registered
  2069.             // then generate a random nick
  2070.             if (_CurrentNickname == NicknameList.Length-1) {
  2071.                 Random rand = new Random();
  2072.                 int number = rand.Next(999);
  2073.                 if (Nickname.Length > 5) {
  2074.                     nickname = Nickname.Substring(0, 5)+number;
  2075.                 } else {
  2076.                     nickname = Nickname.Substring(0, Nickname.Length-1)+number;
  2077.                 }
  2078.             } else {
  2079.                 nickname = _NextNickname();
  2080.             }
  2081.             // change the nickname
  2082.             RfcNick(nickname, Priority.Critical);
  2083.         }
  2084.     }
  2085. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement