Skip to content

Commit 3a9b3ab

Browse files
committed
Merge remote-tracking branch 'HelderFSFerreira/createSpace'
2 parents 8b76a79 + 3ec67ed commit 3a9b3ab

File tree

6 files changed

+92
-11
lines changed

6 files changed

+92
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package upgrades
2+
3+
import (
4+
"database/sql"
5+
)
6+
7+
func init() {
8+
upgrades[32] = upgrade{"Store space in user table", func(tx *sql.Tx, ctx context) error {
9+
_, err := tx.Exec(`ALTER TABLE "user" ADD COLUMN space_room TEXT NOT NULL DEFAULT ''`)
10+
return err
11+
}}
12+
}

database/upgrades/upgrades.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ type upgrade struct {
3939
fn upgradeFunc
4040
}
4141

42-
const NumberOfUpgrades = 33
42+
const NumberOfUpgrades = 34
4343

4444
var upgrades [NumberOfUpgrades]upgrade
4545

database/user.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (uq *UserQuery) New() *User {
3838
}
3939

4040
func (uq *UserQuery) GetAll() (users []*User) {
41-
rows, err := uq.db.Query(`SELECT mxid, username, agent, device, management_room FROM "user"`)
41+
rows, err := uq.db.Query(`SELECT mxid, username, agent, device, management_room, space_room FROM "user"`)
4242
if err != nil || rows == nil {
4343
return nil
4444
}
@@ -50,15 +50,15 @@ func (uq *UserQuery) GetAll() (users []*User) {
5050
}
5151

5252
func (uq *UserQuery) GetByMXID(userID id.UserID) *User {
53-
row := uq.db.QueryRow(`SELECT mxid, username, agent, device, management_room FROM "user" WHERE mxid=$1`, userID)
53+
row := uq.db.QueryRow(`SELECT mxid, username, agent, device, management_room, space_room FROM "user" WHERE mxid=$1`, userID)
5454
if row == nil {
5555
return nil
5656
}
5757
return uq.New().Scan(row)
5858
}
5959

6060
func (uq *UserQuery) GetByUsername(username string) *User {
61-
row := uq.db.QueryRow(`SELECT mxid, username, agent, device, management_room FROM "user" WHERE username=$1`, username)
61+
row := uq.db.QueryRow(`SELECT mxid, username, agent, device, management_room, space_room FROM "user" WHERE username=$1`, username)
6262
if row == nil {
6363
return nil
6464
}
@@ -72,12 +72,13 @@ type User struct {
7272
MXID id.UserID
7373
JID types.JID
7474
ManagementRoom id.RoomID
75+
SpaceRoom id.RoomID
7576
}
7677

7778
func (user *User) Scan(row Scannable) *User {
7879
var username sql.NullString
7980
var device, agent sql.NullByte
80-
err := row.Scan(&user.MXID, &username, &agent, &device, &user.ManagementRoom)
81+
err := row.Scan(&user.MXID, &username, &agent, &device, &user.ManagementRoom, &user.SpaceRoom)
8182
if err != nil {
8283
if err != sql.ErrNoRows {
8384
user.log.Errorln("Database scan failed:", err)
@@ -112,16 +113,16 @@ func (user *User) devicePtr() *uint8 {
112113
}
113114

114115
func (user *User) Insert() {
115-
_, err := user.db.Exec(`INSERT INTO "user" (mxid, username, agent, device, management_room) VALUES ($1, $2, $3, $4, $5)`,
116-
user.MXID, user.usernamePtr(), user.agentPtr(), user.devicePtr(), user.ManagementRoom)
116+
_, err := user.db.Exec(`INSERT INTO "user" (mxid, username, agent, device, management_room, space_room) VALUES ($1, $2, $3, $4, $5, $6)`,
117+
user.MXID, user.usernamePtr(), user.agentPtr(), user.devicePtr(), user.ManagementRoom, user.SpaceRoom)
117118
if err != nil {
118119
user.log.Warnfln("Failed to insert %s: %v", user.MXID, err)
119120
}
120121
}
121122

122123
func (user *User) Update() {
123-
_, err := user.db.Exec(`UPDATE "user" SET username=$1, agent=$2, device=$3, management_room=$4 WHERE mxid=$5`,
124-
user.usernamePtr(), user.agentPtr(), user.devicePtr(), user.ManagementRoom, user.MXID)
124+
_, err := user.db.Exec(`UPDATE "user" SET username=$1, agent=$2, device=$3, management_room=$4, space_room=$5 WHERE mxid=$6`,
125+
user.usernamePtr(), user.agentPtr(), user.devicePtr(), user.ManagementRoom, user.SpaceRoom, user.MXID)
125126
if err != nil {
126127
user.log.Warnfln("Failed to update %s: %v", user.MXID, err)
127128
}

main.go

+3
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ type Bridge struct {
179179
usersByMXID map[id.UserID]*User
180180
usersByUsername map[string]*User
181181
usersLock sync.Mutex
182+
spaceRooms map[id.RoomID]*User
183+
spaceRoomsLock sync.Mutex
182184
managementRooms map[id.RoomID]*User
183185
managementRoomsLock sync.Mutex
184186
portalsByMXID map[id.RoomID]*Portal
@@ -479,6 +481,7 @@ func main() {
479481
(&Bridge{
480482
usersByMXID: make(map[id.UserID]*User),
481483
usersByUsername: make(map[string]*User),
484+
spaceRooms: make(map[id.RoomID]*User),
482485
managementRooms: make(map[id.RoomID]*User),
483486
portalsByMXID: make(map[id.RoomID]*Portal),
484487
portalsByJID: make(map[database.PortalKey]*Portal),

portal.go

+12
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,8 @@ func (portal *Portal) CreateMatrixRoom(user *User, groupInfo *types.GroupInfo, i
11411141
portal.ensureUserInvited(user)
11421142
user.syncChatDoublePuppetDetails(portal, true)
11431143

1144+
portal.addToSpace(user.getSpaceRoom(), portal.MXID, portal.bridge.Config.Homeserver.Domain)
1145+
11441146
if groupInfo != nil {
11451147
portal.SyncParticipants(user, groupInfo)
11461148
if groupInfo.IsAnnounce {
@@ -1176,6 +1178,16 @@ func (portal *Portal) CreateMatrixRoom(user *User, groupInfo *types.GroupInfo, i
11761178
return nil
11771179
}
11781180

1181+
func (portal *Portal) addToSpace(spaceID id.RoomID, portalID id.RoomID, homeserverDomain string) {
1182+
1183+
parentSpaceContent := make(map[string]interface{})
1184+
parentSpaceContent["via"] = []string{homeserverDomain}
1185+
1186+
portal.log.Debugfln("adding room %s to the space %s", portalID, spaceID)
1187+
1188+
portal.MainIntent().SendStateEvent(spaceID, event.Type{Type: "m.space.child", Class: event.StateEventType}, portalID.String(), parentSpaceContent)
1189+
}
1190+
11791191
func (portal *Portal) IsPrivateChat() bool {
11801192
return portal.Key.JID.Server == types.DefaultUserServer
11811193
}

user.go

+55-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ type User struct {
5757
Whitelisted bool
5858
RelayWhitelisted bool
5959

60-
mgmtCreateLock sync.Mutex
61-
connLock sync.Mutex
60+
mgmtCreateLock sync.Mutex
61+
spaceCreateLock sync.Mutex
62+
connLock sync.Mutex
6263

6364
historySyncs chan *events.HistorySync
6465
prevBridgeStatus *BridgeState
@@ -179,6 +180,58 @@ func (bridge *Bridge) NewUser(dbUser *database.User) *User {
179180
return user
180181
}
181182

183+
func (user *User) getSpaceRoom() id.RoomID {
184+
var roomID id.RoomID
185+
186+
if len(user.SpaceRoom) == 0 {
187+
//TODO check if Spaces creation is enabled by config
188+
189+
//Create Space
190+
user.log.Debugln("Locking to create space.")
191+
user.spaceCreateLock.Lock()
192+
defer user.spaceCreateLock.Unlock()
193+
194+
if len(user.SpaceRoom) != 0 {
195+
roomID = user.SpaceRoom
196+
user.log.Debugln("Returning space after lock" + user.SpaceRoom)
197+
} else {
198+
creationContent := make(map[string]interface{})
199+
creationContent["type"] = "m.space"
200+
201+
user.log.Debugln("Creating a new space for the user")
202+
203+
user.log.Debugln("Inviting user " + user.MXID)
204+
var invite []id.UserID
205+
invite = append(invite, user.MXID)
206+
207+
resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
208+
Visibility: "private",
209+
Name: "WhatsApp",
210+
Topic: "WhatsApp bridge Space",
211+
Invite: invite,
212+
CreationContent: creationContent,
213+
})
214+
if err != nil {
215+
user.log.Errorln("Failed to auto-create space room:", err)
216+
} else {
217+
user.setSpaceRoom(resp.RoomID)
218+
roomID = resp.RoomID
219+
}
220+
}
221+
} else {
222+
user.log.Debugln("Space found" + user.SpaceRoom)
223+
roomID = user.SpaceRoom
224+
}
225+
226+
return roomID
227+
}
228+
229+
func (user *User) setSpaceRoom(spaceID id.RoomID) {
230+
user.SpaceRoom = spaceID
231+
user.bridge.spaceRooms[user.SpaceRoom] = user
232+
user.Update()
233+
}
234+
182235
func (user *User) GetManagementRoom() id.RoomID {
183236
if len(user.ManagementRoom) == 0 {
184237
user.mgmtCreateLock.Lock()

0 commit comments

Comments
 (0)