puppet.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package database
  2. import (
  3. "database/sql"
  4. "go.mau.fi/util/dbutil"
  5. log "maunium.net/go/maulogger/v2"
  6. "maunium.net/go/mautrix/id"
  7. )
  8. const (
  9. puppetSelect = "SELECT id, name, name_set, avatar, avatar_url, avatar_set," +
  10. " contact_info_set, global_name, username, discriminator, is_bot, is_webhook, is_application, custom_mxid, access_token, next_batch" +
  11. " FROM puppet "
  12. )
  13. type PuppetQuery struct {
  14. db *Database
  15. log log.Logger
  16. }
  17. func (pq *PuppetQuery) New() *Puppet {
  18. return &Puppet{
  19. db: pq.db,
  20. log: pq.log,
  21. }
  22. }
  23. func (pq *PuppetQuery) Get(id string) *Puppet {
  24. return pq.get(puppetSelect+" WHERE id=$1", id)
  25. }
  26. func (pq *PuppetQuery) GetByCustomMXID(mxid id.UserID) *Puppet {
  27. return pq.get(puppetSelect+" WHERE custom_mxid=$1", mxid)
  28. }
  29. func (pq *PuppetQuery) get(query string, args ...interface{}) *Puppet {
  30. return pq.New().Scan(pq.db.QueryRow(query, args...))
  31. }
  32. func (pq *PuppetQuery) GetAll() []*Puppet {
  33. return pq.getAll(puppetSelect)
  34. }
  35. func (pq *PuppetQuery) GetAllWithCustomMXID() []*Puppet {
  36. return pq.getAll(puppetSelect + " WHERE custom_mxid<>''")
  37. }
  38. func (pq *PuppetQuery) getAll(query string, args ...interface{}) []*Puppet {
  39. rows, err := pq.db.Query(query, args...)
  40. if err != nil || rows == nil {
  41. return nil
  42. }
  43. defer rows.Close()
  44. var puppets []*Puppet
  45. for rows.Next() {
  46. puppets = append(puppets, pq.New().Scan(rows))
  47. }
  48. return puppets
  49. }
  50. type Puppet struct {
  51. db *Database
  52. log log.Logger
  53. ID string
  54. Name string
  55. NameSet bool
  56. Avatar string
  57. AvatarURL id.ContentURI
  58. AvatarSet bool
  59. ContactInfoSet bool
  60. GlobalName string
  61. Username string
  62. Discriminator string
  63. IsBot bool
  64. IsWebhook bool
  65. IsApplication bool
  66. CustomMXID id.UserID
  67. AccessToken string
  68. NextBatch string
  69. }
  70. func (p *Puppet) Scan(row dbutil.Scannable) *Puppet {
  71. var avatarURL string
  72. var customMXID, accessToken, nextBatch sql.NullString
  73. err := row.Scan(&p.ID, &p.Name, &p.NameSet, &p.Avatar, &avatarURL, &p.AvatarSet, &p.ContactInfoSet,
  74. &p.GlobalName, &p.Username, &p.Discriminator, &p.IsBot, &p.IsWebhook, &p.IsApplication, &customMXID, &accessToken, &nextBatch)
  75. if err != nil {
  76. if err != sql.ErrNoRows {
  77. p.log.Errorln("Database scan failed:", err)
  78. panic(err)
  79. }
  80. return nil
  81. }
  82. p.AvatarURL, _ = id.ParseContentURI(avatarURL)
  83. p.CustomMXID = id.UserID(customMXID.String)
  84. p.AccessToken = accessToken.String
  85. p.NextBatch = nextBatch.String
  86. return p
  87. }
  88. func (p *Puppet) Insert() {
  89. query := `
  90. INSERT INTO puppet (
  91. id, name, name_set, avatar, avatar_url, avatar_set, contact_info_set,
  92. global_name, username, discriminator, is_bot, is_webhook, is_application,
  93. custom_mxid, access_token, next_batch
  94. )
  95. VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
  96. `
  97. _, err := p.db.Exec(query, p.ID, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
  98. p.GlobalName, p.Username, p.Discriminator, p.IsBot, p.IsWebhook, p.IsApplication,
  99. strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch))
  100. if err != nil {
  101. p.log.Warnfln("Failed to insert %s: %v", p.ID, err)
  102. panic(err)
  103. }
  104. }
  105. func (p *Puppet) Update() {
  106. query := `
  107. UPDATE puppet SET name=$1, name_set=$2, avatar=$3, avatar_url=$4, avatar_set=$5, contact_info_set=$6,
  108. global_name=$7, username=$8, discriminator=$9, is_bot=$10, is_webhook=$11, is_application=$12,
  109. custom_mxid=$13, access_token=$14, next_batch=$15
  110. WHERE id=$16
  111. `
  112. _, err := p.db.Exec(
  113. query,
  114. p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
  115. p.GlobalName, p.Username, p.Discriminator, p.IsBot, p.IsWebhook, p.IsApplication,
  116. strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch),
  117. p.ID,
  118. )
  119. if err != nil {
  120. p.log.Warnfln("Failed to update %s: %v", p.ID, err)
  121. panic(err)
  122. }
  123. }