Valhalla Legends Forums Archive | Battle.net Bot Development | [VB6] Parsing 0x65

AuthorMessageTime
JoeTheOdd
Heres my parser for it. It spits out ugly messages, and is horribly inefficent at doing so. There has got to be an easier way than this! Anyhow, heres what I've managed to do.

[quote][12:56:10 AM] [BNCS-DEBUG] Friends List:
[12:56:10 AM] [BNCS-DEBUG] krazed[x86] (Mutual Away) is in chat and using StarCraft Expansion in the channel op x86.
[12:56:10 AM] [BNCS-DEBUG] ersan is offline.
[12:56:10 AM] [BNCS-DEBUG] x86 is in chat and using WarCraft II: BNE.
[12:56:10 AM] [BNCS-DEBUG] WirE is offline.
[12:56:10 AM] [BNCS-DEBUG] vuther is offline.
[12:56:10 AM] [BNCS-DEBUG] InsaneJoey[x86] is offline.
[12:56:10 AM] [BNCS-DEBUG] Screenor is in chat and using WarCraft II: BNE.
[12:56:10 AM] [BNCS-DEBUG] HdxBmx27 is offline.[/quote]

[quote]'Status Constants
Private Const bMutual      As Byte = &H1
Private Const bDND        As Byte = &H2
Private Const bAway        As Byte = &H3

'Location Constants
Private Const bOffline    As Byte = &H0
Private Const bNotInChat  As Byte = &H1
Private Const bInChat      As Byte = &H2
Private Const bInPubGame  As Byte = &H3
Private Const bInPrivGame  As Byte = &H4

Public Sub ParseFriends(S As String)
    Call AddChat(frmMain.rtbChat, True, vbYellow, "[BNCS-DEBUG] Friends List:")
    Dim Debuff As clsDebuffer, i As Byte, Name As String, Status As Byte, Location As Byte, ProductID As String, Channel As String
    Set Debuff = New clsDebuffer
    With Debuff
        Let .Buffer = S
        Call .RemoveHeader(4) 'Remove Header
        For i = 1 To .RemoveByte
            Name = .RemoveNTString
            Status = .RemoveByte
            Location = .RemoveByte
            ProductID = .RemoveVoid(4)
            Channel = .RemoveNTString
            Call AddChat(frmMain.rtbChat, True, vbYellow, AssembleMessage(Name, ParseStatus(Status), ParseLocation(Location), modMain.GetProductName(ProductID), Channel))
        Next i
    End With
End Sub

Private Function ParseStatus(B As Byte) As String
    Dim Mutual As Boolean, DND As Boolean, Away As Boolean
    If B And bMutual Then Mutual = True
    If B And bDND Then DND = True
    If B And bAway Then Away = True
   
    Dim Ret As String
    Ret = Ret & IIf(Mutual, "Mutual ", vbNullString)
    Ret = Ret & IIf(DND, "DND ", vbNullString)
    Ret = Ret & IIf(Away, "Away", vbNullString)
   
    ParseStatus = Ret
End Function

Public Function ParseLocation(B As Byte)
    Select Case B
        Case bOffline
            ParseLocation = "offline"
        Case bNotInChat
            ParseLocation = "not in chat"
        Case bInChat
            ParseLocation = "in chat"
        Case bInPubGame
            ParseLocation = "in public game"
        Case bInPrivGame
            ParseLocation = "in private game"
    End Select
End Function

Public Function AssembleMessage(Name As String, Status As String, Location As String, ProductID As String, Channel As String)
        Dim Ret As String
        Let Ret = Ret & "[BNCS-DEBUG] "
        Let Ret = Ret & Name
        Let Ret = Ret & Space(1) & IIf(Len(Status) = 0, vbNullString, "(" & Status & ") ")
        Let Ret = Ret & "is " & Location
        If Location = "offline" Then AssembleMessage = Ret & ".": Exit Function
        Let Ret = Ret & " and using " & ProductID
        If Location = "not in chat" Then AssembleMessage = Ret & ".": Exit Function
        If Location = "in chat" And InStr(1, Status, "Mutual") Then AssembleMessage = Ret & " in the channel " & Channel & ".": Exit Function
        Let AssembleMessage = Ret & ".": Exit Function
        'Call AddChat(frmMain.rtbChat, True, vbYellow, "[BNCS-DEBUB] " & Name & "(" & ParseStatus(Status) & ") is " & ParseLocation(Location) & " using " & modMain.GetProductName(ProductID) & " in " & Channel & ".")
End Function[/quote]


EDIT -
More code.

[code]Private Sub CSB_UnhandledPacket(SocketName As String, Packet As String, RawData As String, HexData As String)
    Select Case Mid(Packet, 4)
        Case "65"
            Call ParseFriends(RawData)
        Case Else
            '...
    End Select
End Sub[/code]

[quote]Private Sub tmrFriends_Timer()
    If CSB.Connected Then Call CSB.BuildPacket("BNET", "PACKET", &H65)
End Sub[/quote]

Yes, I am using CSB. Leave me alone. /cry.
August 15, 2005, 6:58 AM
Myndfyr
I don't think it's that inefficient, unless your debuffer is horribly inefficient.  The only place you could really tune that is when you're formatting the string.  You might be able to speed it up with sprintf or something, but I don't really think that's necessary.
August 15, 2005, 3:55 PM

Search