package main import ( "bufio" "bytes" "encoding/binary" ) const ( AdminPacketAdminJoin = 0 AdminPacketAdminQuit = 1 AdminPacketAdminUpdateFrequency = 2 AdminPacketAdminPoll = 3 AdminPacketAdminChat = 4 AdminPacketAdminRCon = 5 AdminPacketAdminGamescript = 6 AdminPacketAdminPing = 7 AdminPacketServerFull = 100 AdminPacketServerBanned = 101 AdminPacketServerError = 102 AdminPacketServerProtocol = 103 AdminPacketServerWelcome = 104 AdminPacketServerNewgame = 105 AdminPacketServerShutdown = 106 AdminPacketServerDate = 107 AdminPacketServerClientJoin = 108 AdminPacketServerClientInfo = 109 AdminPacketServerClientUpdate = 110 AdminPacketServerClientQuit = 111 AdminPacketServerClientError = 112 AdminPacketServerCompanyNew = 113 AdminPacketServerCompanyInfo = 114 AdminPacketServerCompanyUpdate = 115 AdminPacketServerCompanyRemove = 116 AdminPacketServerCompanyEconomy = 117 AdminPacketServerCompanyStats = 118 AdminPacketServerChat = 119 AdminPacketServerRCon = 120 AdminPacketServerConsole = 121 AdminPacketServerCmdNames = 122 AdminPacketServerCmdLogging = 123 AdminPacketServerGamescript = 124 AdminPacketServerRConEnd = 125 AdminPacketServerPong = 126 InvalidAdminPacket = 255 ) 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 *PacketAdminServerWelcome) Read(b []byte) { r := bufio.NewReader(bytes.NewReader(b)) r.Discard(3) p.ServerName, _ = r.ReadString(0) p.OpenTTDVersion, _ = r.ReadString(0) c, _ := r.ReadByte() if c > 0 { p.Dedicated = true } else { p.Dedicated = false } p.MapName, _ = r.ReadString(0) bs := make([]byte, 13) _, _ = r.Read(bs) p.MapSeed = binary.LittleEndian.Uint32(bs[0:]) r.Discard(4) c, _ = r.ReadByte() p.MapLandscape = uint8(c) 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: logInfoDebug("AdminPacketServerWelcome Raw : %v", b) sp := PacketAdminServerWelcome{ Packet: p, } sp.Read(b) logInfoDebug("AdminPacketServerWelcome :\n- ServerName: %s\n- OpenTTDVersion: %s", sp.ServerName, sp.OpenTTDVersion) default: } }