Attribute VB_Name = "modIRCUserCommands"
Option Explicit
Dim NickName As String, level As Long

Public Function ChangeNick(Index As Long, NewNick As String, Optional SendLink As Boolean = True) As Boolean
On Error Resume Next
If NickInUse(NewNick) Then
    ChangeNick = False
    Exit Function
End If
If UCase(Users(Index).Nick) = UCase(NewNick) Then
    ChangeNick = True
    Exit Function
End If
If Users(Index).Nick = "" Then
    SendWsock Index, ":" & NewNick & " NICK " & NewNick
    ChangeNick = True
Else
    Dim i As Long, X As Long, CurChan As clsChannel, CurNick As clsUser
    For i = 1 To Users(Index).Onchannels.Count
        Set CurChan = ChanToObject(Users(Index).Onchannels(i))
        If CurChan.IsNorm(Users(Index).Nick) Then
            CurChan.NormUsers.Remove Users(Index).Nick
            CurChan.NormUsers.Add NewNick, NewNick
        ElseIf CurChan.IsVoice(Users(Index).Nick) Then
            CurChan.Voices.Remove Users(Index).Nick
            CurChan.Voices.Add NewNick, NewNick
        ElseIf CurChan.IsOp(Users(Index).Nick) Then
            CurChan.Ops.Remove Users(Index).Nick
            CurChan.Ops.Add NewNick, NewNick
        End If
        CurChan.All.Remove Users(Index).Nick
        CurChan.All.Add NewNick, NewNick
        For X = 1 To (CurChan.All.Count)
            If Not NewNick = CurChan.All(X) Then SendWsock NickToObject(CurChan.All(X)).Index, ": " & Users(Index).Nick & " NICK " & NewNick
        Next X
    Next i
    SendWsock Index, ":" & Users(Index).Nick & " NICK " & NewNick
    ChangeNick = True
End If
'1 = Command, 2 = Nick, 3 = NewNick
If SendLink Then SendLinks "Nick" & vbLf & Users(Index).Nick & vbLf & NewNick
Users(Index).Nick = NewNick
ChangeNick = True
End Function

Public Sub SendMsg(Target As String, Message As String, User As String, Optional SendToChan As Boolean = True, Optional SendLink As Boolean = True)
On Error Resume Next
Dim Index As Long
Index = NickToObject(User, 5).Index
NickToObject(User, 5).Idle = UnixTime
If SendToChan Then
    Dim i As Long, X As Long, CurChan As clsChannel
    Set CurChan = ChanToObject(Target)
    If CurChan.IsMode("c") Then StripColorCodes Message
    For X = 1 To (CurChan.All.Count)
        If Not User = CurChan.All(X) Then SendWsock NickToObject(CurChan.All(X), 5, True).Index, ":" & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " PRIVMSG " & Target & " :" & Message
    Next X
    '1 = Command, 2 = Nick, 3 = Channel, 4 = Msg
    If SendLink Then SendLinks "PrivMsgChan" & vbLf & User & vbLf & Target & vbLf & Message
Else
    Dim cUser As clsUser
    Set cUser = NickToObject(Target, 5)
    If cUser.LocalUser Then SendLink = False
    SendWsock cUser.Index, ":" & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " PRIVMSG " & Target & " :" & Message & vbCrLf
    '1 = Command, 2 = Nick, 3 = Target, 4 = Msg
    If SendLink Then SendLinks "PrivMsgUser" & vbLf & User & vbLf & Target & vbLf & Message
End If
End Sub

