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