aboutsummaryrefslogtreecommitdiff
path: root/config/guild.go
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-03-09 18:47:40 +0100
committerAnhgelus Morhtuuzh <william@herges.fr>2026-03-09 18:47:40 +0100
commit9c3f1ea5ffe9ad70caf306faff7a3e3948cef6ab (patch)
treed7931c65a40a7bf22764473c0dd330f83a4bc071 /config/guild.go
parent6e92feaba23a4992e0ec4b529660921a6bcb492a (diff)
feat(config): preload role reactfeat/leave-gorm
Diffstat (limited to 'config/guild.go')
-rw-r--r--config/guild.go79
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
}