guildquery.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package database
  2. import (
  3. "fmt"
  4. log "maunium.net/go/maulogger/v2"
  5. )
  6. type GuildQuery struct {
  7. db *Database
  8. log log.Logger
  9. }
  10. const (
  11. guildSelect = "SELECT discord_id, guild_id, guild_name, bridge FROM guild"
  12. )
  13. func (gq *GuildQuery) New() *Guild {
  14. return &Guild{
  15. db: gq.db,
  16. log: gq.log,
  17. }
  18. }
  19. func (gq *GuildQuery) Get(discordID, guildID string) *Guild {
  20. query := guildSelect + " WHERE discord_id=$1 AND guild_id=$2"
  21. row := gq.db.QueryRow(query, discordID, guildID)
  22. if row == nil {
  23. return nil
  24. }
  25. return gq.New().Scan(row)
  26. }
  27. func (gq *GuildQuery) GetAll(discordID string) []*Guild {
  28. query := guildSelect + " WHERE discord_id=$1"
  29. rows, err := gq.db.Query(query, discordID)
  30. if err != nil || rows == nil {
  31. return nil
  32. }
  33. guilds := []*Guild{}
  34. for rows.Next() {
  35. guilds = append(guilds, gq.New().Scan(rows))
  36. }
  37. return guilds
  38. }
  39. func (gq *GuildQuery) Prune(discordID string, guilds []string) {
  40. // We need this interface slice because a variadic function can't mix
  41. // arguements with a `...` expanded slice.
  42. args := []interface{}{discordID}
  43. nGuilds := len(guilds)
  44. if nGuilds <= 0 {
  45. return
  46. }
  47. gq.log.Debugfln("prunning guilds for %s", discordID)
  48. // Build the in query
  49. inQuery := "$2"
  50. for i := 1; i < nGuilds; i++ {
  51. inQuery += fmt.Sprintf(", $%d", i+2)
  52. }
  53. // Add the arguements for the build query
  54. for _, guildID := range guilds {
  55. args = append(args, guildID)
  56. }
  57. // Now remove any guilds that the user has left.
  58. query := "DELETE FROM guild WHERE discord_id=$1 AND guild_id NOT IN (" +
  59. inQuery + ")"
  60. _, err := gq.db.Exec(query, args...)
  61. if err != nil {
  62. gq.log.Warnfln("Failed to remove old guilds for user %s: %v", discordID, err)
  63. }
  64. }