Пример #1
0
 public IRCMessage(IRCMessageType type, string sender, string channel, string body, string rawMessage)
 {
     this.Type = type;
     this.Sender = sender;
     this.Channel = channel;
     this.Body = body;
     this.RawMessage = rawMessage;
 }
Пример #2
0
 public MessageInfo(string username, string channel, string message)
 {
     this.username = username;
     this.channel  = channel;
     this.message  = message;
     header        = IRCMessageType.OTHER;
     theUser       = new User(this.username)
     {
         lastCheckIn = DateTime.Now
     };
     ttsMessage = "";
 }
Пример #3
0
 public IRCMessage( string from, string nick, string ident, string host, string channel, string message, string rawMessage, IRCMessageType type, IRCReplyCode replycode ) {
     RawMessage = rawMessage;
     RawMessageArray = rawMessage.Split( new[] { ' ' } );
     Type = type;
     ReplyCode = replycode;
     From = from;
     Nick = nick;
     Ident = ident;
     Host = host;
     Channel = channel;
     if( message != null ) {
         // message is optional
         Message = message;
         MessageArray = message.Split( new[] { ' ' } );
     }
 }
Пример #4
0
        /// <summary>
        /// Sends a message to everyone who is on a common channel with a certain user
        /// </summary>
        /// <param name="user"></param>
        /// <param name="type"></param>
        /// <param name="extraParam"></param>
        private void SendToUserChannels(IRCUser user, IRCMessageType type, string extraParam)
        {
            //find all channels that this user is in
            List <KeyValuePair <IRCChannel, IRCUser> > channels = m_channelUserPairs.FindAll(delegate(KeyValuePair <IRCChannel, IRCUser> kvp)
            {
                return(kvp.Value == user);
            });

            string message;

            if (type == IRCMessageType.Nick) //extraParam = old nickname
            {
                message = ":" + extraParam + "!" + user.UserName + "@" + user.HostName + " NICK :" + user.Name;
            }

            else if (type == IRCMessageType.Quit) //extraParam = quit message
            {
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " QUIT :" + extraParam;
            }

            else
            {
                return;
            }

            SendToUser(user, message);

            List <IRCUser> recepients = new List <IRCUser>();

            //find all users who are in each channel which have not already received this message
            for (int i = 0, cCount = channels.Count; i < cCount; i++)
            {
                List <KeyValuePair <IRCChannel, IRCUser> > users = m_channelUserPairs.FindAll(delegate(KeyValuePair <IRCChannel, IRCUser> kvp)
                {
                    return(kvp.Key == channels[i].Key);
                });

                for (int u = 0, uCount = users.Count; u < uCount; u++)
                {
                    if (!recepients.Contains(users[i].Value))
                    {
                        recepients.Add(users[i].Value);
                        SendToUser(users[i].Value, message);
                    }
                }
            }
        }
Пример #5
0
 public IRCMessage(string from, string nick, string ident, string host, string channel, string message, string rawMessage, IRCMessageType type, IRCReplyCode replycode)
 {
     RawMessage      = rawMessage;
     RawMessageArray = rawMessage.Split(new[] { ' ' });
     Type            = type;
     ReplyCode       = replycode;
     From            = from;
     Nick            = nick;
     Ident           = ident;
     Host            = host;
     Channel         = channel;
     if (message != null)
     {
         // message is optional
         Message      = message;
         MessageArray = message.Split(new[] { ' ' });
     }
 }
Пример #6
0
        /// <summary>
        /// Sends s message to everyone in a certain channel
        /// </summary>
        /// <param name="channel"></param>
        /// <param name="user"></param>
        /// <param name="type"></param>
        private void SendToChannel(IRCChannel channel, IRCUser user, IRCMessageType type, string extraParam)
        {
            //find all users who are in this channel
            List <KeyValuePair <IRCChannel, IRCUser> > users = m_channelUserPairs.FindAll(delegate(KeyValuePair <IRCChannel, IRCUser> kvp)
            {
                return(kvp.Key == channel);
            });

            string message;

            if (type == IRCMessageType.Join)
            {
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " JOIN " + channel.Name;
            }
            else if (type == IRCMessageType.Part)
            {
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " PART :" + channel.Name;
            }
            else if (type == IRCMessageType.Privmsg)
            {
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " PRIVMSG " + channel.Name + " :" + extraParam;

                if (channel.Name == m_defaultChannel && user.TCPClient != null) //only call entity chat for irc users
                {
                    m_scene.EntityChat(this, user, 0f, extraParam, 0, EntityChatType.Broadcast);
                }
            }
            else
            {
                return;
            }

            for (int u = 0, uCount = users.Count; u < uCount; u++)
            {
                if (type != IRCMessageType.Privmsg || users[u].Value != user)
                {
                    SendToUser(users[u].Value, message);
                }
            }
        }
