|
@@ -57,8 +57,9 @@ type User struct {
|
|
|
Whitelisted bool
|
|
|
RelayWhitelisted bool
|
|
|
|
|
|
- mgmtCreateLock sync.Mutex
|
|
|
- connLock sync.Mutex
|
|
|
+ mgmtCreateLock sync.Mutex
|
|
|
+ spaceCreateLock sync.Mutex
|
|
|
+ connLock sync.Mutex
|
|
|
|
|
|
historySyncs chan *events.HistorySync
|
|
|
prevBridgeStatus *BridgeState
|
|
@@ -182,45 +183,50 @@ func (bridge *Bridge) NewUser(dbUser *database.User) *User {
|
|
|
func (user *User) getSpaceRoom() id.RoomID {
|
|
|
var roomID id.RoomID
|
|
|
|
|
|
- user.log.Debugln("getSpaceRoom called")
|
|
|
-
|
|
|
if len(user.SpaceRoom) == 0 {
|
|
|
//TODO check if Spaces creation is enabled by config
|
|
|
- creationContent := make(map[string]interface{})
|
|
|
- creationContent["type"] = "m.space"
|
|
|
|
|
|
- user.log.Debugln("Creating a new space for the user")
|
|
|
+ //Create Space
|
|
|
+ user.log.Debugln("Locking to create space.")
|
|
|
+ user.spaceCreateLock.Lock()
|
|
|
+ defer user.spaceCreateLock.Unlock()
|
|
|
|
|
|
- user.log.Debugln("Inviting user " + user.MXID)
|
|
|
- var invite []id.UserID
|
|
|
- invite = append(invite, user.MXID)
|
|
|
-
|
|
|
- resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
|
|
- Visibility: "private",
|
|
|
- Name: "WhatsApp",
|
|
|
- Topic: "WhatsApp bridge Space",
|
|
|
- Invite: invite,
|
|
|
- CreationContent: creationContent,
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
- user.log.Errorln("Failed to auto-create space room:", err)
|
|
|
+ if len(user.SpaceRoom) != 0 {
|
|
|
+ roomID = user.SpaceRoom
|
|
|
+ user.log.Debugln("Returning space after lock" + user.SpaceRoom)
|
|
|
} else {
|
|
|
- user.setSpaceRoom(resp.RoomID)
|
|
|
+ creationContent := make(map[string]interface{})
|
|
|
+ creationContent["type"] = "m.space"
|
|
|
+
|
|
|
+ user.log.Debugln("Creating a new space for the user")
|
|
|
+
|
|
|
+ user.log.Debugln("Inviting user " + user.MXID)
|
|
|
+ var invite []id.UserID
|
|
|
+ invite = append(invite, user.MXID)
|
|
|
+
|
|
|
+ resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
|
|
+ Visibility: "private",
|
|
|
+ Name: "WhatsApp",
|
|
|
+ Topic: "WhatsApp bridge Space",
|
|
|
+ Invite: invite,
|
|
|
+ CreationContent: creationContent,
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ user.log.Errorln("Failed to auto-create space room:", err)
|
|
|
+ } else {
|
|
|
+ user.setSpaceRoom(resp.RoomID)
|
|
|
+ roomID = resp.RoomID
|
|
|
+ }
|
|
|
}
|
|
|
} else {
|
|
|
user.log.Debugln("Space found" + user.SpaceRoom)
|
|
|
roomID = user.SpaceRoom
|
|
|
}
|
|
|
+
|
|
|
return roomID
|
|
|
}
|
|
|
|
|
|
func (user *User) setSpaceRoom(spaceID id.RoomID) {
|
|
|
- existingUser, ok := user.bridge.spaceRooms[spaceID]
|
|
|
- if ok {
|
|
|
- existingUser.SpaceRoom = ""
|
|
|
- existingUser.Update()
|
|
|
- }
|
|
|
-
|
|
|
user.SpaceRoom = spaceID
|
|
|
user.bridge.spaceRooms[user.SpaceRoom] = user
|
|
|
user.Update()
|