func (s *Server) IsMinecraftServerResponding() bool { conn, err := net.DialTimeout("tcp", s.IPAddress+":25565", time.Second*5) if err != nil { return false } defer conn.Close() conn.SetDeadline(time.Now().Add(time.Second * 5)) stream := protocol.NewStream(conn) handshake := protocol.NewPacketWithID(0x00) handshake.WriteVarInt(5) handshake.WriteString(s.IPAddress) handshake.WriteUInt16(25565) handshake.WriteVarInt(1) if err := stream.WritePacket(handshake); err != nil { return false } request := protocol.NewPacketWithID(0x00) if err := stream.WritePacket(request); err != nil { return false } conn.SetDeadline(time.Now().Add(time.Second * 5)) _, length, err := stream.GetPacketStream() if err != nil { return false } if length > 5 { return true } return false }
func handleConnection(conn net.Conn) { defer conn.Close() player := &Player{ IPAddress: strings.Split(conn.RemoteAddr().String(), ":")[0], Stream: protocol.NewStream(conn), Connection: conn, ShouldClose: false, State: 1, } packetLoop: for { if player.ShouldClose { return } packetStream, _, err := player.Stream.GetPacketStream() if err != nil { if err == io.EOF { return } log.Println("beacon: Failed to read next packet:", err) return } packetID, err := packetStream.ReadVarInt() if err != nil { log.Println("beacon: Failed to read packet ID:", err) return } switch packetID { case 0: err := handlePacketID0(player, packetStream) if err != nil { log.Println("beacon: Failed to handle packet ID 0:", err) } if player.ForwardAddress != "" { break packetLoop } case 1: if err := handlePacketID1(player, packetStream); err != nil { log.Println("beacon: Failed to handle packet ID 1:", err) } case 122: return default: log.Println("beacon: Unknown packet ID:", packetID) } numBytes, err := packetStream.ExhaustPacket() if err != nil { log.Println("beacon: Failed to exahust", numBytes, "packets:", err) } else if numBytes > 0 { log.Println("beacon: Exhausted", numBytes, "bytes. (Exhausting packets shouldn't happen).") } } forwardConnection(player) }