Fix: ws auto proto

pull/21/head
zijiren233 2 years ago
parent 7d3e94ed4c
commit e40075268e

@ -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
}

@ -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
}

Loading…
Cancel
Save