diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2026-03-09 18:47:40 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2026-03-09 18:47:40 +0100 |
| commit | 9c3f1ea5ffe9ad70caf306faff7a3e3948cef6ab (patch) | |
| tree | d7931c65a40a7bf22764473c0dd330f83a4bc071 /config/guild.go | |
| parent | 6e92feaba23a4992e0ec4b529660921a6bcb492a (diff) | |
feat(config): preload role reactfeat/leave-gorm
Diffstat (limited to 'config/guild.go')
| -rw-r--r-- | config/guild.go | 79 |
1 files changed, 19 insertions, 60 deletions
diff --git a/config/guild.go b/config/guild.go index aec78ed..10e30ff 100644 --- a/config/guild.go +++ b/config/guild.go @@ -15,40 +15,22 @@ import ( type Guild struct { ID uint64 - XpRoles []XpRole + XpRoles []*XpRole DisabledChannels string FallbackChannel uint64 DaysXPRemains uint - RrMessages []RoleReactMessage -} - -type RoleReactMessage struct { - ID uint `gorm:"primarykey"` - MessageID uint64 `gorm:"not null;unique"` - ChannelID uint64 - GuildID uint64 - Note string - Roles []*RoleReact -} - -type RoleReact struct { - ID uint `gorm:"primarykey"` - Reaction string - RoleID uint64 - RoleReactMessageID uint - CounterID uint `gorm:"-"` + RrMessages []*RoleReactMessage } func GetGuild(ctx context.Context, guildID uint64) *Guild { cfg := Guild{ID: guildID} - if err := cfg.Load(ctx); err != nil { + if err := cfg.load(ctx, common.GetDB(ctx)); err != nil { panic(err) } return &cfg } -func (g *Guild) Load(ctx context.Context) error { - db := common.GetDB(ctx) +func (g *Guild) load(ctx context.Context, db *sql.DB) error { row := db.QueryRowContext( ctx, `SELECT disabled_channels, fallback_channel, days_xp_remains FROM guilds WHERE id = ?`, @@ -72,12 +54,15 @@ func (g *Guild) Load(ctx context.Context) error { if err != nil { return err } - g.XpRoles, err = getXpRoles(ctx, g.ID) + g.XpRoles, err = getXpRoles(ctx, db, g.ID) + if err != nil { + return err + } + g.RrMessages, err = getRoleReactMessages(ctx, db, g.ID) return err } -func (g *Guild) Save(ctx context.Context) error { - db := common.GetDB(ctx) +func (g *Guild) Save(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext( ctx, `UPDATE guilds SET disabled_channels = ?, fallback_channel = ?, days_xp_remains = ? WHERE id = ?`, @@ -86,19 +71,19 @@ func (g *Guild) Save(ctx context.Context) error { if err != nil { return err } - savedRoles, err := getXpRoles(ctx, g.ID) + savedRoles, err := getXpRoles(ctx, db, g.ID) if err != nil { return err } - roleEqual := func(base XpRole) func(XpRole) bool { - return func(v XpRole) bool { + roleEqual := func(base *XpRole) func(*XpRole) bool { + return func(v *XpRole) bool { return v.GuildID == base.GuildID && v.RoleID == base.RoleID && v.XP == base.XP } } // super slow code, but I don't want to implement a data structure to optimize this for _, role := range g.XpRoles { if !slices.ContainsFunc(savedRoles, roleEqual(role)) { - err = role.Save(ctx) + err = role.Save(ctx, db) if err != nil { return err } @@ -106,7 +91,7 @@ func (g *Guild) Save(ctx context.Context) error { } for _, role := range savedRoles { if !slices.ContainsFunc(g.XpRoles, roleEqual(role)) { - err = role.Delete(ctx) + err = role.Delete(ctx, db) if err != nil { return err } @@ -133,37 +118,11 @@ func (g *Guild) IsDisabled(ctx context.Context, dg bot.Session, channelID uint64 return !ok } -func (g *Guild) FindXpRole(roleID uint64) (int, *XpRole) { - for i, r := range g.XpRoles { +func (g *Guild) FindXpRole(roleID uint64) *XpRole { + for _, r := range g.XpRoles { if r.RoleID == roleID { - return i, &r - } - } - return 0, nil -} - -func getXpRoles(ctx context.Context, gID uint64) ([]XpRole, error) { - roles := make([]XpRole, 0) - rows, err := common.GetDB(ctx).QueryContext( - ctx, - `SELECT xp, role FROM xp_roles WHERE guild_id = ?`, - gID, - ) - if err == nil { - defer rows.Close() - for rows.Next() { - var role XpRole - err = rows.Scan(&role.XP, &role.RoleID) - if err != nil { - return roles, err - } - role.GuildID = gID - roles = append(roles, role) - } - } else { - if !errors.Is(err, sql.ErrNoRows) { - return roles, err + return r } } - return roles, nil + return nil } |
