From 6b6c775ab3af659e26f0c79dbabd86d88d2451d5 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:15:59 +0200 Subject: [PATCH] refactor(gorm): remove ...At fields from model --- PRIVACY.md | 4 +-- config/guild.go | 5 ++-- events.go | 6 ++-- user/member.go | 80 +++++++++++-------------------------------------- user/xp.go | 33 +++----------------- 5 files changed, 29 insertions(+), 99 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index 87f3f69..eb60bac 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -32,9 +32,9 @@ En tant qu'utilisateur, vous avez le droit de : - avoir accès à vos données sauvegardées - modifier ces données -Pour exercer vos droits concernant l'accès aux données ou à la modification des données, contacter me@anhgelus.world. +Pour exercer vos droits concernant l'accès aux données ou à la modification des données, contactez me@anhgelus.world. -Concernant la suppression des données, entraîne de facto une remise à zéro de votre profile sur un serveur, contacter le propriétaire du serveur. +La suppression des données entraîne de facto une remise à zéro de votre profile sur un serveur, contactez le propriétaire du serveur pour exercer ce droit. Concernant la suppression intégrale des données, contacter me@anhgelus.world. diff --git a/config/guild.go b/config/guild.go index 0971837..5e41465 100644 --- a/config/guild.go +++ b/config/guild.go @@ -3,12 +3,11 @@ package config import ( "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" - "gorm.io/gorm" "strings" ) type GuildConfig struct { - gorm.Model + ID uint `gorm:"primarykey"` GuildID string `gorm:"not null;unique"` XpRoles []XpRole DisabledChannels string @@ -16,7 +15,7 @@ type GuildConfig struct { } type XpRole struct { - gorm.Model + ID uint `gorm:"primarykey"` XP uint RoleID string GuildConfigID uint diff --git a/events.go b/events.go index a00fe6c..4e23b69 100644 --- a/events.go +++ b/events.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" @@ -162,8 +161,11 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { utils.SendDebug("Leave event", "user_id", e.User.ID) + if e.User.Bot { + return + } c := user.GetCopaing(e.User.ID, e.GuildID) - if err := gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c).Error; err != nil { + if err := c.Delete(); err != nil { utils.SendAlert( "events.go - deleting user from db", err.Error(), "user_id", e.User.ID, diff --git a/user/member.go b/user/member.go index 91327ad..dc93979 100644 --- a/user/member.go +++ b/user/member.go @@ -4,32 +4,21 @@ import ( "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" - "gorm.io/gorm" ) type Copaing struct { - gorm.Model - DiscordID string `gorm:"not null"` - //XP []CopaingXP - XP uint `gorm:"default:0"` - GuildID string `gorm:"not null"` + ID uint `gorm:"primarykey"` + DiscordID string `gorm:"not null"` + XP []CopaingXP `gorm:"constraint:OnDelete:SET NULL;"` + GuildID string `gorm:"not null"` } -type leftCopaing struct { - ID uint - StopDelete chan<- interface{} +type CopaingXP struct { + ID uint `gorm:"primarykey"` + XP uint `gorm:"default:0"` + CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"` } -//type CopaingXP struct { -// gorm.Model -// XP uint `gorm:"default:0"` -// CopaingID uint -//} - -var ( - leftCopaingsMap = map[string]*leftCopaing{} -) - const ( LastEvent = "last_event" AlreadyRemoved = "already_removed" @@ -52,50 +41,11 @@ func GetCopaing(discordID string, guildID string) *Copaing { } func (c *Copaing) Load() error { - // check if user left in the past 48 hours - k := c.GuildID + ":" + c.DiscordID - l, ok := leftCopaingsMap[k] - if !ok || l == nil { - // if not, common first or create - return gokord.DB.Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).FirstOrCreate(c).Error - } - // else, getting last data - tmp := Copaing{ - Model: gorm.Model{ - ID: c.ID, - }, - DiscordID: c.DiscordID, - GuildID: c.GuildID, - } - if err := gokord.DB.Unscoped().Find(&tmp).Error; err != nil { - // if error, avoid getting old data and use new one - utils.SendAlert( - "user/member.go - Getting user in soft delete", err.Error(), - "discord_id", c.DiscordID, - "guild_id", c.DiscordID, - "last_id", l.ID, - ) - return gokord.DB.Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).FirstOrCreate(c).Error - } - // resetting internal data - tmp.Model = gorm.Model{} - l.StopDelete <- true - leftCopaingsMap[k] = nil - // creating new data - err := gokord.DB.Create(&tmp).Error - if err != nil { - return err - } - // delete old data - if err = gokord.DB.Unscoped().Delete(&tmp).Error; err != nil { - utils.SendAlert( - "user/member.go - Deleting user in soft delete", err.Error(), - "discord_id", c.DiscordID, - "guild_id", c.DiscordID, - "last_id", l.ID, - ) - } - return nil + return gokord.DB. + Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID). + Preload("XP"). + FirstOrCreate(c). + Error } func (c *Copaing) Save() error { @@ -105,3 +55,7 @@ func (c *Copaing) Save() error { func (c *Copaing) GenKey(key string) string { return fmt.Sprintf("%s:%s:%s", c.GuildID, c.DiscordID, key) } + +func (c *Copaing) Delete() error { + return gokord.DB.Where("guild_id = ? AND discord_id = ?", c.GuildID, c.DiscordID).Delete(c).Error +} diff --git a/user/xp.go b/user/xp.go index 4b93f26..90be09d 100644 --- a/user/xp.go +++ b/user/xp.go @@ -10,7 +10,6 @@ import ( "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" "github.com/redis/go-redis/v9" - "gorm.io/gorm" "math" "strconv" "time" @@ -105,20 +104,20 @@ func (c *Copaing) AddXPAlreadyRemoved(xp uint) uint { utils.SendAlert("user/xp.go - Getting redis client (set)", err.Error()) return 0 } - exp := xp + c.XPAlreadyRemoved() - err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), exp, 0).Err() + nxp := xp + c.XPAlreadyRemoved() + err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), nxp, 0).Err() if err != nil { utils.SendAlert( "user/xp.go - Setting already removed", err.Error(), "exp already removed", - exp, + nxp, "base_key", c.GenKey(""), ) return 0 } - return exp + return nxp } func (c *Copaing) XPAlreadyRemoved() uint { @@ -159,27 +158,3 @@ func (c *Copaing) XPAlreadyRemoved() uint { } return uint(xp) } - -func (c *Copaing) Reset() { - gokord.DB.Where("guild_id = ? AND discord_id = ?", c.GuildID, c.DiscordID).Delete(c) -} - -func (c *Copaing) AfterDelete(db *gorm.DB) error { - id := c.ID - dID := c.DiscordID - gID := c.GuildID - k := c.GuildID + ":" + c.DiscordID - ch := utils.NewTimer(48*time.Hour, func(stop chan<- interface{}) { - if err := db.Unscoped().Where("id = ?", id).Delete(c).Error; err != nil { - utils.SendAlert( - "user/xp.go - Removing user from database", err.Error(), - "discord_id", dID, - "guild_id", gID, - ) - } - stop <- true - leftCopaingsMap[k] = nil - }) - leftCopaingsMap[k] = &leftCopaing{id, ch} - return nil -}