diff --git a/entities/message.go b/entities/message.go index 0d84358..bbd7963 100644 --- a/entities/message.go +++ b/entities/message.go @@ -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. } diff --git a/services/handler.go b/services/handler.go index 4643a27..ed970a5 100644 --- a/services/handler.go +++ b/services/handler.go @@ -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)) diff --git a/services/room/disconnect.go b/services/room/disconnect.go index 7cc99c2..c017098 100644 --- a/services/room/disconnect.go +++ b/services/room/disconnect.go @@ -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) diff --git a/services/room/get_info.go b/services/room/get_info.go index 396b1c0..3f710ac 100644 --- a/services/room/get_info.go +++ b/services/room/get_info.go @@ -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 } diff --git a/services/room/init.go b/services/room/init.go index d7be399..1309635 100644 --- a/services/room/init.go +++ b/services/room/init.go @@ -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, + } } diff --git a/services/room/join.go b/services/room/join.go index 8080a11..4256f00 100644 --- a/services/room/join.go +++ b/services/room/join.go @@ -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) { diff --git a/services/room/pause.go b/services/room/pause.go index b51ca19..8f9495a 100644 --- a/services/room/pause.go +++ b/services/room/pause.go @@ -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 } diff --git a/services/room/play.go b/services/room/play.go index 29598ba..1163212 100644 --- a/services/room/play.go +++ b/services/room/play.go @@ -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 } diff --git a/services/room/set_time.go b/services/room/set_time.go index 9b15263..7f7e83f 100644 --- a/services/room/set_time.go +++ b/services/room/set_time.go @@ -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, + } } diff --git a/services/room/set_url.go b/services/room/set_url.go index d58d25f..edab9c7 100644 --- a/services/room/set_url.go +++ b/services/room/set_url.go @@ -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, + } } diff --git a/services/room/update_user_state.go b/services/room/update_user_state.go index d710720..eda5bc8 100644 --- a/services/room/update_user_state.go +++ b/services/room/update_user_state.go @@ -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 }