guild.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package database
  2. import (
  3. "database/sql"
  4. "errors"
  5. log "maunium.net/go/maulogger/v2"
  6. "maunium.net/go/mautrix/id"
  7. "maunium.net/go/mautrix/util/dbutil"
  8. )
  9. type GuildQuery struct {
  10. db *Database
  11. log log.Logger
  12. }
  13. const (
  14. guildSelect = "SELECT dcid, mxid, plain_name, name, name_set, avatar, avatar_url, avatar_set, auto_bridge_channels FROM guild"
  15. )
  16. func (gq *GuildQuery) New() *Guild {
  17. return &Guild{
  18. db: gq.db,
  19. log: gq.log,
  20. }
  21. }
  22. func (gq *GuildQuery) GetByID(dcid string) *Guild {
  23. query := guildSelect + " WHERE dcid=$1"
  24. return gq.New().Scan(gq.db.QueryRow(query, dcid))
  25. }
  26. func (gq *GuildQuery) GetByMXID(mxid id.RoomID) *Guild {
  27. query := guildSelect + " WHERE mxid=$1"
  28. return gq.New().Scan(gq.db.QueryRow(query, mxid))
  29. }
  30. func (gq *GuildQuery) GetAll() []*Guild {
  31. rows, err := gq.db.Query(guildSelect)
  32. if err != nil {
  33. gq.log.Errorln("Failed to query guilds:", err)
  34. return nil
  35. }
  36. var guilds []*Guild
  37. for rows.Next() {
  38. guild := gq.New().Scan(rows)
  39. if guild != nil {
  40. guilds = append(guilds, guild)
  41. }
  42. }
  43. return guilds
  44. }
  45. type Guild struct {
  46. db *Database
  47. log log.Logger
  48. ID string
  49. MXID id.RoomID
  50. PlainName string
  51. Name string
  52. NameSet bool
  53. Avatar string
  54. AvatarURL id.ContentURI
  55. AvatarSet bool
  56. AutoBridgeChannels bool
  57. }
  58. func (g *Guild) Scan(row dbutil.Scannable) *Guild {
  59. var mxid sql.NullString
  60. var avatarURL string
  61. err := row.Scan(&g.ID, &mxid, &g.PlainName, &g.Name, &g.NameSet, &g.Avatar, &avatarURL, &g.AvatarSet, &g.AutoBridgeChannels)
  62. if err != nil {
  63. if !errors.Is(err, sql.ErrNoRows) {
  64. g.log.Errorln("Database scan failed:", err)
  65. panic(err)
  66. }
  67. return nil
  68. }
  69. g.MXID = id.RoomID(mxid.String)
  70. g.AvatarURL, _ = id.ParseContentURI(avatarURL)
  71. return g
  72. }
  73. func (g *Guild) mxidPtr() *id.RoomID {
  74. if g.MXID != "" {
  75. return &g.MXID
  76. }
  77. return nil
  78. }
  79. func (g *Guild) Insert() {
  80. query := `
  81. INSERT INTO guild (dcid, mxid, plain_name, name, name_set, avatar, avatar_url, avatar_set, auto_bridge_channels)
  82. VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
  83. `
  84. _, err := g.db.Exec(query, g.ID, g.mxidPtr(), g.PlainName, g.Name, g.NameSet, g.Avatar, g.AvatarURL.String(), g.AvatarSet, g.AutoBridgeChannels)
  85. if err != nil {
  86. g.log.Warnfln("Failed to insert %s: %v", g.ID, err)
  87. panic(err)
  88. }
  89. }
  90. func (g *Guild) Update() {
  91. query := `
  92. UPDATE guild SET mxid=$1, plain_name=$2, name=$3, name_set=$4, avatar=$5, avatar_url=$6, avatar_set=$7, auto_bridge_channels=$8
  93. WHERE dcid=$9
  94. `
  95. _, err := g.db.Exec(query, g.mxidPtr(), g.PlainName, g.Name, g.NameSet, g.Avatar, g.AvatarURL.String(), g.AvatarSet, g.AutoBridgeChannels, g.ID)
  96. if err != nil {
  97. g.log.Warnfln("Failed to update %s: %v", g.ID, err)
  98. panic(err)
  99. }
  100. }
  101. func (g *Guild) Delete() {
  102. _, err := g.db.Exec("DELETE FROM guild WHERE dcid=$1", g.ID)
  103. if err != nil {
  104. g.log.Warnfln("Failed to delete %s: %v", g.ID, err)
  105. panic(err)
  106. }
  107. }