user.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. Discriminator string
  14. Username string
  15. ManagementRoom id.RoomID
  16. Session *discordgo.Session
  17. }
  18. func (u *User) Scan(row Scannable) *User {
  19. var token sql.NullString
  20. err := row.Scan(&u.MXID, &u.ID, &u.ManagementRoom, &token)
  21. if err != nil {
  22. if err != sql.ErrNoRows {
  23. u.log.Errorln("Database scan failed:", err)
  24. }
  25. return nil
  26. }
  27. if token.Valid {
  28. session, err := discordgo.New("Bearer " + token.String)
  29. if err != nil {
  30. u.log.Errorln("Failed to create discord session:", err)
  31. } else {
  32. u.Session = session
  33. }
  34. }
  35. return u
  36. }
  37. func (u *User) sessionNonptr() discordgo.Session {
  38. if u.Session != nil {
  39. return *u.Session
  40. }
  41. return discordgo.Session{}
  42. }
  43. func (u *User) Insert() {
  44. session := u.sessionNonptr()
  45. query := "INSERT INTO user" +
  46. " (mxid, id, management_room, token)" +
  47. " VALUES ($1, $2, $3, $4);"
  48. _, err := u.db.Exec(query, u.MXID, u.ID, u.ManagementRoom,
  49. session.Identify.Token)
  50. if err != nil {
  51. u.log.Warnfln("Failed to insert %s: %v", u.MXID, err)
  52. }
  53. }
  54. func (u *User) Update() {
  55. session := u.sessionNonptr()
  56. query := "UPDATE user SET" +
  57. " id=$1, management_room=$2, token=$3" +
  58. " WHERE mxid=$4;"
  59. _, err := u.db.Exec(query, u.ID, u.ManagementRoom, session.Identify.Token, u.MXID)
  60. if err != nil {
  61. u.log.Warnfln("Failed to update %q: %v", u.MXID, err)
  62. }
  63. }