Exemple #1
0
 void irc_OnArchMsg(RawMsg amsg)
 {
     backlog.Enqueue(amsg);
     if (newMessage != null)
     {
         newMessage(amsg, server);
     }
 }
 public JoinMsg(string who, string whoUser, string whoHost, string channel)
 {
     raw          = new RawMsg();
     this.who     = who;
     this.whoUser = whoUser;
     this.whoHost = whoHost;
     this.channel = channel;
 }
 public JoinMsg(RawMsg raw)
 {
     this.raw = raw;
     //who = raw.subject.nick;
     //whoUser = raw.subject.user;
     //whoHost = raw.subject.host;
     //channel = raw.payload;
 }
 public MSG(string from, string fromUser, string fromHost, string to, string message)
 {
     raw           = new RawMsg();
     when          = DateTime.Now;
     this.from     = from;
     this.fromHost = fromHost;
     this.fromUser = fromUser;
     this.to       = to;
     this.message  = message;
 }
 public KickMsg(string from, string fromUser, string fromHost, string to, string channel, string message)
 {
     raw           = new RawMsg();
     this.from     = from;
     this.fromHost = fromHost;
     this.fromUser = fromUser;
     this.to       = to;
     this.message  = message;
     this.channel  = channel;
 }
 public CTCP(string from, string fromUser, string fromHost, string to, string command, string message)
 {
     raw           = new RawMsg();
     when          = DateTime.Now;
     this.from     = from;
     this.fromHost = fromHost;
     this.fromUser = fromUser;
     this.to       = to;
     this.message  = message;
     this.command  = command;
 }
        public MSG(string line)
        {
            raw = new RawMsg();
            Regex msg = new Regex(@"(\[)(?<date>.*?)(\]\()(?<channel>.*?)(\)<)(?<nick>.*?)(> )(?<message>.*)");
            Match m   = msg.Match(line);

            if (m.Success)
            {
                from    = m.Groups["nick"].Value;
                to      = m.Groups["channel"].Value;
                message = m.Groups["message"].Value;
                when    = DateTime.Parse(m.Groups["date"].Value);
            }
        }
 public bool SendMessage(string target, string message)
 {
     lock (padlock)
     {
         sendQueue.Enqueue("PRIVMSG " + target + " :" + message);
         RawMsg rm = new RawMsg(nick + "!you@core PRIVMSG " + target + " :" + message);
         if (OnArchMsg != null)
         {
             OnArchMsg(rm);
         }
     }
     //stream.Write(ASCIIEncoding.ASCII.GetBytes("PRIVMSG " + target + " :" + message + "\n"), 0, ASCIIEncoding.ASCII.GetByteCount("PRIVMSG " + target + " :" + message + "\n"));
     return(true);
 }
 public MSG(RawMsg raw)
 {
     this.raw = raw;
 }
 public CTCP(RawMsg raw)
 {
     this.raw = raw;
 }
 public KickMsg(RawMsg raw)
 {
     this.raw = raw;
 }
        void ReceiveThread()
        {
            byte[] receiveBuf    = new byte[1024];
            string lastOverdraft = "";

            while (true)
            {
                if (!client.Connected)
                {
                    if (quitOnPurpose)
                    {
                        return;
                    }
                    else
                    {
                        if (OnDisconnect != null)
                        {
                            OnDisconnect();
                        }
                        return;
                    }
                }
                int c = 0;
                try
                {
                    c = stream.Read(receiveBuf, 0, 1024);
                }
                catch
                {
                    if (quitOnPurpose)
                    {
                        return;
                    }
                    else
                    {
                        if (OnDisconnect != null)
                        {
                            OnDisconnect();
                        }
                        return;
                    }
                }
                if (c != 0)
                {
                    string        receivedTotal = lastOverdraft + Encoding.UTF8.GetString(receiveBuf, 0, c);
                    List <string> receivedLines = new List <string>();
                    for (int x = 0; x < receivedTotal.Length; x++)
                    {
                        if (receivedTotal[x] != "\n".ToCharArray()[0])
                        {
                            lastOverdraft += receivedTotal[x];
                        }
                        else
                        {
                            receivedLines.Add(lastOverdraft);
                            lastOverdraft = "";
                        }
                    }
                    foreach (string received in receivedLines)
                    {
                        try
                        {
                            if (received.StartsWith("PING :"))
                            {
                                stream.Write(ASCIIEncoding.ASCII.GetBytes("PONG :" + received.Substring("PING :".Length) + "\n"), 0, ASCIIEncoding.ASCII.GetByteCount("PONG :" + received.Substring("PING :".Length) + "\n"));
                            }
                            else if (received.Contains(":End of /MOTD command.") || received.Contains("MOTD File is missing"))
                            {
                                ready = true;
                            }
                            else if (received.StartsWith(":"))
                            {
                                if (received.Contains("!"))
                                {
                                    RawMsg msg = null;
                                    try
                                    {
                                        msg = new RawMsg(received.Replace("\r", "").Replace("\n", ""));
                                    }
                                    catch (Exception)
                                    {
                                        continue;
                                    }
                                    switch (msg.command)
                                    {
                                    case "PRIVMSG":
                                    {
                                        //PRIVMSG
                                        //string header = received.Substring(1, received.IndexOf(':', 1));
                                        //string message = received.Substring(received.IndexOf(':', 1) + 1).Replace("\r", "");
                                        //string from = header.Substring(0, header.IndexOf('!'));
                                        //string fromUser = header.Substring(header.IndexOf('!') + 1, header.IndexOf('@') - (header.IndexOf('!') + 1));
                                        //string fromHost = header.Substring(header.IndexOf('@') + 1, header.IndexOf(' ') - (header.IndexOf('@') + 1));
                                        //string to = header.Split(' ')[2];
                                        if (msg.payload.StartsWith("\x01"))
                                        {
                                            if (OnCTCPRecvd != null)
                                            {
                                                OnCTCPRecvd(new CTCP(msg));
                                            }
                                            if (OnArchMsg != null)
                                            {
                                                OnArchMsg(msg);
                                            }
                                        }
                                        else if (msg.location.Contains("#"))
                                        {
                                            //Message to Channel
                                            if (OnMSGRecvd != null)
                                            {
                                                OnMSGRecvd(new MSG(msg));
                                            }
                                            if (OnArchMsg != null)
                                            {
                                                OnArchMsg(msg);
                                            }
                                        }
                                        else
                                        {
                                            //Private Message
                                            if (OnPMRecvd != null)
                                            {
                                                OnPMRecvd(new MSG(msg));
                                            }
                                            if (OnArchMsg != null)
                                            {
                                                OnArchMsg(msg);
                                            }
                                        }
                                        break;
                                    }

                                    case "NOTICE":
                                    {
                                        //NOTICE
                                        //string header = received.Substring(1, received.IndexOf(':', 1));
                                        //string message = received.Substring(received.IndexOf(':', 1) + 1).Replace("\r", "");
                                        //string from = header.Substring(0, header.IndexOf('!'));
                                        //string fromUser = header.Substring(header.IndexOf('!') + 1, header.IndexOf('@') - (header.IndexOf('!') + 1));
                                        //string fromHost = header.Substring(header.IndexOf('@') + 1, header.IndexOf(' ') - (header.IndexOf('@') + 1));
                                        //string to = header.Split(' ')[2];
                                        if (OnNoticeRecvd != null)
                                        {
                                            OnNoticeRecvd(new MSG(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "JOIN":
                                    {
                                        //Response: :[email protected] JOIN :#chat
                                        //Add channel to list of channels
                                        if (msg.subject.nick == nick)
                                        {
                                            channels.Add(msg.payload);
                                        }
                                        //string who = received.Substring(1, received.IndexOf('!') - 1);
                                        //string whoUser = received.Substring(received.IndexOf('!') + 1, received.IndexOf('@') - (received.IndexOf('!') + 1));
                                        //string whoHost = received.Substring(received.IndexOf('@') + 1, received.IndexOf(' ') - (received.IndexOf('@') + 1));
                                        //string channel = received.Substring(received.IndexOf(':', 1) + 1).Replace("\r", "");
                                        if (OnJoinRecvd != null)
                                        {
                                            OnJoinRecvd(new JoinMsg(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "NICK":
                                    {
                                        //string who = received.Substring(1, received.IndexOf('!') - 1);
                                        //string whoUser = received.Substring(received.IndexOf('!') + 1, received.IndexOf('@') - (received.IndexOf('!') + 1));
                                        //string whoHost = received.Substring(received.IndexOf('@') + 1, received.IndexOf(' ') - (received.IndexOf('@') + 1));
                                        //string channel = received.Substring(received.IndexOf(':', 1) + 1).Replace("\r", "");
                                        if (OnNickRecvd != null)
                                        {
                                            OnNickRecvd(new JoinMsg(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "QUIT":
                                    {
                                        //string who = received.Substring(1, received.IndexOf('!') - 1);
                                        if (msg.subject.nick == nick)
                                        {
                                            if (OnDisconnect != null)
                                            {
                                                OnDisconnect();
                                            }
                                            client.Close();
                                            return;
                                        }
                                        //string whoUser = received.Substring(received.IndexOf('!') + 1, received.IndexOf('@') - (received.IndexOf('!') + 1));
                                        //string whoHost = received.Substring(received.IndexOf('@') + 1, received.IndexOf(' ') - (received.IndexOf('@') + 1));
                                        //string message = received.Substring(received.IndexOf(':', 1) + 1).Replace("\r", "");
                                        if (OnQuitRecvd != null)
                                        {
                                            OnQuitRecvd(new JoinMsg(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "PART":
                                    {
                                        if (msg.subject.nick == nick)
                                        {
                                            channels.Remove(msg.location);
                                        }
                                        //string header = received.Substring(1);
                                        //string message = received.Substring(received.IndexOf(':', 1) + 1);
                                        //string from = header.Substring(0, header.IndexOf('!'));
                                        //string fromUser = header.Substring(header.IndexOf('!') + 1, header.IndexOf('@') - (header.IndexOf('!') + 1));
                                        //string fromHost = header.Substring(header.IndexOf('@') + 1, header.IndexOf(' ') - (header.IndexOf('@') + 1));
                                        //string to = header.Split(' ')[2];
                                        if (OnPartRecvd != null)
                                        {
                                            OnPartRecvd(new MSG(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "KICK":
                                    {
                                        if (msg.target == nick)
                                        {
                                            channels.Remove(msg.location);
                                        }
                                        //string from = received.Substring(1, received.IndexOf('!') - 1);
                                        //string fromUser = received.Substring(received.IndexOf('!') + 1, received.IndexOf('@') - (received.IndexOf('!') + 1));
                                        //string fromHost = received.Substring(received.IndexOf('@') + 1, received.IndexOf(' ') - (received.IndexOf('@') + 1));
                                        //string message = "";
                                        if (OnKickRecvd != null)
                                        {
                                            OnKickRecvd(new KickMsg(msg));
                                        }
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }

                                    case "MODE":
                                    {
                                        //Do modes later
                                        if (OnArchMsg != null)
                                        {
                                            OnArchMsg(msg);
                                        }
                                        break;
                                    }
                                    }
                                }
                                else
                                {
                                    switch (received.Split(' ')[1])
                                    {
                                    case "433":
                                        stream.Write(ASCIIEncoding.ASCII.GetBytes("NICK " + server.othernick + "\n"), 0, ASCIIEncoding.ASCII.GetByteCount("NICK " + server.othernick + "\n"));
                                        break;
                                    }
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Client error: (" + e.Message + ") Errored netcode: " + received);
                        }
                    }
                }
            }
        }