Files
screego/ws/event_create.go
2024-12-07 12:15:44 +01:00

84 lines
1.9 KiB
Go

package ws
import (
"errors"
"fmt"
"github.com/rs/xid"
"github.com/screego/server/config"
)
func init() {
register("create", func() Event {
return &Create{}
})
}
type Create struct {
ID string `json:"id"`
Mode ConnectionMode `json:"mode"`
CloseOnOwnerLeave bool `json:"closeOnOwnerLeave"`
UserName string `json:"username"`
JoinIfExist bool `json:"joinIfExist,omitempty"`
}
func (e *Create) Execute(rooms *Rooms, current ClientInfo) error {
if rooms.connected[current.ID] != "" {
return fmt.Errorf("cannot join room, you are already in one")
}
if _, ok := rooms.Rooms[e.ID]; ok {
if e.JoinIfExist {
join := &Join{UserName: e.UserName, ID: e.ID}
return join.Execute(rooms, current)
}
return fmt.Errorf("room with id %s does already exist", e.ID)
}
name := e.UserName
if current.Authenticated {
name = current.AuthenticatedUser
}
if name == "" {
name = rooms.RandUserName()
}
switch rooms.config.AuthMode {
case config.AuthModeNone:
case config.AuthModeAll:
if !current.Authenticated {
return errors.New("you need to login")
}
case config.AuthModeTurn:
if e.Mode != ConnectionSTUN && e.Mode != ConnectionLocal && !current.Authenticated {
return errors.New("you need to login")
}
default:
return errors.New("invalid authmode:" + rooms.config.AuthMode)
}
room := &Room{
ID: e.ID,
CloseOnOwnerLeave: e.CloseOnOwnerLeave,
Mode: e.Mode,
Sessions: map[xid.ID]*RoomSession{},
Users: map[xid.ID]*User{
current.ID: {
ID: current.ID,
Name: name,
Streaming: false,
Owner: true,
Addr: current.Addr,
_write: current.Write,
},
},
}
rooms.connected[current.ID] = room.ID
rooms.Rooms[e.ID] = room
room.notifyInfoChanged()
usersJoinedTotal.Inc()
roomsCreatedTotal.Inc()
return nil
}