Example #1
0
        private void ParseWHOIS(MessageInfo messageInfo)
        {
            UserInfo userInfo;

            switch (messageInfo.Command)
            {
                case "311": //:sendak.freenode.net 311 Jaex ShareX ~ShareX unaffiliated/sharex * :realname
                    if (messageInfo.Parameters.Count >= 4)
                    {
                        userInfo = new UserInfo();
                        userInfo.Nickname = messageInfo.Parameters[1];

                        if (messageInfo.Parameters[2][1] == '~')
                        {
                            userInfo.Username = messageInfo.Parameters[2].Substring(1);
                        }
                        else // Ident
                        {
                            userInfo.Username = messageInfo.Parameters[2];
                        }

                        userInfo.Host = messageInfo.Parameters[3];
                        userInfo.Realname = messageInfo.Message;

                        userList.Add(userInfo);
                    }
                    break;
                case "319": //:sendak.freenode.net 319 Jaex ShareX :@#ShareX @#ShareX_Test
                    if (messageInfo.Parameters.Count >= 2)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            userInfo.Channels.Clear();
                            userInfo.Channels.AddRange(messageInfo.Message.Split());
                        }
                    }
                    break;
                case "312": //:sendak.freenode.net 312 Jaex ShareX sendak.freenode.net :Vilnius, Lithuania, EU
                    if (messageInfo.Parameters.Count >= 3)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            userInfo.Server = messageInfo.Parameters[2];
                        }
                    }
                    break;
                case "671": //:sendak.freenode.net 671 Jaex ShareX :is using a secure connection
                    if (messageInfo.Parameters.Count >= 2)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            userInfo.SecureConnection = true;
                        }
                    }
                    break;
                case "317": //:sendak.freenode.net 317 Jaex ShareX 39110 1440201914 :seconds idle, signon time
                    if (messageInfo.Parameters.Count >= 4)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            int idleTime;
                            if (int.TryParse(messageInfo.Parameters[2], out idleTime))
                            {
                                userInfo.IdleTime = TimeSpan.FromSeconds(idleTime);
                            }

                            int signOnTime;
                            if (int.TryParse(messageInfo.Parameters[3], out signOnTime))
                            {
                                userInfo.SignOnDate = Helpers.UnixToDateTime(signOnTime).ToLocalTime();
                            }
                        }
                    }
                    break;
                case "330": //:sendak.freenode.net 330 Jaex ShareX ShareX :is logged in as
                    if (messageInfo.Parameters.Count >= 3)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            userInfo.Identity = messageInfo.Parameters[2];
                        }
                    }
                    break;
                case "318": //:sendak.freenode.net 318 Jaex ShareX :End of /WHOIS list.
                    if (messageInfo.Parameters.Count >= 2)
                    {
                        userInfo = FindUser(messageInfo.Parameters[1]);

                        if (userInfo != null)
                        {
                            userList.Remove(userInfo);
                            OnWhoisResult(userInfo);
                        }
                    }
                    break;
            }
        }
Example #2
0
        public static MessageInfo Parse(string content)
        {
            MessageInfo messageInfo = new MessageInfo(content);

            int index;
            string nickname = ParseSection(content, out index);

            // Is it not my message?
            if (nickname.StartsWith(":"))
            {
                nickname = nickname.Substring(1);
                int usernameIndex = nickname.IndexOf("!", StringComparison.Ordinal);

                // Is it not server?
                if (usernameIndex > -1)
                {
                    //nickname!~username@host
                    messageInfo.User.UserType = IRCUserType.User;
                    messageInfo.User.Nickname = nickname.Remove(usernameIndex);

                    nickname = nickname.Substring(usernameIndex + 1);

                    if (nickname[0] == '~') // Remove Ident character
                    {
                        nickname = nickname.Substring(1);
                    }

                    int hostIndex = nickname.IndexOf("@", StringComparison.Ordinal);
                    messageInfo.User.Username = nickname.Remove(hostIndex);
                    messageInfo.User.Host = nickname.Substring(hostIndex + 1);
                }
                else
                {
                    //irc.freenode.net
                    messageInfo.User.UserType = IRCUserType.Server;
                    messageInfo.User.Host = nickname;
                }

                content = content.Substring(index + 1);
                messageInfo.Command = ParseSection(content, out index);
            }
            else
            {
                // It is my command
                messageInfo.User.UserType = IRCUserType.Me;
                messageInfo.Command = nickname;
            }

            while (index > -1)
            {
                content = content.Substring(index + 1);
                string check = ParseSection(content, out index);

                // Is it parameter?
                if (!check.StartsWith(":"))
                {
                    messageInfo.Parameters.Add(check);
                }
                else
                {
                    // It is message
                    messageInfo.Message = content.Substring(1);
                    break;
                }
            }

            return messageInfo;
        }
Example #3
0
        private void CheckMessage(MessageInfo messageInfo)
        {
            string channel = messageInfo.Parameters[0];

            OnMessage(messageInfo.User, channel, messageInfo.Message);

            if (messageInfo.User.UserType == IRCUserType.User)
            {
                HandleAutoResponse(channel, messageInfo.User.Nickname, messageInfo.Message.ToLowerInvariant());
            }
        }
