All pastes #176894 Raw Edit

PK

public text v1 · immutable
#176894 ·published 2006-09-20 01:11 UTC
rendered paste body
	// The invoked function, a member of the m_Protocol used below
        [Command( "433" )]
        void NickInUse( Connection conn, string Prefix, params object[] Params )
        {
            conn.SendCommand( "NICK " + Params[1] + "_" + "\r\n" );
        }

        // The invoking function
        private void RunCommand( string Command )
        {
            m_Log.WriteLine( "<<< " + Command );
            m_Log.Flush();
            string[] Parameters = Command.Split( ' ' );
            string[] RealParms;
            int iOffset = 1;
            string Cmd = Parameters[0];
            string Prefix = null;
            if( Cmd.StartsWith( ":" ) )
            {
                // It starts with a prefix. Ignore it.
                Prefix = Parameters[0].Substring( 1 );
                Cmd = Parameters[1];
                iOffset = 2;
            }
            // Parse the parameters
            // Count until we find a parameter starting with ':'
            int iParamEnd = Parameters.Length-1;
            for( int i = iOffset; i < Parameters.Length; i++ )
            {
                if( Parameters[i].StartsWith( ":" ) )
                {
                    iParamEnd = i;
                    break;
                }
            }
            // Allocate space for all the parameters
            RealParms = new string[(iParamEnd - iOffset) + 1];
            // Copy all the arguments but the last over
            for( int i = iOffset; i < iParamEnd; i++ )
                RealParms[i - iOffset] = Parameters[i];
            // If the last one is not a fullstring, copy it in
            if( !Parameters[iParamEnd].StartsWith( ":" ) )
            {
                RealParms[iParamEnd-iOffset] = Parameters[iParamEnd];
            }
            // Otherwise...
            else
            {
                // Create a string with the remaining parameters
                string fullstring = Parameters[iParamEnd].Substring( 1 );
                for( int i = iParamEnd+1; i < Parameters.Length; i++ )
                {
                    fullstring += " " + Parameters[i];
                }
                // Pop it into the last parameter
                RealParms[iParamEnd-iOffset] = fullstring;
            }
            // Trim a single \r off the end
            if( RealParms[iParamEnd-iOffset].EndsWith( "\r" ) )
            {
                RealParms[iParamEnd-iOffset] = RealParms[iParamEnd-iOffset].Substring( 0, RealParms[iParamEnd-iOffset].Length - 1 );
            }

            // Call the function
            object oMI = m_Hashtable[Cmd];
            if( oMI == null )
            {
                // It's an unknown command, throw a warning
                Console.WriteLine( "Unknown command: " + Cmd );
                return;
            }
            MethodInfo mi = (MethodInfo)oMI;
            object[] objs = new object[2+RealParms.Length];
            objs[0] = this;
            objs[1] = Prefix;
            for( int i = 0; i < RealParms.Length; i++ )
            {
                objs[i + 2] = RealParms[i];
            }
            mi.Invoke( m_Protocol, objs );
        }