Load users from the database during startup

This commit is contained in:
Gary Kramlich
2022-01-05 14:59:35 -06:00
parent aa7059b1e3
commit de1f524e25
5 changed files with 60 additions and 8 deletions

View File

@@ -141,6 +141,8 @@ func (b *Bridge) Start() error {
go b.updateBotProfile() go b.updateBotProfile()
go b.startUsers()
// Finally tell the appservice we're ready // Finally tell the appservice we're ready
b.as.Ready = true b.as.Ready = true

View File

@@ -123,7 +123,7 @@ func (l *loginCmd) Run(g *globals) error {
return err return err
} }
if err := g.user.login(user.Token); err != nil { if err := g.user.Login(user.Token); err != nil {
fmt.Println(g.context.Stdout, "failed to login", err) fmt.Println(g.context.Stdout, "failed to login", err)
return err return err

View File

@@ -74,6 +74,36 @@ func (b *Bridge) NewUser(dbUser *database.User) *User {
return user return user
} }
func (b *Bridge) getAllUsers() []*User {
b.usersLock.Lock()
defer b.usersLock.Unlock()
dbUsers := b.db.User.GetAll()
users := make([]*User, len(dbUsers))
for idx, dbUser := range dbUsers {
user, ok := b.usersByMXID[dbUser.MXID]
if !ok {
user = b.loadUser(dbUser, nil)
}
users[idx] = user
}
return users
}
func (b *Bridge) startUsers() {
b.log.Debugln("Starting users")
for _, user := range b.getAllUsers() {
// if user.ID != "" {
// haveSessions = true
// }
go user.Connect()
}
}
func (u *User) SetManagementRoom(roomID id.RoomID) { func (u *User) SetManagementRoom(roomID id.RoomID) {
u.bridge.managementRoomsLock.Lock() u.bridge.managementRoomsLock.Lock()
defer u.bridge.managementRoomsLock.Unlock() defer u.bridge.managementRoomsLock.Unlock()
@@ -137,12 +167,16 @@ func (u *User) uploadQRCode(code string) (id.ContentURI, error) {
return resp.ContentURI, nil return resp.ContentURI, nil
} }
func (u *User) login(token string) error { func (u *User) Login(token string) error {
err := u.User.Login(token) err := u.User.NewSession(token)
if err != nil { if err != nil {
return err return err
} }
return u.Connect()
}
func (u *User) Connect() error {
u.User.Session.AddHandler(u.messageHandler) u.User.Session.AddHandler(u.messageHandler)
u.log.Warnln("logged in, opening websocket") u.log.Warnln("logged in, opening websocket")

View File

@@ -21,10 +21,10 @@ type User struct {
Session *discordgo.Session Session *discordgo.Session
} }
// Login is just used to create the session and update the database and should // NewSession is just used to create the session and update the database. It
// only be called by bridge.User.Login which will continue setting up event // should only be called by bridge.User.Connect which will continue setting up
// handlers. // event handlers and everything else.
func (u *User) Login(token string) error { func (u *User) NewSession(token string) error {
session, err := discordgo.New(token) session, err := discordgo.New(token)
if err != nil { if err != nil {
return err return err
@@ -50,7 +50,7 @@ func (u *User) Scan(row Scannable) *User {
} }
if token.Valid { if token.Valid {
if err := u.Login(token.String); err != nil { if err := u.NewSession(token.String); err != nil {
u.log.Errorln("Failed to login: ", err) u.log.Errorln("Failed to login: ", err)
} }
} }

View File

@@ -25,3 +25,19 @@ func (uq *UserQuery) GetByMXID(userID id.UserID) *User {
return uq.New().Scan(row) return uq.New().Scan(row)
} }
func (uq *UserQuery) GetAll() []*User {
rows, err := uq.db.Query("SELECT mxid, id, management_room, token FROM user")
if err != nil || rows == nil {
return nil
}
defer rows.Close()
users := []*User{}
for rows.Next() {
users = append(users, uq.New().Scan(rows))
}
return users
}