Public Sub SendQuit(Index As Long, QuitMsg As String, Optional Kill As Boolean = False, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, X As Long, CurChan As clsChannel
If QuitMsg = "" Then QuitMsg = DefQuit
Users(Index).SentQuit = True
For i = 1 To Users(Index).Onchannels.Count
    Set CurChan = ChanToObject(Users(Index).Onchannels(i))
    For X = 1 To (CurChan.All.Count)
        If Not Users(Index).Nick = CurChan.All(X) Then SendWsock NickToObject(CurChan.All(X)).Index, ": " & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " QUIT :" & QuitMsg
    Next X
    CurChan.All.Remove Users(Index).Nick
    If CurChan.IsNorm(Users(Index).Nick) Then
        CurChan.NormUsers.Remove Users(Index).Nick
    ElseIf CurChan.IsVoice(Users(Index).Nick) Then
        CurChan.Voices.Remove Users(Index).Nick
    ElseIf CurChan.IsOp(Users(Index).Nick) Then
        CurChan.Ops.Remove Users(Index).Nick
    End If
Next i
If Kill Then
    SendWsock Index, ":" & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " KILL :" & QuitMsg
    SendWsock Index, "ERROR :Closing Link: " & "You have been killed" & vbCrLf
    '1 = Command, 2 = Nick, 3 = Reason
    If SendLink Then SendLinks "KillUser" & vbLf & Users(Index).Nick & vbLf & QuitMsg
Else
    '1 = Command, 2 = Nick, 3 = QuitMsg
    If SendLink Then SendLinks "QuitUser" & vbLf & Users(Index).Nick & vbLf & QuitMsg
End If
End Sub

Public Sub SendPart(Index As Long, Chan As String, Reason As String, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, X As Long, CurChan As clsChannel, Found As Boolean
Users(Index).Idle = UnixTime
For i = 1 To Users(Index).Onchannels.Count
    If Chan = Users(Index).Onchannels(i) Then Found = True
Next i
If Found = False Then Exit Sub
'1 = Command, 2 = Nick, 3 = Channel, 4 = Reason
If SendLink Then SendLinks "PartUser" & vbLf & Users(Index).Nick & vbLf & Chan & vbLf & Reason
Set CurChan = ChanToObject(Chan)
For X = 1 To (CurChan.All.Count)
    If Not Users(Index).Nick = CurChan.All(X) Then SendWsock NickToObject(CurChan.All(X)).Index, ": " & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " PART " & Chan & " :" & Reason
Next X
CurChan.All.Remove Users(Index).Nick
If CurChan.IsNorm(Users(Index).Nick) Then
    CurChan.NormUsers.Remove Users(Index).Nick
ElseIf CurChan.IsVoice(Users(Index).Nick) Then
    CurChan.Voices.Remove Users(Index).Nick
ElseIf CurChan.IsOp(Users(Index).Nick) Then
    CurChan.Ops.Remove Users(Index).Nick
End If
Users(Index).Onchannels.Remove Chan
SendWsock Index, ":" & Users(Index).Nick & " PART " & Chan
If CurChan.All.Count = 0 And (CurChan.IsMode("r")) Then
    Do Until CurChan.Invited.Count = 0
        CurChan.Invited.Remove 1
    Loop
    CurChan.TopicSetBy = ""
    CurChan.TopicSetBy = 0
    CurChan.Topic = ""
ElseIf CurChan.All.Count = 0 And (Not CurChan.IsMode("r")) Then
    Set Channels(CurChan.Index) = Nothing
End If
End Sub

Public Sub SendPing(Index As Long)
SendWsock Index, "PING " & GetRandom
End Sub

Public Sub NotifyJoin(Index As Long, Chan As String, Optional SendLink As Boolean = True)
Dim i As Long, Channel As clsChannel
Set Channel = ChanToObject(Chan)
If Channel.IsOnChan(Users(Index).Nick) Then Exit Sub
For i = 1 To Channel.All.Count
    If Not Channel.All(i) = Users(Index).Nick Or Channel.All(i) = "" Then SendWsock NickToObject(Channel.All(i)).Index, ":" & Users(Index).Nick & "!" & Users(Index).Ident & "@" & Users(Index).DNS & " JOIN " & Chan
Next i
'1 = Command, 2 = Nick, 3 = Channel
If SendLink Then SendLinks "JoinChan" & vbLf & Users(Index).Nick & vbLf & Chan
End Sub

Public Sub SendNotice(Target As String, Message As String, User As String, Optional ToChannel As Boolean = False, Optional Index As Integer, Optional SendLink As Boolean = True)
On Error Resume Next
Dim TargetIndex As Long, i As Long
If Index <> 0 Then
    TargetIndex = Index
Else
    TargetIndex = NickToObject(Target).Index
End If
If Not ToChannel Then
    If Users(TargetIndex).LocalUser Then SendLink = False
    SendWsock TargetIndex, ":" & User & " NOTICE " & Target & " :" & Message
    '1 = Command, 2 = Nick, 3 = Target, 4 = Msg
    If SendLink Then SendLinks "NoticeUser" & vbLf & User & vbLf & Target & vbLf & Message
Else
    Dim Chan As clsChannel
    Set Chan = ChanToObject(Target)
    For i = 1 To Chan.All.Count
        SendWsock NickToObject(Chan.All(i)).Index, ":" & User & " NOTICE " & Target & " :" & Message
    Next i
    '1 = Command, 2 = Nick, 3 = Target, 4 = Msg
    If SendLink Then SendLinks "NoticeChan" & vbLf & User & vbLf & Target & vbLf & Message
End If
End Sub

Public Sub KickUser(Source As String, Chan As String, Target As String, Optional Reason As String, Optional Reasoning As Boolean = False, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, Channel As clsChannel, KickMsg As String
Set Channel = ChanToObject(Chan)
If Reasoning = True Then
    KickMsg = ":" & Source & " KICK " & Chan & " " & Target & " :" & Reason
Else
    KickMsg = ":" & Source & " KICK " & Chan & " " & Target
End If
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, KickMsg
Next i
Channel.All.Remove Target
If Channel.IsNorm(Target) Then
    Channel.NormUsers.Remove Target
ElseIf Channel.IsVoice(Target) Then
    Channel.Voices.Remove Target
ElseIf Channel.IsOp(Target) Then
    Channel.Ops.Remove Target
End If
NickToObject(Target).Onchannels.Remove Chan
'1 = Command, 2 = Nick, 3 = Channel, 4 = Reason, 5 = Target
If SendLink Then SendLinks "KickUser" & vbLf & Source & vbLf & Channel.Name & vbLf & Reason & vbLf & Target
End Sub

Public Sub SetTopic(Chan As String, NewTopic As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long, Channel As clsChannel
Set Channel = ChanToObject(Chan)
If Channel.Topic = NewTopic Then Exit Sub
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, ":" & User & " TOPIC " & Chan & " :" & NewTopic
Next i
Channel.Topic = NewTopic
Channel.TopicSetOn = UnixTime
Channel.TopicSetBy = User
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "SetTopic" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & NewTopic
End Sub

Public Sub OpUser(Channel As clsChannel, Target As String, User As String, Optional OpAnyway As Boolean = False, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, Chan As String
Chan = Channel.Name
If Channel.IsOp(Target) And OpAnyway = False Then Exit Sub
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, (":" & User & " MODE " & Chan & " +o " & Target)
Next i
If Channel.IsNorm(Target) Then Channel.NormUsers.Remove Target
Channel.Ops.Add Target, Target
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "OpUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub DeOpUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, Chan As String
If Not Channel.IsOp(Target) Then Exit Sub
Chan = Channel.Name
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, (":" & User & " MODE " & Chan & " -o " & Target)
Next i
Channel.Ops.Remove Target
If Channel.IsVoice(Target) Then
Else
    Channel.NormUsers.Add Target, Target
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "DeOpUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub
Public Sub VoiceUser(Channel As clsChannel, Target As String, User As String, Optional VoiceAnyway As Boolean = False, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, Chan As String
Chan = Channel.Name
If Channel.IsVoice(Target) And VoiceAnyway = False Then Exit Sub
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, (":" & User & " MODE " & Chan & " +v " & Target)
Next i
Channel.Voices.Add Target, Target
If Channel.IsNorm(Target) Then Channel.NormUsers.Remove Target
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "VoiceUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub
Public Sub DeVoiceUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
On Error Resume Next
Dim i As Long, Chan As String
If Not Channel.IsVoice(Target) Then Exit Sub
Chan = Channel.Name
For i = 1 To Channel.All.Count
     SendWsock NickToObject(Channel.All(i)).Index, (":" & User & " MODE " & Chan & " -v " & Target)
Next i
Channel.Voices.Remove Target
If Channel.IsOp(Target) Then
Else
    Channel.NormUsers.Add Target, Target
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "DeVoiceUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub BanUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
If Not Channel.IsBanned2(Target) Then
    Channel.Bans.Add Target, Target
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " +b " & Target
    Next i
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "BanUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub UnBanUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
For i = 1 To Channel.All.Count
    SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " -b " & Target
Next i
Channel.Bans.Remove Target
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "UnBanUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub RemoveChanModes(NewModes As String, Chan As String, User As clsUser, Optional SendLink As Boolean = True)
Dim Found As Boolean, X As Long, Channel As clsChannel, Modes As String
Set Channel = ChanToObject(Chan)
If InStr(1, NewModes, "r") And User.Nick <> "ChanServ" Then NewModes = Replace(NewModes, "r", "")
If Not (Mid(NewModes, 1, 1) = "k" Or Mid(NewModes, 1, 1) = "l") Then
    For X = 1 To Len(NewModes)
        If Channel.IsMode(Mid(NewModes, X, 1)) Then
            Channel.Modes.Remove Mid(NewModes, X, 1)
            Modes = Modes & Mid(NewModes, X, 1)
        End If
    Next X
    If Modes = "" Then Exit Sub
    Dim i As Long
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " -" & Modes
    Next i
ElseIf Mid(NewModes, 1, 2) = "lk" Then
    Dim Key As String, Limit As String
    Limit = Replace(NewModes, "lk ", "")
    If Channel.Key = Limit Then Channel.Key = ""
    Channel.Limit = 0
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " -" & NewModes
    Next i
ElseIf Mid(NewModes, 1, 1) = "k" Then
    If Channel.Key = Replace(NewModes, "k ", "") Then
        If SendLink Then SendLinks "UnKey" & vbLf & User.Nick & vbLf & Channel.Name & vbLf & Channel.Key
        Channel.Key = ""
        For i = 1 To Channel.All.Count
            SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " -" & NewModes
        Next i
    End If
ElseIf Mid(NewModes, 1, 1) = "l" Then
    Channel.Limit = 0
    If SendLink Then SendLinks "UnLimit" & vbLf & User.Nick & vbLf & Channel.Name & vbLf & Channel.Limit
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " -" & NewModes
    Next i
End If
'1 = Command, 2 = Nick, 3 = +/-, 4 = Modes, 5 = Channel
If SendLink Then SendLinks "ChanMode" & vbLf & User.Nick & vbLf & "-" & vbLf & Modes & vbLf & Channel.Name
End Sub

Public Sub AddChanModes(NewModes As String, Chan As String, User As clsUser, Optional SendLink As Boolean = True)
Dim Found As Boolean, X As Long, Channel As clsChannel, Modes As String
On Error Resume Next
If InStr(1, NewModes, "r") And User.Nick <> "ChanServ" Then NewModes = Replace(NewModes, "r", "")
Set Channel = ChanToObject(Chan)
If Not (Mid(NewModes, 1, 1) = "k" Or Mid(NewModes, 1, 1) = "l") Then
    For X = 1 To Len(NewModes)
        If Not Channel.IsMode(Mid(NewModes, X, 1)) Then
            Channel.Modes.Add Mid(NewModes, X, 1), Mid(NewModes, X, 1)
            Modes = Modes & Mid(NewModes, X, 1)
        End If
    Next X
    If Modes = "" Then Exit Sub
    Dim i As Long
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & Modes
    Next i
ElseIf Mid(NewModes, 1, 2) = "lk" Then
    Dim Key As String, Limit As String
    Limit = Replace(NewModes, "lk ", "")
    Key = Mid(Limit, 1, InStr(1, Limit, " ") - 1)
    Limit = Replace(Limit & " ", Key, "")
    Limit = Trim(Limit)
    Channel.Key = Limit
    Channel.Limit = Key
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & NewModes
    Next i
ElseIf Mid(NewModes, 1, 1) = "k" Then
    Channel.Key = Replace(NewModes, "k ", "")
    If SendLink Then SendLinks "Key" & vbLf & User.Nick & vbLf & Channel.Name & vbLf & Channel.Key
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & NewModes
    Next i
ElseIf Mid(NewModes, 1, 1) = "l" Then
    Channel.Limit = Replace(NewModes, "l ", "")
    If SendLink Then SendLinks "Limit" & vbLf & User.Nick & vbLf & Channel.Name & vbLf & Channel.Limit
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & NewModes
    Next i
ElseIf Mid(NewModes, 1, 1) = "C" Then
    Channel.Limit = Replace(NewModes, "C ", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & NewModes
    Next i
ElseIf Mid(NewModes, 1, 1) = "c" Then
    Channel.Limit = Replace(NewModes, "c ", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User.Nick & "!" & User.ID & " MODE " & Channel.Name & " +" & NewModes
    Next i
End If
'1 = Command, 2 = Nick, 3 = +/-, 4 = Modes, 5 = Channel
If SendLink Then SendLinks "ChanMode" & vbLf & User.Nick & vbLf & "+" & vbLf & Modes & vbLf & Channel.Name
End Sub

Public Function GetChanList(User As String)
Dim i As Long, Chan As clsChannel
For i = 1 To UBound(Channels)
    If Not Channels(i) Is Nothing Then
        GetChanList = GetChanList & ":" & ServerName & " 322 " & User & " " & Channels(i).Name & " " & Channels(i).All.Count & " :[+" & Channels(i).GetModes & "] " & Channels(i).Topic & vbCrLf
    End If
Next i
End Function

Public Sub InviteUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
If Not Channel.IsInvited3(Replace(Target, "*!", "")) Then
    Channel.Invites.Add Replace(Target, "*!", ""), Replace(Target, "*!", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " +I " & Target
    Next i
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "InviteUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub UnInviteUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
If Channel.IsInvited3(Replace(Target, "*!", "")) Then
    Channel.Invites.Remove Replace(Target, "*!", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " -I " & Target
    Next i
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "UnInviteUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub ExceptionUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
If Not Channel.IsException2(Replace(Target, "*!", "")) Then
    Channel.Exceptions.Add Replace(Target, "*!", ""), Replace(Target, "*!", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " +e " & Target
    Next i
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "ExceptUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub UnExceptionUser(Channel As clsChannel, Target As String, User As String, Optional SendLink As Boolean = True)
Dim i As Long
If Channel.IsException2(Replace(Target, "*!", "")) Then
    Channel.Exceptions.Remove Replace(Target, "*!", "")
    For i = 1 To Channel.All.Count
        SendWsock NickToObject(Channel.All(i)).Index, ":" & User & "!" & NickToObject(User).ID & " MODE " & Channel.Name & " -e " & Target
    Next i
End If
'1 = Command, 2 = Nick, 3 = Channel, 4 = Target
If SendLink Then SendLinks "UnExceptUser" & vbLf & User & vbLf & Channel.Name & vbLf & "" & vbLf & Target
End Sub

Public Sub AddUserMode(Index As Long, Modes As String, Optional Silent As Boolean = False, Optional SendLink As Boolean = True)
Dim NewModes As String
Modes = LCase(Modes)
Dim i As Long
For i = 1 To Len(Modes)
    Select Case Mid(Modes, i, 1)
        Case "s"
            If Not Users(Index).IsMode("s") Then
                NewModes = NewModes & "s"
                Users(Index).AddModes "s"
            End If
        Case "w"
            If Not Users(Index).IsMode("w") Then
                NewModes = NewModes & "w"
                Users(Index).AddModes "w"
            End If
    End Select
Next i
If Silent Then Exit Sub
If Not NewModes = "" Then
    SendWsock Index, ":" & Users(Index).Nick & " MODE " & Users(Index).Nick & " +" & NewModes
End If
'1 = Command, 2 = Nick, 3 = +/-, 4 = Modes
If SendLink Then SendLinks "ModeUser" & vbLf & Users(Index).Nick & vbLf & "+" & vbLf & Modes
End Sub

Public Sub RemoveUsermode(Index As Long, Modes As String, Optional Silent As Boolean = False, Optional SendLink As Boolean = True)
Dim NewModes As String
Modes = LCase(Modes)
Dim i As Long
For i = 1 To Len(Modes)
    Select Case Mid(Modes, i, 1)
        Case "s"
            If Users(Index).IsMode("s") Then
                NewModes = NewModes & "s"
                Users(Index).Modes.Remove "s"
            End If
        Case "w"
            If Users(Index).IsMode("w") Then
                NewModes = NewModes & "w"
                Users(Index).Modes.Remove "w"
            End If
        Case "a"
            If Users(Index).IsMode("a") Then
                NewModes = NewModes & "a"
                Users(Index).Modes.Remove "a"
                Users(Index).Away = False
                Users(Index).AwayMsg = ""
                SendWsock Index, ":" & ServerName & " 305 " & Users(Index).Nick & " :You are no longer marked as being away"
            End If
        Case "o"
            If Users(Index).IRCOp Then
                Users(Index).MsgsSent = 0
                SendSvrMsg Users(Index).Nick & " gave up his Operator status", True, ServerName
                NewModes = NewModes & "o"
                Users(Index).Modes.Remove "o"
                Users(Index).IRCOp = False
                Operators = Operators - 1
                Users(Index).DNS = Users(Index).RealDNS
                Users(Index).RealDNS = ""
                SendNotice "", "You are not an operator anymore", ServerName, , CInt(Index)
            End If
            Users(Index).IRCOp = False
    End Select
Next i
If Silent Then Exit Sub
If Not NewModes = "" Then
    SendWsock Index, ":" & Users(Index).Nick & " MODE " & Users(Index).Nick & " -" & NewModes
End If
'1 = Command, 2 = Nick, 3 = +/-, 4 = Modes
If SendLink Then SendLinks "ModeUser" & vbLf & Users(Index).Nick & vbLf & "-" & vbLf & Modes
End Sub
