Advertisement
Guest User

Untitled

a guest
Aug 12th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 127.50 KB | None | 0 0
  1.  
  2. Imports ccirc.clsMain
  3. Imports ccirc.connections
  4. Imports ccirc.general.config.clsGetConfig
  5. Imports ccirc.general.logs.clsLog
  6. Imports ccirc.irc.clsResponse
  7. Imports ccirc.irc.clsUtils
  8. Imports ccirc.irc.clsRegisteredUser
  9. Imports ccirc.irc.clsRegisteredChannelCollection
  10. Imports ccirc.irc.clsAccess
  11.  
  12. Imports System.Security.Cryptography
  13. Imports System.Timers
  14. Imports System.Text
  15. Imports System.Net.Sockets
  16. Imports System.Net
  17.  
  18. Namespace irc
  19.  
  20.     Public Class clsUser
  21.  
  22.         Private Structure DataLine
  23.             Dim Line As String
  24.             Dim SourceServer As String
  25.         End Structure
  26.  
  27. #Region "Variables"
  28.         Public UniqueID As String = String.Empty
  29.         Public Nickname As String = String.Empty
  30.         Public Username As String = String.Empty
  31.         Public Password As String = String.Empty
  32.         Public Host As String = String.Empty
  33.         Public DNSLookup As String = String.Empty
  34.         Public IP As String = String.Empty
  35.         Public RealName As String = String.Empty
  36.         Public NickservNicknameAttempt As String = String.Empty
  37.         Public Server As String = String.Empty
  38.         Public Away As String = String.Empty
  39.         Public Authenticated As Boolean
  40.         Public NicknameIsRegistered As Boolean
  41.         Public LastMessageSent As Date
  42.         Public SignonTime As Double
  43.         Public BeingKilled As Boolean
  44.         Public Webchat As Boolean
  45.         Public RegisteredUser As Boolean
  46.  
  47.         Private WithEvents _objClient As clsClient
  48.         Private WithEvents _objPing As clsPing
  49.  
  50.         Private _AccessList As New clsAccess
  51.         Private _Oper As clsOper
  52.         Private _InputBufferDelay As New Timer
  53.         Private _InputBufferTime As DateTime
  54.         Private _InputBufferLines As New ArrayList
  55.         Private _InputBufferLength As Integer
  56.         Private _RegisteredProtection As RegisteredProtectionType 'unused
  57.         Private _OperType As clsOperCollection.OperType = clsOperCollection.OperType.NoOper
  58.         Public _Channels As New ArrayList
  59.         Private _NickChangeTime As Date
  60. #End Region
  61.  
  62. #Region "Locks"
  63.         Private _objClientLock As New Object
  64.         Private _objPingLock As New Object
  65.  
  66.         Private _AccessListLock As New Object
  67.         Private _OperLock As New Object
  68.         Private _InputBufferLock As New Object
  69.         Private _RegisteredUserLock As New Object
  70.         Private _NicknameIsRegisteredLock As New Object
  71.         Private _RegisteredProtectionLock As New Object
  72.         Private _OperTypeLock As New Object
  73.         Public _ChannelsLock As New Object
  74.         Private _NickChangeTimeLock As New Object
  75. #End Region
  76.  
  77. #Region "Properties"
  78.         Public Property objClient() As clsClient
  79.             Get
  80.                 SyncLock _objClientLock : Return _objClient : End SyncLock
  81.             End Get
  82.             Set(ByVal value As clsClient)
  83.                 SyncLock _objClientLock : _objClient = value : End SyncLock
  84.             End Set
  85.         End Property
  86.         Public Property AccessList() As clsAccess
  87.             Get
  88.                 SyncLock _AccessListLock : Return _AccessList : End SyncLock
  89.             End Get
  90.             Set(ByVal value As clsAccess)
  91.                 SyncLock _AccessListLock : _AccessList = value : End SyncLock
  92.             End Set
  93.         End Property
  94.         Public Property Oper() As clsOper
  95.             Get
  96.                 SyncLock _OperLock : Return _Oper : End SyncLock
  97.             End Get
  98.             Set(ByVal value As clsOper)
  99.                 SyncLock _OperLock : _Oper = value : End SyncLock
  100.             End Set
  101.         End Property
  102.         Public Property RegisteredProtection() As RegisteredProtectionType
  103.             Get
  104.                 SyncLock _RegisteredProtectionLock : Return _RegisteredProtection : End SyncLock
  105.             End Get
  106.             Set(ByVal value As RegisteredProtectionType)
  107.                 SyncLock _RegisteredProtectionLock : _RegisteredProtection = value : End SyncLock
  108.             End Set
  109.         End Property
  110.         Public Property OperType() As clsOperCollection.OperType
  111.             Get
  112.                 SyncLock _OperTypeLock : Return _OperType : End SyncLock
  113.             End Get
  114.             Set(ByVal value As clsOperCollection.OperType)
  115.                 SyncLock _OperTypeLock : _OperType = value : End SyncLock
  116.             End Set
  117.         End Property
  118.         Public Property objPing() As clsPing
  119.             Get
  120.                 SyncLock _objPingLock : Return _objPing : End SyncLock
  121.             End Get
  122.             Set(ByVal value As clsPing)
  123.                 SyncLock _objPingLock : _objPing = value : End SyncLock
  124.             End Set
  125.         End Property
  126.         Public Property Channels() As ArrayList
  127.             Get
  128.                 SyncLock _ChannelsLock : Return _Channels : End SyncLock
  129.             End Get
  130.             Set(ByVal value As ArrayList)
  131.                 SyncLock _ChannelsLock : _Channels = value : End SyncLock
  132.             End Set
  133.         End Property
  134. #End Region
  135.  
  136.         Public Sub New( _
  137. ByVal UserGuid As String, _
  138. Optional ByVal ServerConnectedTo As String = Nothing, _
  139. Optional ByVal Client As clsClient = Nothing _
  140. )
  141.  
  142.             UniqueID = UserGuid
  143.  
  144.             Server = ServerConnectedTo
  145.  
  146.             _InputBufferTime = Now().ToUniversalTime
  147.  
  148.             AddHandler _InputBufferDelay.Elapsed, AddressOf InputBufferDelay_Elapsed
  149.  
  150.             If Client Is Nothing Then
  151.  
  152.             Else
  153.                 _objClient = Client
  154.                 IP = Client.IP
  155.  
  156.                 Host = GetMD5Hash(String.Concat(IP, "3jr8u9wwrwrtesaf'[]'safs"))
  157.  
  158.                 DNSLookup = clsUserCollection.GetDNSCache(IP)
  159.                 If String.IsNullOrEmpty(DNSLookup) Then
  160.                     DNSLookup = Dns.GetHostEntry(IP).HostName
  161.                     clsUserCollection.AddToDNSCache(IP, DNSLookup)
  162.                 End If
  163.  
  164.             End If
  165.  
  166.             SignonTime = DateToUnix(Now)
  167.  
  168.             _objPing = New clsPing(Client)
  169.  
  170.         End Sub
  171.  
  172.         Private Function GetMD5Hash(ByVal input As String) As String
  173.             Dim x As New System.Security.Cryptography.MD5CryptoServiceProvider()
  174.             Dim bs As Byte() = System.Text.Encoding.UTF8.GetBytes(input)
  175.             bs = x.ComputeHash(bs)
  176.             Dim s As New System.Text.StringBuilder()
  177.             For Each b As Byte In bs
  178.                 s.Append(b.ToString("x2").ToLower())
  179.             Next
  180.             Dim password As String = s.ToString()
  181.             Return password
  182.         End Function
  183.  
  184.         Public Sub SendCommonUsers(ByVal Data As String)
  185.  
  186.             If _Channels.Count Then
  187.                 Dim htCommonUsers As Hashtable = CommonUsers()
  188.                 For Each CommonUser As DictionaryEntry In htCommonUsers
  189.                     Dim objUser As clsUser = CommonUser.Value
  190.                     If objUser IsNot Me Then
  191.                         objUser.Send(Data)
  192.                     End If
  193.                 Next
  194.  
  195.             End If
  196.  
  197.         End Sub
  198.  
  199.         Public Sub Send(ByVal Data As StringBuilder, Optional ByVal Replicate As Boolean = False, Optional ByVal SendToServer As Boolean = False)
  200.  
  201.             If Server = clsServerCollection.LocalServer.Name Then
  202.                 If objClient IsNot Nothing Then
  203.                     objClient.Send(Data.ToString)
  204.                 End If
  205.             End If
  206.  
  207.             If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  208.                 If Replicate Then
  209.                     'send to Leafs
  210.                     clsServerCollection.Replicate(String.Concat(Data.ToString, vbCrLf))
  211.                 ElseIf SendToServer AndAlso Server <> clsServerCollection.LocalServer.Name Then
  212.                     Dim objServer As clsServer = clsServerCollection.Servers(Server)
  213.                     objServer.Send(String.Concat(Data.ToString, vbCrLf))
  214.                 End If
  215.             End If
  216.  
  217.         End Sub
  218.  
  219.         Public Sub Send(ByVal Data As String, Optional ByVal Replicate As Boolean = False, Optional ByVal SendToServer As Boolean = False)
  220.  
  221.             If Not Webchat Then
  222.                 Data = clsUtils.StripWebchatFont(Data)
  223.             End If
  224.  
  225.             If Server = clsServerCollection.LocalServer.Name Then
  226.                 If objClient IsNot Nothing Then
  227.                     objClient.Send(String.Concat(Data, vbCrLf))
  228.                 End If
  229.             End If
  230.  
  231.             If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  232.                 If Replicate Then
  233.                     'send to Leafs
  234.                     clsServerCollection.Replicate(String.Concat(">", UniqueID, " ", Data, vbCrLf))
  235.                 ElseIf SendToServer AndAlso Server <> clsServerCollection.LocalServer.Name Then
  236.                     Dim objServer As clsServer = clsServerCollection.Servers(Server)
  237.                     objServer.Send(String.Concat(">", UniqueID, " ", Data, vbCrLf))
  238.                 End If
  239.             End If
  240.  
  241.         End Sub
  242.  
  243.         Public Sub Authenticate()
  244.  
  245.             Dim MatchedEntry As New clsAccessEntry
  246.  
  247.             If clsServerCollection.LocalServer.AccessList.EntryCheck(Me, True, MatchedEntry) = EntryResponse.Denied Then
  248.  
  249.                 Dim strReason As String = String.Empty
  250.                 If Not String.IsNullOrEmpty(MatchedEntry.Info) Then
  251.                     strReason = String.Concat(" (", MatchedEntry.Info, ")")
  252.                 End If
  253.  
  254.                 Send(String.Concat( _
  255.                      ":", clsServerCollection.LocalServer.Name, " NOTICE ", Nickname, " :You are banned from ", Server, strReason, " Email ", ConfigSetting("adminEmail"), " for more information.", vbCrLf, _
  256.                      "ERROR :Closing Link: ", Nickname, "[", DNSLookup, "] (User is banned", strReason, ")"))
  257.                 Disconnected(QuitMessage:=strReason, Replicate:=True, DisplayQuit:=False)
  258.  
  259.             ElseIf clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  260.  
  261.                 clsUserCollection.AuthenticateUser(Me)
  262.  
  263.                 Authenticated = True
  264.  
  265.                 Dim sb As New StringBuilder
  266.  
  267.                 Dim blnNicknameIsRegistered As Boolean = NicknameIsRegistered
  268.                 Dim protRegisteredProtection As RegisteredProtectionType = _RegisteredProtection
  269.  
  270.                 If blnNicknameIsRegistered Then
  271.                     Select Case protRegisteredProtection
  272.                         Case RegisteredProtectionType.MustIdentify
  273.                             'set the Nickname to a Guest until the user identifies...
  274.                             NickservNicknameAttempt = Nickname
  275.                             Nickname = "Temp" & Guid.NewGuid.ToString.Substring(0, 6)
  276.                             clsUserCollection.NicknameChange(Me, NickservNicknameAttempt, Nickname)
  277.  
  278.                         Case RegisteredProtectionType.MustIdentifyAfterDelay
  279.                             'allow the Nickname, but force it to a Guest after a certain delay...
  280.  
  281.  
  282.                         Case RegisteredProtectionType.NoProtection
  283.                             'no protection, so do nothing...
  284.  
  285.  
  286.                     End Select
  287.                 End If
  288.  
  289.                 If Server = clsServerCollection.LocalServer.Name Then
  290.                     SendInitialMessages(sb)
  291.                 Else
  292.                     sb.Append(String.Concat("<", UniqueID, " AUTHUSER ", Nickname, " ", Username, " ", Host, " ", RealName, vbCrLf))
  293.                 End If
  294.  
  295.                 If blnNicknameIsRegistered Then
  296.                     NickServInit(sb)
  297.                 End If
  298.  
  299.                 Send(sb, Replicate:=True)
  300.  
  301.             Else
  302.  
  303.                 Authenticated = True
  304.  
  305.             End If
  306.  
  307.         End Sub
  308.  
  309.         Public Sub SendInitialMessages(ByRef sb As StringBuilder)
  310.  
  311.             Dim strFullAddress As String = FullAddress()
  312.  
  313.             Dim RPL_WELCOME As IRCResponse = GetIRCResponse("RPL_WELCOME", _
  314.                                                 Nickname:=Nickname, _
  315.                                                 ServerDesc:=ConfigSetting("description"), _
  316.                                                 FullAddress:=strFullAddress)
  317.  
  318.             Dim RPL_YOURHOST As IRCResponse = GetIRCResponse("RPL_YOURHOST", _
  319.                                                             Nickname:=Nickname, _
  320.                                                             Server:=Server, _
  321.                                                             Version:=IRCVersion)
  322.  
  323.             Dim RPL_CREATED As IRCResponse = GetIRCResponse("RPL_CREATED", _
  324.                                                             Nickname:=Nickname, _
  325.                                                             _Date:=clsMain.CreatedDateTime)
  326.  
  327.             Dim RPL_MYINFO As IRCResponse = GetIRCResponse("RPL_MYINFO", _
  328.                                                             Nickname:=Nickname, _
  329.                                                             Server:=Server, _
  330.                                                             Version:=IRCVersion, _
  331.                                                             UserModes:="io", _
  332.                                                             ChanModes:="kflpsmntuirx")
  333.  
  334.             Dim RPL_ISUPPORT1 As IRCResponse = GetIRCResponse("RPL_ISUPPORT1", _
  335.                                                             Nickname:=Nickname, _
  336.                                                             maxChannelsPerUser:=ConfigSetting("maxChannelsPerUser"), _
  337.                                                             MaxNickLength:=ConfigSetting("maxNicknameLength"), _
  338.                                                             MaxChanLength:=ConfigSetting("maxChannelLength"), _
  339.                                                             MaxTopicLength:=ConfigSetting("maxTopicLength"), _
  340.                                                             MaxKickLength:=ConfigSetting("maxKickLength"), _
  341.                                                             MaxAwayLength:=ConfigSetting("maxAwayLength"))
  342.  
  343.             Dim RPL_ISUPPORT2 As IRCResponse = GetIRCResponse("RPL_ISUPPORT2", _
  344.                                                             Nickname:=Nickname, _
  345.                                                             Server:=Server, _
  346.                                                             ChanTypes:="&#", _
  347.                                                             ChanModes:="kflpsmntuirx", _
  348.                                                             UserModes:="io", _
  349.                                                             UserPrefixes:="(qov).@+")
  350.  
  351.             Dim RPL_LUSERCLIENT As IRCResponse = GetIRCResponse("RPL_LUSERCLIENT", _
  352.                                                             Nickname:=Nickname, _
  353.                                                             UserCount:=clsUserCollection.Users.Count, _
  354.                                                             InvisibleUserCount:="0", _
  355.                                                             UserModes:="io", _
  356.                                                             ServersCount:=clsServerCollection.Servers.Count)
  357.  
  358.             Dim strPrepend As String = String.Empty
  359.  
  360.             If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub AndAlso Server <> clsServerCollection.LocalServer.Name Then
  361.                 strPrepend = String.Concat(">", UniqueID, " ")
  362.                 'sb.Append(String.Concat("<", UniqueID, " AUTHUSER ", Nickname, " ", Username, " ", Host, " ", RealName, vbCrLf))
  363.             End If
  364.  
  365.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_WELCOME.Numeric, " ", RPL_WELCOME.Format, vbCrLf))
  366.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_YOURHOST.Numeric, " ", RPL_YOURHOST.Format, vbCrLf))
  367.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_CREATED.Numeric, " ", RPL_CREATED.Format, vbCrLf))
  368.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_MYINFO.Numeric, " ", RPL_MYINFO.Format, vbCrLf))
  369.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_ISUPPORT1.Numeric, " ", RPL_ISUPPORT1.Format, vbCrLf))
  370.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_ISUPPORT2.Numeric, " ", RPL_ISUPPORT2.Format, vbCrLf))
  371.             sb.Append(String.Concat(strPrepend, ":", Server, " ", RPL_LUSERCLIENT.Numeric, " ", RPL_LUSERCLIENT.Format, vbCrLf))
  372.  
  373.             'MOTD
  374.             Dim ERR_NOMOTD As IRCResponse = GetIRCResponse("ERR_NOMOTD", Nickname:=Nickname)
  375.             sb.Append(String.Concat(strPrepend, ":", Server, " ", ERR_NOMOTD.Numeric, " ", ERR_NOMOTD.Format, vbCrLf))
  376.  
  377.         End Sub
  378.  
  379.         Private Function NickServInit(ByRef sb As StringBuilder) As String
  380.  
  381.             Dim strPrepend As String = String.Empty
  382.  
  383.             Dim strNickname As String = Nickname
  384.  
  385.             If sb Is Nothing Then sb = New StringBuilder
  386.  
  387.             If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub AndAlso Server <> clsServerCollection.LocalServer.Name Then
  388.                 strPrepend = String.Concat(">", UniqueID, " ")
  389.             End If
  390.  
  391.             'display nickserv message "this nickname is regsitered etc"
  392.             sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :The nickname ", Chr(2), NickservNicknameAttempt, Chr(2), " is registered and protected.", vbCrLf))
  393.             Select Case RegisteredProtection
  394.                 Case RegisteredProtectionType.MustIdentify
  395.                     'set the nickname to a Guest until the user identifies...
  396.                     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))
  397.  
  398.                 Case RegisteredProtectionType.MustIdentifyAfterDelay
  399.                     'allow the nickname, but force it to a Guest after a certain delay...
  400.                     sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :You have ", ConfigSetting("changeNicknameDelay"), " seconds to identify.", vbCrLf))
  401.  
  402.                 Case RegisteredProtectionType.NoProtection
  403.                     'no protection, so do nothing...
  404.  
  405.             End Select
  406.  
  407.             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))
  408.             sb.Append(String.Concat(strPrepend, ":NickServ!services@chatcore.org NOTICE ", strNickname, " :Otherwise please change your nickname now.", vbCrLf))
  409.  
  410.             Return sb.ToString
  411.  
  412.         End Function
  413.  
  414.         Public Function FullAddress() As String
  415.  
  416.             If Not RegisteredUser AndAlso Oper Is Nothing Then
  417.                 Return Nickname & "!~" & Username & "@" & Host
  418.             Else
  419.                 Return Nickname & "!" & Username & "@" & Host
  420.             End If
  421.  
  422.         End Function
  423.  
  424.         Public Function FullAddressIP() As String
  425.  
  426.             If Not RegisteredUser AndAlso Oper Is Nothing Then
  427.                 Return Nickname & "!~" & Username & "@" & IP
  428.             Else
  429.                 Return Nickname & "!" & Username & "@" & IP
  430.             End If
  431.  
  432.         End Function
  433.  
  434.         Public Function FullWhoAddress() As String
  435.  
  436.             If Not RegisteredUser AndAlso Oper Is Nothing Then
  437.                 Return String.Concat("~", Username, " ", Host)
  438.             Else
  439.                 Return String.Concat(Username, " ", Host)
  440.             End If
  441.  
  442.         End Function
  443.  
  444.         Public Sub Disconnected(Optional ByVal QuitMessage As String = Nothing, Optional ByVal Replicate As Boolean = False, Optional ByVal DisplayQuit As Boolean = True)
  445.  
  446.             On Error Resume Next
  447.  
  448.             If DisplayQuit Then
  449.                 If QuitMessage Is Nothing Then QuitMessage = String.Empty
  450.  
  451.                 QuitMessage = QuitMessage.Trim
  452.                 '            If QuitMessage = ":" Then QuitMessage = String.Empty
  453.                 If QuitMessage.StartsWith(":") Then QuitMessage = QuitMessage.Substring(1)
  454.  
  455.                 If QuitMessage Is String.Empty Then
  456.                     QuitMessage = "Connection reset by peer"
  457.                 End If
  458.  
  459.                 If QuitMessage IsNot Nothing AndAlso QuitMessage.Trim.Length Then
  460.                     If Channels.Count Then
  461.                         Dim htCommonUsers As Hashtable = CommonUsers()
  462.                         For Each User As DictionaryEntry In htCommonUsers
  463.                             Dim objUser As clsUser = User.Value
  464.                             If objUser IsNot Me Then
  465.                                 objUser.Send(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
  466.                             End If
  467.                         Next
  468.                     End If
  469.                     Send(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
  470.                 End If
  471.             End If
  472.  
  473.             SyncLock _ChannelsLock
  474.                 For i As Integer = _Channels.Count - 1 To 0 Step -1
  475.                     Dim Channel As clsChannel = _Channels(i)
  476.                     If Channel IsNot Nothing Then
  477.                         Channel.RemoveUser(Me)
  478.                         If DisplayQuit Then
  479.                             Channel.AddToRecentHistory(String.Concat(":", FullAddress(), " QUIT ", ":", QuitMessage))
  480.                         End If
  481.                         _Channels.Remove(Channel)
  482.                     End If
  483.                 Next
  484.             End SyncLock
  485.  
  486.             If objClient IsNot Nothing Then
  487.                 objClient.Dispose()
  488.             End If
  489.  
  490.             clsUserCollection.Remove(Me)
  491.  
  492.             Destroy()
  493.  
  494.             If Replicate Then
  495.                 clsServerCollection.Replicate(String.Concat("<", UniqueID, " QUIT ", QuitMessage, vbCrLf))
  496.             End If
  497.  
  498.         End Sub
  499.  
  500.         Public Sub Destroy()
  501.  
  502.             Try
  503.                 If _objClient IsNot Nothing Then
  504.                     If _objClient.sckClient IsNot Nothing Then
  505.                         _objClient.sckClient.Close()
  506.                         _objClient.sckClient = Nothing
  507.                     End If
  508.                     _objClient = Nothing
  509.                 End If
  510.                 SyncLock _InputBufferLock
  511.                     _InputBufferLines.Clear()
  512.                     _InputBufferDelay.Enabled = False
  513.                     _InputBufferDelay = Nothing
  514.                 End SyncLock
  515.                 SyncLock _objPingLock
  516.                     _objPing.Dispose()
  517.                     _objPing = Nothing
  518.                 End SyncLock
  519.             Catch ex As Exception
  520.             End Try
  521.  
  522.         End Sub
  523.  
  524.         Public Function ChangeNickname( _
  525.             ByVal User As clsUser, _
  526.             ByVal NewNickname As String, _
  527.             Optional ByVal SendErrorToUser As Boolean = True, _
  528.             Optional ByVal Force As Boolean = False _
  529.             ) As Boolean
  530.  
  531.             If NewNickname = User.Nickname Then
  532.                 Return True
  533.             End If
  534.  
  535.             Dim blnAlreadyExists As Boolean = False
  536.  
  537.             Dim strOldNickname As String = Nickname
  538.  
  539.             SyncLock _ChannelsLock
  540.  
  541.                 For Each Channel As clsChannel In _Channels
  542.  
  543.                     'If Channel.NicknameFound(NewNickname) Then
  544.                     Dim objUser As clsChannelUser = Channel.Users(NewNickname.ToLower)
  545.                     If objUser IsNot Nothing AndAlso Not objUser.User Is User Then
  546.                         blnAlreadyExists = True
  547.                         Exit For
  548.                     End If
  549.  
  550.                 Next
  551.  
  552.             End SyncLock
  553.  
  554.             If blnAlreadyExists Then
  555.  
  556.                 If SendErrorToUser AndAlso clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  557.  
  558.                     Dim ERR_NICKNAMEINUSE As IRCResponse = GetIRCResponse("ERR_NICKNAMEINUSE", Nickname:=NewNickname)
  559.                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKNAMEINUSE.Numeric, " ", ERR_NICKNAMEINUSE.Format), Replicate:=True)
  560.  
  561.                 End If
  562.  
  563.                 Return False
  564.  
  565.             Else
  566.  
  567.                 'Dim objRegisteredUser As clsRegisteredUser = Nothing
  568.                 Dim blnNicknameIsRegistered As Boolean
  569.  
  570.                 If Not Force Then
  571.                     'objRegisteredUser = clsRegisteredUserCollection.Users(NewNickname.ToLower)
  572.                     'If objRegisteredUser IsNot Nothing AndAlso objRegisteredUser IsNot RegisteredUser Then
  573.                     blnNicknameIsRegistered = clsRegisteredUserCollection.IsNicknameRegistered(Me, NewNickname)
  574.                     If blnNicknameIsRegistered Then
  575.                         NicknameIsRegistered = True
  576.                         RegisteredProtection = RegisteredProtectionType.MustIdentify
  577.                         If RegisteredProtection = RegisteredProtectionType.MustIdentify Then
  578.                             NickservNicknameAttempt = NewNickname
  579.                             NewNickname = "Temp" & Guid.NewGuid.ToString.Substring(0, 6)
  580.                         End If
  581.                         'Else
  582.                         'objRegisteredUser = Nothing
  583.                     End If
  584.                 End If
  585.  
  586.                 SyncLock _ChannelsLock
  587.  
  588.                     'send NICK message to all "common" users
  589.                     If _Channels.Count Then
  590.                         Dim htCommonUsers As Hashtable = CommonUsers()
  591.                         For Each CommonUser As DictionaryEntry In htCommonUsers
  592.                             Dim objUser As clsUser = CommonUser.Value
  593.                             If objUser IsNot Me Then
  594.                                 objUser.Send(String.Concat(":", FullAddress(), " NICK :", NewNickname))
  595.                             End If
  596.                         Next
  597.  
  598.                     End If
  599.  
  600.                     'now send NICK message to self
  601.                     If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  602.                         Send(String.Concat(":", FullAddress(), " NICK :", NewNickname), Replicate:=True)
  603.                     End If
  604.  
  605.                     For Each Channel As clsChannel In _Channels
  606.                         Channel.NicknameChange(Me, strOldNickname, NewNickname)
  607.                     Next
  608.  
  609.                 End SyncLock
  610.  
  611.                 Nickname = NewNickname
  612.  
  613.                 clsUserCollection.NicknameChange(Me, strOldNickname, NewNickname)
  614.  
  615.                 If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  616.                     Dim sbReplicate As New StringBuilder
  617.                     If Not Force Then
  618.                         If Not blnNicknameIsRegistered Then
  619.                             Me.RegisteredProtection = Nothing
  620.                             Me.RegisteredUser = Nothing
  621.                         Else
  622.                             NickServInit(sbReplicate)
  623.                         End If
  624.                         Send(sbReplicate.ToString, False)
  625.                     End If
  626.                     sbReplicate.Append(String.Concat("<", UniqueID, " NICK ", NewNickname, vbCrLf))
  627.                     clsServerCollection.Replicate(sbReplicate.ToString)
  628.                     'Return False
  629.                 End If
  630.  
  631.                 Return True
  632.  
  633.             End If
  634.  
  635.         End Function
  636.  
  637.         Public Function CommonUsers() As Hashtable
  638.  
  639.             Dim ht As New Hashtable
  640.  
  641.             SyncLock _ChannelsLock
  642.  
  643.                 For Each Channel As clsChannel In _Channels
  644.  
  645.                     Channel.FillUniqueUsers(ht)
  646.  
  647.                 Next
  648.  
  649.             End SyncLock
  650.  
  651.             Return ht
  652.  
  653.         End Function
  654.  
  655.         Public Function CommonUser(ByVal Nickname As String) As clsUser
  656.  
  657.             SyncLock _ChannelsLock
  658.  
  659.                 For Each Channel As clsChannel In _Channels
  660.  
  661.                     Dim objChannelUser As clsChannelUser = Channel.Users(Nickname.ToLower)
  662.                     If objChannelUser IsNot Nothing Then
  663.                         Return objChannelUser.User
  664.                     End If
  665.  
  666.                 Next
  667.  
  668.             End SyncLock
  669.  
  670.             Return Nothing
  671.  
  672.         End Function
  673.  
  674.         Private Sub InputBufferDelay_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
  675.  
  676.             Try
  677.                 SyncLock _InputBufferLock
  678.  
  679.                     If _InputBufferLines.Count Then
  680.  
  681.                         Dim objDataLine As DataLine = _InputBufferLines(0)
  682.  
  683.                         DataReceived(objDataLine.Line, objDataLine.SourceServer, FromBuffer:=True)
  684.  
  685.                         _InputBufferLength -= objDataLine.Line.Length
  686.  
  687.                         _InputBufferLines.RemoveAt(0)
  688.  
  689.                         If _InputBufferLines.Count = 0 Then
  690.                             _InputBufferLength = 0
  691.                             _InputBufferDelay.Enabled = False
  692.                         End If
  693.  
  694.                     Else
  695.  
  696.                         _InputBufferLength = 0
  697.                         _InputBufferDelay.Enabled = False
  698.  
  699.                     End If
  700.  
  701.                 End SyncLock
  702.             Catch ex As Exception
  703.  
  704.             End Try
  705.  
  706.         End Sub
  707.  
  708.         Public Sub DataReceived(ByVal Line As String, ByVal SourceServer As String, Optional ByVal FromBuffer As Boolean = False)
  709.  
  710.             Try
  711.  
  712.                 If BeingKilled Then Exit Sub
  713.  
  714.                 If ConfigSetting("debug") = "1" Then OutputToLog(String.Concat("DATA: ", FullAddressIP, " ", Line))
  715.  
  716.                 If SourceServer = clsServerCollection.LocalServer.Name Then
  717.                     'perform Flood control on local clients
  718.  
  719.                     'from RFC 2813:
  720.  
  721.                     '* check to see if client's 'message timer' is less than current time
  722.                     '  (set to be equal if it is);
  723.  
  724.                     '* read any data present from the client;
  725.  
  726.                     '* while the timer is less than ten (10) seconds ahead of the current
  727.                     '  time, parse any present messages and penalize the client by two (2)
  728.                     '  seconds for each message;
  729.  
  730.                     '* additional penalties MAY be used for specific commands which
  731.                     '  generate a lot of traffic across the network.
  732.  
  733.                     'This in essence means that the client may send one (1) message every
  734.                     'two (2) seconds without being adversely affected.  Services MAY also
  735.                     'be subject to this mechanism.
  736.  
  737.                     If Not FromBuffer AndAlso Oper Is Nothing AndAlso Not Line.ToUpper.StartsWith("QUIT") Then
  738.  
  739.                         SyncLock _InputBufferLock
  740.  
  741.                             Dim dtNow As Date = Now().ToUniversalTime
  742.  
  743.                             If _InputBufferTime < dtNow Then
  744.                                 _InputBufferTime = dtNow
  745.                             End If
  746.  
  747.                             If _InputBufferLines.Count = 0 AndAlso DateDiff(DateInterval.Second, dtNow, _InputBufferTime) < 10 Then
  748.                                 Dim intPenality As Integer = 1 + (Line.Length) / 100
  749.                                 _InputBufferTime = DateAdd(DateInterval.Second, intPenality, _InputBufferTime)
  750.                             ElseIf _InputBufferLines.Count <= ConfigSetting("maxInputBufferLines") AndAlso _InputBufferLength <= ConfigSetting("maxInputBufferLength") Then
  751.                                 'add to buffer
  752.                                 Dim objDateLine As New DataLine
  753.                                 objDateLine.Line = Line
  754.                                 objDateLine.SourceServer = SourceServer
  755.                                 _InputBufferLength += Line.Length
  756.                                 _InputBufferLines.Add(objDateLine)
  757.                                 If Not _InputBufferDelay.Enabled Then
  758.                                     _InputBufferDelay.Interval = ConfigSetting("processBufferDelay")
  759.                                     _InputBufferDelay.AutoReset = True
  760.                                     _InputBufferDelay.Enabled = True
  761.                                 End If
  762.                                 Exit Sub
  763.                             Else
  764.                                 'buffer full; user has flooded
  765.                                 Disconnected("Input flooding", Replicate:=True)
  766.                                 Exit Sub
  767.                             End If
  768.  
  769.                         End SyncLock
  770.  
  771.                     End If
  772.  
  773.                 End If
  774.  
  775.                 _objPing.Pong() 'reset ping upon ANY data being sent
  776.  
  777.                 Dim Words() As String = Split(Line, " ")
  778.  
  779.                 Dim blnError As Boolean = False
  780.  
  781.                 Dim strWord0 As String = Words(0).ToUpper
  782.  
  783.                 Select Case strWord0
  784.  
  785.                     Case "PING"
  786.  
  787.                         If Words.Length > 1 Then
  788.                             Send(String.Concat(":", clsMain.IRCServer, " PONG ", clsMain.IRCServer, " :", Words(1)))
  789.                         Else
  790.                             Dim ERR_NOORIGIN As IRCResponse = GetIRCResponse("ERR_NOORIGIN", Nickname:=Nickname)
  791.                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOORIGIN.Numeric, " ", ERR_NOORIGIN.Format))
  792.                         End If
  793.  
  794.                     Case "PONG"
  795.  
  796.                     Case Else
  797.  
  798.                         LastMessageSent = Now.ToUniversalTime
  799.  
  800.                         Select Case strWord0
  801.  
  802.                             Case "WEBIRC"
  803.  
  804.                                 If Words.Length = 5 Then
  805.  
  806.                                     If clsCGIIRCCollection.CGIIRCLogin(IP, Words(1)) Then
  807.                                         IP = Words(3)
  808.                                         Host = GetMD5Hash(String.Concat(IP, "3jr8u9wwrwrtesaf'[]'safs"))
  809.                                         Dim MatchedEntry As New clsAccessEntry
  810.                                         If clsServerCollection.LocalServer.AccessList.EntryCheck(IP, True, MatchedEntry) = EntryResponse.Denied Then
  811.  
  812.                                             Dim strReason As String = String.Empty
  813.                                             If Not String.IsNullOrEmpty(MatchedEntry.Info) Then
  814.                                                 strReason = String.Concat(" (", MatchedEntry.Info, ")")
  815.                                             End If
  816.  
  817.                                             Send(String.Concat( _
  818.                                                  ":", clsServerCollection.LocalServer.Name, " NOTICE ", Nickname, " :You are banned from ", Server, strReason, " Email ", ConfigSetting("adminEmail"), " for more information.", vbCrLf, _
  819.                                                      "ERROR :Closing Link: ", Nickname, "[", DNSLookup, "] (User is banned", strReason, ")"))
  820.                                             Disconnected(QuitMessage:=strReason, Replicate:=True, DisplayQuit:=False)
  821.                                         Else
  822.                                             Webchat = True
  823.                                             DNSLookup = clsUserCollection.GetDNSCache(IP)
  824.                                             If String.IsNullOrEmpty(DNSLookup) Then
  825.                                                 DNSLookup = Dns.GetHostEntry(IP).HostName
  826.                                                 clsUserCollection.AddToDNSCache(IP, DNSLookup)
  827.                                             End If
  828.                                         End If
  829.                                     End If
  830.  
  831.                                 End If
  832.  
  833.                             Case "NICK"
  834.  
  835.                                 If Words.Length > 1 Then
  836.  
  837.                                     If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
  838.                                         Dim strNickname As String = RemoveColon(Words(1))
  839.                                         If clsUserCollection.ValidNickname(strNickname) Then
  840.                                             If Not Authenticated Then Nickname = RemoveColon(Words(1))
  841.                                             If Not String.IsNullOrEmpty(Username) Then
  842.                                                 If Authenticated Then
  843.                                                     'already authenticated, so change this user's nickname...
  844.                                                     If Oper Is Nothing Then
  845.                                                         SyncLock _NickChangeTimeLock
  846.                                                             Dim dtNow As Date = Now().ToUniversalTime
  847.                                                             If _NickChangeTime < dtNow Then
  848.                                                                 _NickChangeTime = DateAdd(DateInterval.Second, ConfigSetting("nicknameChangeDelay"), dtNow)
  849.                                                             Else
  850.                                                                 Dim ERR_NICKTOOFAST As IRCResponse = GetIRCResponse("ERR_NICKTOOFAST", Nickname:=strNickname, Info:=DateDiff(DateInterval.Second, dtNow, _NickChangeTime) + 1)
  851.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKTOOFAST.Numeric, " ", ERR_NICKTOOFAST.Format), Replicate:=True)
  852.                                                                 blnError = True
  853.                                                                 Exit Sub
  854.                                                             End If
  855.                                                         End SyncLock
  856.                                                     ElseIf Oper.Type <> clsOperCollection.OperType.Admin Then
  857.                                                         'do NOT allow bots/sysops/guides to change their nickname
  858.                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=strNickname)
  859.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format), Replicate:=True)
  860.                                                         blnError = True
  861.                                                         Exit Sub
  862.                                                     End If
  863.                                                     blnError = Not ChangeNickname(Me, strNickname)
  864.                                                 Else
  865.                                                     'not yet authenticated, so authenticate this user...
  866.                                                     Authenticate()
  867.                                                     If Not String.IsNullOrEmpty(Password) Then
  868.                                                         DataReceived(String.Concat("OPER ", Username, " ", Password), SourceServer)
  869.                                                     End If
  870.                                                 End If
  871.                                             End If
  872.                                         Else
  873.                                             Dim ERR_ERRONEOUSNICKNAME As IRCResponse = GetIRCResponse("ERR_ERRONEOUSNICKNAME", Nickname:=strNickname)
  874.                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_ERRONEOUSNICKNAME.Numeric, " ", ERR_ERRONEOUSNICKNAME.Format), Replicate:=True)
  875.                                             blnError = True
  876.                                         End If
  877.                                     End If
  878.  
  879.                                 End If
  880.  
  881.                             Case "PASS"
  882.  
  883.                                 If Words.Length > 1 Then
  884.  
  885.                                     If Not Authenticated Then
  886.  
  887.                                         Password = Words(1)
  888.  
  889.                                     End If
  890.  
  891.                                 End If
  892.  
  893.                             Case "USER"
  894.  
  895.                                 If Words.Length > 1 Then
  896.  
  897.                                     If Not Authenticated Then
  898.                                         Username = Words(1)
  899.                                         RealName = RemoveColon(WordRange(Words, 4))
  900.                                         If Server = clsServerCollection.LocalServer.Name Then
  901.                                             Line = String.Concat("USER", " ", Words(1), " ", Host, " ", clsServerCollection.LocalServer.Name, " :", RealName)
  902.                                         Else
  903.                                             Host = Words(2)
  904.                                         End If
  905.                                         If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
  906.                                             'If Not String.IsNullOrEmpty(Nickname) AndAlso Server = clsServerCollection.LocalServer.Name Then
  907.                                             If Not String.IsNullOrEmpty(Nickname) Then
  908.                                                 Authenticate()
  909.                                                 If Not String.IsNullOrEmpty(Password) Then
  910.                                                     DataReceived(String.Concat("OPER ", Username, " ", Password), SourceServer)
  911.                                                 End If
  912.                                             End If
  913.                                         End If
  914.                                     End If
  915.  
  916.                                 End If
  917.  
  918.                             Case Else
  919.  
  920.                                 If Not Authenticated Then
  921.  
  922.                                     'not authenticated yet; return error
  923.                                     Dim ERR_NOTREGISTERED As IRCResponse = GetIRCResponse("ERR_NOTREGISTERED")
  924.                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTREGISTERED.Numeric, " ", ERR_NOTREGISTERED.Format))
  925.  
  926.                                     blnError = True
  927.  
  928.                                 Else
  929.  
  930.                                     Select Case strWord0
  931.  
  932.                                         Case "IRCX"
  933.  
  934.                                             Send(String.Concat(":", clsMain.IRCServer, " 800 ", Nickname, " 1 0 ANON 512 *"))
  935.  
  936.                                         Case "QUIT"
  937.  
  938.                                             Disconnected(WordRange(Words, 1))
  939.  
  940.                                         Case "JOIN"
  941.  
  942.                                             If Words.Length > 1 Then
  943.  
  944.                                                 Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
  945.  
  946.                                                 Dim strKey As String = Nothing
  947.                                                 If Words.Count > 2 Then
  948.                                                     strKey = Words(2)
  949.                                                 End If
  950.  
  951.                                                 For Each Channel As String In strChannels
  952.                                                     clsChannelCollection.Join(Me, Channel, strKey)
  953.                                                 Next
  954.  
  955.                                             End If
  956.  
  957.                                         Case "PART"
  958.  
  959.                                             If Words.Length > 1 Then
  960.  
  961.                                                 Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
  962.  
  963.                                                 For Each Channel As String In strChannels
  964.                                                     clsChannelCollection.Part(Me, Channel)
  965.                                                 Next
  966.  
  967.                                             End If
  968.  
  969.                                         Case "AWAY"
  970.  
  971.                                             If Words.Length > 1 Then
  972.                                                 Dim strReason As String = RemoveColon(WordRange(Words, 1))
  973.                                                 Dim RPL_USERNOWAWAY As IRCResponse = GetIRCResponse("RPL_USERNOWAWAY", Info:=strReason)
  974.                                                 SendCommonUsers(String.Concat(":", FullAddress, " ", RPL_USERNOWAWAY.Numeric, " ", RPL_USERNOWAWAY.Format))
  975.                                                 Dim RPL_NOWAWAY As IRCResponse = GetIRCResponse("RPL_NOWAWAY", Nickname:=Nickname)
  976.                                                 Send(String.Concat(":", clsMain.IRCServer, " ", RPL_NOWAWAY.Numeric, " ", RPL_NOWAWAY.Format))
  977.                                                 Away = strReason
  978.                                             Else
  979.                                                 Dim RPL_USERUNAWAY As IRCResponse = GetIRCResponse("RPL_USERUNAWAY")
  980.                                                 SendCommonUsers(String.Concat(":", FullAddress, " ", RPL_USERUNAWAY.Numeric, " ", RPL_USERUNAWAY.Format))
  981.                                                 Dim RPL_UNAWAY As IRCResponse = GetIRCResponse("RPL_UNAWAY", Nickname:=Nickname)
  982.                                                 Send(String.Concat(":", clsMain.IRCServer, " ", RPL_UNAWAY.Numeric, " ", RPL_UNAWAY.Format))
  983.                                                 Away = String.Empty
  984.                                             End If
  985.  
  986.                                         Case "WHO"
  987.  
  988.                                             If Words.Length > 1 Then
  989.  
  990.                                                 Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
  991.  
  992.                                                 For Each Target As String In strTargets
  993.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
  994.                                                     If objChannel Is Nothing Then
  995.                                                         Dim arrUsers As ArrayList = clsUserCollection.FindByExpression(Target.ToLower, SearchRealName:=True)
  996.                                                         Dim sb As New StringBuilder
  997.                                                         If arrUsers IsNot Nothing AndAlso arrUsers.Count Then
  998.                                                             For Each TargetUser As clsUser In arrUsers
  999.                                                                 If TargetUser.Channels.Count Then
  1000.                                                                     Dim objFirstChannel As clsChannel = TargetUser.Channels(0)
  1001.                                                                     Dim objTargetChannelUser As clsChannelUser = objFirstChannel.Users(TargetUser.Nickname.ToLower)
  1002.                                                                     Dim RPL_WHOREPLY As IRCResponse = GetIRCResponse("RPL_WHOREPLY", Channel:=objFirstChannel.Name, Nickname:=TargetUser.Nickname, Info:=objFirstChannel.WhoLine(objTargetChannelUser))
  1003.                                                                     sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOREPLY.Numeric, " ", RPL_WHOREPLY.Format, vbCrLf))
  1004.                                                                 Else
  1005.                                                                     Dim RPL_WHOREPLY As IRCResponse = GetIRCResponse("RPL_WHOREPLY", Channel:="*", Nickname:=TargetUser.Nickname, Info:=TargetUser.WhoLine)
  1006.                                                                     sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOREPLY.Numeric, " ", RPL_WHOREPLY.Format, vbCrLf))
  1007.                                                                 End If
  1008.                                                             Next
  1009.                                                         End If
  1010.                                                         Dim RPL_ENDOFWHO As IRCResponse = GetIRCResponse("RPL_ENDOFWHO", _Object:=Target, Nickname:=Nickname)
  1011.                                                         sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFWHO.Numeric, " ", RPL_ENDOFWHO.Format, vbCrLf))
  1012.                                                         Send(sb)
  1013.                                                     Else
  1014.                                                         objChannel.SendWhoList(Me)
  1015.                                                     End If
  1016.                                                 Next
  1017.  
  1018.                                             End If
  1019.  
  1020.                                         Case "WHOIS"
  1021.  
  1022.                                             If Words.Length > 1 Then
  1023.  
  1024.                                                 Dim sb As New StringBuilder
  1025.  
  1026.                                                 Dim strTarget As String = RemoveColon(Words(1))
  1027.  
  1028.                                                 Dim strTargets() As String = Split(strTarget, ",")
  1029.  
  1030.                                                 For Each Target As String In strTargets
  1031.  
  1032.                                                     Dim arrUsers As ArrayList = clsUserCollection.FindByExpression(Target.ToLower)
  1033.  
  1034.                                                     If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
  1035.                                                         Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=Target)
  1036.                                                         sb.Append(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format, vbCrLf))
  1037.                                                     Else
  1038.  
  1039.                                                         For Each TargetUser As clsUser In arrUsers
  1040.  
  1041.                                                             Dim strChannels As String = TargetUser.WhoisChannels.Trim
  1042.  
  1043.                                                             Dim strWhoisUser As String = String.Empty
  1044.  
  1045.                                                             Dim RPL_WHOISUSER As IRCResponse = GetIRCResponse("RPL_WHOISUSER", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat(TargetUser.FullWhoAddress, " * :", TargetUser.RealName))
  1046.                                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISUSER.Numeric, " ", RPL_WHOISUSER.Format, vbCrLf))
  1047.  
  1048.                                                             If Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper AndAlso HasPowerOver(TargetUser) Then
  1049.                                                                 Dim RPL_WHOISHOST As IRCResponse = GetIRCResponse("RPL_WHOISHOST", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat("*@", TargetUser.DNSLookup, " ", TargetUser.IP))
  1050.                                                                 sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISHOST.Numeric, " ", RPL_WHOISHOST.Format, vbCrLf))
  1051.                                                             End If
  1052.  
  1053.                                                             If strChannels.Length Then
  1054.                                                                 Dim RPL_WHOISCHANNELS As IRCResponse = GetIRCResponse("RPL_WHOISCHANNELS", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=strChannels)
  1055.                                                                 sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISCHANNELS.Numeric, " ", RPL_WHOISCHANNELS.Format, vbCrLf))
  1056.                                                             End If
  1057.  
  1058.                                                             Dim RPL_WHOISSERVER As IRCResponse = GetIRCResponse("RPL_WHOISSERVER", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=String.Concat(Server, " :IRCX Network"))
  1059.                                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISSERVER.Numeric, " ", RPL_WHOISSERVER.Format, vbCrLf))
  1060.  
  1061.                                                             If TargetUser.Oper IsNot Nothing AndAlso TargetUser.Oper.Type <> clsOperCollection.OperType.NoOper Then
  1062.                                                                 Dim strOperInfo As String
  1063.                                                                 If TargetUser.Oper.Type = clsOperCollection.OperType.Admin Then
  1064.                                                                     strOperInfo = "is a Network Administrator"
  1065.                                                                 ElseIf TargetUser.Oper.Type = clsOperCollection.OperType.Sysop OrElse TargetUser.Oper.Type = clsOperCollection.OperType.Bot Then
  1066.                                                                     strOperInfo = "is an IRC Operator"
  1067.                                                                 ElseIf TargetUser.Oper.Type = clsOperCollection.OperType.Guide Then
  1068.                                                                     strOperInfo = "is an IRC Guide"
  1069.                                                                 End If
  1070.                                                                 Dim RPL_WHOISOPERATOR As IRCResponse = GetIRCResponse("RPL_WHOISOPERATOR", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=strOperInfo)
  1071.                                                                 sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISOPERATOR.Numeric, " ", RPL_WHOISOPERATOR.Format, vbCrLf))
  1072.                                                             End If
  1073.  
  1074.                                                             If Not String.IsNullOrEmpty(TargetUser.Away) Then
  1075.                                                                 Dim RPL_WHOISAWAY As IRCResponse = GetIRCResponse("RPL_WHOISAWAY", Nickname:=Nickname, _Object:=TargetUser.Nickname, Info:=TargetUser.Away)
  1076.                                                                 sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISAWAY.Numeric, " ", RPL_WHOISAWAY.Format, vbCrLf))
  1077.                                                             End If
  1078.  
  1079.                                                             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))
  1080.                                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_WHOISIDLE.Numeric, " ", RPL_WHOISIDLE.Format, vbCrLf))
  1081.  
  1082.                                                         Next
  1083.  
  1084.                                                     End If
  1085.  
  1086.                                                 Next
  1087.  
  1088.                                                 Dim RPL_ENDOFWHOIS As IRCResponse = GetIRCResponse("RPL_ENDOFWHOIS", Nickname:=Nickname, _Object:=strTarget)
  1089.                                                 sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFWHOIS.Numeric, " ", RPL_ENDOFWHOIS.Format, vbCrLf))
  1090.  
  1091.                                                 If sb.Length Then
  1092.                                                     Send(sb)
  1093.                                                 End If
  1094.  
  1095.                                                 ':core.ircx.net.pl 311 Bench yodel ~andrew xxxxxxxxxxxxxxxxxxxxxx.perr.cable.virginmedia.com * :Andrew Gee
  1096.                                                 ':core.ircx.net.pl 319 Bench yodel :.#chatcore
  1097.                                                 ':core.ircx.net.pl 312 Bench yodel core.ircx.net.pl :IRCX Network [wts]
  1098.                                                 ':core.ircx.net.pl 301 Bench yodel :s
  1099.                                                 ':core.ircx.net.pl 317 Bench yodel 6 1300400334 :seconds idle, signon time
  1100.                                                 ':core.ircx.net.pl 318 Bench yodel :End of /WHOIS list
  1101.  
  1102.  
  1103.                                             End If
  1104.  
  1105.                                         Case "MODE"
  1106.  
  1107.                                             If Words.Length > 1 Then
  1108.  
  1109.                                                 Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
  1110.  
  1111.                                                 For Each Channel As String In strChannels
  1112.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
  1113.                                                     If objChannel Is Nothing Then
  1114.                                                         Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Nickname:=Nickname, Channel:=Channel)
  1115.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
  1116.                                                     Else
  1117.                                                         If Words.Length > 2 Then
  1118.                                                             'channel mode is being set
  1119.                                                             Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1120.                                                             If (objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me) OrElse Oper IsNot Nothing Then
  1121.                                                                 objChannel.SetModes(WordRange(Words, 2), objChannelUser)
  1122.                                                                 If objChannel.Registered Then
  1123.                                                                     clsRegisteredChannelCollection.SaveChannel(objChannel, Me)
  1124.                                                                 End If
  1125.                                                             Else
  1126.                                                                 Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Channel, Nickname:=Nickname)
  1127.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
  1128.                                                             End If
  1129.                                                         Else
  1130.                                                             'channel modes are being returned
  1131.                                                             Dim RPL_CHANNELMODEIS As IRCResponse = GetIRCResponse("RPL_CHANNELMODEIS", Channel:=Channel, Mode:=objChannel.GetModes, Nickname:=Nickname)
  1132.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", RPL_CHANNELMODEIS.Numeric, " ", RPL_CHANNELMODEIS.Format))
  1133.                                                         End If
  1134.                                                     End If
  1135.                                                 Next
  1136.  
  1137.                                             End If
  1138.  
  1139.                                         Case "TOPIC"
  1140.  
  1141.                                             If Words.Length > 1 Then
  1142.  
  1143.                                                 Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
  1144.  
  1145.                                                 For Each Channel As String In strChannels
  1146.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
  1147.                                                     If objChannel Is Nothing Then
  1148.                                                         Dim ERR_NOSUCHCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHCHANNEL", Channel:=Channel)
  1149.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHCHANNEL.Numeric, " ", ERR_NOSUCHCHANNEL.Format))
  1150.                                                     Else
  1151.                                                         Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1152.                                                         If objChannelUser Is Nothing OrElse (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Oper Is Nothing) Then
  1153.                                                             Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Channel:=Channel, Nickname:=Nickname)
  1154.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
  1155.                                                         Else
  1156.                                                             objChannel.Topic = RemoveColon(WordRange(Words, 2))
  1157.                                                             objChannel.Send(String.Concat(":", FullAddress, " TOPIC ", objChannel.Name, " :", objChannel.Topic))
  1158.                                                             If objChannel.Registered Then
  1159.                                                                 clsRegisteredChannelCollection.SaveChannel(objChannel, Me)
  1160.                                                             End If
  1161.                                                         End If
  1162.                                                     End If
  1163.                                                 Next
  1164.  
  1165.                                             End If
  1166.  
  1167.                                         Case "KICK"
  1168.  
  1169.                                             If Words.Length > 1 Then
  1170.  
  1171.                                                 Dim strChannels() As String = Split(RemoveColon(Words(1)), ",")
  1172.  
  1173.                                                 For Each Channel As String In strChannels
  1174.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Channel.ToLower)
  1175.                                                     If objChannel Is Nothing Then
  1176.                                                         Dim ERR_NOSUCHCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHCHANNEL", Channel:=Channel)
  1177.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHCHANNEL.Numeric, " ", ERR_NOSUCHCHANNEL.Format))
  1178.                                                     Else
  1179.                                                         Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1180.                                                         If Oper Is Nothing AndAlso (objChannelUser Is Nothing OrElse (Not objChannelUser.Owner AndAlso Not objChannelUser.Host)) Then
  1181.                                                             Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Channel:=Channel, Nickname:=Nickname)
  1182.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
  1183.                                                         Else
  1184.                                                             Dim strNicknames() As String = Split(RemoveColon(Words(2)), ",")
  1185.                                                             For Each NicknameToKick As String In strNicknames
  1186.                                                                 Dim objUserToKick As clsChannelUser = objChannel.Users(NicknameToKick.ToLower)
  1187.                                                                 If objUserToKick Is Nothing Then
  1188.                                                                     Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=NicknameToKick)
  1189.                                                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
  1190.                                                                 Else
  1191.                                                                     If Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Oper Is Nothing Then
  1192.                                                                         Dim ERR_CHANOPRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOPRIVSNEEDED", Nickname:=Nickname, Channel:=objChannel.Name)
  1193.                                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOPRIVSNEEDED.Numeric, " ", ERR_CHANOPRIVSNEEDED.Format))
  1194.                                                                     ElseIf objChannelUser.HasPowerOver(objChannel, objUserToKick) Then
  1195.                                                                         Dim strReason As String = String.Empty
  1196.                                                                         If Words.Length > 3 Then
  1197.                                                                             strReason = RemoveColon(WordRange(Words, 3))
  1198.                                                                         End If
  1199.                                                                         objChannel.Send(String.Concat(":", FullAddress, " KICK ", objChannel.Name, " ", objUserToKick.User.Nickname, " :", strReason))
  1200.                                                                         objChannel.RemoveUser(objUserToKick.User)
  1201.                                                                     ElseIf objChannelUser.Host AndAlso objUserToKick.Owner Then
  1202.                                                                         Dim ERR_CHANOWNERRIVSNEEDED As IRCResponse = GetIRCResponse("ERR_CHANOWNERRIVSNEEDED", Channel:=objChannel.Name, Nickname:=Nickname)
  1203.                                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CHANOWNERRIVSNEEDED.Numeric, " ", ERR_CHANOWNERRIVSNEEDED.Format))
  1204.                                                                     Else
  1205.                                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1206.                                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1207.                                                                     End If
  1208.                                                                 End If
  1209.                                                             Next
  1210.                                                         End If
  1211.                                                     End If
  1212.                                                 Next
  1213.  
  1214.                                             End If
  1215.  
  1216.                                         Case "KILL"
  1217.  
  1218.                                             If Words.Length > 1 Then
  1219.  
  1220.                                                 clsUserCollection.ParseKill(Me, Words)
  1221.  
  1222.                                             End If
  1223.  
  1224.                                         Case "KLINE"
  1225.  
  1226.                                             If Words.Length > 1 Then
  1227.  
  1228.                                                 clsUserCollection.ParseKill(Me, Words, BanIP:=True)
  1229.  
  1230.                                             End If
  1231.  
  1232.                                         Case "CHANSERV", "CS"
  1233.  
  1234.                                             '    0     1      2     3     4
  1235.                                             'chanserv aop #channel add nickname
  1236.  
  1237.                                             If Words.Length > 1 Then
  1238.  
  1239.                                                 Select Case Words(1).ToUpper
  1240.  
  1241.                                                     Case "AOP"
  1242.  
  1243.                                                         If Words.Length > 2 Then
  1244.  
  1245.                                                             Dim strChannel As String = Words(2)
  1246.  
  1247.                                                             Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
  1248.  
  1249.                                                             If objChannel IsNot Nothing Then
  1250.  
  1251.                                                                 Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1252.  
  1253.                                                                 If objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me Then
  1254.  
  1255.                                                                     If Words.Length > 4 Then
  1256.  
  1257.                                                                         Select Case Words(3).ToUpper
  1258.  
  1259.                                                                             Case "ADD"
  1260.  
  1261.                                                                                 Dim strNickname As String = Words(4)
  1262.  
  1263.                                                                                 If clsRegisteredUserCollection.IsNicknameRegistered(Me, strNickname) Then
  1264.                                                                                     objChannel.AccessList.Parse(Me, objChannel.Name, String.Concat("ADD HOST ", strNickname), objChannel)
  1265.                                                                                 End If
  1266.  
  1267.                                                                         End Select
  1268.  
  1269.                                                                     End If
  1270.  
  1271.                                                                 End If
  1272.  
  1273.                                                             End If
  1274.  
  1275.                                                         End If
  1276.  
  1277.                                                     Case "DROP"
  1278.  
  1279.                                                         'chanserv drop #channel
  1280.  
  1281.                                                         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
  1282.  
  1283.                                                             If Words.Length > 2 Then
  1284.  
  1285.                                                                 Dim strChannel As String = Words(2)
  1286.  
  1287.                                                                 Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
  1288.  
  1289.                                                                 If objChannel IsNot Nothing Then
  1290.  
  1291.                                                                     If objChannel.Registered Then
  1292.  
  1293.                                                                         If (Oper IsNot Nothing AndAlso (Oper.Type = clsOperCollection.OperType.Admin OrElse Oper.Type = clsOperCollection.OperType.Sysop)) OrElse objChannel.Founder.ToLower = Nickname.ToLower Then
  1294.                                                                             If clsRegisteredChannelCollection.DropChannel(objChannel) Then
  1295.                                                                                 Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel registration for ", Chr(2), strChannel, Chr(2), " has been cancelled.", vbCrLf), SendToServer:=True)
  1296.                                                                             End If
  1297.                                                                         Else
  1298.                                                                             Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Access denied.", vbCrLf), SendToServer:=True)
  1299.                                                                         End If
  1300.                                                                     Else
  1301.                                                                         Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " isn't registered.", vbCrLf), SendToServer:=True)
  1302.                                                                     End If
  1303.  
  1304.                                                                 Else
  1305.                                                                     Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " isn't registered.", vbCrLf), SendToServer:=True)
  1306.                                                                 End If
  1307.  
  1308.                                                             Else
  1309.                                                                 Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "DROP ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
  1310.                                                             End If
  1311.                                                         Else
  1312.                                                             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)
  1313.                                                         End If
  1314.  
  1315.                                                     Case "REGISTER"
  1316.                                                         'chanserv register #channel
  1317.  
  1318.                                                         If Me.RegisteredUser OrElse (Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper) Then
  1319.  
  1320.                                                             If Words.Length > 2 Then
  1321.  
  1322.                                                                 Dim strChannel As String = Words(2)
  1323.  
  1324.                                                                 Dim objChannel As clsChannel = clsChannelCollection.Channels(strChannel.ToLower)
  1325.  
  1326.                                                                 If objChannel IsNot Nothing Then
  1327.  
  1328.                                                                     If Not objChannel.Registered Then
  1329.  
  1330.                                                                         Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1331.  
  1332.                                                                         If objChannelUser IsNot Nothing AndAlso objChannelUser.User Is Me Then
  1333.  
  1334.                                                                             If objChannelUser.Owner Then
  1335.  
  1336.                                                                                 If clsRegisteredChannelCollection.RegisterChannel(objChannel, Me) Then
  1337.                                                                                     Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " is now registered under your account.", vbCrLf), SendToServer:=True)
  1338.                                                                                 End If
  1339.  
  1340.                                                                             Else
  1341.  
  1342.                                                                                 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)
  1343.  
  1344.                                                                             End If
  1345.  
  1346.                                                                         End If
  1347.  
  1348.                                                                     Else
  1349.                                                                         Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Channel ", Chr(2), strChannel, Chr(2), " is already registered.", vbCrLf), SendToServer:=True)
  1350.                                                                     End If
  1351.  
  1352.                                                                 End If
  1353.  
  1354.                                                             Else
  1355.                                                                 Send(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
  1356.                                                             End If
  1357.  
  1358.                                                         Else
  1359.                                                             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)
  1360.  
  1361.                                                         End If
  1362.  
  1363.                                                     Case "HELP"
  1364.  
  1365.                                                         Dim sb As New StringBuilder
  1366.  
  1367.                                                         If Words.Length < 3 Then
  1368.  
  1369.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "ChanServ", Chr(2), " allows you to ""register"" a channel and", vbCrLf))
  1370.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :prevent others from creating it or taking it over.", vbCrLf))
  1371.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :There are only 2 commands on this server:", vbCrLf))
  1372.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
  1373.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :    REGISTER   Register a channel", vbCrLf))
  1374.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :    DROP   Cancel the registration of a channel", vbCrLf))
  1375.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "NOTICE: ", Chr(2), "When you register a room, you will automatically", vbCrLf))
  1376.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :have an Owner access entry added to the channel.", vbCrLf))
  1377.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :This cannot be removed. You will also be protected from other", vbCrLf))
  1378.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :owners of the channel.", vbCrLf))
  1379.  
  1380.                                                         ElseIf Words(2).ToUpper = "REGISTER" Then
  1381.  
  1382.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "REGISTER ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf))
  1383.  
  1384.                                                         ElseIf Words(2).ToUpper = "DROP" Then
  1385.  
  1386.                                                             sb.Append(String.Concat(":ChanServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "DROP ", Chr(31), "channel", Chr(31), Chr(2), vbCrLf))
  1387.  
  1388.                                                         End If
  1389.  
  1390.                                                         Send(sb, SendToServer:=True)
  1391.  
  1392.                                                 End Select
  1393.  
  1394.                                             End If
  1395.  
  1396.                                         Case "NICKSERV", "NS"
  1397.  
  1398.                                             If Words.Length > 1 Then
  1399.  
  1400.                                                 If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  1401.  
  1402.                                                     Select Case Words(1).ToUpper
  1403.  
  1404.                                                         Case "IDENTIFY"
  1405.  
  1406.                                                             If Words.Length = 3 Then
  1407.                                                                 If clsRegisteredUserCollection.Identify(Me, Words(2)) Then
  1408.  
  1409.                                                                 End If
  1410.                                                             Else
  1411.                                                                 Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "IDENTIFY ", Chr(31), "password", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
  1412.                                                             End If
  1413.  
  1414.                                                         Case "REGISTER"
  1415.  
  1416.                                                             If Words.Length = 4 Then
  1417.                                                                 If Not Nickname.StartsWith("'") Then
  1418.                                                                     clsRegisteredUserCollection.RegisterUser(Me, Words(2), Words(3))
  1419.                                                                 End If
  1420.                                                             Else
  1421.                                                                 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)
  1422.                                                             End If
  1423.  
  1424.                                                         Case "CHANGE"
  1425.  
  1426.                                                             If Words.Length = 3 Then
  1427.                                                                 If clsRegisteredUserCollection.ChangeNickname(Me, Words(2)) Then
  1428.  
  1429.                                                                 End If
  1430.                                                             Else
  1431.                                                                 Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "CHANGE ", Chr(31), "NewNickname", Chr(31), Chr(2), vbCrLf), SendToServer:=True)
  1432.                                                             End If
  1433.  
  1434.                                                         Case "DROP"
  1435.  
  1436.                                                             If Oper IsNot Nothing AndAlso Oper.Type <> clsOperCollection.OperType.NoOper Then
  1437.                                                                 If Oper.Type = clsOperCollection.OperType.Admin Then
  1438.                                                                     If Words.Length > 2 Then
  1439.                                                                         clsRegisteredUserCollection.DropUser(Words(2))
  1440.                                                                     End If
  1441.                                                                 Else
  1442.                                                                     Send(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Access denied.", vbCrLf), SendToServer:=True)
  1443.                                                                 End If
  1444.                                                             Else
  1445.                                                                 clsRegisteredUserCollection.DropUser(Me)
  1446.                                                             End If
  1447.  
  1448.                                                         Case "HELP"
  1449.  
  1450.                                                                 Dim sb As New StringBuilder
  1451.  
  1452.                                                                 If Words.Length < 3 Then
  1453.  
  1454.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", Chr(2), "NickServ", Chr(2), " allows you to ""register"" a nickname and", vbCrLf))
  1455.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :prevent others from using it.", vbCrLf))
  1456.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :There are only 4 commands on this server:", vbCrLf))
  1457.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
  1458.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :    REGISTER   Register a nickname", vbCrLf))
  1459.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :    IDENTIFY   Identify yourself with your password", vbCrLf))
  1460.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :    CHANGE   Change your nickname.", vbCrLf))
  1461.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :    DROP   Cancel your nickserv registration.", vbCrLf))
  1462.                                                                     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))
  1463.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :will automatically add an Owner access entry for your Nickname.", vbCrLf))
  1464.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :This is secure because no other users can use your", vbCrLf))
  1465.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :nickname without first identifying.", vbCrLf))
  1466.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :", vbCrLf))
  1467.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :If you change your nickname, via ""/NickServ CHANGE"", the", vbCrLf))
  1468.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :server will automatically update your access entry across", vbCrLf))
  1469.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :all relevant channels.", vbCrLf))
  1470.  
  1471.                                                                 ElseIf Words(2).ToUpper = "REGISTER" Then
  1472.  
  1473.                                                                     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))
  1474.  
  1475.                                                                 ElseIf Words(2).ToUpper = "IDENTIFY" Then
  1476.  
  1477.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "IDENTIFY ", Chr(31), "password", Chr(31), Chr(2), vbCrLf))
  1478.  
  1479.                                                                 ElseIf Words(2).ToUpper = "CHANGE" Then
  1480.  
  1481.                                                                     sb.Append(String.Concat(":NickServ!services@chatcore.org NOTICE ", Nickname, " :Syntax: ", Chr(2), "CHANGE ", Chr(31), "NewNickname", Chr(31), Chr(2), vbCrLf))
  1482.  
  1483.  
  1484.                                                                 End If
  1485.  
  1486.                                                                 Send(sb, SendToServer:=True)
  1487.  
  1488.                                                     End Select
  1489.  
  1490.                                                 End If
  1491.  
  1492.                                             End If
  1493.  
  1494.                                         Case "PRIVMSG"
  1495.  
  1496.                                             If Words.Length > 1 Then
  1497.  
  1498.                                                 Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
  1499.                                                 Dim strMessage As String = String.Empty
  1500.  
  1501.                                                 For Each Target As String In strTargets
  1502.  
  1503.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
  1504.  
  1505.                                                     If objChannel IsNot Nothing Then
  1506.                                                         Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1507.                                                         If Oper Is Nothing Then 'opers bypass all channel restrictions
  1508.                                                             If (objChannelUser Is Nothing OrElse objChannelUser.User IsNot Me) AndAlso objChannel.ModeNoExternalMessages Then
  1509.                                                                 Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Target, Nickname:=Nickname)
  1510.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
  1511.                                                                 Continue For
  1512.                                                             End If
  1513.                                                             If objChannel.ModeModerated AndAlso (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Not objChannelUser.Voice) Then
  1514.                                                                 Dim ERR_CANNOTSENDTOCHAN As IRCResponse = GetIRCResponse("ERR_CANNOTSENDTOCHAN", Channel:=Target, Nickname:=Nickname)
  1515.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CANNOTSENDTOCHAN.Numeric, " ", ERR_CANNOTSENDTOCHAN.Format))
  1516.                                                                 Continue For
  1517.                                                             End If
  1518.                                                         End If
  1519.                                                         strMessage = RemoveColon(WordRange(Words, 2))
  1520.                                                         objChannel.Send(String.Concat(":", FullAddress, " PRIVMSG ", objChannel.Name, " :", strMessage), Me)
  1521.                                                     Else
  1522.                                                         Dim objTargetUser As clsUser = CommonUser(Target)
  1523.                                                         If objTargetUser IsNot Nothing Then
  1524.                                                             strMessage = RemoveColon(WordRange(Words, 2))
  1525.                                                             objTargetUser.Send(String.Concat(":", FullAddress, " PRIVMSG ", objTargetUser.Nickname, " :", strMessage))
  1526.                                                         Else
  1527.                                                             Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Channel:=Target, Nickname:=Nickname)
  1528.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
  1529.                                                         End If
  1530.                                                     End If
  1531.  
  1532.                                                 Next
  1533.  
  1534.                                             End If
  1535.  
  1536.                                         Case "NOTICE"
  1537.  
  1538.                                             If Words.Length > 1 Then
  1539.  
  1540.                                                 Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
  1541.                                                 Dim strMessage As String = String.Empty
  1542.  
  1543.                                                 For Each Target As String In strTargets
  1544.  
  1545.                                                     Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
  1546.  
  1547.                                                     If objChannel IsNot Nothing Then
  1548.                                                         Dim objChannelUser As clsChannelUser = objChannel.Users(Nickname.ToLower)
  1549.                                                         If Oper Is Nothing Then 'opers bypass all channel restrictions
  1550.                                                             If (objChannelUser Is Nothing OrElse objChannelUser.User IsNot Me) AndAlso objChannel.ModeNoExternalMessages Then
  1551.                                                                 Dim ERR_NOTONCHANNEL As IRCResponse = GetIRCResponse("ERR_NOTONCHANNEL", Channel:=Target, Nickname:=Nickname)
  1552.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOTONCHANNEL.Numeric, " ", ERR_NOTONCHANNEL.Format))
  1553.                                                                 Continue For
  1554.                                                             End If
  1555.                                                             If objChannel.ModeModerated AndAlso (Not objChannelUser.Owner AndAlso Not objChannelUser.Host AndAlso Not objChannelUser.Voice) Then
  1556.                                                                 Dim ERR_CANNOTSENDTOCHAN As IRCResponse = GetIRCResponse("ERR_CANNOTSENDTOCHAN", Channel:=Target, Nickname:=Nickname)
  1557.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_CANNOTSENDTOCHAN.Numeric, " ", ERR_CANNOTSENDTOCHAN.Format))
  1558.                                                                 Continue For
  1559.                                                             End If
  1560.                                                         End If
  1561.                                                         strMessage = RemoveColon(WordRange(Words, 2))
  1562.                                                         objChannel.Send(String.Concat(":", FullAddress, " NOTICE ", objChannel.Name, " :", strMessage), Me, WebchattersOnly:=(strMessage.Contains("WEBCHATINFO")))
  1563.                                                     Else
  1564.                                                         Dim objTargetUser As clsUser = CommonUser(Target)
  1565.                                                         If objTargetUser IsNot Nothing Then
  1566.                                                             strMessage = RemoveColon(WordRange(Words, 2))
  1567.                                                             objTargetUser.Send(String.Concat(":", FullAddress, " NOTICE ", objTargetUser.Nickname, " :", strMessage))
  1568.                                                         Else
  1569.                                                             Dim ERR_NOSUCHNICKORCHANNEL As IRCResponse = GetIRCResponse("ERR_NOSUCHNICKORCHANNEL", Channel:=Target, Nickname:=Nickname)
  1570.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICKORCHANNEL.Numeric, " ", ERR_NOSUCHNICKORCHANNEL.Format))
  1571.                                                         End If
  1572.                                                     End If
  1573.  
  1574.                                                 Next
  1575.  
  1576.                                             End If
  1577.  
  1578.                                         Case "ACCESS"
  1579.  
  1580.                                             'Syntax 1:
  1581.                                             '
  1582.                                             'ACCESS <object> LIST
  1583.                                             'Syntax 2:
  1584.                                             '
  1585.                                             'ACCESS <object> ADD|DELETE <level> <mask> [<timeout> [:<reason>]]
  1586.                                             'Syntax 3:
  1587.                                             '
  1588.                                             'ACCESS <object> CLEAR [<level>]
  1589.  
  1590.                                             If Words.Length > 1 Then
  1591.  
  1592.                                                 Dim strTargets() As String = Split(RemoveColon(Words(1)), ",")
  1593.  
  1594.                                                 For Each Target As String In strTargets
  1595.  
  1596.                                                     If Target = "*" OrElse Target = "$" Then
  1597.                                                         If Oper IsNot Nothing AndAlso (Oper.Type = clsOperCollection.OperType.Admin OrElse Oper.Type = clsOperCollection.OperType.Sysop OrElse Oper.Type = clsOperCollection.OperType.Bot) Then
  1598.                                                             If Target = "*" OrElse Server = clsServerCollection.LocalServer.Name Then
  1599.                                                                 clsServerCollection.LocalServer.AccessList.Parse(Me, Target, WordRange(Words, 2))
  1600.                                                             End If
  1601.                                                         Else
  1602.                                                             Dim IRCERR_NOACCESS As IRCResponse = GetIRCResponse("IRCERR_NOACCESS", _Object:=Target, Nickname:=Nickname)
  1603.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOACCESS.Numeric, " ", IRCERR_NOACCESS.Format))
  1604.                                                         End If
  1605.                                                     ElseIf Target.ToLower = Nickname.ToLower OrElse clsUserCollection.NicknameExists(Target) Then
  1606.                                                         If Target.ToLower = Nickname.ToLower OrElse Oper IsNot Nothing Then
  1607.                                                             Dim objTargetUser As clsUser = clsUserCollection.UsersByNickname(Target)
  1608.                                                             objTargetUser.AccessList.Parse(Me, Target, WordRange(Words, 2))
  1609.                                                         Else
  1610.                                                             Dim IRCERR_NOACCESS As IRCResponse = GetIRCResponse("IRCERR_NOACCESS", _Object:=Target, Nickname:=Nickname)
  1611.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOACCESS.Numeric, " ", IRCERR_NOACCESS.Format))
  1612.                                                         End If
  1613.                                                     Else
  1614.                                                         Dim objChannel As clsChannel = clsChannelCollection.Channels(Target.ToLower)
  1615.                                                         If objChannel IsNot Nothing Then
  1616.                                                             objChannel.AccessList.Parse(Me, Target, WordRange(Words, 2), objChannel)
  1617.                                                         Else
  1618.                                                             Dim IRCERR_NOSUCHOBJECT As IRCResponse = GetIRCResponse("IRCERR_NOSUCHOBJECT", _Object:=Target, Nickname:=Nickname)
  1619.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_NOSUCHOBJECT.Numeric, " ", IRCERR_NOSUCHOBJECT.Format))
  1620.                                                         End If
  1621.                                                     End If
  1622.                                                 Next
  1623.  
  1624.                                             End If
  1625.  
  1626.                                         Case "OPER"
  1627.  
  1628.                                             If clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub OrElse SourceServer = clsServerCollection.HubServer.Name Then
  1629.  
  1630.                                                 If Words.Length = 3 Then
  1631.  
  1632.                                                     Dim objOper As clsOper = clsOperCollection.Authenticate(Words(1), Words(2), Me)
  1633.  
  1634.                                                     If objOper Is Nothing Then
  1635.                                                         Dim ERR_NOOPERHOST As IRCResponse = GetIRCResponse("ERR_NOOPERHOST", Nickname:=Nickname)
  1636.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOOPERHOST.Numeric, " ", ERR_NOOPERHOST.Format), Replicate:=True)
  1637.                                                     Else
  1638.                                                         Dim strNewNickname As String = objOper.Nick, blnChangeNickname As Boolean = Not Nickname = strNewNickname
  1639.                                                         If blnChangeNickname Then
  1640.                                                             If strNewNickname <> Nickname Then
  1641.                                                                 SyncLock clsOperCollection._OpersLock
  1642.                                                                     SyncLock _ChannelsLock
  1643.  
  1644.                                                                         For Each Channel As clsChannel In _Channels
  1645.  
  1646.                                                                             Dim objUser As clsChannelUser = Channel.Users(strNewNickname.ToLower)
  1647.                                                                             If objUser IsNot Nothing AndAlso Not objUser.User Is Me Then
  1648.                                                                                 Dim ERR_NICKNAMEINUSE As IRCResponse = GetIRCResponse("ERR_NICKNAMEINUSE", Nickname:=strNewNickname)
  1649.                                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NICKNAMEINUSE.Numeric, " ", ERR_NICKNAMEINUSE.Format), Replicate:=True)
  1650.                                                                                 blnError = True
  1651.                                                                                 Exit Sub
  1652.                                                                             End If
  1653.                                                                         Next
  1654.  
  1655.                                                                     End SyncLock
  1656.                                                                 End SyncLock
  1657.                                                             End If
  1658.                                                         End If
  1659.  
  1660.                                                         Host = ConfigSetting("operHost")
  1661.                                                         Oper = objOper
  1662.                                                         OperType = objOper.Type
  1663.                                                         ':irc.chatcore.org 381 Bench :You are now an IRC Operator
  1664.                                                         If blnChangeNickname Then ChangeNickname(Me, strNewNickname, False, True)
  1665.                                                         Dim RPL_YOUREOPER As IRCResponse = GetIRCResponse("RPL_YOUREOPER", Nickname:=Nickname)
  1666.                                                         Dim sb As New StringBuilder
  1667.                                                         sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_YOUREOPER.Numeric, " ", RPL_YOUREOPER.Format, vbCrLf))
  1668.                                                         If Server <> clsServerCollection.LocalServer.Name Then
  1669.                                                             sb.Append(String.Concat("<", UniqueID, " HOSTCHANGE ", Host, vbCrLf))
  1670.                                                         End If
  1671.                                                         SyncLock _ChannelsLock
  1672.                                                             For Each Channel As clsChannel In _Channels
  1673.                                                                 DataReceived(String.Concat("MODE ", Channel.Name, " +q ", Nickname), SourceServer)
  1674.                                                             Next
  1675.                                                         End SyncLock
  1676.                                                         Send(sb, Replicate:=True)
  1677.                                                         Dim strOperChannel As String = ConfigSetting("operChannel")
  1678.                                                         If Not String.IsNullOrEmpty(strOperChannel) Then
  1679.                                                             clsChannelCollection.Join(Me, strOperChannel, Force:=True)
  1680.                                                         End If
  1681.                                                     End If
  1682.  
  1683.                                                 End If
  1684.  
  1685.                                             End If
  1686.  
  1687.                                         Case "LISTX"
  1688.  
  1689.                                             clsChannelCollection.OutputChannelList(Me, IRCX:=True)
  1690.  
  1691.                                         Case "LIST"
  1692.  
  1693.                                             clsChannelCollection.OutputChannelList(Me, IRCX:=False)
  1694.  
  1695.                                         Case "TIME"
  1696.  
  1697.                                             Dim RPL_TIME As IRCResponse = GetIRCResponse("RPL_TIME", Nickname:=Nickname, Info:=Now().ToUniversalTime.ToString("ddd MMM dd HH:mm:ss yyyy"), Server:=Server)
  1698.                                             Send(String.Concat(":", clsMain.IRCServer, " ", RPL_TIME.Numeric, " ", RPL_TIME.Format))
  1699.  
  1700.                                         Case "VERSION"
  1701.  
  1702.                                             Dim RPL_VERSION As IRCResponse = GetIRCResponse("RPL_VERSION", Nickname:=Nickname, Info:=String.Concat(clsMain.IRCVersion, " ", Server, " ", clsMain.IRCInfo))
  1703.                                             Send(String.Concat(":", clsMain.IRCServer, " ", RPL_VERSION.Numeric, " ", RPL_VERSION.Format))
  1704.  
  1705.                                         Case "INFO"
  1706.  
  1707.                                             Dim sb As New StringBuilder
  1708.  
  1709.                                             Dim RPL_INFO1 As IRCResponse = GetIRCResponse("RPL_INFO", Nickname:=Nickname, Info:=clsMain.IRCInfo)
  1710.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_INFO1.Numeric, " ", RPL_INFO1.Format, vbCrLf))
  1711.  
  1712.                                             Dim RPL_INFO2 As IRCResponse = GetIRCResponse("RPL_INFO", Nickname:=Nickname, Info:=String.Concat("On-line since ", clsServerCollection.LocalServer.OnlineSince))
  1713.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_INFO2.Numeric, " ", RPL_INFO2.Format, vbCrLf))
  1714.  
  1715.                                             Dim RPL_ENDOFINFO As IRCResponse = GetIRCResponse("RPL_ENDOFINFO", Nickname:=Nickname, Info:=String.Concat("On-line since ", clsServerCollection.LocalServer.OnlineSince))
  1716.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ENDOFINFO.Numeric, " ", RPL_ENDOFINFO.Format, vbCrLf))
  1717.  
  1718.                                             Send(sb)
  1719.  
  1720.                                         Case "ADMIN"
  1721.  
  1722.                                             Dim sb As New StringBuilder
  1723.  
  1724.                                             Dim RPL_ADMINME As IRCResponse = GetIRCResponse("RPL_ADMINME", Nickname:=Nickname, Server:=Server)
  1725.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINME.Numeric, " ", RPL_ADMINME.Format, vbCrLf))
  1726.  
  1727.                                             Dim RPL_ADMINLOC1 As IRCResponse = GetIRCResponse("RPL_ADMINLOC1", Nickname:=Nickname, Info:=ConfigSetting("admin1"))
  1728.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINLOC1.Numeric, " ", RPL_ADMINLOC1.Format, vbCrLf))
  1729.  
  1730.                                             Dim RPL_ADMINLOC2 As IRCResponse = GetIRCResponse("RPL_ADMINLOC2", Nickname:=Nickname, Info:=ConfigSetting("admin2"))
  1731.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINLOC2.Numeric, " ", RPL_ADMINLOC2.Format, vbCrLf))
  1732.  
  1733.                                             Dim RPL_ADMINEMAIL As IRCResponse = GetIRCResponse("RPL_ADMINEMAIL", Nickname:=Nickname, Info:=ConfigSetting("adminEmail"))
  1734.                                             sb.Append(String.Concat(":", clsMain.IRCServer, " ", RPL_ADMINEMAIL.Numeric, " ", RPL_ADMINEMAIL.Format, vbCrLf))
  1735.  
  1736.                                             Send(sb)
  1737.  
  1738.                                         Case "REHASH"
  1739.  
  1740.                                             If Oper IsNot Nothing Then
  1741.  
  1742.                                                 If OperType = clsOperCollection.OperType.Admin Then
  1743.  
  1744.                                                     clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "REHASH", Chr(2)), OpersOnly:=True)
  1745.                                                     clsMain.Rehash()
  1746.  
  1747.                                                 Else
  1748.  
  1749.                                                     Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1750.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1751.  
  1752.                                                 End If
  1753.  
  1754.                                             Else
  1755.  
  1756.                                                 Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1757.                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1758.  
  1759.                                             End If
  1760.  
  1761.                                         Case "RESET"
  1762.  
  1763.                                             If Oper IsNot Nothing Then
  1764.  
  1765.                                                 If OperType = clsOperCollection.OperType.Admin Then
  1766.  
  1767.                                                     clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "RESET", Chr(2)), OpersOnly:=True)
  1768.                                                     Reset()
  1769.  
  1770.                                                 Else
  1771.  
  1772.                                                     Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1773.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1774.  
  1775.                                                 End If
  1776.  
  1777.                                             Else
  1778.  
  1779.                                                 Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1780.                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1781.  
  1782.                                             End If
  1783.  
  1784.                                         Case "DIE"
  1785.  
  1786.                                             If Oper IsNot Nothing Then
  1787.  
  1788.                                                 If OperType = clsOperCollection.OperType.Admin Then
  1789.  
  1790.                                                     clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "DIE", Chr(2)), OpersOnly:=True)
  1791.                                                     Application.Exit()
  1792.  
  1793.                                                 Else
  1794.  
  1795.                                                     Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1796.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1797.  
  1798.                                                 End If
  1799.  
  1800.                                             Else
  1801.  
  1802.                                                 Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1803.                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1804.  
  1805.                                             End If
  1806.  
  1807.                                         Case "GLOBAL"
  1808.  
  1809.                                             If Words.Length > 1 Then
  1810.  
  1811.                                                 If Oper IsNot Nothing Then
  1812.  
  1813.                                                     If OperType = clsOperCollection.OperType.Admin OrElse OperType = clsOperCollection.OperType.Sysop Then
  1814.  
  1815.                                                         clsUserCollection.SendGlobal(RemoveColon(WordRange(Words, 1)), OpersOnly:=False)
  1816.  
  1817.                                                     Else
  1818.  
  1819.                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1820.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1821.  
  1822.                                                     End If
  1823.  
  1824.                                                 Else
  1825.  
  1826.                                                     Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1827.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1828.  
  1829.                                                 End If
  1830.  
  1831.                                             End If
  1832.  
  1833.                                         Case "FNICK"
  1834.  
  1835.                                             If Words.Length = 3 Then
  1836.  
  1837.                                                 If Oper IsNot Nothing Then
  1838.  
  1839.                                                     If OperType = clsOperCollection.OperType.Admin Then
  1840.  
  1841.                                                         Dim strTargetNickname As String = Words(1)
  1842.  
  1843.                                                         If Not clsUserCollection.ValidNickname(Words(2)) Then
  1844.                                                             Dim ERR_ERRONEOUSNICKNAME As IRCResponse = GetIRCResponse("ERR_ERRONEOUSNICKNAME", Nickname:=strTargetNickname)
  1845.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_ERRONEOUSNICKNAME.Numeric, " ", ERR_ERRONEOUSNICKNAME.Format), Replicate:=True)
  1846.                                                         Else
  1847.  
  1848.                                                             Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(strTargetNickname.ToLower)
  1849.  
  1850.                                                             If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
  1851.                                                                 Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=strTargetNickname)
  1852.                                                                 Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
  1853.                                                             Else
  1854.  
  1855.                                                                 Dim strOldNickname As String = arrUsers(0).Nickname
  1856.  
  1857.                                                                 Dim arrUsersToChange As New ArrayList
  1858.  
  1859.                                                                 For Each TargetUser As clsUser In arrUsers
  1860.  
  1861.                                                                     If Not HasPowerOver(TargetUser) Then
  1862.                                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1863.                                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1864.                                                                     Else
  1865.                                                                         arrUsersToChange.Add(TargetUser)
  1866.                                                                     End If
  1867.  
  1868.                                                                 Next
  1869.  
  1870.                                                                 For Each TargetUser As clsUser In arrUsersToChange
  1871.  
  1872.                                                                     TargetUser.ChangeNickname(TargetUser, Words(2), False, True)
  1873.  
  1874.                                                                 Next
  1875.  
  1876.                                                                 clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "FNICK", Chr(2), " (", strOldNickname, " to ", Words(2), ")"), OpersOnly:=True)
  1877.  
  1878.                                                             End If
  1879.  
  1880.                                                         End If
  1881.  
  1882.                                                     Else
  1883.  
  1884.                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1885.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1886.  
  1887.                                                     End If
  1888.  
  1889.                                                 Else
  1890.  
  1891.                                                     Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1892.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1893.  
  1894.                                                 End If
  1895.  
  1896.                                             End If
  1897.  
  1898.                                         Case "FJOIN"
  1899.  
  1900.                                             If Words.Length = 3 Then
  1901.  
  1902.                                                 If Oper IsNot Nothing Then
  1903.  
  1904.                                                     If OperType = clsOperCollection.OperType.Admin OrElse OperType = clsOperCollection.OperType.Sysop OrElse OperType = clsOperCollection.OperType.Bot Then
  1905.  
  1906.                                                         Dim strTargetNickname As String = Words(1)
  1907.  
  1908.                                                         Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(strTargetNickname.ToLower)
  1909.  
  1910.                                                         If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
  1911.                                                             Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Nickname, _Object:=strTargetNickname)
  1912.                                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
  1913.                                                         Else
  1914.  
  1915.                                                             Dim arrUsersToChange As New ArrayList
  1916.  
  1917.                                                             For Each TargetUser As clsUser In arrUsers
  1918.  
  1919.                                                                 If Not HasPowerOver(TargetUser) Then
  1920.                                                                     Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1921.                                                                     Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1922.                                                                 Else
  1923.                                                                     arrUsersToChange.Add(TargetUser)
  1924.                                                                 End If
  1925.  
  1926.                                                             Next
  1927.  
  1928.                                                             For Each TargetUser As clsUser In arrUsersToChange
  1929.  
  1930.                                                                 'TargetUser.ChangeNickname(TargetUser, Words(2), False, True)
  1931.                                                                 clsChannelCollection.Join(TargetUser, Words(2), Force:=True)
  1932.  
  1933.                                                             Next
  1934.  
  1935.                                                             clsUserCollection.SendGlobal(String.Concat(Nickname, " used ", Chr(2), "FJOIN", Chr(2), " (", arrUsers(0).Nickname, " to ", Words(2), ")"), OpersOnly:=True)
  1936.  
  1937.                                                         End If
  1938.  
  1939.                                                     Else
  1940.  
  1941.                                                         Dim IRCERR_SECURITY As IRCResponse = GetIRCResponse("IRCERR_SECURITY", Nickname:=Nickname)
  1942.                                                         Send(String.Concat(":", clsMain.IRCServer, " ", IRCERR_SECURITY.Numeric, " ", IRCERR_SECURITY.Format))
  1943.  
  1944.                                                     End If
  1945.  
  1946.                                                 Else
  1947.  
  1948.                                                     Dim ERR_NOPRIVILEGES As IRCResponse = GetIRCResponse("ERR_NOPRIVILEGES", Nickname:=Nickname)
  1949.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOPRIVILEGES.Numeric, " ", ERR_NOPRIVILEGES.Format))
  1950.  
  1951.                                                 End If
  1952.  
  1953.                                             End If
  1954.  
  1955.                                         Case "USERHOST"
  1956.  
  1957.                                             ':core.ircx.net.pl 302 yodel :wyleniauy*=+digit@nts
  1958.                                             ':core.ircx.net.pl 302 yodel :WaS*=+bfcior@bf
  1959.                                             If Words.Length > 1 Then
  1960.  
  1961.                                                 Dim arrUsers As ArrayList = clsUserCollection.UsersByNickname(Words(1).ToLower)
  1962.  
  1963.                                                 If arrUsers Is Nothing OrElse arrUsers.Count = 0 Then
  1964.                                                     Dim ERR_NOSUCHNICK As IRCResponse = GetIRCResponse("ERR_NOSUCHNICK", Nickname:=Words(1), _Object:=Words(1))
  1965.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", ERR_NOSUCHNICK.Numeric, " ", ERR_NOSUCHNICK.Format))
  1966.                                                 Else
  1967.                                                     Dim objUser As clsUser = arrUsers(0)
  1968.                                                     Dim RPL_USERHOST As IRCResponse = GetIRCResponse("RPL_USERHOST", Nickname:=Nickname, _Object:=objUser.Nickname, Info:=String.Concat(objUser.Username, "@", objUser.Host))
  1969.                                                     Send(String.Concat(":", clsMain.IRCServer, " ", RPL_USERHOST.Numeric, " ", RPL_USERHOST.Format))
  1970.                                                 End If
  1971.  
  1972.                                             End If
  1973.  
  1974.                                         Case Else
  1975.  
  1976.                                             Dim ERR_UNKNOWNCOMMAND As IRCResponse = GetIRCResponse("ERR_UNKNOWNCOMMAND", Nickname:=Nickname, Command:=strWord0)
  1977.                                             Send(String.Concat(":", clsMain.IRCServer, " ", ERR_UNKNOWNCOMMAND.Numeric, " ", ERR_UNKNOWNCOMMAND.Format))
  1978.  
  1979.                                     End Select
  1980.  
  1981.                                 End If
  1982.  
  1983.                         End Select
  1984.  
  1985.                 End Select
  1986.  
  1987.                 If Not blnError Then
  1988.                     'send this message on (if Hub, send to Leafs... if Leaf send to Hub)
  1989.                     If SourceServer <> clsServerCollection.HubServer.Name OrElse clsServerCollection.LocalServer.Type = clsServerCollection.ServerType.Hub Then
  1990.                         clsServerCollection.Replicate(String.Concat("<", UniqueID, " ", Line, vbCrLf), Server)
  1991.                     End If
  1992.                 End If
  1993.  
  1994.             Catch ex As Exception
  1995.  
  1996.                 'MsgBox("Error: ", ex.Message)
  1997.                 OutputToLog("ERROR: " & ex.Message)
  1998.  
  1999.             End Try
  2000.  
  2001.         End Sub
  2002.  
  2003.         Private Sub _objPing_PingTimeout() Handles _objPing.PingTimeout
  2004.  
  2005.             'user has failed to reply with a PONG, within ConfigSetting("pingInterval")
  2006.             Disconnected("Ping Timeout")
  2007.  
  2008.         End Sub
  2009.  
  2010.         Private Sub _objClient_Disconnected() Handles _objClient.Disconnected
  2011.  
  2012.             Disconnected()
  2013.  
  2014.         End Sub
  2015.  
  2016.         Private Sub _objClient_ReceiveData(ByVal Lines() As String) Handles _objClient.ReceiveData
  2017.  
  2018.             For Each Line As String In Lines
  2019.  
  2020.                 Line = Line.Trim()
  2021.  
  2022.                 If Line.Length Then
  2023.  
  2024.                     DataReceived(Line, Server)
  2025.  
  2026.                 End If
  2027.  
  2028.             Next
  2029.  
  2030.         End Sub
  2031.  
  2032.         Public Function HasPowerOver(ByVal Target As clsUser) As Boolean
  2033.  
  2034.             Dim objOper As clsOper = Oper
  2035.             Dim objOperTarget As clsOper = Target.Oper
  2036.  
  2037.             If Me Is Target Then
  2038.                 Return True
  2039.             ElseIf objOperTarget IsNot Nothing AndAlso objOperTarget.Type <> clsOperCollection.OperType.NoOper Then
  2040.                 If objOper Is Nothing OrElse objOper.Type = clsOperCollection.OperType.NoOper Then
  2041.                     Return False
  2042.                 Else
  2043.                     If objOperTarget.Type = clsOperCollection.OperType.Admin Then
  2044.                         If objOper.Type = clsOperCollection.OperType.Admin Then
  2045.                             Return True
  2046.                         Else
  2047.                             Return False
  2048.                         End If
  2049.                     ElseIf objOperTarget.Type = clsOperCollection.OperType.Sysop OrElse objOperTarget.Type = clsOperCollection.OperType.Bot Then
  2050.                         If objOper.Type = clsOperCollection.OperType.Guide Then
  2051.                             Return False
  2052.                         Else
  2053.                             Return True
  2054.                         End If
  2055.                     Else
  2056.                         Return True
  2057.                     End If
  2058.                 End If
  2059.             ElseIf objOper IsNot Nothing AndAlso objOper.Type <> clsOperCollection.OperType.NoOper Then
  2060.                 Return True
  2061.             End If
  2062.  
  2063.             Return False
  2064.  
  2065.         End Function
  2066.  
  2067.         Public Function WhoisChannels() As String
  2068.  
  2069.             Dim sb As New StringBuilder
  2070.  
  2071.             SyncLock _ChannelsLock
  2072.  
  2073.                 For Each Channel As clsChannel In _Channels
  2074.  
  2075.                     Dim objChannelUser As clsChannelUser = Channel.Users(Nickname.ToLower)
  2076.  
  2077.                     If objChannelUser IsNot Nothing Then
  2078.                         If objChannelUser.Owner Then
  2079.                             sb.Append(".")
  2080.                         ElseIf objChannelUser.Host Then
  2081.                             sb.Append("@")
  2082.                         End If
  2083.                         sb.Append(String.Concat(Channel.Name, " "))
  2084.                     End If
  2085.  
  2086.                 Next
  2087.  
  2088.             End SyncLock
  2089.  
  2090.             Return sb.ToString.Trim
  2091.  
  2092.         End Function
  2093.  
  2094.         Public Function WhoLine() As String
  2095.  
  2096.             Dim strWhoLine As String = String.Empty
  2097.  
  2098.             If RegisteredUser = False AndAlso Oper Is Nothing Then
  2099.                 strWhoLine = "~"
  2100.             End If
  2101.  
  2102.             strWhoLine &= String.Concat(Username, " ", Host, " ", Server, " ", Nickname, " ")
  2103.  
  2104.             If String.IsNullOrEmpty(Away) Then
  2105.                 strWhoLine &= "H"
  2106.             Else
  2107.                 strWhoLine &= "G"
  2108.             End If
  2109.  
  2110.             If Oper IsNot Nothing Then
  2111.                 If Oper.Type = clsOperCollection.OperType.Admin Then
  2112.                     strWhoLine &= "a"
  2113.                 Else
  2114.                     strWhoLine &= "*"
  2115.                 End If
  2116.             End If
  2117.  
  2118.             strWhoLine &= String.Concat(" :0 ", RealName)
  2119.  
  2120.             Return strWhoLine
  2121.  
  2122.         End Function
  2123.  
  2124.     End Class
  2125.  
  2126. End Namespace
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement