You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
4.8 KiB
Go

package room
import (
"movie-sync-server/conf"
"movie-sync-server/entities"
"github.com/sirupsen/logrus"
"github.com/zishang520/socket.io/v2/socket"
)
func JoinEndpoint(client *socket.Socket, cliMsg *entities.ClientMessage) []byte {
roomname, username := cliMsg.Room, cliMsg.UserName
userID := string(client.Id())
clientData, ok := client.Data().(*entities.ClientData)
if !ok {
clientData = &entities.ClientData{
Room: roomname,
}
}
if roomname == "" || userID == "" || username == "" {
logrus.Warnf("room or username is empty: room: [%s], username: [%s], showName: [%s]", roomname, userID, username)
return nil
}
var newUser entities.User = &entities.UserImpl{}
//首先判断当前用户是否想要加入已有的房间,如果房间不存在则新建房间
newUser.SetID(userID)
newUser.SetSocket(client)
newUser.SetUsername(username)
var joinedRoom entities.Room
if r, ok := entities.GetCinema().GetRoom(roomname); ok {
u := r.GetUser(userID)
if u != nil {
logrus.Warnf("user [%s] already in room [%s]", userID, roomname)
return nil
}
joinedRoom = r
if cliMsg.Password != "" {
if cliMsg.Password != conf.ServerSetting.HostPassword {
logrus.Warnf("user [%s] join room [%s] failed: incorrect password", userID, roomname)
newUser.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Severity: "error",
Message: "密码错误",
Title: "",
})
return nil
}
// 如果密码正确,则设置为管理员
logrus.Infof("user [%s] join room [%s] with password, set as admin", userID, roomname)
newUser.SetAdmin(true)
}
if oldUser := r.GetUser(userID); oldUser != nil {
r.RemoveUser(userID)
}
r.AddUser(newUser)
} else {
// 创建房间时,检测密码
if cliMsg.Password != conf.ServerSetting.HostPassword {
logrus.Warnf("user [%s] join room [%s] failed: incorrect password", userID, roomname)
newUser.Send(entities.MessageTypeMessage, entities.ServerNotificationMessage{
Severity: "error",
Message: "密码错误",
Title: "",
})
return nil
}
newUser.SetAdmin(true) // 设置为管理员
var newRoom entities.Room = &entities.RoomImpl{}
newRoom.SetName(roomname)
newRoom.InitUsers()
newRoom.AddUser(newUser)
joinedRoom = newRoom
entities.GetCinema().SetRoom(roomname, newRoom)
}
clientData.Username = username
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{
UserID: userID,
UserName: username,
IsAdmin: newUser.IsAdmin(),
},
})
joinedRoom.GetUsers()
joinedRoom.BroadcastRoomState()
logrus.Infof("user [%s] join room [%s] success", userID, roomname)
return nil
}
func JoinRecovered(client *socket.Socket) {
userID := string(client.Id())
clientData, ok := client.Data().(*entities.ClientData)
if !ok {
return
}
if clientData.Room == "" || clientData.Username == "" {
logrus.Warnf("client data is incomplete: room [%s], username [%s]", clientData.Room, clientData.Username)
return
}
roomname := clientData.Room
username := clientData.Username
isAdmin := clientData.IsAdmin
logrus.Infof("recovering user [%s] in room [%s]", username, roomname)
var newUser entities.User = &entities.UserImpl{}
//首先判断当前用户是否想要加入已有的房间,如果房间不存在则新建房间
newUser.SetID(userID)
newUser.SetSocket(client)
newUser.SetUsername(username)
newUser.SetAdmin(isAdmin)
var joinedRoom entities.Room
if r, ok := entities.GetCinema().GetRoom(roomname); ok {
u := r.GetUser(userID)
if u != nil {
logrus.Warnf("user [%s] already in room [%s]", userID, roomname)
return
}
joinedRoom = r
if oldUser := r.GetUser(userID); oldUser != nil {
r.RemoveUser(userID)
}
r.AddUser(newUser)
} else {
var newRoom entities.Room = &entities.RoomImpl{}
newRoom.SetName(roomname)
newRoom.InitUsers()
newRoom.AddUser(newUser)
joinedRoom = newRoom
entities.GetCinema().SetRoom(roomname, newRoom)
}
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{
UserID: userID,
UserName: username,
IsAdmin: newUser.IsAdmin(),
},
})
joinedRoom.GetUsers()
joinedRoom.BroadcastRoomState()
logrus.Infof("user [%s] re-join room [%s] success", userID, roomname)
}