diff --git a/room/message.go b/room/message.go index 63c3991..cc440f8 100644 --- a/room/message.go +++ b/room/message.go @@ -3,6 +3,8 @@ package room import ( "io" + json "github.com/json-iterator/go" + "github.com/gorilla/websocket" pb "github.com/synctv-org/synctv/proto" "google.golang.org/protobuf/proto" @@ -11,7 +13,23 @@ import ( type Message interface { MessageType() int String() string - Encode(wc io.Writer) error + Encode(w io.Writer) error +} + +type ElementJsonMessage struct { + *pb.ElementMessage +} + +func (em *ElementJsonMessage) MessageType() int { + return websocket.TextMessage +} + +func (em *ElementJsonMessage) String() string { + return em.ElementMessage.String() +} + +func (em *ElementJsonMessage) Encode(w io.Writer) error { + return json.NewEncoder(w).Encode(em) } type ElementMessage struct { @@ -23,44 +41,15 @@ func (em *ElementMessage) MessageType() int { } func (em *ElementMessage) String() string { - // out, _ := yaml.Marshal(em) - // switch em.Type { - // case Error: - // return fmt.Sprintf("Element Error: %s", out) - // case ChatMessage: - // return fmt.Sprintf("Element ChatMessage: %s", out) - // case Play: - // return fmt.Sprintf("Element Play: %s", out) - // case Pause: - // return fmt.Sprintf("Element Pause: %s", out) - // case CheckSeek: - // return fmt.Sprintf("Element CheckSeek: %s", out) - // case TooFast: - // return fmt.Sprintf("Element TooFast: %s", out) - // case TooSlow: - // return fmt.Sprintf("Element TooSlow: %s", out) - // case ChangeRate: - // return fmt.Sprintf("Element ChangeRate: %s", out) - // case ChangeSeek: - // return fmt.Sprintf("Element ChangeSeek: %s", out) - // case ChangeCurrent: - // return fmt.Sprintf("Element ChangeCurrent: %s", out) - // case ChangeMovies: - // return fmt.Sprintf("Element ChangeMovieList: %s", out) - // case ChangePeople: - // return fmt.Sprintf("Element ChangePeopleNum: %s", out) - // default: - // return fmt.Sprintf("Element Unknown: %s", out) - // } - return "" + return em.ElementMessage.String() } -func (em *ElementMessage) Encode(wc io.Writer) error { +func (em *ElementMessage) Encode(w io.Writer) error { b, err := proto.Marshal(em) if err != nil { return err } - _, err = wc.Write(b) + _, err = w.Write(b) return err } @@ -74,6 +63,6 @@ func (pm *PingMessage) String() string { return "Ping" } -func (pm *PingMessage) Encode(wc io.Writer) error { +func (pm *PingMessage) Encode(w io.Writer) error { return nil } diff --git a/server/handlers/websocket.go b/server/handlers/websocket.go index 07dd5ff..ee7d263 100644 --- a/server/handlers/websocket.go +++ b/server/handlers/websocket.go @@ -5,16 +5,15 @@ import ( "net/http" "time" - json "github.com/json-iterator/go" - "google.golang.org/protobuf/proto" - "github.com/gin-gonic/gin" "github.com/gorilla/websocket" + json "github.com/json-iterator/go" log "github.com/sirupsen/logrus" "github.com/synctv-org/synctv/cmd/flags" pb "github.com/synctv-org/synctv/proto" "github.com/synctv-org/synctv/room" "github.com/synctv-org/synctv/utils" + "google.golang.org/protobuf/proto" ) const maxInterval = 10 @@ -141,17 +140,32 @@ func handleReaderMessage(c *room.Client) error { } continue } + default: + log.Errorf("ws: room %s user %s receive unknown message type: %d", c.Room().ID(), c.Username(), t) + continue } if flags.Dev { log.Infof("ws: receive room %s user %s message: %+v", c.Room().ID(), c.Username(), msg.String()) } - if err := handleElementMsg(c.Room(), &msg, func(em *pb.ElementMessage) error { - em.Sender = c.Username() - return c.Send(&room.ElementMessage{ElementMessage: em}) - }, func(em *pb.ElementMessage, bc ...room.BroadcastConf) error { - em.Sender = c.Username() - return c.Broadcast(&room.ElementMessage{ElementMessage: em}, bc...) - }); err != nil { + switch t { + case websocket.BinaryMessage: + err = handleElementMsg(c.Room(), &msg, func(em *pb.ElementMessage) error { + em.Sender = c.Username() + return c.Send(&room.ElementMessage{ElementMessage: em}) + }, func(em *pb.ElementMessage, bc ...room.BroadcastConf) error { + em.Sender = c.Username() + return c.Broadcast(&room.ElementMessage{ElementMessage: em}, bc...) + }) + case websocket.TextMessage: + err = handleElementMsg(c.Room(), &msg, func(em *pb.ElementMessage) error { + em.Sender = c.Username() + return c.Send(&room.ElementJsonMessage{ElementMessage: em}) + }, func(em *pb.ElementMessage, bc ...room.BroadcastConf) error { + em.Sender = c.Username() + return c.Broadcast(&room.ElementJsonMessage{ElementMessage: em}, bc...) + }) + } + if err != nil { log.Errorf("ws: room %s user %s handle message error: %v", c.Room().ID(), c.Username(), err) return err }