role.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package database
  2. import (
  3. "database/sql"
  4. "errors"
  5. log "maunium.net/go/maulogger/v2"
  6. "maunium.net/go/mautrix/util/dbutil"
  7. "github.com/bwmarrin/discordgo"
  8. )
  9. type RoleQuery struct {
  10. db *Database
  11. log log.Logger
  12. }
  13. // language=postgresql
  14. const (
  15. roleSelect = "SELECT dc_guild_id, dcid, name, icon, mentionable, managed, hoist, color, position, permissions FROM role"
  16. roleUpsert = `
  17. INSERT INTO role (dc_guild_id, dcid, name, icon, mentionable, managed, hoist, color, position, permissions)
  18. VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
  19. ON CONFLICT (dc_guild_id, dcid) DO UPDATE
  20. SET name=excluded.name, icon=excluded.icon, mentionable=excluded.mentionable, managed=excluded.managed,
  21. hoist=excluded.hoist, color=excluded.color, position=excluded.position, permissions=excluded.permissions
  22. `
  23. roleDelete = "DELETE FROM role WHERE dc_guild_id=$1 AND dcid=$2"
  24. )
  25. func (rq *RoleQuery) New() *Role {
  26. return &Role{
  27. db: rq.db,
  28. log: rq.log,
  29. }
  30. }
  31. func (rq *RoleQuery) GetByID(guildID, dcid string) *Role {
  32. query := roleSelect + " WHERE dc_guild_id=$1 AND dcid=$2"
  33. return rq.New().Scan(rq.db.QueryRow(query, guildID, dcid))
  34. }
  35. func (rq *RoleQuery) DeleteByID(guildID, dcid string) {
  36. _, err := rq.db.Exec("DELETE FROM role WHERE dc_guild_id=$1 AND dcid=$2", guildID, dcid)
  37. if err != nil {
  38. rq.log.Warnfln("Failed to delete %s/%s: %v", guildID, dcid, err)
  39. panic(err)
  40. }
  41. }
  42. func (rq *RoleQuery) GetAll(guildID string) []*Role {
  43. rows, err := rq.db.Query(roleSelect+" WHERE dc_guild_id=$1", guildID)
  44. if err != nil {
  45. rq.log.Errorfln("Failed to query roles of %s: %v", guildID, err)
  46. return nil
  47. }
  48. var roles []*Role
  49. for rows.Next() {
  50. role := rq.New().Scan(rows)
  51. if role != nil {
  52. roles = append(roles, role)
  53. }
  54. }
  55. return roles
  56. }
  57. type Role struct {
  58. db *Database
  59. log log.Logger
  60. GuildID string
  61. discordgo.Role
  62. }
  63. func (r *Role) Scan(row dbutil.Scannable) *Role {
  64. var icon sql.NullString
  65. err := row.Scan(&r.GuildID, &r.ID, &r.Name, &icon, &r.Mentionable, &r.Managed, &r.Hoist, &r.Color, &r.Position, &r.Permissions)
  66. if err != nil {
  67. if !errors.Is(err, sql.ErrNoRows) {
  68. r.log.Errorln("Database scan failed:", err)
  69. panic(err)
  70. }
  71. return nil
  72. }
  73. r.Icon = icon.String
  74. return r
  75. }
  76. func (r *Role) Upsert(txn dbutil.Execable) {
  77. if txn == nil {
  78. txn = r.db
  79. }
  80. _, err := txn.Exec(roleUpsert, r.GuildID, r.ID, r.Name, strPtr(r.Icon), r.Mentionable, r.Managed, r.Hoist, r.Color, r.Position, r.Permissions)
  81. if err != nil {
  82. r.log.Warnfln("Failed to insert %s/%s: %v", r.GuildID, r.ID, err)
  83. panic(err)
  84. }
  85. }
  86. func (r *Role) Delete(txn dbutil.Execable) {
  87. if txn == nil {
  88. txn = r.db
  89. }
  90. _, err := txn.Exec(roleDelete, r.GuildID, r.Icon)
  91. if err != nil {
  92. r.log.Warnfln("Failed to delete %s/%s: %v", r.GuildID, r.ID, err)
  93. panic(err)
  94. }
  95. }