Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports ccirc.clsMain
- Imports ccirc.connections
- Imports ccirc.general.config.clsGetConfig
- Imports ccirc.general.logs.clsLog
- Imports ccirc.irc.clsResponse
- Imports ccirc.irc.clsUtils
- Imports ccirc.irc.clsRegisteredUser
- Imports ccirc.irc.clsRegisteredChannelCollection
- Imports ccirc.irc.clsAccess
- Imports System.Security.Cryptography
- Imports System.Timers
- Imports System.Text
- Imports System.Net.Sockets
- Imports System.Net
- Namespace irc
- Public Class clsUser
- Private Structure DataLine
- Dim Line As String
- Dim SourceServer As String
- End Structure
- #Region "Variables"
- Public UniqueID As String = String.Empty
- Public Nickname As String = String.Empty
- Public Username As String = String.Empty
- Public Password As String = String.Empty
- Public Host As String = String.Empty
- Public DNSLookup As String = String.Empty
- Public IP As String = String.Empty
- Public RealName As String = String.Empty
- Public NickservNicknameAttempt As String = String.Empty
- Public Server As String = String.Empty
- Public Away As String = String.Empty
- Public Authenticated As Boolean
- Public NicknameIsRegistered As Boolean
- Public LastMessageSent As Date
- Public SignonTime As Double
- Public BeingKilled As Boolean
- Public Webchat As Boolean
- Public RegisteredUser As Boolean
- Private WithEvents _objClient As clsClient
- Private WithEvents _objPing As clsPing
- Private _AccessList As New clsAccess
- Private _Oper As clsOper
- Private _InputBufferDelay As New Timer
- Private _InputBufferTime As DateTime
- Private _InputBufferLines As New ArrayList
- Private _InputBufferLength As Integer
- Private _RegisteredProtection As RegisteredProtectionType 'unused
- Private _OperType As clsOperCollection.OperType = clsOperCollection.OperType.NoOper
- Public _Channels As New ArrayList
- Private _NickChangeTime As Date
- #End Region
- #Region "Locks"
- Private _objClientLock As New Object
- Private _objPingLock As New Object
- Private _AccessListLock As New Object
- Private _OperLock As New Object
- Private _InputBufferLock As New Object
- Private _RegisteredUserLock As New Object
- Private _NicknameIsRegisteredLock As New Object
- Private _RegisteredProtectionLock As New Object
- Private _OperTypeLock As New Object
- Public _ChannelsLock As New Object
- Private _NickChangeTimeLock As New Object
- #End Region
- #Region "Properties"
- Public Property objClient() As clsClient
- Get
- SyncLock _objClientLock : Return _objClient : End SyncLock
- End Get
- Set(ByVal value As clsClient)
- SyncLock _objClientLock : _objClient = value : End SyncLock
- End Set
- End Property
- Public Property AccessList() As clsAccess
- Get
- SyncLock _AccessListLock : Return _AccessList : End SyncLock
- End Get
- Set(ByVal value As clsAccess)
- SyncLock _AccessListLock : _AccessList = value : End SyncLock
- End Set
- End Property
- Public Property Oper() As clsOper
- Get
- SyncLock _OperLock : Return _Oper : End SyncLock
- End Get
- Set(ByVal value As clsOper)
- SyncLock _OperLock : _Oper = value : End SyncLock
- End Set
- End Property
- Public Property RegisteredProtection() As RegisteredProtectionType
- Get
- SyncLock _RegisteredProtectionLock : Return _RegisteredProtection : End SyncLock
- End Get
- Set(ByVal value As RegisteredProtectionType)
- SyncLock _RegisteredProtectionLock : _RegisteredProtection = value : End SyncLock
- End Set
- End Property
- Public Property OperType() As clsOperCollection.OperType
- Get
- SyncLock _OperTypeLock : Return _OperType : End SyncLock
- End Get
- Set(ByVal value As clsOperCollection.OperType)
- SyncLock _OperTypeLock : _OperType = value : End SyncLock
- End Set
- End Property
- Public Property objPing() As clsPing
- Get
- SyncLock _objPingLock : Return _objPing : End SyncLock
- End Get
- Set(ByVal value As clsPing)
- SyncLock _objPingLock : _objPing = value : End SyncLock
- End Set
- End Property
- Public Property Channels() As ArrayList
- Get
- SyncLock _ChannelsLock : Return _Channels : End SyncLock
- End Get
- Set(ByVal value As ArrayList)
- SyncLock _ChannelsLock : _Channels = value : End SyncLock
- End Set
- End Property
- #End Region
- Public Sub New( _
- ByVal UserGuid As String, _
- Optional ByVal ServerConnectedTo As String = Nothing, _
- Optional ByVal Client As clsClient = Nothing _
- )
- UniqueID = UserGuid
- Server = ServerConnectedTo
- _InputBufferTime = Now().ToUniversalTime
- AddHandler _InputBufferDelay.Elapsed, AddressOf InputBufferDelay_Elapsed
- If Client Is Nothing Then
- Else
- _objClient = Client
- IP = Client.IP
- Host = GetMD5Hash(String.Concat(IP, "3jr8u9wwrwrtesaf'[]'safs"))
- DNSLookup = clsUserCollection.GetDNSCache(IP)
- If String.IsNullOrEmpty(DNSLookup) Then
- DNSLookup = Dns.GetHostEntry(IP).HostName
- clsUserCollection.AddToDNSCache(IP, DNSLookup)
- End If
- End If
- SignonTime = DateToUnix(Now)
- _objPing = New clsPing(Client)
- End Sub
- Private Function GetMD5Hash(ByVal input As String) As String
- Dim x As New System.Security.Cryptography.MD5CryptoServiceProvider()
- Dim bs As Byte() = System.Text.Encoding.UTF8.GetBytes(input)
- bs = x.ComputeHash(bs)
- Dim s As New System.Text.StringBuilder()
- For Each b As Byte In bs
- s.Append(b.ToString("x2").ToLower())
- Next
- Dim password As String = s.ToString()
- Return password
- End Function
- Public Sub SendCommonUsers(ByVal Data As String)
- If _Channels.Count Then
- Dim htCommonUsers As Hashtable = CommonUsers()
- For Each CommonUser As DictionaryEntry In htCommonUsers
- Dim objUser As clsUser = CommonUser.Value
- If objUser IsNot Me Then
- objUser.Send(Data)
- End If
- Next
- End If
- End Sub
- Public Sub Send(ByVal Data As StringBuilder, Optional ByVal Replicate As Boolean = False, Optional ByVal SendToServer As Boolean = False)
- If Server = clsServerCollection.LocalServer.Name Then
- If objClient IsNot Nothing Then
- objClient.Send(Data.ToString)
- End If
- End If
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- If Replicate Then
- 'send to Leafs
- clsServerCollection.Replicate(String.Concat(Data.ToString, vbCrLf))
- ElseIf SendToServer AndAlso Server <> clsServerCollection.LocalServer.Name Then
- Dim objServer As clsServer = clsServerCollection.Servers(Server)
- objServer.Send(String.Concat(Data.ToString, vbCrLf))
- End If
- End If
- End Sub
- Public Sub Send(ByVal Data As String, Optional ByVal Replicate As Boolean = False, Optional ByVal SendToServer As Boolean = False)
- If Not Webchat Then
- Data = clsUtils.StripWebchatFont(Data)
- End If
- If Server = clsServerCollection.LocalServer.Name Then
- If objClient IsNot Nothing Then
- objClient.Send(String.Concat(Data, vbCrLf))
- End If
- End If
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- If Replicate Then
- 'send to Leafs
- clsServerCollection.Replicate(String.Concat(">", UniqueID, " ", Data, vbCrLf))
- ElseIf SendToServer AndAlso Server <> clsServerCollection.LocalServer.Name Then
- Dim objServer As clsServer = clsServerCollection.Servers(Server)
- objServer.Send(String.Concat(">", UniqueID, " ", Data, vbCrLf))
- End If
- End If
- End Sub
- Public Sub Authenticate()
- Dim MatchedEntry As New clsAccessEntry
- If clsServerCollection.LocalServer.AccessList.EntryCheck(Me, True, MatchedEntry) = EntryResponse.Denied Then
- Dim strReason As String = String.Empty
- If Not String.IsNullOrEmpty(MatchedEntry.Info) Then
- strReason = String.Concat(" (", MatchedEntry.Info, ")")
- End If
- Send(String.Concat( _
- ":", clsServerCollection.LocalServer.Name, " NOTICE ", Nickname, " :You are banned from ", Server, strReason, " Email ", ConfigSetting("adminEmail"), " for more information.", vbCrLf, _
- "ERROR :Closing Link: ", Nickname, "[", DNSLookup, "] (User is banned", strReason, ")"))
- Disconnected(QuitMessage:=strReason, Replicate:=True, DisplayQuit:=False)
- ElseIf clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- clsUserCollection.AuthenticateUser(Me)
- Authenticated = True
- Dim sb As New StringBuilder
- Dim blnNicknameIsRegistered As Boolean = NicknameIsRegistered
- Dim protRegisteredProtection As RegisteredProtectionType = _RegisteredProtection
- If blnNicknameIsRegistered Then
- Select Case protRegisteredProtection
- Case RegisteredProtectionType.MustIdentify
- 'set the Nickname to a Guest until the user identifies...
- NickservNicknameAttempt = Nickname
- Nickname = "Temp" & Guid.NewGuid.ToString.Substring(0, 6)
- clsUserCollection.NicknameChange(Me, NickservNicknameAttempt, Nickname)
- Case RegisteredProtectionType.MustIdentifyAfterDelay
- 'allow the Nickname, but force it to a Guest after a certain delay...
- Case RegisteredProtectionType.NoProtection
- 'no protection, so do nothing...
- End Select
- End If
- If Server = clsServerCollection.LocalServer.Name Then
- SendInitialMessages(sb)
- Else
- sb.Append(String.Concat("<", UniqueID, " AUTHUSER ", Nickname, " ", Username, " ", Host, " ", RealName, vbCrLf))
- End If
- If blnNicknameIsRegistered Then
- NickServInit(sb)
- End If
- Send(sb, Replicate:=True)
- Else
- Authenticated = True
- End If
- End Sub
- Public Sub SendInitialMessages(ByRef sb As StringBuilder)
- Dim strFullAddress As String = FullAddress()
- Dim RPL_WELCOME As IRCResponse = GetIRCResponse("RPL_WELCOME", _
- Nickname:=Nickname, _
- ServerDesc:=ConfigSetting("description"), _
- FullAddress:=strFullAddress)
- Dim RPL_YOURHOST As IRCResponse = GetIRCResponse("RPL_YOURHOST", _
- Nickname:=Nickname, _
- Server:=Server, _
- Version:=IRCVersion)
- Dim RPL_CREATED As IRCResponse = GetIRCResponse("RPL_CREATED", _
- Nickname:=Nickname, _
- _Date:=clsMain.CreatedDateTime)
- Dim RPL_MYINFO As IRCResponse = GetIRCResponse("RPL_MYINFO", _
- Nickname:=Nickname, _
- Server:=Server, _
- Version:=IRCVersion, _
- UserModes:="io", _
- ChanModes:="kflpsmntuirx")
- Dim RPL_ISUPPORT1 As IRCResponse = GetIRCResponse("RPL_ISUPPORT1", _
- Nickname:=Nickname, _
- maxChannelsPerUser:=ConfigSetting("maxChannelsPerUser"), _
- MaxNickLength:=ConfigSetting("maxNicknameLength"), _
- MaxChanLength:=ConfigSetting("maxChannelLength"), _
- MaxTopicLength:=ConfigSetting("maxTopicLength"), _
- MaxKickLength:=ConfigSetting("maxKickLength"), _
- MaxAwayLength:=ConfigSetting("maxAwayLength"))
- Dim RPL_ISUPPORT2 As IRCResponse = GetIRCResponse("RPL_ISUPPORT2", _
- Nickname:=Nickname, _
- Server:=Server, _
- ChanTypes:="&#", _
- ChanModes:="kflpsmntuirx", _
- UserModes:="io", _
- UserPrefixes:="(qov).@+")
- Dim RPL_LUSERCLIENT As IRCResponse = GetIRCResponse("RPL_LUSERCLIENT", _
- Nickname:=Nickname, _
- UserCount:=clsUserCollection.Users.Count, _
- InvisibleUserCount:="0", _
- UserModes:="io", _
- ServersCount:=clsServerCollection.Servers.Count)
- Dim strPrepend As String = String.Empty
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub AndAlso Server <> clsServerCollection.LocalServer.Name Then
- strPrepend = String.Concat(">", UniqueID, " ")
- 'sb.Append(String.Concat("<", UniqueID, " AUTHUSER ", Nickname, " ", Username, " ", Host, " ", RealName, vbCrLf))
- End If
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_WELCOME.Numeric, " ", RPL_WELCOME.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_YOURHOST.Numeric, " ", RPL_YOURHOST.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_CREATED.Numeric, " ", RPL_CREATED.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_MYINFO.Numeric, " ", RPL_MYINFO.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_ISUPPORT1.Numeric, " ", RPL_ISUPPORT1.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_ISUPPORT2.Numeric, " ", RPL_ISUPPORT2.Format, vbCrLf))
- sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_LUSERCLIENT.Numeric, " ", RPL_LUSERCLIENT.Format, vbCrLf))
- 'MOTD
- Dim ERR_NOMOTD As IRCResponse = GetIRCResponse("ERR_NOMOTD", Nickname:=Nickname)
- sb.Append(String.Concat(strPrepend, ":", Server, " ", ERR_NOMOTD.Numeric, " ", ERR_NOMOTD.Format, vbCrLf))
- End Sub
- Private Function NickServInit(ByRef sb As StringBuilder) As String
- Dim strPrepend As String = String.Empty
- Dim strNickname As String = Nickname
- If sb Is Nothing Then sb = New StringBuilder
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub AndAlso Server <> clsServerCollection.LocalServer.Name Then
- strPrepend = String.Concat(">", UniqueID, " ")
- End If
- 'display nickserv message "this nickname is regsitered etc"
- sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :The nickname ", Chr(2), NickservNicknameAttempt, Chr(2), " is registered and protected.", vbCrLf))
- Select Case RegisteredProtection
- Case RegisteredProtectionType.MustIdentify
- 'set the nickname to a Guest until the user identifies...
- sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :Your nickname has been changed to ", Chr(2), strNickname, Chr(2), " while you identify yourself.", vbCrLf))
- Case RegisteredProtectionType.MustIdentifyAfterDelay
- 'allow the nickname, but force it to a Guest after a certain delay...
- sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :You have ", ConfigSetting("changeNicknameDelay"), " seconds to identify.", vbCrLf))
- Case RegisteredProtectionType.NoProtection
- 'no protection, so do nothing...
- End Select
- sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :If it is your nickname, type ", Chr(2), "/nickserv identify ", Chr(31), "password", Chr(31), Chr(2), vbCrLf))
- sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :Otherwise please change your nickname now.", vbCrLf))
- Return sb.ToString
- End Function
- Public Function FullAddress() As String
- If Not RegisteredUser AndAlso Oper Is Nothing Then
- Return Nickname & "!~" & Username & "@" & Host
- Else
- Return Nickname & "!" & Username & "@" & Host
- End If
- End Function
- Public Function FullAddressIP() As String
- If Not RegisteredUser AndAlso Oper Is Nothing Then
- Return Nickname & "!~" & Username & "@" & IP
- Else
- Return Nickname & "!" & Username & "@" & IP
- End If
- End Function
- Public Function FullWhoAddress() As String
- If Not RegisteredUser AndAlso Oper Is Nothing Then
- Return String.Concat("~", Username, " ", Host)
- Else
- Return String.Concat(Username, " ", Host)
- End If
- End Function
- Public Sub Disconnected(Optional ByVal QuitMessage As String = Nothing, Optional ByVal Replicate As Boolean = False, Optional ByVal DisplayQuit As Boolean = True)
- On Error Resume Next
- If DisplayQuit Then
- If QuitMessage Is Nothing Then QuitMessage = String.Empty
- QuitMessage = QuitMessage.Trim
- ' If QuitMessage = ":" Then QuitMessage = String.Empty
- If QuitMessage.StartsWith(":") Then QuitMessage = QuitMessage.Substring(1)
- If QuitMessage Is String.Empty Then
- QuitMessage = "Connection reset by peer"
- End If
- If QuitMessage IsNot Nothing AndAlso QuitMessage.Trim.Length Then
- If Channels.Count Then
- Dim htCommonUsers As Hashtable = CommonUsers()
- For Each User As DictionaryEntry In htCommonUsers
- Dim objUser As clsUser = User.Value
- If objUser IsNot Me Then
- objUser.Send(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
- End If
- Next
- End If
- Send(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
- End If
- End If
- SyncLock _ChannelsLock
- For i As Integer = _Channels.Count - 1 To 0 Step -1
- Dim Channel As clsChannel = _Channels(i)
- If Channel IsNot Nothing Then
- Channel.RemoveUser(Me)
- If DisplayQuit Then
- Channel.AddToRecentHistory(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
- End If
- _Channels.Remove(Channel)
- End If
- Next
- End SyncLock
- If objClient IsNot Nothing Then
- objClient.Dispose()
- End If
- clsUserCollection.Remove(Me)
- Destroy()
- If Replicate Then
- clsServerCollection.Replicate(String.Concat("<", UniqueID, " QUIT ", QuitMessage, vbCrLf))
- End If
- End Sub
- Public Sub Destroy()
- Try
- If _objClient IsNot Nothing Then
- If _objClient.sckClient IsNot Nothing Then
- _objClient.sckClient.Close()
- _objClient.sckClient = Nothing
- End If
- _objClient = Nothing
- End If
- SyncLock _InputBufferLock
- _InputBufferLines.Clear()
- _InputBufferDelay.Enabled = False
- _InputBufferDelay = Nothing
- End SyncLock
- SyncLock _objPingLock
- _objPing.Dispose()
- _objPing = Nothing
- End SyncLock
- Catch ex As Exception
- End Try
- End Sub
- Public Function ChangeNickname( _
- ByVal User As clsUser, _
- ByVal NewNickname As String, _
- Optional ByVal SendErrorToUser As Boolean = True, _
- Optional ByVal Force As Boolean = False _
- ) As Boolean
- If NewNickname = User.Nickname Then
- Return True
- End If
- Dim blnAlreadyExists As Boolean = False
- Dim strOldNickname As String = Nickname
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- 'If Channel.NicknameFound(NewNickname) Then
- Dim objUser As clsChannelUser = Channel.Users(NewNickname.ToLower)
- If objUser IsNot Nothing AndAlso Not objUser.User Is User Then
- blnAlreadyExists = True
- Exit For
- End If
- Next
- End SyncLock
- If blnAlreadyExists Then
- If SendErrorToUser AndAlso clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- Dim ERR_NICKNAMEINUSE As IRCResponse = GetIRCResponse("ERR_NICKNAMEINUSE", Nickname:=NewNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKNAMEINUSE.Numeric, " ", ERR_NICKNAMEINUSE.Format), Replicate:=True)
- End If
- Return False
- Else
- 'Dim objRegisteredUser As clsRegisteredUser = Nothing
- Dim blnNicknameIsRegistered As Boolean
- If Not Force Then
- 'objRegisteredUser = clsRegisteredUserCollection.Users(NewNickname.ToLower)
- 'If objRegisteredUser IsNot Nothing AndAlso objRegisteredUser IsNot RegisteredUser Then
- blnNicknameIsRegistered = clsRegisteredUserCollection.IsNicknameRegistered(Me, NewNickname)
- If blnNicknameIsRegistered Then
- NicknameIsRegistered = True
- RegisteredProtection = RegisteredProtectionType.MustIdentify
- If RegisteredProtection = RegisteredProtectionType.MustIdentify Then
- NickservNicknameAttempt = NewNickname
- NewNickname = "Temp" & Guid.NewGuid.ToString.Substring(0, 6)
- End If
- 'Else
- 'objRegisteredUser = Nothing
- End If
- End If
- SyncLock _ChannelsLock
- 'send NICK message to all "common" users
- If _Channels.Count Then
- Dim htCommonUsers As Hashtable = CommonUsers()
- For Each CommonUser As DictionaryEntry In htCommonUsers
- Dim objUser As clsUser = CommonUser.Value
- If objUser IsNot Me Then
- objUser.Send(String.Concat(":", FullAddress(), " NICK :", NewNickname))
- End If
- Next
- End If
- 'now send NICK message to self
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- Send(String.Concat(":", FullAddress(), " NICK :", NewNickname), Replicate:=True)
- End If
- For Each Channel As clsChannel In _Channels
- Channel.NicknameChange(Me, strOldNickname, NewNickname)
- Next
- End SyncLock
- Nickname = NewNickname
- clsUserCollection.NicknameChange(Me, strOldNickname, NewNickname)
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- Dim sbReplicate As New StringBuilder
- If Not Force Then
- If Not blnNicknameIsRegistered Then
- Me.RegisteredProtection = Nothing
- Me.RegisteredUser = Nothing
- Else
- NickServInit(sbReplicate)
- End If
- Send(sbReplicate.ToString, False)
- End If
- sbReplicate.Append(String.Concat("<", UniqueID, " NICK ", NewNickname, vbCrLf))
- clsServerCollection.Replicate(sbReplicate.ToString)
- 'Return False
- End If
- Return True
- End If
- End Function
- Public Function CommonUsers() As Hashtable
- Dim ht As New Hashtable
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- Channel.FillUniqueUsers(ht)
- Next
- End SyncLock
- Return ht
- End Function
- Public Function CommonUser(ByVal Nickname As String) As clsUser
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- Dim objChannelUser As clsChannelUser = Channel.Users(Nickname.ToLower)
- If objChannelUser IsNot Nothing Then
- Return objChannelUser.User
- End If
- Next
- End SyncLock
- Return Nothing
- End Function
- Private Sub InputBufferDelay_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
- Try
- SyncLock _InputBufferLock
- If _InputBufferLines.Count Then
- Dim objDataLine As DataLine = _InputBufferLines(0)
- DataReceived(objDataLine.Line, objDataLine.SourceServer, FromBuffer:=True)
- _InputBufferLength -= objDataLine.Line.Length
- _InputBufferLines.RemoveAt(0)
- If _InputBufferLines.Count = 0 Then
- _InputBufferLength = 0
- _InputBufferDelay.Enabled = False
- End If
- Else
- _InputBufferLength = 0
- _InputBufferDelay.Enabled = False
- End If
- End SyncLock
- Catch ex As Exception
- End Try
- End Sub
- Public Sub DataReceived(ByVal Line As String, ByVal SourceServer As String, Optional ByVal FromBuffer As Boolean = False)
- Try
- If BeingKilled Then Exit Sub
- If ConfigSetting("debug") = "1" Then OutputToLog(String.Concat("DATA: ", FullAddressIP, " ", Line))
- If SourceServer = clsServerCollection.LocalServer.Name Then
- 'perform Flood control on local clients
- 'from RFC 2813:
- '* check to see if client's 'message timer' is less than current time
- ' (set to be equal if it is);
- '* read any data present from the client;
- '* while the timer is less than ten (10) seconds ahead of the current
- ' time, parse any present messages and penalize the client by two (2)
- ' seconds for each message;
- '* additional penalties MAY be used for specific commands which
- ' generate a lot of traffic across the network.
- 'This in essence means that the client may send one (1) message every
- 'two (2) seconds without being adversely affected. Services MAY also
- 'be subject to this mechanism.
- If Not FromBuffer AndAlso Oper Is Nothing AndAlso Not Line.ToUpper.StartsWith("QUIT") Then
- SyncLock _InputBufferLock
- Dim dtNow As Date = Now().ToUniversalTime
- If _InputBufferTime < dtNow Then
- _InputBufferTime = dtNow
- End If
- If _InputBufferLines.Count = 0 AndAlso DateDiff(DateInterval.Second, dtNow, _InputBufferTime) < 10 Then
- Dim intPenality As Integer = 1 + (Line.Length) / 100
- _InputBufferTime = DateAdd(DateInterval.Second, intPenality, _InputBufferTime)
- ElseIf _InputBufferLines.Count <= ConfigSetting("maxInputBufferLines") AndAlso _InputBufferLength <= ConfigSetting("maxInputBufferLength") Then
- 'add to buffer
- Dim objDateLine As New DataLine
- objDateLine.Line = Line
- objDateLine.SourceServer = SourceServer
- _InputBufferLength += Line.Length
- _InputBufferLines.Add(objDateLine)
- If Not _InputBufferDelay.Enabled Then
- _InputBufferDelay.Interval = ConfigSetting("processBufferDelay")
- _InputBufferDelay.AutoReset = True
- _InputBufferDelay.Enabled = True
- End If
- Exit Sub
- Else
- 'buffer full; user has flooded
- Disconnected("Input flooding", Replicate:=True)
- Exit Sub
- End If
- End SyncLock
- End If
- End If
- _objPing.Pong() 'reset ping upon ANY data being sent
- Dim Words() As String = Split(Line, " ")
- Dim blnError As Boolean = False
- Dim strWord0 As String = Words(0).ToUpper
- Select Case strWord0
- Case "PING"
- If Words.Length > 1 Then
- Send(String.Concat(":", clsMain.IRCServer, " PONG ", clsMain.IRCServer, " :", Words(1)))
- Else
- Dim ERR_NOORIGIN As IRCResponse = GetIRCResponse("ERR_NOORIGIN", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOORIGIN.Numeric, " ", ERR_NOORIGIN.Format))
- End If
- Case "PONG"
- Case Else
- LastMessageSent = Now.ToUniversalTime
- Select Case strWord0
- Case "WEBIRC"
- If Words.Length = 5 Then
- If clsCGIIRCCollection.CGIIRCLogin(IP, Words(1)) Then
- IP = Words(3)
- Host = GetMD5Hash(String.Concat(IP, "3jr8u9wwrwrtesaf'[]'safs"))
- Dim MatchedEntry As New clsAccessEntry
- If clsServerCollection.LocalServer.AccessList.EntryCheck(IP, True, MatchedEntry) = EntryResponse.Denied Then
- Dim strReason As String = String.Empty
- If Not String.IsNullOrEmpty(MatchedEntry.Info) Then
- strReason = String.Concat(" (", MatchedEntry.Info, ")")
- End If
- Send(String.Concat( _
- ":", clsServerCollection.LocalServer.Name, " NOTICE ", Nickname, " :You are banned from ", Server, strReason, " Email ", ConfigSetting("adminEmail"), " for more information.", vbCrLf, _
- "ERROR :Closing Link: ", Nickname, "[", DNSLookup, "] (User is banned", strReason, ")"))
- Disconnected(QuitMessage:=strReason, Replicate:=True, DisplayQuit:=False)
- Else
- Webchat = True
- DNSLookup = clsUserCollection.GetDNSCache(IP)
- If String.IsNullOrEmpty(DNSLookup) Then
- DNSLookup = Dns.GetHostEntry(IP).HostName
- clsUserCollection.AddToDNSCache(IP, DNSLookup)
- End If
- End If
- End If
- End If
- Case "NICK"
- If Words.Length > 1 Then
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
- Dim strNickname As String = RemoveColon(Words(1))
- If clsUserCollection.ValidNickname(strNickname) Then
- If Not Authenticated Then Nickname = RemoveColon(Words(1))
- If Not String.IsNullOrEmpty(Username) Then
- If Authenticated Then
- 'already authenticated, so change this user's nickname...
- If Oper Is Nothing Then
- SyncLock _NickChangeTimeLock
- Dim dtNow As Date = Now().ToUniversalTime
- If _NickChangeTime < dtNow Then
- _NickChangeTime = DateAdd(DateInterval.Second, ConfigSetting("nicknameChangeDelay"), dtNow)
- Else
- Dim ERR_NICKTOOFAST As IRCResponse = GetIRCResponse("ERR_NICKTOOFAST", Nickname:=strNickname, Info:=DateDiff(DateInterval.Second, dtNow, _NickChangeTime) + 1)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKTOOFAST.Numeric, " ", ERR_NICKTOOFAST.Format), Replicate:=True)
- blnError = True
- Exit Sub
- End If
- End SyncLock
- ElseIf Oper.Type <> clsOperCollection.OperType.Admin Then
- 'do NOT allow bots/sysops/guides to change their nickname
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=strNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format), Replicate:=True)
- blnError = True
- Exit Sub
- End If
- blnError = Not ChangeNickname(Me, strNickname)
- Else
- 'not yet authenticated, so authenticate this user...
- Authenticate()
- If Not String.IsNullOrEmpty(Password) Then
- DataReceived(String.Concat("OPER ", Username, " ", Password), SourceServer)
- End If
- End If
- End If
- Else
- Dim ERR_ERRONEOUSNICKNAME As IRCResponse = GetIRCResponse("ERR_ERRONEOUSNICKNAME", Nickname:=strNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_ERRONEOUSNICKNAME.Numeric, " ", ERR_ERRONEOUSNICKNAME.Format), Replicate:=True)
- blnError = True
- End If
- End If
- End If
- Case "PASS"
- If Words.Length > 1 Then
- If Not Authenticated Then
- Password = Words(1)
- End If
- End If
- Case "USER"
- If Words.Length > 1 Then
- If Not Authenticated Then
- Username = Words(1)
- RealName = RemoveColon(WordRange(Words, 4))
- If Server = clsServerCollection.LocalServer.Name Then
- Line = String.Concat("USER", " ", Words(1), " ", Host, " ", clsServerCollection.LocalServer.Name, " :", RealName)
- Else
- Host = Words(2)
- End If
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
- 'If Not String.IsNullOrEmpty(Nickname) AndAlso Server = clsServerCollection.LocalServer.Name Then
- If Not String.IsNullOrEmpty(Nickname) Then
- Authenticate()
- If Not String.IsNullOrEmpty(Password) Then
- DataReceived(String.Concat("OPER ", Username, " ", Password), SourceServer)
- End If
- End If
- End If
- End If
- End If
- Case Else
- If Not Authenticated Then
- 'not authenticated yet; return error
- Dim ERR_NOTREGISTERED As IRCResponse = GetIRCResponse("ERR_NOTREGISTERED")
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTREGISTERED.Numeric, " ", ERR_NOTREGISTERED.Format))
- blnError = True
- Else
- Select Case strWord0
- Case "IRCX"
- Send(String.Concat(":", clsMain.IRCServer, " 800 ", Nickname, " 1 0 ANON 512 *"))
- Case "QUIT"
- Disconnected(WordRange(Words, 1))
- Case "JOIN"
- If Words.Length > 1 Then
- Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
- Dim strKey As String = Nothing
- If Words.Count > 2 Then
- strKey = Words(2)
- End If
- For Each Channel As String In strChannels
- clsChannelCollection.Join(Me, Channel, strKey)
- Next
- End If
- Case "PART"
- If Words.Length > 1 Then
- Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
- For Each Channel As String In strChannels
- clsChannelCollection.Part(Me, Channel)
- Next
- End If
- Case "AWAY"
- If Words.Length > 1 Then
- Dim strReason As String = RemoveColon(WordRange(Words, 1))
- Dim RPL_USERNOWAWAY As IRCResponse = GetIRCResponse("RPL_USERNOWAWAY", Info:=strReason)
- SendCommonUsers(String.Concat(":", FullAddress, " ", RPL_USERNOWAWAY.Numeric, " ", RPL_USERNOWAWAY.Format))
- Dim RPL_NOWAWAY As IRCResponse = GetIRCResponse("RPL_NOWAWAY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_NOWAWAY.Numeric, " ", RPL_NOWAWAY.Format))
- Away = strReason
- Else
- Dim RPL_USERUNAWAY As IRCResponse = GetIRCResponse("RPL_USERUNAWAY")
- SendCommonUsers(String.Concat(":", FullAddress, " ", RPL_USERUNAWAY.Numeric, " ", RPL_USERUNAWAY.Format))
- Dim RPL_UNAWAY As IRCResponse = GetIRCResponse("RPL_UNAWAY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_UNAWAY.Numeric, " ", RPL_UNAWAY.Format))
- Away = String.Empty
- End If
- Case "WHO"
- If Words.Length > 1 Then
- Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
- For Each Target As String In strTargets
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
- If objChannel Is Nothing Then
- Dim arrUsers As ArrayList = clsUserCollection.FindByExpression(Target.ToLower, SearchRealName:=True)
- Dim sb As New StringBuilder
- If arrUsers IsNot Nothing AndAlso arrUsers.Count Then
- For Each TargetUser As clsUser In arrUsers
- If TargetUser.Channels.Count Then
- Dim objFirstChannel As clsChannel = TargetUser.Channels(0)
- Dim objTargetChannelUser As clsChannelUser = objFirstChannel.Users(TargetUser.Nickname.ToLower)
- Dim RPL_WHOREPLY As IRCResponse = GetIRCResponse("RPL_WHOREPLY", Channel:=objFirstChannel.Name, Nickname:=TargetUser.Nickname, Info:=objFirstChannel.WhoLine(objTargetChannelUser))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOREPLY.Numeric, " ", RPL_WHOREPLY.Format, vbCrLf))
- Else
- Dim RPL_WHOREPLY As IRCResponse = GetIRCResponse("RPL_WHOREPLY", Channel:="*", Nickname:=TargetUser.Nickname, Info:=TargetUser.WhoLine)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOREPLY.Numeric, " ", RPL_WHOREPLY.Format, vbCrLf))
- End If
- Next
- End If
- Dim RPL_ENDOFWHO As IRCResponse = GetIRCResponse("RPL_ENDOFWHO", _Object:=Target, Nickname:=Nickname)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFWHO.Numeric, " ", RPL_ENDOFWHO.Format, vbCrLf))
- Send(sb)
- Else
- objChannel.SendWhoList(Me)
- End If
- Next
- End If
- Case "WHOIS"
- If Words.Length > 1 Then
- Dim sb As New StringBuilder
- Dim strTarget As String = RemoveColon(Words(1))
- Dim strTargets() As String = Split(strTarget, ",")
- For Each Target As String In strTargets
- Dim arrUsers As ArrayList = clsUserCollection.FindByExpression(Target.ToLower)
- If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
- Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=Target)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format, vbCrLf))
- Else
- For Each TargetUser As clsUser In arrUsers
- Dim strChannels As String = TargetUser.WhoisChannels.Trim
- Dim strWhoisUser As String = String.Empty
- Dim RPL_WHOISUSER As IRCResponse = GetIRCResponse("RPL_WHOISUSER", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat(TargetUser.FullWhoAddress, " * :", TargetUser.RealName))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISUSER.Numeric, " ", RPL_WHOISUSER.Format, vbCrLf))
- If Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper AndAlso HasPowerOver(TargetUser) Then
- Dim RPL_WHOISHOST As IRCResponse = GetIRCResponse("RPL_WHOISHOST", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat("*@", TargetUser.DNSLookup, " ", TargetUser.IP))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISHOST.Numeric, " ", RPL_WHOISHOST.Format, vbCrLf))
- End If
- If strChannels.Length Then
- Dim RPL_WHOISCHANNELS As IRCResponse = GetIRCResponse("RPL_WHOISCHANNELS", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=strChannels)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISCHANNELS.Numeric, " ", RPL_WHOISCHANNELS.Format, vbCrLf))
- End If
- Dim RPL_WHOISSERVER As IRCResponse = GetIRCResponse("RPL_WHOISSERVER", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat(Server, " :IRCX Network"))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISSERVER.Numeric, " ", RPL_WHOISSERVER.Format, vbCrLf))
- If TargetUser.Oper IsNot Nothing AndAlso TargetUser.Oper.Type <> clsOperCollection.OperType.NoOper Then
- Dim strOperInfo As String
- If TargetUser.Oper.Type = clsOperCollection.OperType.Admin Then
- strOperInfo = "is a Network Administrator"
- ElseIf TargetUser.Oper.Type = clsOperCollection.OperType.Sysop OrElse TargetUser.Oper.Type = clsOperCollection.OperType.Bot Then
- strOperInfo = "is an IRC Operator"
- ElseIf TargetUser.Oper.Type = clsOperCollection.OperType.Guide Then
- strOperInfo = "is an IRC Guide"
- End If
- Dim RPL_WHOISOPERATOR As IRCResponse = GetIRCResponse("RPL_WHOISOPERATOR", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=strOperInfo)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISOPERATOR.Numeric, " ", RPL_WHOISOPERATOR.Format, vbCrLf))
- End If
- If Not String.IsNullOrEmpty(TargetUser.Away) Then
- Dim RPL_WHOISAWAY As IRCResponse = GetIRCResponse("RPL_WHOISAWAY", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=TargetUser.Away)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISAWAY.Numeric, " ", RPL_WHOISAWAY.Format, vbCrLf))
- End If
- Dim RPL_WHOISIDLE As IRCResponse = GetIRCResponse("RPL_WHOISIDLE", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat(DateDiff(DateInterval.Second, TargetUser.LastMessageSent, Now().ToUniversalTime), " ", TargetUser.SignonTime))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISIDLE.Numeric, " ", RPL_WHOISIDLE.Format, vbCrLf))
- Next
- End If
- Next
- Dim RPL_ENDOFWHOIS As IRCResponse = GetIRCResponse("RPL_ENDOFWHOIS", Nickname:=Nickname, _Object:=strTarget)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFWHOIS.Numeric, " ", RPL_ENDOFWHOIS.Format, vbCrLf))
- If sb.Length Then
- Send(sb)
- End If
- ':core.ircx.net.pl 311 Bench yodel ~andrew xxxxxxxxxxxxxxxxxxxxxx.perr.cable.virginmedia.com * :Andrew Gee
- ':core.ircx.net.pl 319 Bench yodel :.#chatcore
- ':core.ircx.net.pl 312 Bench yodel core.ircx.net.pl :IRCX Network [wts]
- ':core.ircx.net.pl 301 Bench yodel :s
- ':core.ircx.net.pl 317 Bench yodel 6 1300400334 :seconds idle, signon time
- ':core.ircx.net.pl 318 Bench yodel :End of /WHOIS list
- End If
- Case "MODE"
- If Words.Length > 1 Then
- Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
- For Each Channel As String In strChannels
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
- If objChannel Is Nothing Then
- Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Nickname:=Nickname, Channel:=Channel)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
- Else
- If Words.Length > 2 Then
- 'channel mode is being set
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If (objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me) OrElse Oper IsNot Nothing Then
- objChannel.SetModes(WordRange(Words, 2), objChannelUser)
- If objChannel.Registered Then
- clsRegisteredChannelCollection.SaveChannel(objChannel, Me)
- End If
- Else
- Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Channel, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
- End If
- Else
- 'channel modes are being returned
- Dim RPL_CHANNELMODEIS As IRCResponse = GetIRCResponse("RPL_CHANNELMODEIS", Channel:=Channel, Mode:=objChannel.GetModes, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_CHANNELMODEIS.Numeric, " ", RPL_CHANNELMODEIS.Format))
- End If
- End If
- Next
- End If
- Case "TOPIC"
- If Words.Length > 1 Then
- Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
- For Each Channel As String In strChannels
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
- If objChannel Is Nothing Then
- Dim ERR_NOSUCHCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHCHANNEL", Channel:=Channel)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHCHANNEL.Numeric, " ", ERR_NOSUCHCHANNEL.Format))
- Else
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If objChannelUser Is Nothing OrElse (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Oper Is Nothing) Then
- Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Channel:=Channel, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
- Else
- objChannel.Topic = RemoveColon(WordRange(Words, 2))
- objChannel.Send(String.Concat(":", FullAddress, " TOPIC ", objChannel.Name, " :", objChannel.Topic))
- If objChannel.Registered Then
- clsRegisteredChannelCollection.SaveChannel(objChannel, Me)
- End If
- End If
- End If
- Next
- End If
- Case "KICK"
- If Words.Length > 1 Then
- Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
- For Each Channel As String In strChannels
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
- If objChannel Is Nothing Then
- Dim ERR_NOSUCHCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHCHANNEL", Channel:=Channel)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHCHANNEL.Numeric, " ", ERR_NOSUCHCHANNEL.Format))
- Else
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If Oper Is Nothing AndAlso (objChannelUser Is Nothing OrElse (Not objChannelUser.Owner AndAlso Not objChannelUser.Host)) Then
- Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Channel:=Channel, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
- Else
- Dim strNicknames() As String = Split(RemoveColon(Words(2)), ",")
- For Each NicknameToKick As String In strNicknames
- Dim objUserToKick As clsChannelUser = objChannel.Users(NicknameToKick.ToLower)
- If objUserToKick Is Nothing Then
- Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=NicknameToKick)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
- Else
- If Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Oper Is Nothing Then
- Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Nickname:=Nickname, Channel:=objChannel.Name)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
- ElseIf objChannelUser.HasPowerOver(objChannel, objUserToKick) Then
- Dim strReason As String = String.Empty
- If Words.Length > 3 Then
- strReason = RemoveColon(WordRange(Words, 3))
- End If
- objChannel.Send(String.Concat(":", FullAddress, " KICK ", objChannel.Name, " ", objUserToKick.User.Nickname, " :", strReason))
- objChannel.RemoveUser(objUserToKick.User)
- ElseIf objChannelUser.Host AndAlso objUserToKick.Owner Then
- Dim ERR_CHANOWNERRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOWNERRIVSNEEDED", Channel:=objChannel.Name, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOWNERRIVSNEEDED.Numeric, " ", ERR_CHANOWNERRIVSNEEDED.Format))
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- End If
- Next
- End If
- End If
- Next
- End If
- Case "KILL"
- If Words.Length > 1 Then
- clsUserCollection.ParseKill(Me, Words)
- End If
- Case "KLINE"
- If Words.Length > 1 Then
- clsUserCollection.ParseKill(Me, Words, BanIP:=True)
- End If
- Case "CHANSERV", "CS"
- ' 0 1 2 3 4
- 'chanserv aop #channel add nickname
- If Words.Length > 1 Then
- Select Case Words(1).ToUpper
- Case "AOP"
- If Words.Length > 2 Then
- Dim strChannel As String = Words(2)
- Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
- If objChannel IsNot Nothing Then
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me Then
- If Words.Length > 4 Then
- Select Case Words(3).ToUpper
- Case "ADD"
- Dim strNickname As String = Words(4)
- If clsRegisteredUserCollection.IsNicknameRegistered(Me, strNickname) Then
- objChannel.AccessList.Parse(Me, objChannel.Name, String.Concat("ADD HOST ", strNickname), objChannel)
- End If
- End Select
- End If
- End If
- End If
- End If
- Case "DROP"
- 'chanserv drop #channel
- If Me.RegisteredUser OrElse (Oper IsNot Nothing AndAlso (Oper.Type = clsOperCollection.OperType.Admin OrElse Oper.Type = clsOperCollection.OperType.Sysop OrElse Oper.Type = clsOperCollection.OperType.Bot)) Then
- If Words.Length > 2 Then
- Dim strChannel As String = Words(2)
- Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
- If objChannel IsNot Nothing Then
- If objChannel.Registered Then
- If (Oper IsNot Nothing AndAlso (Oper.Type = clsOperCollection.OperType.Admin OrElse Oper.Type = clsOperCollection.OperType.Sysop)) OrElse objChannel.Founder.ToLower = Nickname.ToLower Then
- If clsRegisteredChannelCollection.DropChannel(objChannel) Then
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel registration for ", Chr(2), strChannel, Chr(2), " has been cancelled.", vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Access denied.", vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " isn't registered.", vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " isn't registered.", vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "DROP ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :You must register your nickname first. Type", Chr(2), " /msg NickServ HELP", Chr(2), " for information on registering nicknames.", vbCrLf), SendToServer:=True)
- End If
- Case "REGISTER"
- 'chanserv register #channel
- If Me.RegisteredUser OrElse (Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper) Then
- If Words.Length > 2 Then
- Dim strChannel As String = Words(2)
- Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
- If objChannel IsNot Nothing Then
- If Not objChannel.Registered Then
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me Then
- If objChannelUser.Owner Then
- If clsRegisteredChannelCollection.RegisterChannel(objChannel, Me) Then
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " is now registered under your account.", vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Access denied - you must be an Owner on the channel before you can register it.", vbCrLf), SendToServer:=True)
- End If
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " is already registered.", vbCrLf), SendToServer:=True)
- End If
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
- End If
- Else
- Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :You must register your nickname first. Type", Chr(2), " /msg NickServ HELP", Chr(2), " for information on registering nicknames.", vbCrLf), SendToServer:=True)
- End If
- Case "HELP"
- Dim sb As New StringBuilder
- If Words.Length < 3 Then
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "ChanServ", Chr(2), " allows you to ""register"" a channel and", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :prevent others from creating it or taking it over.", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :There are only 2 commands on this server:", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " : REGISTER Register a channel", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " : DROP Cancel the registration of a channel", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "NOTICE: ", Chr(2), "When you register a room, you will automatically", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :have an Owner access entry added to the channel.", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :This cannot be removed. You will also be protected from other", vbCrLf))
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :owners of the channel.", vbCrLf))
- ElseIf Words(2).ToUpper = "REGISTER" Then
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf))
- ElseIf Words(2).ToUpper = "DROP" Then
- sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "DROP ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf))
- End If
- Send(sb, SendToServer:=True)
- End Select
- End If
- Case "NICKSERV", "NS"
- If Words.Length > 1 Then
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- Select Case Words(1).ToUpper
- Case "IDENTIFY"
- If Words.Length = 3 Then
- If clsRegisteredUserCollection.Identify(Me, Words(2)) Then
- End If
- Else
- Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "IDENTIFY ", Chr(31), "password", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
- End If
- Case "REGISTER"
- If Words.Length = 4 Then
- If Not Nickname.StartsWith("'") Then
- clsRegisteredUserCollection.RegisterUser(Me, Words(2), Words(3))
- End If
- Else
- Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "password", Chr(31), " ", Chr(31), "email", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
- End If
- Case "CHANGE"
- If Words.Length = 3 Then
- If clsRegisteredUserCollection.ChangeNickname(Me, Words(2)) Then
- End If
- Else
- Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "CHANGE ", Chr(31), "NewNickname", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
- End If
- Case "DROP"
- If Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper Then
- If Oper.Type = clsOperCollection.OperType.Admin Then
- If Words.Length > 2 Then
- clsRegisteredUserCollection.DropUser(Words(2))
- End If
- Else
- Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Access denied.", vbCrLf), SendToServer:=True)
- End If
- Else
- clsRegisteredUserCollection.DropUser(Me)
- End If
- Case "HELP"
- Dim sb As New StringBuilder
- If Words.Length < 3 Then
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "NickServ", Chr(2), " allows you to ""register"" a nickname and", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :prevent others from using it.", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :There are only 4 commands on this server:", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " : REGISTER Register a nickname", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " : IDENTIFY Identify yourself with your password", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " : CHANGE Change your nickname.", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " : DROP Cancel your nickserv registration.", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "NOTICE: ", Chr(2), "When you create a room while identified, the server", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :will automatically add an Owner access entry for your Nickname.", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :This is secure because no other users can use your", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :nickname without first identifying.", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :If you change your nickname, via ""/NickServ CHANGE"", the", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :server will automatically update your access entry across", vbCrLf))
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :all relevant channels.", vbCrLf))
- ElseIf Words(2).ToUpper = "REGISTER" Then
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "password", Chr(31), " ", Chr(31), "email", Chr(31), Chr(2), vbCrLf))
- ElseIf Words(2).ToUpper = "IDENTIFY" Then
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "IDENTIFY ", Chr(31), "password", Chr(31), Chr(2), vbCrLf))
- ElseIf Words(2).ToUpper = "CHANGE" Then
- sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "CHANGE ", Chr(31), "NewNickname", Chr(31), Chr(2), vbCrLf))
- End If
- Send(sb, SendToServer:=True)
- End Select
- End If
- End If
- Case "PRIVMSG"
- If Words.Length > 1 Then
- Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
- Dim strMessage As String = String.Empty
- For Each Target As String In strTargets
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
- If objChannel IsNot Nothing Then
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If Oper Is Nothing Then 'opers bypass all channel restrictions
- If (objChannelUser Is Nothing OrElse objChannelUser.User IsNot Me) AndAlso objChannel.ModeNoExternalMessages Then
- Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
- Continue For
- End If
- If objChannel.ModeModerated AndAlso (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Not objChannelUser.Voice) Then
- Dim ERR_CANNOTSENDTOCHAN As IRCResponse = GetIRCResponse("ERR_CANNOTSENDTOCHAN", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CANNOTSENDTOCHAN.Numeric, " ", ERR_CANNOTSENDTOCHAN.Format))
- Continue For
- End If
- End If
- strMessage = RemoveColon(WordRange(Words, 2))
- objChannel.Send(String.Concat(":", FullAddress, " PRIVMSG ", objChannel.Name, " :", strMessage), Me)
- Else
- Dim objTargetUser As clsUser = CommonUser(Target)
- If objTargetUser IsNot Nothing Then
- strMessage = RemoveColon(WordRange(Words, 2))
- objTargetUser.Send(String.Concat(":", FullAddress, " PRIVMSG ", objTargetUser.Nickname, " :", strMessage))
- Else
- Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
- End If
- End If
- Next
- End If
- Case "NOTICE"
- If Words.Length > 1 Then
- Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
- Dim strMessage As String = String.Empty
- For Each Target As String In strTargets
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
- If objChannel IsNot Nothing Then
- Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
- If Oper Is Nothing Then 'opers bypass all channel restrictions
- If (objChannelUser Is Nothing OrElse objChannelUser.User IsNot Me) AndAlso objChannel.ModeNoExternalMessages Then
- Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
- Continue For
- End If
- If objChannel.ModeModerated AndAlso (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Not objChannelUser.Voice) Then
- Dim ERR_CANNOTSENDTOCHAN As IRCResponse = GetIRCResponse("ERR_CANNOTSENDTOCHAN", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CANNOTSENDTOCHAN.Numeric, " ", ERR_CANNOTSENDTOCHAN.Format))
- Continue For
- End If
- End If
- strMessage = RemoveColon(WordRange(Words, 2))
- objChannel.Send(String.Concat(":", FullAddress, " NOTICE ", objChannel.Name, " :", strMessage), Me, WebchattersOnly:=(strMessage.Contains("WEBCHATINFO")))
- Else
- Dim objTargetUser As clsUser = CommonUser(Target)
- If objTargetUser IsNot Nothing Then
- strMessage = RemoveColon(WordRange(Words, 2))
- objTargetUser.Send(String.Concat(":", FullAddress, " NOTICE ", objTargetUser.Nickname, " :", strMessage))
- Else
- Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Channel:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
- End If
- End If
- Next
- End If
- Case "ACCESS"
- 'Syntax 1:
- '
- 'ACCESS <object> LIST
- 'Syntax 2:
- '
- 'ACCESS <object> ADD|DELETE <level> <mask> [<timeout> [:<reason>]]
- 'Syntax 3:
- '
- 'ACCESS <object> CLEAR [<level>]
- If Words.Length > 1 Then
- Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
- For Each Target As String In strTargets
- If Target = "*" OrElse Target = "$" Then
- If Oper IsNot Nothing AndAlso (Oper.Type = clsOperCollection.OperType.Admin OrElse Oper.Type = clsOperCollection.OperType.Sysop OrElse Oper.Type = clsOperCollection.OperType.Bot) Then
- If Target = "*" OrElse Server = clsServerCollection.LocalServer.Name Then
- clsServerCollection.LocalServer.AccessList.Parse(Me, Target, WordRange(Words, 2))
- End If
- Else
- Dim IRCERR_NOACCESS As IRCResponse = GetIRCResponse("IRCERR_NOACCESS", _Object:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOACCESS.Numeric, " ", IRCERR_NOACCESS.Format))
- End If
- ElseIf Target.ToLower = Nickname.ToLower OrElse clsUserCollection.NicknameExists(Target) Then
- If Target.ToLower = Nickname.ToLower OrElse Oper IsNot Nothing Then
- Dim objTargetUser As clsUser = clsUserCollection.UsersByNickname(Target)
- objTargetUser.AccessList.Parse(Me, Target, WordRange(Words, 2))
- Else
- Dim IRCERR_NOACCESS As IRCResponse = GetIRCResponse("IRCERR_NOACCESS", _Object:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOACCESS.Numeric, " ", IRCERR_NOACCESS.Format))
- End If
- Else
- Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
- If objChannel IsNot Nothing Then
- objChannel.AccessList.Parse(Me, Target, WordRange(Words, 2), objChannel)
- Else
- Dim IRCERR_NOSUCHOBJECT As IRCResponse = GetIRCResponse("IRCERR_NOSUCHOBJECT", _Object:=Target, Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOSUCHOBJECT.Numeric, " ", IRCERR_NOSUCHOBJECT.Format))
- End If
- End If
- Next
- End If
- Case "OPER"
- If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
- If Words.Length = 3 Then
- Dim objOper As clsOper = clsOperCollection.Authenticate(Words(1), Words(2), Me)
- If objOper Is Nothing Then
- Dim ERR_NOOPERHOST As IRCResponse = GetIRCResponse("ERR_NOOPERHOST", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOOPERHOST.Numeric, " ", ERR_NOOPERHOST.Format), Replicate:=True)
- Else
- Dim strNewNickname As String = objOper.Nick, blnChangeNickname As Boolean = Not Nickname = strNewNickname
- If blnChangeNickname Then
- If strNewNickname <> Nickname Then
- SyncLock clsOperCollection._OpersLock
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- Dim objUser As clsChannelUser = Channel.Users(strNewNickname.ToLower)
- If objUser IsNot Nothing AndAlso Not objUser.User Is Me Then
- Dim ERR_NICKNAMEINUSE As IRCResponse = GetIRCResponse("ERR_NICKNAMEINUSE", Nickname:=strNewNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKNAMEINUSE.Numeric, " ", ERR_NICKNAMEINUSE.Format), Replicate:=True)
- blnError = True
- Exit Sub
- End If
- Next
- End SyncLock
- End SyncLock
- End If
- End If
- Host = ConfigSetting("operHost")
- Oper = objOper
- OperType = objOper.Type
- ':irc.chatcore.org 381 Bench :You are now an IRC Operator
- If blnChangeNickname Then ChangeNickname(Me, strNewNickname, False, True)
- Dim RPL_YOUREOPER As IRCResponse = GetIRCResponse("RPL_YOUREOPER", Nickname:=Nickname)
- Dim sb As New StringBuilder
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_YOUREOPER.Numeric, " ", RPL_YOUREOPER.Format, vbCrLf))
- If Server <> clsServerCollection.LocalServer.Name Then
- sb.Append(String.Concat("<", UniqueID, " HOSTCHANGE ", Host, vbCrLf))
- End If
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- DataReceived(String.Concat("MODE ", Channel.Name, " +q ", Nickname), SourceServer)
- Next
- End SyncLock
- Send(sb, Replicate:=True)
- Dim strOperChannel As String = ConfigSetting("operChannel")
- If Not String.IsNullOrEmpty(strOperChannel) Then
- clsChannelCollection.Join(Me, strOperChannel, Force:=True)
- End If
- End If
- End If
- End If
- Case "LISTX"
- clsChannelCollection.OutputChannelList(Me, IRCX:=True)
- Case "LIST"
- clsChannelCollection.OutputChannelList(Me, IRCX:=False)
- Case "TIME"
- Dim RPL_TIME As IRCResponse = GetIRCResponse("RPL_TIME", Nickname:=Nickname, Info:=Now().ToUniversalTime.ToString("ddd MMM dd HH:mm:ss yyyy"), Server:=Server)
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_TIME.Numeric, " ", RPL_TIME.Format))
- Case "VERSION"
- Dim RPL_VERSION As IRCResponse = GetIRCResponse("RPL_VERSION", Nickname:=Nickname, Info:=String.Concat(clsMain.IRCVersion, " ", Server, " ", clsMain.IRCInfo))
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_VERSION.Numeric, " ", RPL_VERSION.Format))
- Case "INFO"
- Dim sb As New StringBuilder
- Dim RPL_INFO1 As IRCResponse = GetIRCResponse("RPL_INFO", Nickname:=Nickname, Info:=clsMain.IRCInfo)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_INFO1.Numeric, " ", RPL_INFO1.Format, vbCrLf))
- Dim RPL_INFO2 As IRCResponse = GetIRCResponse("RPL_INFO", Nickname:=Nickname, Info:=String.Concat("On-line since ", clsServerCollection.LocalServer.OnlineSince))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_INFO2.Numeric, " ", RPL_INFO2.Format, vbCrLf))
- Dim RPL_ENDOFINFO As IRCResponse = GetIRCResponse("RPL_ENDOFINFO", Nickname:=Nickname, Info:=String.Concat("On-line since ", clsServerCollection.LocalServer.OnlineSince))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFINFO.Numeric, " ", RPL_ENDOFINFO.Format, vbCrLf))
- Send(sb)
- Case "ADMIN"
- Dim sb As New StringBuilder
- Dim RPL_ADMINME As IRCResponse = GetIRCResponse("RPL_ADMINME", Nickname:=Nickname, Server:=Server)
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINME.Numeric, " ", RPL_ADMINME.Format, vbCrLf))
- Dim RPL_ADMINLOC1 As IRCResponse = GetIRCResponse("RPL_ADMINLOC1", Nickname:=Nickname, Info:=ConfigSetting("admin1"))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINLOC1.Numeric, " ", RPL_ADMINLOC1.Format, vbCrLf))
- Dim RPL_ADMINLOC2 As IRCResponse = GetIRCResponse("RPL_ADMINLOC2", Nickname:=Nickname, Info:=ConfigSetting("admin2"))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINLOC2.Numeric, " ", RPL_ADMINLOC2.Format, vbCrLf))
- Dim RPL_ADMINEMAIL As IRCResponse = GetIRCResponse("RPL_ADMINEMAIL", Nickname:=Nickname, Info:=ConfigSetting("adminEmail"))
- sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINEMAIL.Numeric, " ", RPL_ADMINEMAIL.Format, vbCrLf))
- Send(sb)
- Case "REHASH"
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin Then
- clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "REHASH", Chr(2)), OpersOnly:=True)
- clsMain.Rehash()
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- Case "RESET"
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin Then
- clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "RESET", Chr(2)), OpersOnly:=True)
- Reset()
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- Case "DIE"
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin Then
- clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "DIE", Chr(2)), OpersOnly:=True)
- Application.Exit()
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- Case "GLOBAL"
- If Words.Length > 1 Then
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin OrElse OperType = clsOperCollection.OperType.Sysop Then
- clsUserCollection.SendGlobal(RemoveColon(WordRange(Words, 1)), OpersOnly:=False)
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- End If
- Case "FNICK"
- If Words.Length = 3 Then
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin Then
- Dim strTargetNickname As String = Words(1)
- If Not clsUserCollection.ValidNickname(Words(2)) Then
- Dim ERR_ERRONEOUSNICKNAME As IRCResponse = GetIRCResponse("ERR_ERRONEOUSNICKNAME", Nickname:=strTargetNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_ERRONEOUSNICKNAME.Numeric, " ", ERR_ERRONEOUSNICKNAME.Format), Replicate:=True)
- Else
- Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(strTargetNickname.ToLower)
- If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
- Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=strTargetNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
- Else
- Dim strOldNickname As String = arrUsers(0).Nickname
- Dim arrUsersToChange As New ArrayList
- For Each TargetUser As clsUser In arrUsers
- If Not HasPowerOver(TargetUser) Then
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- Else
- arrUsersToChange.Add(TargetUser)
- End If
- Next
- For Each TargetUser As clsUser In arrUsersToChange
- TargetUser.ChangeNickname(TargetUser, Words(2), False, True)
- Next
- clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "FNICK", Chr(2), " (", strOldNickname, " to ", Words(2), ")"), OpersOnly:=True)
- End If
- End If
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- End If
- Case "FJOIN"
- If Words.Length = 3 Then
- If Oper IsNot Nothing Then
- If OperType = clsOperCollection.OperType.Admin OrElse OperType = clsOperCollection.OperType.Sysop OrElse OperType = clsOperCollection.OperType.Bot Then
- Dim strTargetNickname As String = Words(1)
- Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(strTargetNickname.ToLower)
- If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
- Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=strTargetNickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
- Else
- Dim arrUsersToChange As New ArrayList
- For Each TargetUser As clsUser In arrUsers
- If Not HasPowerOver(TargetUser) Then
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- Else
- arrUsersToChange.Add(TargetUser)
- End If
- Next
- For Each TargetUser As clsUser In arrUsersToChange
- 'TargetUser.ChangeNickname(TargetUser, Words(2), False, True)
- clsChannelCollection.Join(TargetUser, Words(2), Force:=True)
- Next
- clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "FJOIN", Chr(2), " (", arrUsers(0).Nickname, " to ", Words(2), ")"), OpersOnly:=True)
- End If
- Else
- Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
- End If
- Else
- Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
- End If
- End If
- Case "USERHOST"
- ':core.ircx.net.pl 302 yodel :wyleniauy*=+digit@nts
- ':core.ircx.net.pl 302 yodel :WaS*=+bfcior@bf
- If Words.Length > 1 Then
- Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(Words(1).ToLower)
- If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
- Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Words(1), _Object:=Words(1))
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
- Else
- Dim objUser As clsUser = arrUsers(0)
- Dim RPL_USERHOST As IRCResponse = GetIRCResponse("RPL_USERHOST", Nickname:=Nickname, _Object:=objUser.Nickname, Info:=String.Concat(objUser.Username, "@", objUser.Host))
- Send(String.Concat(":", clsMain.IRCServer, " ", RPL_USERHOST.Numeric, " ", RPL_USERHOST.Format))
- End If
- End If
- Case Else
- Dim ERR_UNKNOWNCOMMAND As IRCResponse = GetIRCResponse("ERR_UNKNOWNCOMMAND", Nickname:=Nickname, Command:=strWord0)
- Send(String.Concat(":", clsMain.IRCServer, " ", ERR_UNKNOWNCOMMAND.Numeric, " ", ERR_UNKNOWNCOMMAND.Format))
- End Select
- End If
- End Select
- End Select
- If Not blnError Then
- 'send this message on (if Hub, send to Leafs... if Leaf send to Hub)
- If SourceServer <> clsServerCollection.HubServer.Name OrElse clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
- clsServerCollection.Replicate(String.Concat("<", UniqueID, " ", Line, vbCrLf), Server)
- End If
- End If
- Catch ex As Exception
- 'MsgBox("Error: ", ex.Message)
- OutputToLog("ERROR: " & ex.Message)
- End Try
- End Sub
- Private Sub _objPing_PingTimeout() Handles _objPing.PingTimeout
- 'user has failed to reply with a PONG, within ConfigSetting("pingInterval")
- Disconnected("Ping Timeout")
- End Sub
- Private Sub _objClient_Disconnected() Handles _objClient.Disconnected
- Disconnected()
- End Sub
- Private Sub _objClient_ReceiveData(ByVal Lines() As String) Handles _objClient.ReceiveData
- For Each Line As String In Lines
- Line = Line.Trim()
- If Line.Length Then
- DataReceived(Line, Server)
- End If
- Next
- End Sub
- Public Function HasPowerOver(ByVal Target As clsUser) As Boolean
- Dim objOper As clsOper = Oper
- Dim objOperTarget As clsOper = Target.Oper
- If Me Is Target Then
- Return True
- ElseIf objOperTarget IsNot Nothing AndAlso objOperTarget.Type <> clsOperCollection.OperType.NoOper Then
- If objOper Is Nothing OrElse objOper.Type = clsOperCollection.OperType.NoOper Then
- Return False
- Else
- If objOperTarget.Type = clsOperCollection.OperType.Admin Then
- If objOper.Type = clsOperCollection.OperType.Admin Then
- Return True
- Else
- Return False
- End If
- ElseIf objOperTarget.Type = clsOperCollection.OperType.Sysop OrElse objOperTarget.Type = clsOperCollection.OperType.Bot Then
- If objOper.Type = clsOperCollection.OperType.Guide Then
- Return False
- Else
- Return True
- End If
- Else
- Return True
- End If
- End If
- ElseIf objOper IsNot Nothing AndAlso objOper.Type <> clsOperCollection.OperType.NoOper Then
- Return True
- End If
- Return False
- End Function
- Public Function WhoisChannels() As String
- Dim sb As New StringBuilder
- SyncLock _ChannelsLock
- For Each Channel As clsChannel In _Channels
- Dim objChannelUser As clsChannelUser = Channel.Users(Nickname.ToLower)
- If objChannelUser IsNot Nothing Then
- If objChannelUser.Owner Then
- sb.Append(".")
- ElseIf objChannelUser.Host Then
- sb.Append("@")
- End If
- sb.Append(String.Concat(Channel.Name, " "))
- End If
- Next
- End SyncLock
- Return sb.ToString.Trim
- End Function
- Public Function WhoLine() As String
- Dim strWhoLine As String = String.Empty
- If RegisteredUser = False AndAlso Oper Is Nothing Then
- strWhoLine = "~"
- End If
- strWhoLine &= String.Concat(Username, " ", Host, " ", Server, " ", Nickname, " ")
- If String.IsNullOrEmpty(Away) Then
- strWhoLine &= "H"
- Else
- strWhoLine &= "G"
- End If
- If Oper IsNot Nothing Then
- If Oper.Type = clsOperCollection.OperType.Admin Then
- strWhoLine &= "a"
- Else
- strWhoLine &= "*"
- End If
- End If
- strWhoLine &= String.Concat(" :0 ", RealName)
- Return strWhoLine
- End Function
- End Class
- End Namespace
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement