更改数据包回复模式

main
落雨楓 3 months ago
parent 3c5978b526
commit 6d845164ca

@ -32,6 +32,13 @@ type ClientUpdateUserStateMessage struct {
Playing bool `json:"playing,omitempty"`
}
type ResponseMessage struct {
RequestID string `json:"rid,omitempty"`
Code int `json:"code,omitempty"` // 200 for success
Message string `json:"message,omitempty"`
Data any `json:"data,omitempty"`
}
type ServerMessage struct {
Type string `json:"type,omitempty"` // "roomInfo", "stateChanged", etc.
}

@ -13,7 +13,9 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func Wrapper(event string, client *socket.Socket, handler func(client *socket.Socket, session *entities.ClientData, cliMsg map[string]any) []byte) func(...any) {
type MessageHandler func(client *socket.Socket, session *entities.ClientData, cliMsg map[string]any) *entities.ResponseMessage
func Wrapper(event string, client *socket.Socket, handler MessageHandler) func(...any) {
return func(datas ...any) {
logrus.Infof("recive a client event: [%s], datas: %+v", event, datas)
d, ok := datas[0].(map[string]any)
@ -22,6 +24,8 @@ func Wrapper(event string, client *socket.Socket, handler func(client *socket.So
return
}
requestId, _ := d["rid"].(string)
sessionData, ok := client.Data().(*entities.ClientData)
if !ok {
sessionData = &entities.ClientData{}
@ -29,8 +33,11 @@ func Wrapper(event string, client *socket.Socket, handler func(client *socket.So
}
r := handler(client, sessionData, d)
if len(r) > 0 {
client.Emit(event)
if r != nil {
if requestId != "" {
r.RequestID = requestId
}
client.Emit("response", r)
}
}
}
@ -45,11 +52,13 @@ func EventHandler() {
//初次连接时,发送初始化信息
client.On("init", Wrapper("init", client, room.InitEndpoint))
//连接后必须加入房间
//用户加入房间
client.On("join", Wrapper("join", client, room.JoinEndpoint))
// 用户发送当前播放时间变化
client.On("updateUserState", Wrapper("updateUserState", client, room.UpdateUserStateEndpoint))
// 房管设置房间的视频地址
client.On("setUrl", Wrapper("setUrl", client, room.SetUrlEndpoint))

@ -7,7 +7,7 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func DisconnectEndpoint(client *socket.Socket) []byte {
func DisconnectEndpoint(client *socket.Socket) *entities.ResponseMessage {
userID := string(client.Id())
if r, ok := entities.GetCinema().GetUserRoom(userID); ok {
u := r.GetUser(userID)

@ -2,42 +2,25 @@ package room
import (
"movie-sync-server/entities"
"movie-sync-server/utils"
"time"
"github.com/sirupsen/logrus"
"github.com/zishang520/socket.io/v2/socket"
)
func GetInfoEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func GetInfoEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
room := session.Room
userID := session.UserID
if r, ok := entities.GetCinema().GetRoom(room); ok {
u := r.GetUser(userID)
if u != nil {
u.Send(entities.MessageTypeRoomInfo, entities.RoomStateChangedMessage{
return &entities.ResponseMessage{
Code: 200,
Message: "success",
Data: entities.RoomStateChangedMessage{
ServerTime: time.Now().Unix(),
VideoUrls: r.GetUrls(),
UserList: r.GetAllUserStatus(),
Playing: r.GetPlaying(),
PlayTime: r.GetPlayTime(),
})
} else {
logrus.Warnf("user [%s] not in room [%s]", userID, room)
rawMsg, err := utils.StructToMapViaJSON(entities.RoomStateChangedMessage{
ServerTime: time.Now().Unix(),
VideoUrls: r.GetUrls(),
UserList: r.GetAllUserStatus(),
Playing: r.GetPlaying(),
PlayTime: r.GetPlayTime(),
})
if err != nil {
logrus.WithError(err).Error("json marshal error")
return nil
}
client.Emit(entities.MessageTypeRoomInfo, rawMsg)
},
}
return nil
}
return nil
}

@ -9,11 +9,15 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func InitEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func InitEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
cliMsg := &entities.ClientInitMessage{}
if err := utils.MapToStructViaJSON(msg, cliMsg); err != nil {
logrus.WithError(err).Errorf("invalid data type: %+v", msg)
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "invalid data type",
Data: nil,
}
}
roomName := cliMsg.Room
@ -57,5 +61,9 @@ func InitEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
client.Emit(entities.MessageTypeRoomInfo, rawMsg)
}
return nil
return &entities.ResponseMessage{
Code: 200,
Message: "success",
Data: nil,
}
}

@ -9,11 +9,15 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
cliMsg := &entities.ClientJoinMessage{}
if err := utils.MapToStructViaJSON(msg, cliMsg); err != nil {
logrus.WithError(err).Errorf("invalid data type: %+v", msg)
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "invalid data type",
Data: nil,
}
}
room := session.Room
@ -35,7 +39,7 @@ func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
var newUser entities.User = &entities.UserImpl{}
//首先判断当前用户是否想要加入已有的房间,如果房间不存在则新建房间
//首先判断当前用户是否加入已有的房间,如果房间不存在则新建房间
newUser.SetID(userID)
newUser.SetSocket(client)
newUser.SetUsername(username)
@ -52,12 +56,10 @@ func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
if cliMsg.Password != "" {
if cliMsg.Password != conf.ServerSetting.HostPassword {
logrus.Warnf("user [%s] join room [%s] failed: incorrect password", userID, room)
newUser.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Severity: "error",
Message: "密码错误",
Title: "",
})
return nil
return &entities.ResponseMessage{
Code: 403,
Message: "密码错误",
}
}
// 如果密码正确,则设置为管理员
@ -73,12 +75,10 @@ func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
// 创建房间时,检测密码
if cliMsg.Password != conf.ServerSetting.HostPassword {
logrus.Warnf("user [%s] join room [%s] failed: incorrect password", userID, room)
newUser.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Severity: "error",
Message: "密码错误",
Title: "",
})
return nil
return &entities.ResponseMessage{
Code: 403,
Message: "密码错误",
}
}
newUser.SetAdmin(true) // 设置为管理员
@ -93,15 +93,6 @@ func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
clientData.IsAdmin = newUser.IsAdmin()
client.SetData(clientData)
newUser.Send("joined", entities.UserJoinLeaveMessage{
Type: "joined",
UserInfo: entities.UserStatus{
UserID: userID,
UserName: username,
IsAdmin: newUser.IsAdmin(),
},
})
joinedRoom.Broadcast(entities.MessageTypeUserJoin, entities.UserJoinLeaveMessage{
Type: entities.MessageTypeUserJoin,
UserInfo: entities.UserStatus{
@ -115,7 +106,16 @@ func JoinEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
joinedRoom.BroadcastRoomState()
logrus.Infof("user [%s] join room [%s] success", userID, room)
return nil
return &entities.ResponseMessage{
Code: 200,
Message: "success",
Data: entities.UserStatus{
UserID: userID,
UserName: username,
IsAdmin: newUser.IsAdmin(),
},
}
}
func JoinRecovered(client *socket.Socket) {

@ -6,9 +6,10 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func PauseEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func PauseEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
room := session.Room
userID := session.UserID
if r, ok := entities.GetCinema().GetRoom(room); ok {
u := r.GetUser(userID)
if u != nil {
@ -25,6 +26,17 @@ func PauseEndpoint(client *socket.Socket, session *entities.ClientData, msg map[
}
r.BroadcastRoomState()
return &entities.ResponseMessage{
Code: 200,
Message: "success",
Data: nil,
}
}
return &entities.ResponseMessage{
Code: 400,
Message: "房间不存在",
Data: nil,
}
return nil
}

@ -6,9 +6,10 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func PlayEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func PlayEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
room := session.Room
userID := session.UserID
if r, ok := entities.GetCinema().GetRoom(room); ok {
u := r.GetUser(userID)
if u != nil {
@ -25,6 +26,16 @@ func PlayEndpoint(client *socket.Socket, session *entities.ClientData, msg map[s
}
r.BroadcastRoomState()
return &entities.ResponseMessage{
Code: 200,
Message: "success",
}
}
return &entities.ResponseMessage{
Code: 400,
Message: "房间不存在",
Data: nil,
}
return nil
}

@ -8,11 +8,15 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func SetTimeEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func SetTimeEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
cliMsg := &entities.ClientSetTimeMessage{}
if err := utils.MapToStructViaJSON(msg, cliMsg); err != nil {
logrus.WithError(err).Errorf("invalid data type: %+v", msg)
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "invalid data type",
Data: nil,
}
}
room := session.Room
@ -25,13 +29,11 @@ func SetTimeEndpoint(client *socket.Socket, session *entities.ClientData, msg ma
if u != nil {
if !u.IsAdmin() {
u.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Type: entities.MessageTypeMessage,
Severity: "error",
Title: "错误",
Message: "只有房间管理员可以设置播放时间",
})
return nil
return &entities.ResponseMessage{
Code: 403,
Message: "只有房间管理员可以设置播放时间",
Data: nil,
}
}
u.SetPlayTime(playTime)
@ -46,8 +48,17 @@ func SetTimeEndpoint(client *socket.Socket, session *entities.ClientData, msg ma
r.BroadcastRoomState()
} else {
// 如果用户不在房间内,直接返回
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "还未加入房间",
Data: nil,
}
}
}
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "房间不存在",
Data: nil,
}
}

@ -8,11 +8,15 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func SetUrlEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func SetUrlEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
cliMsg := &entities.ClientSetUrlMessage{}
if err := utils.MapToStructViaJSON(msg, cliMsg); err != nil {
logrus.WithError(err).Errorf("invalid data type: %+v", msg)
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "invalid data type",
Data: nil,
}
}
room := session.Room
@ -23,20 +27,29 @@ func SetUrlEndpoint(client *socket.Socket, session *entities.ClientData, msg map
u := r.GetUser(userID)
if u != nil {
if !u.IsAdmin() {
u.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Type: entities.MessageTypeMessage,
Severity: "error",
Title: "错误",
Message: "只有房间管理员可以设置URL",
})
return nil
return &entities.ResponseMessage{
Code: 403,
Message: "只有房间管理员可以设置URL",
}
}
r.SetUrls(videoUrls)
r.BroadcastRoomState()
} else {
// 如果用户不在房间内,直接返回
return &entities.ResponseMessage{
Code: 400,
Message: "还未加入房间",
Data: nil,
}
}
} else {
logrus.Warnf("room [%s] not found, can not set url", room)
}
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "房间不存在",
Data: nil,
}
}

@ -7,10 +7,14 @@ import (
"github.com/zishang520/socket.io/v2/socket"
)
func UpdateUserStateEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) []byte {
func UpdateUserStateEndpoint(client *socket.Socket, session *entities.ClientData, msg map[string]any) *entities.ResponseMessage {
cliMsg := &entities.ClientUpdateUserStateMessage{}
if err := utils.MapToStructViaJSON(msg, cliMsg); err != nil {
return nil
return &entities.ResponseMessage{
Code: 400,
Message: "invalid data type",
Data: nil,
}
}
room := session.Room
@ -23,9 +27,25 @@ func UpdateUserStateEndpoint(client *socket.Socket, session *entities.ClientData
if u != nil {
u.SetPlayTime(playTime)
u.SetPlaying(isPlaying)
}
r.BroadcastRoomState()
r.BroadcastRoomState()
return &entities.ResponseMessage{
Code: 200,
Message: "success",
Data: nil,
}
} else {
return &entities.ResponseMessage{
Code: 400,
Message: "还未加入房间",
Data: nil,
}
}
}
return &entities.ResponseMessage{
Code: 400,
Message: "房间不存在",
Data: nil,
}
return nil
}

Loading…
Cancel
Save