Example #4
0
        private void OnOutput(MessageInfo messageInfo)
        {
            if (Output != null)
            {
                Output(messageInfo);
            }

            //Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {messageInfo.Content}");
        }
Example #5
0
 private void IRC_Output(MessageInfo messageInfo)
 {
     this.InvokeSafe(() =>
     {
         txtOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {messageInfo.Content}\r\n");
     });
 }
Example #6
0
        public static MessageInfo Parse(string content)
        {
            MessageInfo messageInfo = new MessageInfo(content);

            int    index;
            string nickname = ParseSection(content, out index);

            // Is it not my message?
            if (nickname.StartsWith(":"))
            {
                nickname = nickname.Substring(1);
                int usernameIndex = nickname.IndexOf("!", StringComparison.Ordinal);

                // Is it not server?
                if (usernameIndex > -1)
                {
                    //nickname!~username@host
                    messageInfo.User.UserType = IRCUserType.User;
                    messageInfo.User.Nickname = nickname.Remove(usernameIndex);

                    nickname = nickname.Substring(usernameIndex + 1);

                    if (nickname[0] == '~') // Remove Ident character
                    {
                        nickname = nickname.Substring(1);
                    }

                    int hostIndex = nickname.IndexOf("@", StringComparison.Ordinal);
                    messageInfo.User.Username = nickname.Remove(hostIndex);
                    messageInfo.User.Host     = nickname.Substring(hostIndex + 1);
                }
                else
                {
                    //irc.freenode.net
                    messageInfo.User.UserType = IRCUserType.Server;
                    messageInfo.User.Host     = nickname;
                }

                content             = content.Substring(index + 1);
                messageInfo.Command = ParseSection(content, out index);
            }
            else
            {
                // It is my command
                messageInfo.User.UserType = IRCUserType.Me;
                messageInfo.Command       = nickname;
            }

            while (index > -1)
            {
                content = content.Substring(index + 1);
                string check = ParseSection(content, out index);

                // Is it parameter?
                if (!check.StartsWith(":"))
                {
                    messageInfo.Parameters.Add(check);
                }
                else
                {
                    // It is message
                    messageInfo.Message = content.Substring(1);
                    break;
                }
            }

            return(messageInfo);
        }
Example #7
0
 private void IRC_Output(MessageInfo messageInfo)
 {
     AppendOutput(messageInfo.Content, Color.Black);
 }
Example #8
0
        private void ParseWHOIS(MessageInfo messageInfo)
        {
            UserInfo userInfo;

            switch (messageInfo.Command)
            {
            case "311":     //:sendak.freenode.net 311 Jaex ShareX ~ShareX unaffiliated/sharex * :realname
                if (messageInfo.Parameters.Count >= 4)
                {
                    userInfo          = new UserInfo();
                    userInfo.Nickname = messageInfo.Parameters[1];

                    if (messageInfo.Parameters[2][1] == '~')
                    {
                        userInfo.Username = messageInfo.Parameters[2].Substring(1);
                    }
                    else     // Ident
                    {
                        userInfo.Username = messageInfo.Parameters[2];
                    }

                    userInfo.Host     = messageInfo.Parameters[3];
                    userInfo.Realname = messageInfo.Message;

                    userList.Add(userInfo);
                }
                break;

            case "319":     //:sendak.freenode.net 319 Jaex ShareX :@#ShareX @#ShareX_Test
                if (messageInfo.Parameters.Count >= 2)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        userInfo.Channels.Clear();
                        userInfo.Channels.AddRange(messageInfo.Message.Split());
                    }
                }
                break;

            case "312":     //:sendak.freenode.net 312 Jaex ShareX sendak.freenode.net :Vilnius, Lithuania, EU
                if (messageInfo.Parameters.Count >= 3)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        userInfo.Server = messageInfo.Parameters[2];
                    }
                }
                break;

            case "671":     //:sendak.freenode.net 671 Jaex ShareX :is using a secure connection
                if (messageInfo.Parameters.Count >= 2)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        userInfo.SecureConnection = true;
                    }
                }
                break;

            case "317":     //:sendak.freenode.net 317 Jaex ShareX 39110 1440201914 :seconds idle, signon time
                if (messageInfo.Parameters.Count >= 4)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        int idleTime;
                        if (int.TryParse(messageInfo.Parameters[2], out idleTime))
                        {
                            userInfo.IdleTime = TimeSpan.FromSeconds(idleTime);
                        }

                        int signOnTime;
                        if (int.TryParse(messageInfo.Parameters[3], out signOnTime))
                        {
                            userInfo.SignOnDate = Helpers.UnixToDateTime(signOnTime).ToLocalTime();
                        }
                    }
                }
                break;

            case "330":     //:sendak.freenode.net 330 Jaex ShareX ShareX :is logged in as
                if (messageInfo.Parameters.Count >= 3)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        userInfo.Identity = messageInfo.Parameters[2];
                    }
                }
                break;

            case "318":     //:sendak.freenode.net 318 Jaex ShareX :End of /WHOIS list.
                if (messageInfo.Parameters.Count >= 2)
                {
                    userInfo = FindUser(messageInfo.Parameters[1]);

                    if (userInfo != null)
                    {
                        userList.Remove(userInfo);
                        OnWhoisResult(userInfo);
                    }
                }
                break;
            }
        }
