puppet.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package database
  2. import (
  3. "database/sql"
  4. log "maunium.net/go/maulogger/v2"
  5. "maunium.net/go/mautrix/id"
  6. "maunium.net/go/mautrix/util/dbutil"
  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, 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. CustomMXID id.UserID
  66. AccessToken string
  67. NextBatch string
  68. }
  69. func (p *Puppet) Scan(row dbutil.Scannable) *Puppet {
  70. var avatarURL string
  71. var customMXID, accessToken, nextBatch sql.NullString
  72. err := row.Scan(&p.ID, &p.Name, &p.NameSet, &p.Avatar, &avatarURL, &p.AvatarSet, &p.ContactInfoSet,
  73. &p.GlobalName, &p.Username, &p.Discriminator, &p.IsBot, &p.IsWebhook, &customMXID, &accessToken, &nextBatch)
  74. if err != nil {
  75. if err != sql.ErrNoRows {
  76. p.log.Errorln("Database scan failed:", err)
  77. panic(err)
  78. }
  79. return nil
  80. }
  81. p.AvatarURL, _ = id.ParseContentURI(avatarURL)
  82. p.CustomMXID = id.UserID(customMXID.String)
  83. p.AccessToken = accessToken.String
  84. p.NextBatch = nextBatch.String
  85. return p
  86. }
  87. func (p *Puppet) Insert() {
  88. query := `
  89. INSERT INTO puppet (
  90. id, name, name_set, avatar, avatar_url, avatar_set, contact_info_set,
  91. global_name, username, discriminator, is_bot, is_webhook,
  92. custom_mxid, access_token, next_batch
  93. )
  94. VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
  95. `
  96. _, err := p.db.Exec(query, p.ID, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
  97. p.GlobalName, p.Username, p.Discriminator, p.IsBot, p.IsWebhook,
  98. strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch))
  99. if err != nil {
  100. p.log.Warnfln("Failed to insert %s: %v", p.ID, err)
  101. panic(err)
  102. }
  103. }
  104. func (p *Puppet) Update() {
  105. query := `
  106. UPDATE puppet SET name=$1, name_set=$2, avatar=$3, avatar_url=$4, avatar_set=$5, contact_info_set=$6,
  107. global_name=$7, username=$8, discriminator=$9, is_bot=$10, is_webhook=$11,
  108. custom_mxid=$12, access_token=$13, next_batch=$14
  109. WHERE id=$13
  110. `
  111. _, err := p.db.Exec(
  112. query,
  113. p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
  114. p.GlobalName, p.Username, p.Discriminator, p.IsBot, p.IsWebhook,
  115. strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch),
  116. p.ID,
  117. )
  118. if err != nil {
  119. p.log.Warnfln("Failed to update %s: %v", p.ID, err)
  120. panic(err)
  121. }
  122. }