Add user-portal mapping to database
This commit is contained in:
86
user.go
86
user.go
@ -66,20 +66,7 @@ func (bridge *Bridge) GetUserByMXID(userID types.MatrixUserID) *User {
|
||||
defer bridge.usersLock.Unlock()
|
||||
user, ok := bridge.usersByMXID[userID]
|
||||
if !ok {
|
||||
dbUser := bridge.DB.User.GetByMXID(userID)
|
||||
if dbUser == nil {
|
||||
dbUser = bridge.DB.User.New()
|
||||
dbUser.MXID = userID
|
||||
dbUser.Insert()
|
||||
}
|
||||
user = bridge.NewUser(dbUser)
|
||||
bridge.usersByMXID[user.MXID] = user
|
||||
if len(user.JID) > 0 {
|
||||
bridge.usersByJID[user.JID] = user
|
||||
}
|
||||
if len(user.ManagementRoom) > 0 {
|
||||
bridge.managementRooms[user.ManagementRoom] = user
|
||||
}
|
||||
return bridge.loadDBUser(bridge.DB.User.GetByMXID(userID), &userID)
|
||||
}
|
||||
return user
|
||||
}
|
||||
@ -89,16 +76,7 @@ func (bridge *Bridge) GetUserByJID(userID types.WhatsAppID) *User {
|
||||
defer bridge.usersLock.Unlock()
|
||||
user, ok := bridge.usersByJID[userID]
|
||||
if !ok {
|
||||
dbUser := bridge.DB.User.GetByJID(userID)
|
||||
if dbUser == nil {
|
||||
return nil
|
||||
}
|
||||
user = bridge.NewUser(dbUser)
|
||||
bridge.usersByMXID[user.MXID] = user
|
||||
bridge.usersByJID[user.JID] = user
|
||||
if len(user.ManagementRoom) > 0 {
|
||||
bridge.managementRooms[user.ManagementRoom] = user
|
||||
}
|
||||
return bridge.loadDBUser(bridge.DB.User.GetByJID(userID), nil)
|
||||
}
|
||||
return user
|
||||
}
|
||||
@ -111,20 +89,50 @@ func (bridge *Bridge) GetAllUsers() []*User {
|
||||
for index, dbUser := range dbUsers {
|
||||
user, ok := bridge.usersByMXID[dbUser.MXID]
|
||||
if !ok {
|
||||
user = bridge.NewUser(dbUser)
|
||||
bridge.usersByMXID[user.MXID] = user
|
||||
if len(user.JID) > 0 {
|
||||
bridge.usersByJID[user.JID] = user
|
||||
}
|
||||
if len(user.ManagementRoom) > 0 {
|
||||
bridge.managementRooms[user.ManagementRoom] = user
|
||||
}
|
||||
user = bridge.loadDBUser(dbUser, nil)
|
||||
}
|
||||
output[index] = user
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
func (bridge *Bridge) loadDBUser(dbUser *database.User, mxid *types.MatrixUserID) *User {
|
||||
if dbUser == nil {
|
||||
if mxid == nil {
|
||||
return nil
|
||||
}
|
||||
dbUser = bridge.DB.User.New()
|
||||
dbUser.MXID = *mxid
|
||||
dbUser.Insert()
|
||||
}
|
||||
user := bridge.NewUser(dbUser)
|
||||
bridge.usersByMXID[user.MXID] = user
|
||||
if len(user.JID) > 0 {
|
||||
bridge.usersByJID[user.JID] = user
|
||||
}
|
||||
if len(user.ManagementRoom) > 0 {
|
||||
bridge.managementRooms[user.ManagementRoom] = user
|
||||
}
|
||||
return user
|
||||
}
|
||||
|
||||
func (user *User) GetPortals() []*Portal {
|
||||
keys := user.User.GetPortalKeys()
|
||||
portals := make([]*Portal, len(keys))
|
||||
|
||||
user.bridge.portalsLock.Lock()
|
||||
defer user.bridge.portalsLock.Unlock()
|
||||
|
||||
for i, key := range keys {
|
||||
portal, ok := user.bridge.portalsByJID[key]
|
||||
if !ok {
|
||||
portal = user.bridge.loadDBPortal(user.bridge.DB.Portal.GetByJID(key), &key)
|
||||
}
|
||||
portals[i] = portal
|
||||
}
|
||||
return portals
|
||||
}
|
||||
|
||||
func (bridge *Bridge) NewUser(dbUser *database.User) *User {
|
||||
user := &User{
|
||||
User: dbUser,
|
||||
@ -295,18 +303,26 @@ func (user *User) PostLogin() {
|
||||
}
|
||||
|
||||
func (user *User) syncPortals(createAll bool) {
|
||||
var chats ChatList
|
||||
chats := make(ChatList, 0, len(user.Conn.Store.Chats))
|
||||
portalKeys := make([]database.PortalKey, 0, len(user.Conn.Store.Chats))
|
||||
for _, chat := range user.Conn.Store.Chats {
|
||||
ts, err := strconv.ParseUint(chat.LastMessageTime, 10, 64)
|
||||
if err != nil {
|
||||
user.log.Warnfln("Non-integer last message time in %s: %s", chat.Jid, chat.LastMessageTime)
|
||||
continue
|
||||
}
|
||||
portal := user.GetPortalByJID(chat.Jid)
|
||||
|
||||
chats = append(chats, Chat{
|
||||
Portal: user.GetPortalByJID(chat.Jid),
|
||||
Portal: portal,
|
||||
Contact: user.Conn.Store.Contacts[chat.Jid],
|
||||
LastMessageTime: ts,
|
||||
})
|
||||
portalKeys = append(portalKeys, portal.Key)
|
||||
}
|
||||
err := user.SetPortalKeys(portalKeys)
|
||||
if err != nil {
|
||||
user.log.Warnln("Failed to update user-portal mapping:", err)
|
||||
}
|
||||
sort.Sort(chats)
|
||||
limit := user.bridge.Config.Bridge.InitialChatSync
|
||||
@ -315,7 +331,7 @@ func (user *User) syncPortals(createAll bool) {
|
||||
}
|
||||
now := uint64(time.Now().Unix())
|
||||
for i, chat := range chats {
|
||||
if chat.LastMessageTime + user.bridge.Config.Bridge.SyncChatMaxAge < now {
|
||||
if chat.LastMessageTime+user.bridge.Config.Bridge.SyncChatMaxAge < now {
|
||||
break
|
||||
}
|
||||
create := (chat.LastMessageTime >= user.LastConnection && user.LastConnection > 0) || i < limit
|
||||
|
Reference in New Issue
Block a user