VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "Parser"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'Used with permission from author. Slightly modifided with use
'with BWW-IRC

Option Explicit
'sIRCPaser class , version 1 by Sahand ** updated version **
'This one works a lot better and has less bugs check it out if you liked the first one!
'send me your comments/suggestions/compliments ... to sstiger3000@yahoo.com
'make sure to declare the instance of the class using the 'Withevents' statement
'or you won't get anything useful out of it!
'changes from version 0.4 are that 5 of error events are now in one
' "OnServerError" which has an attribute called errortype that you can
'use to find out what kind of error it was
'in this version every event has the "RealLine" parameter which is the unparsed
'line , in case you want to use in some other way(like logging e.g)
'have fun! and make sure to vote for it and send me your suggstions
'because i want to continue this project.
'You are free to use this file in your projects(give me credits if u like anyway :)

    Public Enum CTCPTypes
        CTCPPing = 1013
        CTCPVersion = 1014
        CTCPTime = 1015
    End Enum

    Public Enum IRCErrors
        ircUnknownCommand = 421
        ircUnKnownName = 401
        ircNotInChannel = 442
        ircChannelIsBanned = 474
        ircNotOperator = 482
        ircNotEnoughParams = 461
        ircNoSuchChannel = 403
        ircNoTextToSend = 412
    End Enum

    Public Enum IRCConstants
        ircNotRegistered = 451
        ircNickExist = 433
        ircMOTD = 372
        ircWelcome = 1
        ircServerNumUsers = 251
        ircEndOfMOTD = 376
        ircStartofMOTD = 375
        ircChannelNames = 353
        ircEOFChannelNames = 366
        ircServerNumOfChannels = 254
        ircPersonJoin = 100
        ircPrivateMsg = 1000
        ircChannelMsg = 1003
        ircPrivateNotice = 1004
        ircChannelAction = 1019
        ircPersonAction = 1020
        ircChannelNotice = 1005
        ircNickChange = 1006
        ircPersonHost = 311
        ircPersonChans = 319
        ircPersonServer = 312
        ircPersonIdleTime = 317
        ircPersonPart = 1007
        ircPersonQuit = 1008
        ircEndOfWhois = 318
        ircServerNotice = 1009
        ircChannelMode = 1011
        ircChannelTopicChange = 1012
        ircChannelTopic = 332
        ircCTCPRequest = 1013
        ircPersonIsAway = 301
        ircAwayStatChange = 1014
        ircServerError = 1015
        ircKickedFromChan = 1016
    End Enum

    Public Event OnServerMOTD(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnServerEOFMOTD(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnServerStartOfMOTD(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnServerWelcome(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnServerNumbers(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal NumOfUsers As Long, ByVal NumOfInvUsers As Long, ByVal NumOfServers As Long, ByVal RealLine As String)
    Public Event OnServerNumOfChan(ByVal Server As String, ByVal Nickname As String, ByVal NumOfChans As Long, ByVal RealLine As String)
    Public Event OnChannelNames(ByVal Server As String, ByVal Nickname As String, ByVal Channel As String, ByVal People As String, ByVal RealLine As String)
    Public Event OnServerNotice(ByVal Server As String, ByVal Nickname As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnEOFChannelNames(ByVal Server As String, ByVal Nickname As String, ByVal Channel As String, ByVal RealLine As String)
    Public Event OnPersonJoin(ByVal Nickname As String, ByVal HostName As String, ByVal Channel As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPrivateMsg(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvNick As String, ByVal Message As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPrivateAction(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvNick As String, ByVal Action As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnChannelMsg(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvChannel As String, ByVal Message As String, ByVal RealLine As String)
    Public Event OnChannelAction(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvChannel As String, ByVal Action As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPrivateNotice(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvNick As String, ByVal Message As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnChannelNotice(ByVal SenderNick As String, ByVal SenderHost As String, ByVal RecvChannel As String, ByVal Message As String, ByVal Ideneted As Boolean, ByVal RealLine As String)
    Public Event OnNickChange(ByVal OldNick As String, ByVal NewNick As String, ByVal HostName As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPersonHost(ByVal Nickname As String, ByVal UserName As String, ByVal RealName As String, ByVal PersonServer As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPersonChans(ByVal Nickname As String, ByVal Channels As String, ByVal RealLine As String)
    Public Event OnPersonServer(ByVal Nickname As String, ByVal PersonServer As String, ByVal ServerDescription As String, ByVal RealLine As String)
    Public Event OnPersonIdleTime(ByVal Nickname As String, ByVal SecondsIdle As String, ByVal LogonTime As String, ByVal RealLine As String)
    Public Event OnPersonPart(ByVal Nickname As String, ByVal HostName As String, ByVal Channel As String, ByVal reason As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPersonQuit(ByVal Nickname As String, ByVal HostName As String, ByVal reason As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnPersonKick(ByVal KickedNick As String, ByVal KickerNick As String, ByVal KickerHost As String, ByVal Channel As String, ByVal reason As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnChannelMode(ByVal Nickname As String, ByVal HostName As String, ByVal Channel As String, ByVal Mode As String, ByVal Who As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnChannelTopicChange(ByVal Nickname As String, ByVal HostName As String, ByVal Channel As String, ByVal Topic As String, ByVal Idented As Boolean, ByVal RealLine As String)
    Public Event OnChannelTopic(ByVal Server As String, ByVal Channel As String, ByVal Topic As String, ByVal RealLine As String)
    Public Event OnCTCPRequest(ByVal Nickname As String, ByVal HostName As String, ByVal Idented As Boolean, ByVal CTCPType As CTCPTypes, ByVal RealLine As String, ByVal PingID As String)
    Public Event onPersonIsAway(ByVal Nickname As String, ByVal Server As String, ByVal PersonAway As String, ByVal reason As String, ByVal RealLine As String)
    Public Event OnAwayStatChange(ByVal Server As String, ByVal Nickname As String, ByVal AwayOn As Boolean, ByVal RealLine As String)
    Public Event OnServerError(ByVal Nickname As String, ByVal Server As String, ByVal ErrorType As IRCErrors, ByVal ExtraInfo As String, ByVal RealLine As String)
    Public Event OnEndOfWhois(ByVal Nickname As String, ByVal RealLine As String)
    Public Event OnNickExist(ByVal Server As String, ByVal Nickname As String, ByVal ExistingNick As String, ByVal RealLine As String)
    Public Event OnClosingLink(ByVal reason As String, ByVal Nickname As String, ByVal RealLine As String)
    Public Event OnServerPing(ByVal PingID As String, ByVal RealLine As String)
    Public Event OnNotRegistered(ByVal Server As String, ByVal RealLine As String)
    Public Event UnknownIncome(ByVal Line As String)

    Private TempStr1() As String
    Private TempStr2() As String
    Private TempStr3() As String
    Private Idented As Boolean

    Private MsgType As IRCConstants
    Private errorCode As IRCErrors

    Public Property Get LastMsgType() As IRCConstants
            LastMsgType = MsgType
    End Property

    Public Property Get LastError() As IRCErrors
            LastError = errorCode
    End Property
    'returns the number of lines in the specified text
    'and calls the CheckLine function for each of the lines
    Private Function GetNumOfCRFL(ByVal text As String) As Long
        Dim LoopIndex As Long, TmpText As String
        LoopIndex = 0
        TmpText = text
        While InStr(TmpText, vbCrLf) <> 0
            TmpText = Mid(TmpText, InStr(TmpText, vbCrLf) + 2)
            LoopIndex = LoopIndex + 1
        Wend
        GetNumOfCRFL = LoopIndex
    End Function

    Public Sub ProcessText(ByRef text As String)
        Dim LoopIndex As Long, TmpText() As String
        TmpText = Split(text, vbCrLf)
        Do
            Call CheckLine(TmpText(LoopIndex))
            LoopIndex = LoopIndex + 1
        Loop While LoopIndex < UBound(TmpText)
    End Sub

    'checks the line and raises events
    Private Function CheckLine(ByVal Line As String) As Boolean
    On Error Resume Next
        If Line = "" Then Exit Function
        If GetNumOfCRFL(Line) > 0 Then
            CheckLine = False
            Exit Function
        End If
        TempStr1 = Split(Mid(Line, 2), ":", 2)
        If UBound(TempStr1) < 1 Then
            TempStr2 = Split(TempStr1(0), " ", 5)
            If UBound(TempStr2) < 3 Then
                If UCase(TempStr2(1)) = "PART" Then
                    MsgType = IRCConstants.ircPersonPart
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnPersonPart(TempStr3(0), TempStr3(1), TempStr2(2), "", Idented, Line)
                End If
            End If
            If Val(TempStr2(1)) > 0 And Val(TempStr2(1)) < 5 Then
                MsgType = IRCConstants.ircWelcome
                RaiseEvent OnServerWelcome(TempStr2(0), TempStr2(2), TempStr2(3), Line)
            End If
            If UCase(TempStr2(1)) = "MODE" Then
                MsgType = IRCConstants.ircChannelMode
                TempStr3 = Split(TempStr2(0), "!", 2)
                If UBound(TempStr3) < 1 Then
                    RaiseEvent UnknownIncome(Line)
                    Exit Function
                End If
                If InStr(TempStr3(1), "~") Then
                    TempStr3(1) = Mid(TempStr3(1), 2)
                    Idented = False
                Else
                    Idented = True
                End If
                RaiseEvent OnChannelMode(TempStr3(0), TempStr3(1), TempStr2(2), TempStr2(3), TempStr2(4), Idented, Line)
            End If
        Else
            TempStr2 = Split(TempStr1(0), " ")
            If UBound(TempStr2) < 2 Then
                If UCase(Mid(Line, 1, 4)) = "PING" Then
                    RaiseEvent OnServerPing(TempStr1(1), Line)
                ElseIf UCase(Mid(Line, 1, 5)) = "ERROR" Then
                    TempStr3 = Split(TempStr1(1), " ")
                    RaiseEvent OnClosingLink(TempStr3(2), TempStr3(0), Line)
                    Exit Function
                Else
                    RaiseEvent UnknownIncome(Line)
                End If
            ElseIf UBound(TempStr2) = 2 Then
                If UCase(TempStr2(1)) = "JOIN" Then
                    MsgType = IRCConstants.ircPersonJoin
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnPersonJoin(TempStr3(0), TempStr3(1), TempStr1(1), Idented, Line)
                ElseIf UCase(TempStr2(1)) = "QUIT" Then
                    MsgType = IRCConstants.ircPersonQuit
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnPersonQuit(TempStr3(0), TempStr3(1), TempStr1(1), Idented, Line)
                ElseIf UCase(TempStr2(1)) = "NICK" Then
                    MsgType = IRCConstants.ircNickChange
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnNickChange(TempStr3(0), TempStr1(1), TempStr3(1), Idented, Line)
                End If
            ElseIf UBound(TempStr2) > 2 Then
                If UCase(TempStr2(1)) = "PART" Then
                    MsgType = IRCConstants.ircPersonPart
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnPersonPart(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                End If
                If UCase(TempStr2(1)) = "KICK" Then
                    MsgType = IRCConstants.ircKickedFromChan
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnPersonKick(TempStr2(3), TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                End If
                If UCase(TempStr2(1)) = "TOPIC" Then
                    MsgType = IRCConstants.ircChannelTopicChange
                    TempStr3 = Split(TempStr2(0), "!", 2)
                    If UBound(TempStr3) < 1 Then
                        RaiseEvent UnknownIncome(Line)
                        Exit Function
                    End If
                    If InStr(TempStr3(1), "~") Then
                        TempStr3(1) = Mid(TempStr3(1), 2)
                        Idented = False
                    Else
                        Idented = True
                    End If
                    RaiseEvent OnChannelTopicChange(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                End If
                If UCase(TempStr2(1)) = "PRIVMSG" Then
                    If InStr(TempStr2(2), "#") <> 0 Then
                        MsgType = IRCConstants.ircChannelMsg
                        TempStr3 = Split(TempStr2(0), "!", 2)
                        If UBound(TempStr3) < 1 Then
                            RaiseEvent UnknownIncome(Line)
                            Exit Function
                        End If
                        If InStr(TempStr3(1), "~") Then
                            TempStr3(1) = Mid(TempStr3(1), 2)
                            Idented = False
                        Else
                            Idented = True
                        End If
                        If Mid(TempStr1(1), 1, 1) = Chr(1) And UCase(Mid(TempStr1(1), 2, 5)) = "ACTION" Then
                            MsgType = ircChannelAction
                            
                            RaiseEvent OnChannelAction(TempStr3(0), TempStr3(1), TempStr2(2), Left(Right(TempStr1(1), Len(TempStr1(1)) - 7), Len(Right(TempStr1(1), Len(TempStr1(1)) - 7)) - 1), Idented, Line)
                            Exit Function
                        End If
                        RaiseEvent OnChannelMsg(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Line)
                    Else
                        MsgType = IRCConstants.ircPrivateMsg
                        TempStr3 = Split(TempStr2(0), "!", 2)
                        If UBound(TempStr3) < 1 Then
                            RaiseEvent UnknownIncome(Line)
                            Exit Function
                        End If
                        If InStr(TempStr3(1), "~") Then
                            TempStr3(1) = Mid(TempStr3(1), 2)
                            Idented = False
                        Else
                            Idented = True
                        End If
                        If InStr(TempStr1(1), Chr(1) & "PING") <> 0 Then
                            MsgType = IRCConstants.ircCTCPRequest
                            RaiseEvent OnCTCPRequest(TempStr3(0), TempStr3(1), Idented, CTCPTypes.CTCPPing, Line, Mid(Line, InStr(Line, Chr(1) & "PING") + 6, Len(Mid(Line, InStr(Line, Chr(1) & "PING") + 6)) - 1))
                            Exit Function
                        ElseIf Mid(TempStr1(1), 1, 1) = Chr(1) And UCase(Mid(TempStr1(1), 2, 6)) = "ACTION" Then
                            MsgType = ircPersonAction
                            RaiseEvent OnPrivateAction(TempStr3(0), TempStr3(1), TempStr2(2), Left(Right(TempStr1(1), Len(TempStr1(1)) - 7), Len(Right(TempStr1(1), Len(TempStr1(1)) - 7)) - 1), Idented, Line)
                            Exit Function
                        ElseIf TempStr1(1) = Chr(1) & "VERSION" & Chr(1) Then
                            MsgType = IRCConstants.ircCTCPRequest
                            RaiseEvent OnCTCPRequest(TempStr3(0), TempStr3(1), Idented, CTCPTypes.CTCPVersion, Line, "")
                            Exit Function
                        ElseIf TempStr1(1) = Chr(1) & "TIME" & Chr(1) Then
                            MsgType = IRCConstants.ircCTCPRequest
                            RaiseEvent OnCTCPRequest(TempStr3(0), TempStr3(1), Idented, CTCPTypes.CTCPTime, Line, "")
                            Exit Function
                        End If
                        RaiseEvent OnPrivateMsg(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                    End If
                ElseIf UCase(TempStr2(1)) = "NOTICE" Then
                    If InStr(TempStr2(2), "#") <> 0 Then
                        MsgType = IRCConstants.ircChannelNotice
                        TempStr3 = Split(TempStr2(0), "!", 2)
                        If UBound(TempStr3) < 1 Then
                            RaiseEvent UnknownIncome(Line)
                            Exit Function
                        End If
                        If InStr(TempStr3(1), "~") Then
                            TempStr3(1) = Mid(TempStr3(1), 2)
                            Idented = False
                        Else
                            Idented = True
                        End If
                        RaiseEvent OnChannelNotice(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                    Else
                        MsgType = IRCConstants.ircPrivateNotice
                        TempStr3 = Split(TempStr2(0), "!", 2)
                        If UBound(TempStr3) < 1 Then
                            MsgType = IRCConstants.ircServerNotice
                            RaiseEvent OnServerNotice(TempStr3(0), TempStr2(2), TempStr1(1), Line)
                            Exit Function
                        End If
                        If InStr(TempStr3(1), "~") Then
                            TempStr3(1) = Mid(TempStr3(1), 2)
                            Idented = False
                        Else
                            Idented = True
                        End If
                        RaiseEvent OnPrivateNotice(TempStr3(0), TempStr3(1), TempStr2(2), TempStr1(1), Idented, Line)
                    End If
                End If
            End If
            If Val(TempStr2(1)) <> 0 Then
                Select Case Val(TempStr2(1))
                    Case 372
                        MsgType = IRCConstants.ircMOTD
                        RaiseEvent OnServerMOTD(TempStr2(0), TempStr2(2), TempStr1(1), Line)
                    Case Is < 5
                        MsgType = IRCConstants.ircWelcome
                        RaiseEvent OnServerWelcome(TempStr2(0), TempStr2(2), TempStr1(1), Line)
                    Case 251
                        MsgType = IRCConstants.ircServerNumUsers
                        TempStr3 = Split(TempStr1(1), " ")
                        RaiseEvent OnServerNumbers(TempStr2(0), TempStr2(2), TempStr1(1), Val(TempStr3(2)), Val(TempStr3(5)), Val(TempStr3(8)), Line)
                    Case 375
                        MsgType = IRCConstants.ircStartofMOTD
                        RaiseEvent OnServerStartOfMOTD(TempStr2(0), TempStr2(2), TempStr1(1), Line)
                    Case 376
                        MsgType = IRCConstants.ircEndOfMOTD
                        RaiseEvent OnServerEOFMOTD(TempStr2(0), TempStr2(2), TempStr1(1), Line)
                    Case 353
                        MsgType = IRCConstants.ircChannelNames
                        RaiseEvent OnChannelNames(TempStr2(0), TempStr2(2), TempStr2(4), TempStr1(1), Line)
                    Case 366
                        MsgType = IRCConstants.ircEOFChannelNames
                        RaiseEvent OnEOFChannelNames(TempStr2(0), TempStr2(2), TempStr2(3), Line)
                    Case 254
                        MsgType = IRCConstants.ircServerNumOfChannels
                        RaiseEvent OnServerNumOfChan(TempStr2(0), TempStr2(2), Val(TempStr2(3)), Line)
                    Case 421
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircUnknownCommand
                        RaiseEvent OnServerError(TempStr2(0), TempStr2(2), IRCErrors.ircUnknownCommand, TempStr2(3), Line)
                    Case 401
                        MsgType = IRCConstants.ircServerError
                        RaiseEvent OnServerError(TempStr2(0), TempStr2(2), IRCErrors.ircUnKnownName, TempStr2(3), Line)
                    Case 311
                        MsgType = IRCConstants.ircPersonHost
                        If InStr(TempStr2(4), "~") Then
                            TempStr2(4) = Mid(TempStr2(4), 2)
                            Idented = False
                        Else
                            Idented = True
                        End If
                        RaiseEvent OnPersonHost(TempStr2(3), TempStr2(4), TempStr1(1), TempStr2(5), Idented, Line)
                    Case 319
                        MsgType = IRCConstants.ircPersonChans
                        RaiseEvent OnPersonChans(TempStr2(3), TempStr1(1), Line)
                    Case 312
                        MsgType = IRCConstants.ircPersonServer
                        RaiseEvent OnPersonServer(TempStr2(3), TempStr2(4), TempStr1(1), Line)
                    Case 317
                        MsgType = IRCConstants.ircPersonIdleTime
                        RaiseEvent OnPersonIdleTime(TempStr2(3), TempStr2(4), TempStr2(5), Line)
                    Case 318
                        MsgType = IRCConstants.ircEndOfWhois
                        RaiseEvent OnEndOfWhois(TempStr2(3), Line)
                    Case 433
                        MsgType = IRCConstants.ircNickExist
                        RaiseEvent OnNickExist(TempStr2(0), TempStr2(2), TempStr2(3), Line)
                    Case 442
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircNotInChannel
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircNotInChannel, TempStr2(3), Line)
                    Case 474
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircChannelIsBanned
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircChannelIsBanned, TempStr2(3), Line)
                    Case 332
                        MsgType = IRCConstants.ircChannelTopic
                        RaiseEvent OnChannelTopic(TempStr2(0), TempStr2(3), TempStr1(1), Line)
                    Case 482
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircNotOperator
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircNotOperator, TempStr2(3), Line)
                    Case 403
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircNoSuchChannel
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircNoSuchChannel, TempStr2(3), Line)
                    Case 451
                        MsgType = IRCConstants.ircNotRegistered
                        RaiseEvent OnNotRegistered(TempStr2(0), Line)
                    Case 301
                        MsgType = IRCConstants.ircPersonIsAway
                        RaiseEvent onPersonIsAway(TempStr2(2), TempStr2(0), TempStr2(3), TempStr1(1), Line)
                    Case 306
                        MsgType = IRCConstants.ircAwayStatChange
                        RaiseEvent OnAwayStatChange(TempStr2(2), TempStr2(0), True, Line)
                    Case 305
                        MsgType = IRCConstants.ircAwayStatChange
                        RaiseEvent OnAwayStatChange(TempStr2(2), TempStr2(0), False, Line)
                    Case 412
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircNoTextToSend
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircNoTextToSend, TempStr2(3), Line)
                    Case 461
                        MsgType = IRCConstants.ircServerError
                        errorCode = IRCErrors.ircNotEnoughParams
                        RaiseEvent OnServerError(TempStr2(2), TempStr2(0), IRCErrors.ircNotEnoughParams, TempStr2(3), Line)
                End Select
            End If
        End If
    End Function
