package controllers import ( "bytes" "encoding/binary" "log" "net/http" "server/models" "github.com/gorilla/websocket" ) type Hub struct { Players map[uint32]*models.Player ServerBuffer []byte } func NewHub() *Hub { return &Hub{ Players: make(map[uint32]*models.Player), } } func (h *Hub) readLoop(conn *websocket.Conn) { p := &models.Player{ Conn: conn, InputX: 0, InputZ: 0, } log.Println("Player connected:", p.ID) h.Players[p.ID] = p defer func() { delete(h.Players, p.ID) p.Conn.Close() log.Println("Player disconnected:", p.ID) }() for { _, data, err := p.Conn.ReadMessage() if err != nil { return } if len(data) < 8 { continue } buf := bytes.NewReader(data) binary.Read(buf, binary.LittleEndian, &p.InputX) binary.Read(buf, binary.LittleEndian, &p.InputZ) } } func (h *Hub) StartWS(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } for { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) continue } go h.readLoop(conn) } } func (h *Hub) Start() { http.HandleFunc("/ws", h.StartWS) log.Fatal(http.ListenAndServe(":8080", nil)) }