From f0c159e4fcbeddeace1ec55b7eb7a22ecaf43443 Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Mon, 3 Feb 2020 03:48:54 +0000 Subject: [PATCH] done for the night --- server/main.go | 1 + server/player.go | 2 +- server/request.go | 20 ++++++++++++++++++++ server/server.go | 13 +++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/server/main.go b/server/main.go index d40df89..dd1a872 100644 --- a/server/main.go +++ b/server/main.go @@ -16,6 +16,7 @@ func main() { s := server{ Log: log, join: make(chan player), + leave: make(chan *player), inbox: make(chan message), souls: make(map[string]soul), } diff --git a/server/player.go b/server/player.go index 012f8bf..1553f9b 100644 --- a/server/player.go +++ b/server/player.go @@ -26,6 +26,7 @@ func (p *player) run() { ctx, cancel := context.WithCancel(context.Background()) go p.writeMessages(ctx) p.readMessages(cancel) + p.server.leave <- p p.outbox = nil p.conn.Close() } @@ -72,7 +73,6 @@ func (p *player) writeMessages(ctx context.Context) { select { case t := <-ticker.C: n++ - p.Info("trying to write a tick") w, err := p.conn.NextWriter(websocket.TextMessage) if err != nil { p.Error("error getting writer: %v", err) diff --git a/server/request.go b/server/request.go index c78c7e1..e41d5ce 100644 --- a/server/request.go +++ b/server/request.go @@ -41,6 +41,26 @@ type collectSoul struct { } func (c *collectSoul) exec(s *server, from *player) { + soul, ok := s.souls[c.PlayerName] + if !ok { + return + } + delete(s.souls, c.PlayerName) + + b, err := json.Marshal(soul) + if err != nil { + s.Error("unable to serialize soul: %v", err) + return + } + + msg := fmt.Sprintf("soul-collected %s", string(b)) + for _, player := range s.players { + select { + case player.outbox <- msg: + default: + s.Error("can't write to player %s's outbox", player.username) + } + } } type login struct { diff --git a/server/server.go b/server/server.go index 609adc0..d758c62 100644 --- a/server/server.go +++ b/server/server.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "net/http" "strconv" @@ -15,6 +16,7 @@ type server struct { router *mux.Router players map[int]*player join chan player + leave chan *player inbox chan message souls map[string]soul } @@ -63,6 +65,17 @@ func (s *server) step(pc int) { p.Log = s.Child("players").Child(strconv.Itoa(p.id)) go p.run() s.players[p.id] = &p + for _, soul := range s.souls { + b, _ := json.Marshal(soul) + msg := fmt.Sprintf("spawn-soul %s", string(b)) + select { + case p.outbox <- msg: + default: + } + } + case p := <-s.leave: + delete(s.players, p.id) + case m := <-s.inbox: s.Info("received message: %v", m) var req request