Author | Message | Time |
---|---|---|
JoeTheOdd | The fun bit of coding we could all do anyhow, heres the BnChat class I wrote. If you find any errors, PM me or reply here, and I'll have them fixed ASAP. [code]'--------------------------------------------------------------------------------------- ' Module : clsBnChat ' Author : JoeTheOdd ' Purpose : Provide a CSB-Like interface for the BnChat protocol '--------------------------------------------------------------------------------------- Private WithEvents sckBNET As CSocket 'Our CSocket Class - Winsock replacement Private sServer As String 'String that will hold Server Private sUsername As String 'String that will hold username Private sPassword As String 'String that will hold password 'Our Events 'Each of these will be "raised" when it occurs Public Event LoggedOnAs(Username As String) Public Event JoinedChannel(Channel As String) Public Event UserInChannel(Username As String, Flags As Integer, Product As String) Public Event Info(Message As String) Public Event Error(Message As String) Public Event UserTalks(Username As String, Message As String) Public Event UserJoins(Username As String, Flags As Integer, Product As String) Public Event UserLeaves(Username As String, Flags As Integer) Public Event Unhandled(sData As String) Public Event sckConnecting() Public Event sckConnected() Public Event sckError() 'Property Let/Get's 'We will use these to set the username, password, and server strings Public Property Let Username(Username As String) sUsername = Username End Property Public Property Get Username() As String Username = sUsername End Property Public Property Let Password(Password As String) sPassword = Password End Property Public Property Get Password() As String Password = sPassword End Property Public Property Let Server(Username As String) sServer = Server End Property Public Property Get Server() As String Server = sServer End Property 'This fires when the class initiates - create our socket Private Sub Class_Initialize() Set sckBNET = New CSocket End Sub 'The user will call this sub to connect to Bnet Public Sub Connect() Call sckBNET.Connect(sServer, 6112) End Sub 'We connect to bnet, raise event and send logon info Private Sub sckBNET_OnConnect() RaiseEvent sckConnected wsBNET.SendData Chr(3) & Chr(4) & sUsername & vbCrLf & sPassword & vbCrLf End Sub 'We recieve data from bnet. split data and parse it Private Sub sckBNET_OnDataArrival(ByVal bytesTotal As Long) wsBNET.GetData s, 8 If CBool(InStr(1, s, vbCrLf)) Then Dim Splt() As String, i As Integer Splt = Split(s, vbCrLf) For i = LBound(Splt) To UBound(Splt) If Not CStr(Splt(i)) = "" Then Call ParseBNET(CStr(Splt(i))) Next i Else If Not CStr(s) = "" Then Call ParseBNET(CStr(s)) End If End Sub 'Theres an error with the Bnet socket Private Sub sckBNET_OnError(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Call AddChat(vbRed, "[BNET] Error " & CStr(Number) & Space(1) & Description) End Sub 'This will be used to get STRING[]'s from the data Public Function GetString(s As String) As String GetString = Mid(s, InStr(1, s, Chr(34)) + 1, Len(s) - (InStr(1, s, Chr(34)) + 1)) End Function 'This does all the actual parsing Private Sub ParseBNET(sData As String) Dim Splt() As String Splt = Split(sData, Space(1)) Select Case Splt(1) Case "from", "Password:", "NULL", "'anonymous'", "your" Exit Sub Case "NAME" Username = Splt(2) RaiseEvent LoggedOnAs(Username) Case "CHANNEL" Channel = GetString(sData) RaiseEvent JoinedChannel(Channel) Case "USER" Username = Splt(2) Flags = Val("&H" & Splt(3)) Product = Mid(Splt(3), 2, 4) RaiseEvent UserInChannel(Username, Flags, Product) Case "INFO" Message = GetString(sData) RaiseEvent Info(Message) Case "ERROR" Message = GetString(sData) RaiseEvent Error(Message) Case "TALK" Username = Splt(2) Message = GetString(sData) RaiseEvent UserTalks(Username, Message) Case "JOIN" Username = Splt(2) Flags = Val("&H" & Splt(3)) Product = Mid(Splt(3), 2, 4) RaiseEvent UserJoins(Username, Flags, Product) Case "LEAVE" Username = Splt(2) Flags = Val("&H" & Splt(3)) RaiseEvent UserLeaves(Username, Flags) Case Else RaiseEvent Unhandled(sData) End Select End Sub[/code] EDIT: I got stupid and left out all the actual connection stuff. Also, please excuse my 3:42 AM comments. | April 4, 2005, 8:31 AM |