public void ParseComplex()
        {
            var modeMap = new ChannelModeMap();
            List<ChannelModeChangeInfo> changeInfos;
            ChannelModeChangeInfo changeInfo;

            changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "-l+o-k+v", "op_nick * voice_nick");
            Assert.IsNotNull(changeInfos);
            Assert.AreEqual(4, changeInfos.Count);

            changeInfo = changeInfos[0];
            Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action);
            Assert.AreEqual(ChannelMode.UserLimit, changeInfo.Mode);
            Assert.AreEqual('l', changeInfo.ModeChar);
            Assert.AreEqual(null, changeInfo.Parameter);

            changeInfo = changeInfos[1];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Op, changeInfo.Mode);
            Assert.AreEqual('o', changeInfo.ModeChar);
            Assert.AreEqual("op_nick", changeInfo.Parameter);

            changeInfo = changeInfos[2];
            Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Key, changeInfo.Mode);
            Assert.AreEqual('k', changeInfo.ModeChar);
            Assert.AreEqual("*", changeInfo.Parameter);

            changeInfo = changeInfos[3];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Voice, changeInfo.Mode);
            Assert.AreEqual('v', changeInfo.ModeChar);
            Assert.AreEqual("voice_nick", changeInfo.Parameter);
        }
        public void ParseUnknown()
        {
            var modeMap = new ChannelModeMap();
            List<ChannelModeChangeInfo> changeInfos;
            ChannelModeChangeInfo changeInfo;

            changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+X-Y", "foo bar");
            Assert.IsNotNull(changeInfos);
            Assert.AreEqual(2, changeInfos.Count);

            changeInfo = changeInfos[0];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode);
            Assert.AreEqual('X', changeInfo.ModeChar);
            Assert.AreEqual("foo", changeInfo.Parameter);

            changeInfo = changeInfos[1];
            Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode);
            Assert.AreEqual('Y', changeInfo.ModeChar);
            Assert.AreEqual("bar", changeInfo.Parameter);
        }
Example #3
0
 /// <summary>
 /// Connection parameters required to establish an server connection.
 /// </summary>
 /// <param name="addresslist">The list of server hostnames.</param>
 /// <param name="port">The TCP port the server listens on.</param>
 public new void Connect(string[] addresslist, int port)
 {
     _SupportNonRfcLocked = true;
     ChannelModeMap = new ChannelModeMap();
     base.Connect(addresslist, port);
 }
Example #4
0
        private void _Event_RPL_BOUNCE(IrcMessageData ircdata)
        {
            // HACK: might be BOUNCE or ISUPPORT; try to detect
            if (ircdata.Message != null && ircdata.Message.StartsWith("Try server ")) {
                // BOUNCE
                string host = null;
                int port = -1;
                // try to parse out host and port
                var match = _BounceMessageRegex.Match(ircdata.Message);
                if (match.Success) {
                    host = match.Groups [1].Value;
                    port = int.Parse(match.Groups [2].Value);
                }

                if (OnBounce != null) {
                    OnBounce(this, new BounceEventArgs(ircdata, host, port));
                }
                return;
            }

            // ISUPPORT
            _ServerProperties.ParseFromRawMessage(ircdata.RawMessageArray);
            if (ircdata.RawMessageArray.Any(x => x.StartsWith("CHANMODES="))) {
                var chanModes = _ServerProperties.RawProperties["CHANMODES"];
                if (!String.IsNullOrEmpty(chanModes)) {
                    ChannelModeMap = new ChannelModeMap(chanModes);
                }
            }
            if (_ServerProperties.RawProperties.ContainsKey("NAMESX")) {
                WriteLine("PROTOCTL NAMESX", Priority.Critical);
            }
        }
Example #5
0
        /// <summary>
        /// This class manages the connection server and provides access to all the objects needed to send and receive messages.
        /// </summary>
        public IrcClient()
        {
            #if LOG4NET
            Logger.Main.Debug("IrcClient created");
            #endif
            OnReadLine        += new ReadLineEventHandler(_Worker);
            OnDisconnected    += new EventHandler(_OnDisconnected);
            OnConnectionError += new EventHandler(_OnConnectionError);

            ChannelModeMap = new ChannelModeMap();
        }
Example #6
0
        private void _Event_RPL_BOUNCE(IrcMessageData ircdata)
        {
            // HACK: might be BOUNCE or ISUPPORT; try to detect
            if (ircdata.Message.StartsWith("Try server ")) {
                // BOUNCE
                string host = null;
                int port = -1;
                // try to parse out host and port
                var match = _BounceMessageRegex.Match(ircdata.Message);
                if (match.Success) {
                    host = match.Groups [1].Value;
                    port = int.Parse(match.Groups [2].Value);
                }

                if (OnBounce != null) {
                    OnBounce(this, new BounceEventArgs(ircdata, host, port));
                }
                return;
            }

            // ISUPPORT
            // split the message (0 = server, 1 = code, 2 = my nick)
            for (int i = 3; i < ircdata.RawMessageArray.Length; ++i) {
                var msg = ircdata.RawMessageArray [i];
                if (msg.StartsWith(":")) {
                    // addendum; we're done
                    break;
                }

                var keyval = msg.Split('=');
                if (keyval.Length == 1) {
                    // keyword only
                    _ServerProperties.RawProperties [keyval [0]] = null;
                } else if (keyval.Length == 2) {
                    // key and value
                    _ServerProperties.RawProperties [keyval [0]] = keyval [1];
                } else {
            #if LOG4NET
                    Logger.Connection.Warn("confusing ISUPPORT message, ignoring: " + msg);
            #endif
                }

                if (keyval.Length == 2 && keyval[0] == "CHANMODES") {
                    var chanModes = keyval[1];
                    if (!String.IsNullOrEmpty(chanModes)) {
                        ChannelModeMap = new ChannelModeMap(chanModes);
                    }
                }
            }
        }
        public void ParseWithoutParameter()
        {
            var modeMap = new ChannelModeMap();
            List<ChannelModeChangeInfo> changeInfos;
            ChannelModeChangeInfo changeInfo;

            changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+nt", "");
            Assert.IsNotNull(changeInfos);
            Assert.AreEqual(2, changeInfos.Count);

            changeInfo = changeInfos[0];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode);
            Assert.AreEqual('n', changeInfo.ModeChar);
            Assert.AreEqual(null, changeInfo.Parameter);

            changeInfo = changeInfos[1];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.TopicLock, changeInfo.Mode);
            Assert.AreEqual('t', changeInfo.ModeChar);
            Assert.AreEqual(null, changeInfo.Parameter);
        }
        public void ParseWithParameter()
        {
            var modeMap = new ChannelModeMap();
            List<ChannelModeChangeInfo> changeInfos;
            ChannelModeChangeInfo changeInfo;

            changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+o", "meebey");
            Assert.IsNotNull(changeInfos);
            Assert.AreEqual(1, changeInfos.Count);

            changeInfo = changeInfos[0];
            Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action);
            Assert.AreEqual(ChannelMode.Op, changeInfo.Mode);
            Assert.AreEqual('o', changeInfo.ModeChar);
            Assert.AreEqual("meebey", changeInfo.Parameter);
        }
Example #9
0
        /// <overloads>this method has 3 overloads</overloads>
        /// <summary>
        /// Connects to the specified server and port using the specified transport, when the connection fails
        /// the next server in the list will be used.
        /// </summary>
        /// <param name="transport">Transport protocol to use</param>
        /// <param name="addresslist">List of servers to connect to</param>
        /// <param name="port">Portnumber to connect to</param>
        /// <exception cref="CouldNotConnectException">The connection failed</exception>
        /// <exception cref="AlreadyConnectedException">If there is already an active connection</exception>
        public new void Connect(IIrcTransportManager transport, string[] addresslist, int port = 0)
        {
            _SupportNonRfcLocked = true;
            ChannelModeMap = new ChannelModeMap();
            base.Connect(transport, addresslist, port);

            // We get here only if the connection is successful
            if (_UseIrcV3) {
                _CapNegotiateStart();
            }
        }