user.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package bridge
  2. import (
  3. log "maunium.net/go/maulogger/v2"
  4. "maunium.net/go/mautrix/id"
  5. "gitlab.com/beeper/discord/database"
  6. )
  7. type User struct {
  8. *database.User
  9. bridge *Bridge
  10. log log.Logger
  11. }
  12. func (b *Bridge) loadUser(dbUser *database.User, mxid *id.UserID) *User {
  13. // If we weren't passed in a user we attempt to create one if we were given
  14. // a matrix id.
  15. if dbUser == nil {
  16. if mxid == nil {
  17. return nil
  18. }
  19. dbUser = b.db.User.New()
  20. dbUser.MXID = *mxid
  21. dbUser.Insert()
  22. }
  23. user := b.NewUser(dbUser)
  24. // We assume the usersLock was acquired by our caller.
  25. b.usersByMXID[user.MXID] = user
  26. if user.ID != "" {
  27. b.usersByID[user.ID] = user
  28. }
  29. if user.ManagementRoom != "" {
  30. // Lock the management rooms for our update
  31. b.managementRoomsLock.Lock()
  32. b.managementRooms[user.ManagementRoom] = user
  33. b.managementRoomsLock.Unlock()
  34. }
  35. return user
  36. }
  37. func (b *Bridge) GetUserByMXID(userID id.UserID) *User {
  38. // TODO: check if puppet
  39. b.usersLock.Lock()
  40. defer b.usersLock.Unlock()
  41. user, ok := b.usersByMXID[userID]
  42. if !ok {
  43. return b.loadUser(b.db.User.GetByMXID(userID), &userID)
  44. }
  45. return user
  46. }
  47. func (b *Bridge) NewUser(dbUser *database.User) *User {
  48. user := &User{
  49. User: dbUser,
  50. bridge: b,
  51. log: b.log.Sub("User").Sub(string(dbUser.MXID)),
  52. }
  53. return user
  54. }
  55. func (u *User) SetManagementRoom(roomID id.RoomID) {
  56. u.bridge.managementRoomsLock.Lock()
  57. defer u.bridge.managementRoomsLock.Unlock()
  58. existing, ok := u.bridge.managementRooms[roomID]
  59. if ok {
  60. // If there's a user already assigned to this management room, clear it
  61. // out.
  62. // I think this is due a name change or something? I dunno, leaving it
  63. // for now.
  64. existing.ManagementRoom = ""
  65. existing.Update()
  66. }
  67. u.ManagementRoom = roomID
  68. u.bridge.managementRooms[u.ManagementRoom] = u
  69. u.Update()
  70. }
  71. func (u *User) HasSession() bool {
  72. return u.User.Session != nil
  73. }