user.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package database
  2. import (
  3. "database/sql"
  4. "github.com/bwmarrin/discordgo"
  5. log "maunium.net/go/maulogger/v2"
  6. "maunium.net/go/mautrix/id"
  7. )
  8. type User struct {
  9. db *Database
  10. log log.Logger
  11. MXID id.UserID
  12. ID string
  13. ManagementRoom id.RoomID
  14. Session *discordgo.Session
  15. }
  16. // NewSession is just used to create the session and update the database. It
  17. // should only be called by bridge.User.Connect which will continue setting up
  18. // event handlers and everything else.
  19. func (u *User) NewSession(token string) error {
  20. session, err := discordgo.New(token)
  21. if err != nil {
  22. return err
  23. }
  24. u.Session = session
  25. u.Update()
  26. return nil
  27. }
  28. // DeleteSession tries to logout and delete the session from the database.
  29. func (u *User) DeleteSession() error {
  30. err := u.Session.Close()
  31. if err != nil {
  32. u.log.Warnfln("failed to close the session for %s: %v", u.ID, err)
  33. }
  34. u.Session = nil
  35. u.Update()
  36. return nil
  37. }
  38. func (u *User) Scan(row Scannable) *User {
  39. var token sql.NullString
  40. err := row.Scan(&u.MXID, &u.ID, &u.ManagementRoom, &token)
  41. if err != nil {
  42. if err != sql.ErrNoRows {
  43. u.log.Errorln("Database scan failed:", err)
  44. }
  45. return nil
  46. }
  47. if token.Valid {
  48. if err := u.NewSession(token.String); err != nil {
  49. u.log.Errorln("Failed to login: ", err)
  50. }
  51. }
  52. return u
  53. }
  54. func (u *User) sessionNonptr() discordgo.Session {
  55. if u.Session != nil {
  56. return *u.Session
  57. }
  58. return discordgo.Session{}
  59. }
  60. func (u *User) Insert() {
  61. session := u.sessionNonptr()
  62. query := "INSERT INTO \"user\"" +
  63. " (mxid, id, management_room, token)" +
  64. " VALUES ($1, $2, $3, $4);"
  65. _, err := u.db.Exec(query, u.MXID, u.ID, u.ManagementRoom,
  66. session.Identify.Token)
  67. if err != nil {
  68. u.log.Warnfln("Failed to insert %s: %v", u.MXID, err)
  69. }
  70. }
  71. func (u *User) Update() {
  72. session := u.sessionNonptr()
  73. query := "UPDATE \"user\" SET" +
  74. " id=$1, management_room=$2, token=$3" +
  75. " WHERE mxid=$4;"
  76. _, err := u.db.Exec(query, u.ID, u.ManagementRoom, session.Identify.Token, u.MXID)
  77. if err != nil {
  78. u.log.Warnfln("Failed to update %q: %v", u.MXID, err)
  79. }
  80. }