gottdad/packet.go
2020-06-14 23:31:26 +02:00

127 lines
2.8 KiB
Go

package main
import (
"bytes"
"encoding/binary"
)
const (
AdminPacketAdminJoin uint8 = 0
AdminPacketAdminQuit
AdminPacketAdminUpdateFrequency
AdminPacketAdminPoll
AdminPacketAdminChat
AdminPacketAdminRCon
AdminPacketAdminGamescript
AdminPacketAdminPing
AdminPacketServerFull = 100
AdminPacketServerBanned
AdminPacketServerError
AdminPacketServerProtocol
AdminPacketServerWelcome
AdminPacketServerNewgame
AdminPacketServerShutdown
AdminPacketServerDate
AdminPacketServerClientJoin
AdminPacketServerClientInfo
AdminPacketServerClientUpdate
AdminPacketServerClientQuit
AdminPacketServerClientError
AdminPacketServerCompanyNew
AdminPacketServerCompanyInfo
AdminPacketServerCompanyUpdate
AdminPacketServerCompanyRemove
AdminPacketServerCompanyEconomy
AdminPacketServerCompanyStats
AdminPacketServerChat
AdminPacketServerRCon
AdminPacketServerConsole
AdminPacketServerCmdNames
AdminPacketServerCmdLogging
AdminPacketServerGamescript
AdminPacketServerRConEnd
AdminPacketServerPong
InvalidAdminPacket = 0xFF
)
type Packet struct {
PLength uint16
PType uint8
}
type PacketAdminJoin struct {
Packet
Password string
AppName string
AppVersion string
}
type PacketAdminServerProtocol struct {
Packet
ProtocolVersion uint8
FurtherData bool
UpdatePacketType uint16
FrequenciesAllowed uint16
}
type PacketAdminServerWelcome struct {
Packet
ServerName string
OpenTTDVersion string
Dedicated bool
MapName string
MapSeed uint32
MapLandscape uint8
MapStartDate uint32
MapX uint16
MapY uint16
}
func (p *PacketAdminJoin) Bytes() []byte {
buf := new(bytes.Buffer)
p.PLength = uint16(len(p.Password) + len(p.AppName) + len(p.AppVersion) + 6)
binary.Write(buf, binary.LittleEndian, p.PLength)
binary.Write(buf, binary.LittleEndian, p.PType)
buf.WriteString(p.Password)
buf.WriteByte(0)
buf.WriteString(p.AppName)
buf.WriteByte(0)
buf.WriteString(p.AppVersion)
buf.WriteByte(0)
return buf.Bytes()
}
func (p *AdminPacketServerWelcome) Read(b []byte) {
r := bufio.NewReader(bytes.NewReader(b))
p.ServerName, _ = r.ReadString(0)
p.OpenTTDVersion, _ = r.ReadString(0)
c, _ := r.ReadByte()
p.Dedicated = bool(c)
p.MapName, _ = r.ReadString(0)
bs := make([]byte, 13)
_, _ = r.Read(bs)
p.MapSeed = binary.LittleEndian.Uint32(bs[0:])
p.MapLandscape = uint8(bs[4:1])
p.MapStartDate = binary.LittleEndian.Uint32(bs[5:])
p.MapX = binary.LittleEndian.Uint16(bs[9:])
p.MapY = binary.LittleEndian.Uint16(bs[11:])
}
func handlePacket(p Packet, b []byte) {
switch p.PType {
case AdminPacketServerProtocol:
case AdminPacketServerWelcome:
sp := PacketAdminServerWelcome{
PLength: p.PLength,
PType: p.PType,
}
sp.Read(b)
logInfoDebug("AdminPacketServerWelcome : %v", sp)
default:
}
}