Example #9
0
        private bool CheckCommand(string message)
        {
            MessageInfo messageInfo = MessageInfo.Parse(message);

            //:sendak.freenode.net 375 Jaex :- sendak.freenode.net Message of the Day -
            //:sendak.freenode.net 372 Jaex :- Welcome to sendak.freenode.net in Vilnius, Lithuania, EU.
            //:sendak.freenode.net 376 Jaex :End of /MOTD command.
            if (Info.SuppressMOTD)
            {
                if (messageInfo.Command == "375" || messageInfo.Command == "372")
                {
                    return(true);
                }
                else if (messageInfo.Command == "376")
                {
                    OnConnected();
                    return(true);
                }
            }

            if (messageInfo.User.UserType == IRCUserType.Me)
            {
                messageInfo.User.Nickname = CurrentNickname;
            }

            OnOutput(messageInfo);

            switch (messageInfo.Command)
            {
            case "PING":     //PING :sendak.freenode.net
                SendRawMessage("PONG :" + messageInfo.Message);
                break;

            case "376":     //:sendak.freenode.net 376 Jaex :End of /MOTD command.
                OnConnected();
                break;

            case "433":     //:sendak.freenode.net 433 * ShareX :Nickname is already in use.
                if (!IsConnected && messageInfo.Parameters.Count >= 2)
                {
                    string nickname = !string.IsNullOrEmpty(Info.Nickname2) ? Info.Nickname2 : Info.Nickname + "_";

                    if (!messageInfo.Parameters[1].Equals(nickname, StringComparison.InvariantCultureIgnoreCase))
                    {
                        ChangeNickname(nickname);
                    }
                }
                break;

            case "PRIVMSG":     //:Jaex!Jaex@unaffiliated/jaex PRIVMSG #ShareX :test
                CheckMessage(messageInfo);
                break;

            case "JOIN":     //:Jaex!Jaex@unaffiliated/jaex JOIN #ShareX or :Jaex!Jaex@unaffiliated/jaex JOIN :#ShareX
                if (UserJoined != null)
                {
                    UserJoined(messageInfo.User, messageInfo.Parameters.Count > 0 ? messageInfo.Parameters[0] : messageInfo.Message);
                }
                break;

            case "PART":     //:Jaex!Jaex@unaffiliated/jaex PART #ShareX :"Leaving"
                if (UserLeft != null)
                {
                    UserLeft(messageInfo.User, messageInfo.Parameters[0]);
                }
                break;

            case "QUIT":     //:Jaex!Jaex@unaffiliated/jaex QUIT :Client Quit
                if (UserQuit != null)
                {
                    UserQuit(messageInfo.User, null);
                }
                break;

            case "NICK":     //:Jaex!Jaex@unaffiliated/jaex NICK :Jaex2
                if (UserNickChanged != null)
                {
                    UserNickChanged(messageInfo.User, messageInfo.Message);
                }
                break;

            case "KICK":     //:Jaex!Jaex@unaffiliated/jaex KICK #ShareX Jaex2 :Jaex2
                if (UserKicked != null)
                {
                    UserKicked(messageInfo.User, messageInfo.Parameters[0], messageInfo.Parameters[1]);
                }
                if (Info.AutoRejoinOnKick)
                {
                    JoinChannel(messageInfo.Parameters[0]);
                }
                break;

            case "311":     //:sendak.freenode.net 311 Jaex ShareX ~ShareX unaffiliated/sharex * :realname
            case "319":     //:sendak.freenode.net 319 Jaex ShareX :@#ShareX @#ShareX_Test
            case "312":     //:sendak.freenode.net 312 Jaex ShareX sendak.freenode.net :Vilnius, Lithuania, EU
            case "671":     //:sendak.freenode.net 671 Jaex ShareX :is using a secure connection
            case "317":     //:sendak.freenode.net 317 Jaex ShareX 39110 1440201914 :seconds idle, signon time
            case "330":     //:sendak.freenode.net 330 Jaex ShareX ShareX :is logged in as
            case "318":     //:sendak.freenode.net 318 Jaex ShareX :End of /WHOIS list.
                ParseWHOIS(messageInfo);
                break;

            case "396":     //:sendak.freenode.net 396 Jaex unaffiliated/jaex :is now your hidden host (set by services.)
                if (Info.AutoJoinWaitIdentify)
                {
                    AutoJoinChannels();
                }
                break;

            case "ERROR":
                return(false);
            }

            return(true);
        }
Example #10
0
 private void IRC_Output(MessageInfo messageInfo)
 {
     WriteText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {messageInfo.Content}", txtOutput);
 }
Example #11
0
 private void IRC_Output(MessageInfo messageInfo)
 {
     WriteText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {messageInfo.Content}", txtOutput);
 }