Imports Microsoft.VisualBasic Public Class clsIRC #Region "About Information" 'IRC Class © 2005-2007 by Fabian Stern 'Website: http://www.smart-coding.com 'Please report any feedback to webmaster@smart-coding.com 'DO NOT REMOVE THIS ABOUT INFORMATION #End Region #Region "Local Variables" Dim myBuffer() As Byte 'Buffer zum Empfangen Dim mAskedForInfo As Boolean 'Frage nach eigener HOST-Adresse Dim mAskVHost As Boolean 'Frage nach der VHost-Adresse Dim UserFlags As New ArrayList 'Collection für alle Modes Dim FirstNick As String 'Der erste übermittelte Nickname Dim AlternativeTry As Boolean 'Angabenspeicher zur Information, ob Alternativnick genutzt wurde Dim myConv As Convert Dim myRegEx As Text.RegularExpressions.Regex #End Region #Region "Events" Public Event OnConnect() Public Event OnClose(ByVal sender As clsIRC) Public Event OnIncoming(ByVal myLine As String, ByVal myParam() As String, ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal sender As clsIRC) Public Event OnReceiveComplete(ByVal mBytes As Int32, ByVal myBuffer() As Byte, ByVal sender As clsIRC) Public Event OnReceiveBegin() Public Event OnSend(ByRef myText As String, ByVal DoThrottle As Boolean) Public Event OnReady(ByVal sender As clsIRC) Public Event OnJoin(ByVal myChan As String, ByVal myCI As Int32) Public Event OnJoinOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnPart(ByVal myChan As String, ByVal myCI As Int32) Public Event OnPartOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnKick(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myReason As String) Public Event OnKickOther(ByVal myChan As String, ByVal myCI As Int32, ByVal kNick As String, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myReason As String) Public Event OnQuitOther(ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myQuitMessage As String) Public Event OnNickChange(ByVal myOldNick As String, ByVal myNewNick As String) Public Event OnNickChangeOther(ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myNewNick As String) Public Event OnNickInUse(ByVal myNick As String) Public Event OnChanLimit(ByVal myChan As String) Public Event OnChanInvite(ByVal myChan As String) Public Event OnChanBanned(ByVal myChan As String) Public Event OnChanKey(ByVal myChan As String) Public Event OnTopic(ByVal myChan As String, ByVal myCI As Int32, ByVal myTopic As String, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnTopicGet(ByVal myChan As String, ByVal myCI As Int32, ByVal myTopic As String) Public Event OnReceivedUserList(ByVal myChan As String, ByVal myCI As Int32) Public Event OnGetInvited(ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myChan As String) Public Event OnVoice(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnDeVoice(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnNewHost(ByVal myOldHost As String, ByVal myNewHost As String) Public Event OnOp(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnDeOp(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnBan(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myBanMask As String) Public Event OnBanOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myBanMask As String) Public Event OnUnBan(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myBanMask As String) Public Event OnUnBanOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myBanMask As String) Public Event OnOpOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myOpNick As String) Public Event OnVoiceOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myVoiceNick As String) Public Event OnDeOpOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myOpNick As String) Public Event OnDeVoiceOther(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myVoiceNick As String) Public Event OnSetInvite(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnRemoveInvite(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetKey(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myKey As String) Public Event OnRemoveKey(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetModerated(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnRemoveModerated(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetNoColor(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnRemoveNoColor(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetSecret(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnRemoveSecret(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetPrivate(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnRemovePrivate(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSetLimit(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myLimit As String) Public Event OnRemoveLimit(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String) Public Event OnSingleMode(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myFlag As String, ByVal myParam As String) Public Event OnMode(ByVal myChan As String, ByVal myCI As Int32, ByVal uNick As String, ByVal uIdent As String, ByVal uHost As String, ByVal myFlags As String, ByVal myParams As String) #End Region #Region "Public Objects" Public mySock As Socket Public myEP As IPEndPoint Public Chans() As sChans 'Der Erste ArrayEintrag wird für eigene Modes reserviert Public sv As New sServer Public cl As New sClient("") Public ThrottleInterval As Int32 Public ThrottleList As New ArrayList Public WithEvents myThrottle As New Timers.Timer Public AutoNickChange As Boolean Public Mode As String Public StoredWelcome As String Public myID As Int32 = -1 Public hisID As Int32 = -1 #End Region #Region "Structures" Structure sServer Dim ChanModes As String Dim UserModes As String Dim RealChanModes As String Dim DualChanModes As String Dim MaxChannels As String Dim MaxBans As String Dim Nicklen As String Dim Topiclen As String Dim Kicklen As String Dim Awaylen As String Dim Prefix As String Dim PrefixChar As String Dim PrefixFlag As String End Structure Structure sChans Dim UserNick As Specialized.NameValueCollection Dim UserModes As Specialized.NameValueCollection Dim Channel As String Dim Modes As String Dim Topic As String Public Sub New(ByVal mChar As String) UserNick = New Specialized.NameValueCollection UserModes = New Specialized.NameValueCollection Channel = mChar Modes = mChar Topic = mChar End Sub End Structure Structure sClient Dim Nick As String Dim NickSuffix As String Dim AlternativeNick As String Dim Ident As String Dim Host As String Dim VHost As String Dim Info As String Dim BNCPass As String Dim Modes As String Dim ServerHost As String Dim ServerPort As Int32 Public Sub New(ByVal mChar As String) Nick = mChar NickSuffix = mChar AlternativeNick = mChar Ident = mChar Host = mChar VHost = mChar Info = mChar BNCPass = mChar Modes = mChar ServerHost = mChar ServerPort = 0 End Sub End Structure #End Region Public Sub ClearClient() With cl .BNCPass = "" .Host = "" .Ident = "" .Info = "" .VHost = "" .ServerHost = "" .ServerPort = 6667 .Nick = "" .AlternativeNick = "" .NickSuffix = "_" End With AlternativeTry = False AutoNickChange = False FirstNick = "" hisID = -1 myID = -1 End Sub Dim myThread As Threading.Thread Public Function DoConnect() As Boolean myEP = New IPEndPoint(Dns.Resolve(cl.ServerHost).AddressList(0), cl.ServerPort) mySock = New Socket(myEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp) Try 'Versuche zu verbinden mySock.Connect(myEP) Catch 'bei Fehler Return True 'gib wahr aus End Try ReDim Chans(100) Chans(0) = New sChans("") If cl.BNCPass.Length > 0 Then Send("PASS " & cl.BNCPass) 'BNCKennwort? Send("USER " & cl.Ident & " ""127.0.0.1"" """ & Dns.GetHostName() & """ :" & cl.Info) 'USER PATTERN Send("NICK " & cl.Nick) 'NICK PATTERN RaiseEvent OnConnect() 'sonst rufe OnConnect auf myThrottle.Interval = 1000 myThrottle.Start() 'Beginne zu Empfangen! myThread = New Threading.Thread(AddressOf Receive) myThread.Start() End Function Public Sub DoClose() Erase myBuffer 'Lösche den Buffer mySock.Shutdown(SocketShutdown.Both) mySock.Close() 'Schliesse das Socket mySock = Nothing 'Lösche das Socket myEP = Nothing 'Lösche den EndPoint RaiseEvent OnClose(Me) ClearClient() 'Entferne alle Client Infos myThread.Abort() End Sub 'Empfangen Public Sub Receive() Try If mySock.Poll(-1, SelectMode.SelectRead) Then If mySock.Available = 0 Then 'Console.WriteLine("Closed clsIRC Receive!") DoClose() Exit Sub End If End If RaiseEvent OnReceiveBegin() Dim myAvailable As Int32 = mySock.Available ReDim myBuffer(myAvailable - 1) mySock.BeginReceive(myBuffer, 0, myAvailable, SocketFlags.[Partial], New AsyncCallback(AddressOf _Receive), mySock) Catch 'Console.WriteLine("Closed clsIRC Catch Receive!") DoClose() Exit Sub End Try End Sub 'Empfangen ENDE Public Sub _Receive(ByVal ar As IAsyncResult) Dim mResult As Int32 = mySock.EndReceive(ar) Dim myString As String = Encoding.Default.GetString(myBuffer) DoParse(myString) RaiseEvent OnReceiveComplete(mResult, myBuffer, Me) Erase myBuffer Receive() End Sub Private Sub DoParse(ByVal myString As String) Static Last As String myString = Last & myString.Replace(Convert.ToChar(10), Convert.ToChar(13)) 'Unterstützung für Konformität von UNIX und WINDOWS If myString.EndsWith(Convert.ToChar(13) & Convert.ToChar(13)) Then 'Ist die Anweisung vollständig? Last = "" 'Leere den PreString Else Dim myLastGet() As String myLastGet = myString.Split(Convert.ToChar(13)) 'Teile nach IRC Anweisungen auf Last = myLastGet(myLastGet.GetUpperBound(0)) 'Setze den PreString Erase myLastGet 'myLastGet wird nicht mehr benötigt myString = myString.Substring(0, myString.Length - Last.Length) 'PreString abhacken End If Dim Zeilen() As String Zeilen = myString.Split(Convert.ToChar(13)) 'Alle Anweisungen durchgehen For I As Int32 = 0 To Zeilen.GetUpperBound(0) - 1 If Not Zeilen(I) = "" Then DoAssemble(Zeilen(I)) 'Bei Anweisung DoAssemblen Next End Sub Private Sub DoAssemble(ByVal myLine As String) Dim myParam() As String = Text.RegularExpressions.Regex.Split(myLine, " ") 'Anweisung in Parameter aufteilen Dim myChan As String = "" 'Channel leeren Dim myCI As Int32 = 0 'Chanindex auf 0 setzen (0 WIRD NIE BELEGT) Dim uNick As String = "", uIdent As String = "", uHost As String = "" If myParam.GetUpperBound(0) > 1 Then 'Channel und dazugehörigen ChanIndex ermitteln (öffentlich zugänglich) myChan = FormatChan(myParam(2)) myCI = GetChannel(myChan) End If If myParam(0).IndexOf("!") > 0 Then 'Nick, Ident und Host zuweisen uNick = myParam(0).Substring(1, myParam(0).IndexOf("!") - 1) uIdent = myParam(0).Substring(myParam(0).IndexOf("!") + 1, myParam(0).IndexOf("@") - myParam(0).IndexOf("!") - 1) uHost = myParam(0).Substring(myParam(0).IndexOf("@") + 1) Else uNick = FormatChan(myParam(0)) 'Das : vor dem Nick abhacken End If RaiseEvent OnIncoming(myLine, myParam, myChan, myCI, uNick, uIdent, uHost, Me) If myParam(0) = "PING" Then Send("PONG " & myParam(1)) 'Ping?Pong! If myParam.GetUpperBound(0) = 0 Then Exit Sub Select Case myParam(1) Case "004" 'USERMODES PARSEN UND ZU CHANMODES ADDEN If myParam.GetUpperBound(0) < 6 Then Exit Sub sv.UserModes = myParam(5) For I As Int32 = 0 To sv.UserModes.Length - 1 sv.ChanModes = sv.UserModes.Substring(I, 1) & "," & sv.ChanModes Next Case "005" 'SERVERSEITIGE OPTIONEN (CHANMODES, MAXCHANS, etc.) If myLine.IndexOf("CHANMODES=") > 0 Then sv.DualChanModes = Text.RegularExpressions.Regex.Split(myLine, "CHANMODES=")(1).Split(",")(0) sv.RealChanModes = Text.RegularExpressions.Regex.Split(myLine, "CHANMODES=" & sv.DualChanModes & ",")(1).Split(" ")(0) sv.ChanModes = Text.RegularExpressions.Regex.Split(myLine, "CHANMODES=")(1).Split(" ")(0) End If If myLine.IndexOf("PREFIX=") > 0 Then Dim myPre As String myPre = Text.RegularExpressions.Regex.Split(myLine, "PREFIX=\(")(1).Split(")")(0) For I As Int32 = 1 To myPre.Length sv.ChanModes = myPre.Substring(I - 1, 1) & "," & sv.ChanModes sv.Prefix = myPre.Substring(I - 1, 1) & "," & sv.Prefix Next myPre = "" 'Wird nicht mehr benötigt sv.PrefixFlag = Text.RegularExpressions.Regex.Split(myLine, "PREFIX=\(")(1).Split(")")(0) sv.PrefixChar = Text.RegularExpressions.Regex.Split(myLine, "PREFIX=\(" & sv.PrefixFlag & "\)")(1).Split(" ")(0) End If 'Standardwerte festlegen If sv.PrefixFlag = "" Then sv.PrefixFlag = "qaohv" If sv.PrefixChar = "" Then sv.PrefixChar = "!&@%+" If myLine.IndexOf("MAXCHANNELS=") > 0 Then sv.MaxChannels = Text.RegularExpressions.Regex.Split(myLine, "MAXCHANNELS=")(1).Split(" ")(0) ReDim Preserve Chans(sv.MaxChannels) 'ChannelArray anpassen! End If If myLine.IndexOf("MAXBANS=") > 0 Then sv.MaxBans = Text.RegularExpressions.Regex.Split(myLine, "MAXBANS=")(1).Split(" ")(0) End If If myLine.IndexOf("NICKLEN=") > 0 Then sv.Nicklen = Text.RegularExpressions.Regex.Split(myLine, "NICKLEN=")(1).Split(" ")(0) End If If myLine.IndexOf("TOPICLEN=") > 0 Then sv.Topiclen = Text.RegularExpressions.Regex.Split(myLine, "TOPICLEN=")(1).Split(" ")(0) End If If myLine.IndexOf("KICKLEN=") > 0 Then sv.Kicklen = Text.RegularExpressions.Regex.Split(myLine, "KICKLEN=")(1).Split(" ")(0) End If If myLine.IndexOf("AWAYLEN=") > 0 Then sv.Awaylen = Text.RegularExpressions.Regex.Split(myLine, "AWAYLEN=")(1).Split(" ")(0) End If Case "376", "422" ' END OF MOTD /// NO MOTD AVAILABLE If mAskedForInfo = False Then Send("USERHOST " & cl.Nick) Dim myCM As String = "" If Not sv.ChanModes = "" Then myCM = sv.ChanModes.Substring(0, sv.ChanModes.Length - sv.ChanModes.Split(",")(sv.ChanModes.Split(",").GetUpperBound(0)).Length) End If For I As Int32 = 0 To myCM.Length - 1 If Not myCM.Substring(I, 1) = "," Then sv.ChanModes = sv.ChanModes & myCM.Substring(I, 1) & "," End If Next myCM = "" 'sv_ChanModes2 wird nicht mehr gebraucht RaiseEvent OnReady(Me) Case "302" 'WHO REPLY If mAskedForInfo = False Then 'Die eigene Host schon ermittelt? If myLine.IndexOf("@") = -1 Then Exit Sub 'Host ermitteln cl.Host = Text.RegularExpressions.Regex.Split(myLine, "=+")(1).Split("@")(1).Trim 'Wenn die Host mit . endet, dann abschneiden If cl.Host.EndsWith(".") Then cl.Host = cl.Host.Substring(0, cl.Host.Length - 1) mAskedForInfo = True 'Die eigene Host schon ermittelt! End If Case "353" 'BEGIN OF NAMES If myParam.GetUpperBound(0) < 5 Then Exit Sub Dim tmpCI As Int32 tmpCI = GetChannel(myParam(4)) 'Channelindex ermitteln For I As Int32 = 5 To myParam.GetUpperBound(0) 'Alle User durchlaufen If Not myParam(I) = "" Then Dim myUMode As String If I = 5 Then myParam(I) = myParam(I).Substring(1) myUMode = TerminateFlag(myParam(I)) 'Userflag löschen 'User ohne Userflag adden Chans(tmpCI).UserNick.Add(myUMode, myUMode) 'Usermodes ermitteln und hinzufügen Chans(tmpCI).UserModes.Add(myUMode, GetUserChar(myParam(I))) End If Next Case "366" 'END OF NAMES Send("MODE " & myParam(3)) 'Channelmodes abfragen Case "332" 'TOPIC RECEIVED Dim tmpCI As Int32 = GetChannel(myParam(3)) 'Channelindex ermitteln Chans(tmpCI).Topic = myLine.Split(" ", 5)(4).Substring(1) 'TOPIC SETZEN RaiseEvent OnTopicGet(myParam(3), tmpCI, myLine.Split(" ", 5)(4).Substring(1)) Case "324" Dim tmpCI As Int32 = GetChannel(myParam(3)) 'Channelindex ermitteln If myParam.GetUpperBound(0) > 3 Then Chans(tmpCI).Modes = myParam(4) 'Modes für den Channel festlegen RaiseEvent OnReceivedUserList(myParam(3), tmpCI) Case "352" 'YOUR HOST HAS CHANGED If myParam.GetUpperBound(0) < 5 Then Exit Sub If mAskVHost = False And cl.VHost = "" Then cl.VHost = myParam(5) mAskVHost = True RaiseEvent OnNewHost(cl.Host, cl.VHost) End If Case "433", "432" 'NICK IN USE, ERRORNEOUS NICK If AutoNickChange = True Then If AlternativeTry = False Then If cl.AlternativeNick <> "" Then FirstNick = cl.Nick cl.Nick = cl.AlternativeNick Send("NICK " & cl.Nick) End If AlternativeTry = True Else If cl.Nick = cl.AlternativeNick Then cl.Nick = FirstNick cl.Nick &= cl.NickSuffix Send("NICK " & cl.Nick) End If Else cl.Nick = "" End If RaiseEvent OnNickInUse(myParam(3)) Case "471" : RaiseEvent OnChanLimit(myParam(3)) 'Cant join +l Case "473" : RaiseEvent OnChanInvite(myParam(3)) 'Cant join +i Case "474" : RaiseEvent OnChanBanned(myParam(3)) 'Cant join +b Case "475" : RaiseEvent OnChanKey(myParam(3)) 'Cant join +k Case "JOIN" If uNick = cl.Nick Then myCI = CreateNewChannel(myChan) 'Neuen Channel erstellen RaiseEvent OnJoin(myChan, myCI) Else If myParam.GetUpperBound(0) < 2 Then Exit Sub 'User mit neuem Mode H adden Chans(myCI).UserNick.Add(uNick, uNick) Chans(myCI).UserModes.Add(uNick, "H") RaiseEvent OnJoinOther(myChan, myCI, uNick, uIdent, uHost) End If Case "PART" If uNick = cl.Nick Then RaiseEvent OnPart(myChan, myCI) ClearChannel(myCI) 'Channel löschen Else RemoveUser(myCI, uNick) 'User vom Channel entfernen RaiseEvent OnPartOther(myChan, myCI, uNick, uIdent, uHost) End If Case "KICK" If myParam(3) = cl.Nick Then RaiseEvent OnKick(myChan, myCI, uNick, uIdent, uHost, myLine.Split(" ", 5)(4).Substring(1)) ClearChannel(myCI) 'Channel löschen Else RemoveUser(myCI, myParam(3)) 'User aus dem Channel löschen RaiseEvent OnKickOther(myChan, myCI, myParam(3), uNick, uIdent, uHost, myLine.Split(" ", 5)(4).Substring(1)) End If Case "QUIT" RemoveUserQuit(uNick) 'User aus ALLEN Channels löschen RaiseEvent OnQuitOther(uNick, uIdent, uHost, myLine.Split(" ", 3)(2).Substring(1)) Case "NICK" If uNick = cl.Nick Then cl.Nick = myChan 'Den Nicknamen aktualisieren UserNickChange(uNick, myChan) 'Usernick von ALLEN Channels ändern RaiseEvent OnNickChange(uNick, cl.Nick) Else UserNickChange(uNick, myChan) 'Usernick von ALLEN Channels ändern RaiseEvent OnNickChangeOther(uNick, uIdent, uHost, myChan) End If Case "TOPIC" Chans(myCI).Topic = myLine.Split(" ", 4)(3).Substring(1) 'TOPIC SETZEN RaiseEvent OnTopic(myChan, myCI, myLine.Split(" ", 4)(3).Substring(1), uNick, uIdent, uHost) Case "MODE" Dim tmpNick As String = "" 'Den TempNick leeren If myParam.GetUpperBound(0) > 3 Then tmpNick = myLine.Split(" ", 5)(4) 'Sind die Modes mit Parametern? If myParam.GetUpperBound(0) < 2 Then Exit Sub If myChan = cl.Nick Then 'Handelt es sich um mich selbst? For I As Int32 = 0 To myParam(3).Replace("+", "").Replace("-", "").Length tmpNick &= " " & cl.Nick 'Setze Parameter auf mich selbst Next tmpNick = tmpNick.Substring(1) End If If myParam.GetUpperBound(0) < 3 Then Exit Sub SplitFlags(myParam(3).Replace(":", ""), tmpNick) 'Nicks und Flags in UserFlags parsen Dim FlagNick, FlagFlag As String 'Nick und Flag Variablen For I As Int32 = 0 To UserFlags.Count - 1 FlagNick = Text.RegularExpressions.Regex.Split(UserFlags(I), " ")(0) If Convert.ToString(UserFlags(I)).IndexOf(" ") = -1 Then Exit Sub FlagFlag = Text.RegularExpressions.Regex.Split(UserFlags(I), " ")(1) If FlagNick = cl.Nick Then 'Modes an mich selbst Select Case FlagFlag Case "+v" RaiseEvent OnVoice(myChan, myCI, uNick, uIdent, uHost) Case "-v" RaiseEvent OnDeVoice(myChan, myCI, uNick, uIdent, uHost) Case "+o" RaiseEvent OnOp(myChan, myCI, uNick, uIdent, uHost) Case "-o" RaiseEvent OnDeOp(myChan, myCI, uNick, uIdent, uHost) Case "+x" If mAskVHost = False Then Send("who " & cl.Nick) End If Case "-x" mAskVHost = False cl.VHost = "" End Select Else 'Undefinierte Modes an mich selbst If myChan = cl.Nick Then Select Case FlagFlag.Substring(0, 1) Case "+" cl.Modes &= Right(FlagFlag, 1) Case "-" cl.Modes = cl.Modes.Replace(Right(FlagFlag, 1), "") End Select Else 'Modes an mich selbst und andere Select Case FlagFlag Case "+b" If cl.Nick.ToLower & "!" & cl.Ident.ToLower & "@" & cl.Host.ToLower Like FlagNick.ToLower Then RaiseEvent OnBan(myChan, myCI, uNick, uIdent, uHost, FlagNick) ElseIf cl.Nick.ToLower & "!" & cl.Ident.ToLower & "@" & cl.VHost.ToLower Like FlagNick.ToLower Then RaiseEvent OnBan(myChan, myCI, uNick, uIdent, uHost, FlagNick) Else RaiseEvent OnBanOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) End If Case "-b" If cl.Nick.ToLower & "!" & cl.Ident.ToLower & "@" & cl.Host.ToLower Like FlagNick.ToLower Then RaiseEvent OnUnBan(myChan, myCI, uNick, uIdent, uHost, FlagNick) ElseIf cl.Nick.ToLower & "!" & cl.Ident.ToLower & "@" & cl.VHost.ToLower Like FlagNick.ToLower Then RaiseEvent OnUnBan(myChan, myCI, uNick, uIdent, uHost, FlagNick) Else RaiseEvent OnUnBanOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) End If Case "+o" : RaiseEvent OnOpOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "-o" : RaiseEvent OnDeOpOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "+v" : RaiseEvent OnVoiceOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "-v" : RaiseEvent OnDeVoiceOther(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "+i" : RaiseEvent OnSetInvite(myChan, myCI, uNick, uIdent, uHost) Case "-i" : RaiseEvent OnRemoveInvite(myChan, myCI, uNick, uIdent, uHost) Case "+k" : RaiseEvent OnSetKey(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "-k" : RaiseEvent OnRemoveKey(myChan, myCI, uNick, uIdent, uHost) Case "+m" : RaiseEvent OnSetModerated(myChan, myCI, uNick, uIdent, uHost) Case "-m" : RaiseEvent OnRemoveModerated(myChan, myCI, uNick, uIdent, uHost) Case "+c" : RaiseEvent OnSetNoColor(myChan, myCI, uNick, uIdent, uHost) Case "-c" : RaiseEvent OnRemoveNoColor(myChan, myCI, uNick, uIdent, uHost) Case "+s" : RaiseEvent OnSetSecret(myChan, myCI, uNick, uIdent, uHost) Case "-s" : RaiseEvent OnRemoveSecret(myChan, myCI, uNick, uIdent, uHost) Case "+p" : RaiseEvent OnSetPrivate(myChan, myCI, uNick, uIdent, uHost) Case "-p" : RaiseEvent OnRemovePrivate(myChan, myCI, uNick, uIdent, uHost) Case "+l" : RaiseEvent OnSetLimit(myChan, myCI, uNick, uIdent, uHost, FlagNick) Case "-l" : RaiseEvent OnRemoveLimit(myChan, myCI, uNick, uIdent, uHost) End Select End If If sv.RealChanModes.IndexOf(Right(FlagFlag, 1)) > -1 Then If FlagFlag.StartsWith("+") Then If sv.ChanModes.IndexOf(Right(FlagFlag, 1) & ",") > -1 Then Chans(myCI).Modes = Chans(myCI).Modes.Replace(FlagFlag.Substring(1), "") End If Chans(myCI).Modes = Chans(myCI).Modes & FlagFlag.Substring(1) Else Chans(myCI).Modes = Chans(myCI).Modes.Replace(FlagFlag.Substring(1), "") End If End If End If If sv.Prefix.IndexOf(Right(FlagFlag, 1) & ",") > -1 And myChan.StartsWith("#") Then Dim tmpChan As String Try 'MODES DEN USERN ZUORDNEN If FlagFlag.StartsWith("+") Then tmpChan = Chans(myCI).UserModes(FlagNick) Chans(myCI).UserModes.Remove(FlagNick) Chans(myCI).UserModes.Add(FlagNick, tmpChan & Right(FlagFlag, 1)) tmpChan = Chans(myCI).UserNick(FlagNick) Chans(myCI).UserNick.Remove(FlagNick) Chans(myCI).UserNick.Add(FlagNick, tmpChan) Else tmpChan = Chans(myCI).UserModes(FlagNick).Replace(Right(FlagFlag, 1), "") Chans(myCI).UserModes.Remove(FlagNick) Chans(myCI).UserModes.Add(FlagNick, tmpChan) tmpChan = Chans(myCI).UserNick(FlagNick) Chans(myCI).UserNick.Remove(FlagNick) Chans(myCI).UserNick.Add(FlagNick, tmpChan) End If Catch End Try End If RaiseEvent OnSingleMode(myChan, myCI, uNick, uIdent, uHost, FlagFlag, FlagNick) 'Alle gesplitteten Modes einzeln verfügbar machen (Spart 1 Schleife) Next If myParam(3).StartsWith(":") Then myParam(3) = myParam(3).Substring(1) RaiseEvent OnMode(myChan, myCI, uNick, uIdent, uHost, myParam(3), tmpNick) Case "INVITE" If myParam(2) = cl.Nick Then RaiseEvent OnGetInvited(uNick, uIdent, uHost, myParam(3).Substring(1)) End Select End Sub Public Sub SplitFlags(ByVal Flags As String, ByVal Nicks As String, Optional ByVal Filter As String = "") Dim myChar As String = "", Operand As String = "", Users() As String Static Cnt As Int32 If Operand = "" Then Operand = "+" UserFlags = New ArrayList Users = Text.RegularExpressions.Regex.Split(Nicks, " ") Cnt = 0 For I As Int32 = 0 To Flags.Length - 1 myChar = Flags.Substring(I, 1) Select Case myChar Case "+" : Operand = "+" 'Setze MODE ADD Flag Operand Case "-" : Operand = "-" 'Setze MODE DEL Flag Operand Case Else If Users.GetUpperBound(0) < Cnt = True Then UserFlags.Add(" " & Operand & myChar) 'Mode mit Flag adden Else If Filter.ToLower = Users(Cnt).ToLower Then UserFlags.Add(Operand & myChar) Cnt = Cnt + 1 Else If sv.ChanModes.IndexOf(myChar & ",") > -1 Then UserFlags.Add(Users(Cnt) & " " & Operand & myChar) 'Mode mit Flag adden Cnt = Cnt + 1 Else UserFlags.Add(" " & Operand & myChar) 'Mode mit Flag adden End If End If End If End Select Next End Sub Public Function GetUserChar(ByVal flags As String) As String GetUserChar = "" For I As Int32 = 0 To sv.PrefixChar.Length - 1 Dim mChar As String = sv.PrefixChar.Substring(I, 1) For J As Int32 = 0 To flags.Length - 1 Dim nChar As String = flags.Substring(J, 1) If mChar = nChar Then GetUserChar &= sv.PrefixFlag.Substring(I, 1) End If Next Next If GetUserChar = "" Then GetUserChar = "H" End Function Public Function GetUserPrefix(ByVal Flaglist As String) As String For I As Int32 = 0 To sv.PrefixFlag.Length - 1 If Flaglist.IndexOf(sv.PrefixFlag.Substring(I, 1)) > -1 Then Return sv.PrefixChar.Substring(I, 1) End If Next End Function Public Function TerminateFlag(ByVal Nick As String) As String Dim I As Integer For I = 0 To sv.PrefixChar.Length - 1 If sv.PrefixChar.Substring(I, 1) = Nick.Substring(0, 1) Then Nick = Nick.Substring(1) End If Next Return Nick End Function Private Sub UserNickChange(ByRef NickName As String, ByRef NewNick As String) Dim tmpModes As String For ChanIndex As Int32 = 1 To Chans.GetUpperBound(0) If Chans(ChanIndex).Channel = Nothing Then Else If IsInsideList(Chans(ChanIndex).UserNick, NickName) Then tmpModes = Chans(ChanIndex).UserModes(NickName) Chans(ChanIndex).UserModes.Remove(NickName) Chans(ChanIndex).UserModes.Add(NewNick, tmpModes) Chans(ChanIndex).UserNick.Remove(NickName) Chans(ChanIndex).UserNick.Add(NewNick, NewNick) End If End If Next End Sub Private Function IsInsideList(ByVal Collection As Collections.Specialized.NameValueCollection, ByVal Value As String) As Boolean For I As Int32 = 0 To Collection.Count - 1 If Collection(I) = Value Then Return True Next End Function Private Sub RemoveUser(ByVal myCI As Int32, ByVal myNick As String) Chans(myCI).UserModes.Remove(myNick) Chans(myCI).UserNick.Remove(myNick) End Sub Private Function CreateNewChannel(ByVal myChan As String) As Int32 Try Dim I As Integer For I = 1 To Chans.GetUpperBound(0) If Chans(I).Channel Is Nothing Then Chans(I) = New sChans("") Chans(I).Channel = myChan Return I ElseIf Chans(I).Channel = "" Then Chans(I).Modes = "" Chans(I).Topic = "" Chans(I).Channel = myChan Chans(I).UserNick = New Specialized.NameValueCollection Chans(I).UserModes = New Specialized.NameValueCollection Return I End If Next Catch End Try End Function Private Sub ClearChannel(ByVal myCI As Int32) Chans(myCI).Channel = "" Chans(myCI).Topic = "" Chans(myCI).Modes = "" Chans(myCI).UserNick = New Specialized.NameValueCollection Chans(myCI).UserModes = New Specialized.NameValueCollection End Sub Private Sub RemoveUserQuit(ByVal myNick As String) For I As Int32 = 1 To Chans.GetUpperBound(0) If Chans(I).Channel = Nothing Then Exit Sub If IsInsideList(Chans(I).UserNick, myNick) Then Chans(I).UserNick.Remove(myNick) Chans(I).UserModes.Remove(myNick) End If Next End Sub Public Sub Say(ByVal myChan As String, ByVal myText As String, Optional ByVal DoThrottle As Boolean = False) If Not DoThrottle Then Send("PRIVMSG " & myChan & " :" & myText) Else ThrottleList.Add("PRIVMSG " & myChan & " :" & myText) End If End Sub Public Sub SayAll(ByVal myText As String, Optional ByVal DoThrottle As Boolean = False) For I As Int32 = 1 To Chans.GetUpperBound(0) If Not Chans(I).Channel = "" Then Say(Chans(I).Channel, myText, DoThrottle) End If Next End Sub Public Sub Notice(ByVal myChan As String, ByVal myText As String, Optional ByVal DoThrottle As Boolean = False) If Not DoThrottle Then Send("NOTICE " & myChan & " :" & myText) Else ThrottleList.Add("NOTICE " & myChan & " :" & myText) End If End Sub Public Sub NoticeAll(ByVal myText As String, Optional ByVal DoThrottle As Boolean = False) For I As Int32 = 1 To Chans.GetUpperBound(0) If Not Chans(I).Channel = "" Then Notice(Chans(I).Channel, myText, DoThrottle) End If Next End Sub Public Sub Send(ByRef myText As String, Optional ByVal DoThrottle As Boolean = False) 'Falls ein ungültiger Nick angegeben wurde, Nick setzen! (nur für connect) If myText.StartsWith("NICK ") Then If cl.Nick = "" Then cl.Nick = FormatChan(myText.Split(CType(" ", Char))(1)) myText &= Environment.NewLine 'IRC END-COMMAND Anhängen RaiseEvent OnSend(myText, DoThrottle) 'Text für Änderungen zugreifbar machen 'Wenn myText nicht leer ist, senden If Not myText = "" Then mySock.Send(Encoding.Default.GetBytes(myText), myText.Length, SocketFlags.None) End Sub Public Function GetChannel(ByVal myChan As String) As Int32 For I As Int32 = 1 To Chans.GetUpperBound(0) If Chans(I).Channel = Nothing Then Else If Chans(I).Channel.ToLower = myChan.ToLower Then Return I End If Next Return 0 End Function Public Function FormatChan(ByVal myChan As String) As String If myChan.StartsWith(":") Then myChan = myChan.Substring(1) Return myChan End Function Private Sub myThrottle_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles myThrottle.Elapsed Static myInterval As Int32 = 0 myInterval = myInterval + 1 If myInterval >= ThrottleInterval Then Dim Teile() As String Check: If ThrottleList.Count > 0 Then Teile = Convert.ToString(ThrottleList(0)).Split(" ") If MustThrottle(Teile) Then Send(ThrottleList(0), True) ThrottleList.RemoveAt(0) Else ThrottleList.RemoveAt(0) GoTo Check End If End If myInterval = 0 End If End Sub Private Function MustThrottle(ByVal Teile() As String) As Boolean If Teile.GetUpperBound(0) = -1 Then MustThrottle = True : Exit Function Select Case Teile(0).ToUpper Case "PRIVMSG", "NOTICE" If Teile.GetUpperBound(0) > 0 Then If Teile(1).Substring(0, 1) = "#" Then If GetChannel(Teile(1)) > 0 Then MustThrottle = True Else MustThrottle = True End If End If Case "INVITE" If Teile.GetUpperBound(0) > 1 Then If HasOP(Teile(2)) Then MustThrottle = True End If End If Case "KICK", "MODE", "TOPIC" If Teile.GetUpperBound(0) > 0 Then If Teile(1).StartsWith("#") Then If HasOP(Teile(1)) Then MustThrottle = True End If Else MustThrottle = True End If End If Case "JOIN", "PART" MustThrottle = True Case Else MustThrottle = True End Select End Function Public Function HasOP(ByVal Channel As String) As Boolean Dim myCI As Int32 = GetChannel(Channel) If myCI = 0 Then Return False For I As Int32 = 0 To Chans(myCI).UserModes.Count - 1 If Chans(myCI).UserNick(I) = cl.Nick Then If Chans(myCI).UserModes(I).IndexOf("o") > -1 Then Return True End If Next End Function Public Function HasVoice(ByVal Channel As String) As Boolean Dim myCI As Int32 = GetChannel(Channel) If myCI = 0 Then Return False For I As Int32 = 0 To Chans(myCI).UserModes.Count - 1 If Chans(myCI).UserNick(I) = cl.Nick Then If Chans(myCI).UserModes(I).IndexOf("v") > -1 Then Return True End If Next End Function Public Function Right(ByVal myString As String, ByVal myLength As Int32) As String Return myString.Substring(myString.Length - myLength) End Function Public Sub New() End Sub End Class