user.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. func (u *User) Scan(row Scannable) *User {
  29. var token sql.NullString
  30. err := row.Scan(&u.MXID, &u.ID, &u.ManagementRoom, &token)
  31. if err != nil {
  32. if err != sql.ErrNoRows {
  33. u.log.Errorln("Database scan failed:", err)
  34. }
  35. return nil
  36. }
  37. if token.Valid {
  38. if err := u.NewSession(token.String); err != nil {
  39. u.log.Errorln("Failed to login: ", err)
  40. }
  41. }
  42. return u
  43. }
  44. func (u *User) sessionNonptr() discordgo.Session {
  45. if u.Session != nil {
  46. return *u.Session
  47. }
  48. return discordgo.Session{}
  49. }
  50. func (u *User) Insert() {
  51. session := u.sessionNonptr()
  52. query := "INSERT INTO user" +
  53. " (mxid, id, management_room, token)" +
  54. " VALUES ($1, $2, $3, $4);"
  55. _, err := u.db.Exec(query, u.MXID, u.ID, u.ManagementRoom,
  56. session.Identify.Token)
  57. if err != nil {
  58. u.log.Warnfln("Failed to insert %s: %v", u.MXID, err)
  59. }
  60. }
  61. func (u *User) Update() {
  62. session := u.sessionNonptr()
  63. query := "UPDATE user SET" +
  64. " id=$1, management_room=$2, token=$3" +
  65. " WHERE mxid=$4;"
  66. _, err := u.db.Exec(query, u.ID, u.ManagementRoom, session.Identify.Token, u.MXID)
  67. if err != nil {
  68. u.log.Warnfln("Failed to update %q: %v", u.MXID, err)
  69. }
  70. }