Пример #7
0
        static IRCMessage MessageParser([NotNull] string rawline, [NotNull] string actualBotNick)
        {
            if (rawline == null)
            {
                throw new ArgumentNullException("rawline");
            }
            if (actualBotNick == null)
            {
                throw new ArgumentNullException("actualBotNick");
            }

            string       line;
            string       nick    = null;
            string       ident   = null;
            string       host    = null;
            string       channel = null;
            string       message = null;
            IRCReplyCode replycode;

            if (rawline[0] == ':')
            {
                line = rawline.Substring(1);
            }
            else
            {
                line = rawline;
            }

            string[] linear = line.Split(new[] { ' ' });

            // conform to RFC 2812
            string from           = linear[0];
            string messagecode    = linear[1];
            int    exclamationpos = from.IndexOf("!");
            int    atpos          = from.IndexOf("@");
            int    colonpos       = line.IndexOf(" :");

            if (colonpos != -1)
            {
                // we want the exact position of ":" not beginning from the space
                colonpos += 1;
            }
            if (exclamationpos != -1)
            {
                nick = from.Substring(0, exclamationpos);
            }
            if ((atpos != -1) &&
                (exclamationpos != -1))
            {
                ident = from.Substring(exclamationpos + 1, (atpos - exclamationpos) - 1);
            }
            if (atpos != -1)
            {
                host = from.Substring(atpos + 1);
            }

            try {
                replycode = (IRCReplyCode)int.Parse(messagecode);
            } catch (FormatException) {
                replycode = IRCReplyCode.Null;
            }
            IRCMessageType type = GetMessageType(rawline, actualBotNick);

            if (colonpos != -1)
            {
                message = line.Substring(colonpos + 1);
            }

            switch (type)
            {
            case IRCMessageType.Join:
            case IRCMessageType.Kick:
            case IRCMessageType.Part:
            case IRCMessageType.TopicChange:
            case IRCMessageType.ChannelModeChange:
            case IRCMessageType.ChannelMessage:
            case IRCMessageType.ChannelAction:
            case IRCMessageType.ChannelNotice:
                channel = linear[2];
                break;

            case IRCMessageType.Who:
            case IRCMessageType.Topic:
            case IRCMessageType.Invite:
            case IRCMessageType.BanList:
            case IRCMessageType.ChannelMode:
                channel = linear[3];
                break;

            case IRCMessageType.Name:
                channel = linear[4];
                break;
            }

            if ((channel != null) &&
                (channel[0] == ':'))
            {
                channel = channel.Substring(1);
            }

            return(new IRCMessage(from, nick, ident, host, channel, message, rawline, type, replycode));
        }
Пример #8
0
        /// <summary>
        /// Sends a message to everyone who is on a common channel with a certain user
        /// </summary>
        /// <param name="user"></param>
        /// <param name="type"></param>
        /// <param name="extraParam"></param>
        private void SendToUserChannels(IRCUser user, IRCMessageType type, string extraParam)
        {
            //find all channels that this user is in
            List<KeyValuePair<IRCChannel, IRCUser>> channels = m_channelUserPairs.FindAll(delegate(KeyValuePair<IRCChannel, IRCUser> kvp)
            {
                return kvp.Value == user;
            });

            string message;

            if (type == IRCMessageType.Nick) //extraParam = old nickname
                message = ":" + extraParam + "!" + user.UserName + "@" + user.HostName + " NICK :" + user.Name;

            else if (type == IRCMessageType.Quit) //extraParam = quit message
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " QUIT :" + extraParam;

            else return;

            SendToUser(user, message);

            List<IRCUser> recepients = new List<IRCUser>();

            //find all users who are in each channel which have not already received this message
            for (int i = 0, cCount = channels.Count; i < cCount; i++)
            {
                List<KeyValuePair<IRCChannel, IRCUser>> users = m_channelUserPairs.FindAll(delegate(KeyValuePair<IRCChannel, IRCUser> kvp)
                {
                    return kvp.Key == channels[i].Key;
                });

                for (int u = 0, uCount = users.Count; u < uCount; u++)
                {
                    if (!recepients.Contains(users[i].Value))
                    {
                        recepients.Add(users[i].Value);
                        SendToUser(users[i].Value, message);
                    }
                }
            }
        }
Пример #9
0
        /// <summary>
        /// Sends s message to everyone in a certain channel
        /// </summary>
        /// <param name="channel"></param>
        /// <param name="user"></param>
        /// <param name="type"></param>
        private void SendToChannel(IRCChannel channel, IRCUser user, IRCMessageType type, string extraParam)
        {
            //find all users who are in this channel
            List<KeyValuePair<IRCChannel, IRCUser>> users = m_channelUserPairs.FindAll(delegate(KeyValuePair<IRCChannel, IRCUser> kvp)
            {
                return kvp.Key == channel;
            });

            string message;

            if (type == IRCMessageType.Join)
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " JOIN " + channel.Name;
            else if (type == IRCMessageType.Part)
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " PART :" + channel.Name;
            else if (type == IRCMessageType.Privmsg)
            {
                message = ":" + user.Name + "!" + user.UserName + "@" + user.HostName + " PRIVMSG " + channel.Name + " :" + extraParam;

                if (channel.Name == m_defaultChannel && user.TCPClient != null) //only call entity chat for irc users
                    m_scene.EntityChat(this, user, 0f, extraParam, 0, EntityChatType.Broadcast);
            }
            else return;

            for (int u = 0, uCount = users.Count; u < uCount; u++)
            {
                if (type != IRCMessageType.Privmsg || users[u].Value != user)
                    SendToUser(users[u].Value, message);
            }
        }