From 68174c72f22da9ccc3870f1f83765cae4afc70e6 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 2 Oct 2025 20:24:54 +0100 Subject: [PATCH] Added the record command Very basic, but it will do for testing --- cmd/record.go | 35 +++++++++++++++++++++++++++++++++++ mockserver/record.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 cmd/record.go create mode 100644 mockserver/record.go diff --git a/cmd/record.go b/cmd/record.go new file mode 100644 index 0000000..983a3af --- /dev/null +++ b/cmd/record.go @@ -0,0 +1,35 @@ +package cmd + +import ( + "fmt" + + "github.com/ESilva15/BeamNGMockOg/mockserver" + + "github.com/spf13/cobra" +) + +func recordAction(cmd *cobra.Command, args []string) { + outputFile, _ := cmd.Flags().GetString("output") + address, _ := cmd.Flags().GetString("address") + port, _ := cmd.Flags().GetInt("port") + + if err := mockserver.Record(address, port, outputFile); err != nil { + fmt.Printf("Something went wrong while recording the file: %v", err) + } +} + +// shelf +var recordCmd = &cobra.Command{ + Use: "record", + Short: "record -o ", + Long: `record will store the data from the given UDP server to the + filepath given by -i`, + Args: nil, + Run: recordAction, +} + +func init() { + rootCmd.AddCommand(recordCmd) + + recordCmd.PersistentFlags().StringP("output", "o", "output.bin", "output file for recording") +} diff --git a/mockserver/record.go b/mockserver/record.go new file mode 100644 index 0000000..9dd331f --- /dev/null +++ b/mockserver/record.go @@ -0,0 +1,41 @@ +package mockserver + +import ( + "encoding/gob" + "log" + "os" + "time" + + bngsdk "github.com/ESilva15/gobngsdk" +) + +// Record records data from the UDP connection created by address and port +func Record(address string, port int, filePath string) error { + ticker := time.NewTicker(time.Second / 60) + defer ticker.Stop() + + // Create the output file + bin, err := os.Create(filePath) + if err != nil { + return err + } + + // Create the BeamNGSDK instance + beam, err := bngsdk.Init(address, port) + if err != nil { + return err + } + defer beam.Close() + + enc := gob.NewEncoder(bin) + for { + err := beam.ReadData() + if err != nil { + return err + } + if err := enc.Encode(beam.Data); err != nil { + log.Fatal(err) + } + <-ticker.C + } +}