Make it easier to extract strings, and pull more data out of the welcome packet.

This commit is contained in:
Justin Hawkins 2020-11-22 12:53:23 +10:30
parent 207d5b32e0
commit 3e8ccf3df1

View File

@ -20,7 +20,15 @@ import (
// OpenTTDServer - an object representing the server connection // OpenTTDServer - an object representing the server connection
type OpenTTDServer struct { type OpenTTDServer struct {
connection net.Conn connection net.Conn
serverName string ServerName string
ServerVersion string
ServerDedicated bool // is this a dedicated server?
MapName string
MapSeed uint32
MapLandscape byte
MapX uint16
MapY uint16
rconDaily []string rconDaily []string
rconMonthly []string rconMonthly []string
rconYearly []string rconYearly []string
@ -296,8 +304,28 @@ SocketLoop:
// fmt.Print(" - Got a adminPacketServerPROTOCOL packet\n") // fmt.Print(" - Got a adminPacketServerPROTOCOL packet\n")
} else if packetType == adminPacketServerWELCOME { } else if packetType == adminPacketServerWELCOME {
log.Println("received welcome packet") log.Println("received welcome packet")
server.serverName = extractString(packetData[0:]) fmt.Printf("packet: %+v?\n", packetData[:])
// fmt.Printf(" * server name: %s\n", serverName) var next int
server.ServerName, next = extractString(packetData[:], 0)
server.ServerVersion, next = extractString(packetData[:], next)
if (packetData[next] == 0000) {
server.ServerDedicated = false
} else if (packetData[next] == 0001) {
server.ServerDedicated = true
} else {
fmt.Printf("not bool %v?\n", packetData[next])
}
server.MapName, next = extractString(packetData[:], next+1)
server.MapSeed = binary.LittleEndian.Uint32(packetData[next:next+4])
server.MapLandscape = packetData[next+4]
// todo
// p->Send_uint32(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
server.MapX = binary.LittleEndian.Uint16(packetData[next+9:next+11])
server.MapY = binary.LittleEndian.Uint16(packetData[next+11:next+13])
log.Printf("server: %s version: %s dedicated: %v map: %s %d/%d size\n", server.ServerName, server.ServerVersion, server.ServerDedicated, server.MapName, server.MapX, server.MapY)
// fmt.Printf(" * server name: %s\n", ServerName)
} else if packetType == adminPacketServerSHUTDOWN { } else if packetType == adminPacketServerSHUTDOWN {
log.Println("server shutting down - will try to reconnect") log.Println("server shutting down - will try to reconnect")
server.connection = nil server.connection = nil
@ -318,16 +346,17 @@ SocketLoop:
chatAction := int8(packetData[0]) chatAction := int8(packetData[0])
chatDestType := int8(packetData[1]) chatDestType := int8(packetData[1])
chatClientID := binary.LittleEndian.Uint32(packetData[2:6]) chatClientID := binary.LittleEndian.Uint32(packetData[2:6])
chatMsg := extractString(packetData[6:]) // var chatMsg string
chatMsg, _ := extractString(packetData[:], 6)
chatData := binary.LittleEndian.Uint64(packetData[len(packetData)-8:]) chatData := binary.LittleEndian.Uint64(packetData[len(packetData)-8:])
log.Printf("chat message: action %v desttype %v, client id %v msg %v data %v\n", chatAction, chatDestType, chatClientID, string(chatMsg), chatData) log.Printf("chat message: action %v desttype %v, client id %v msg %v data %v\n", chatAction, chatDestType, chatClientID, string(chatMsg), chatData)
} else if packetType == adminPacketServerRCON { } else if packetType == adminPacketServerRCON {
colour := binary.LittleEndian.Uint16(packetData[0:2]) colour := binary.LittleEndian.Uint16(packetData[0:2])
string := extractString(packetData[2:]) rconRecvString, _ := extractString(packetData[:], 2)
log.Printf("rcon: colour %v : %s\n", colour, string) log.Printf("rcon: colour %v : %s\n", colour, rconRecvString)
} else if packetType == adminPacketServerRCON_END { } else if packetType == adminPacketServerRCON_END {
string := extractString(packetData[0:]) rconEndRecvString, _ := extractString(packetData[:], 0)
log.Printf("rcon end : %s\n", string) log.Printf("rcon end : %s\n", rconEndRecvString)
} else { } else {
log.Printf("unknown packet received from server: %v [%v]\n", string(packetData), packetData) log.Printf("unknown packet received from server: %v [%v]\n", string(packetData), packetData)
} }
@ -348,13 +377,13 @@ SocketLoop:
} }
func extractString(bytes []byte) string { func extractString(bytes []byte, start int) (string, int) {
var str []byte var buildString []byte
for i := 0; i <= len(bytes); i++ { for i := start; i <= len(bytes); i++ {
if bytes[i] == 0 { if bytes[i] == 0 {
return string(str) return string(buildString), i+1
} }
str = append(str, bytes[i]) buildString = append(buildString, bytes[i])
} }
return "" return "", -1
} }