user.go 1.5 KB

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