feat(level): update roles on new level

This commit is contained in:
Anhgelus Morhtuuzh 2024-04-15 16:12:19 +02:00
parent beb0ea0ca4
commit 9e6a5ce1d3
No known key found for this signature in database
GPG key ID: CF4550297832A29F
8 changed files with 78 additions and 73 deletions

View file

@ -8,14 +8,6 @@ import (
"github.com/bwmarrin/discordgo"
)
func Config(s *discordgo.Session, i *discordgo.InteractionCreate) {
resp := utils.ResponseBuilder{C: s, I: i}
err := resp.Message("Merci d'utiliser les sous-commandes.").IsEphemeral().Send()
if err != nil {
utils.SendAlert("commands/config.go - Sending please use subcommand", err.Error())
}
}
func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
cfg := config.GetGuildConfig(i.GuildID)
resp := utils.ResponseBuilder{C: s, I: i}
@ -23,9 +15,9 @@ func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
l := len(cfg.XpRoles) - 1
for i, r := range cfg.XpRoles {
if i == l {
roles += fmt.Sprintf("> **%d** - <@&%s>", xp.Level(r.XP), r.RoleID)
roles += fmt.Sprintf("> Niveau %d - <@&%s>", xp.Level(r.XP), r.RoleID)
} else {
roles += fmt.Sprintf("> **%d** - <@&%s>\n", xp.Level(r.XP), r.RoleID)
roles += fmt.Sprintf("> Niveau %d - <@&%s>\n", xp.Level(r.XP), r.RoleID)
}
}
err := resp.Embeds([]*discordgo.MessageEmbed{
@ -50,14 +42,12 @@ func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
optMap := utils.GenerateOptionMapForSubcommand(i)
for k, v := range optMap {
utils.SendSuccess("option map", "key", k, "value", v)
}
resp := utils.ResponseBuilder{C: s, I: i}
resp.IsEphemeral()
// verify every args
t, ok := optMap["type"]
if !ok {
err := resp.Message("Le type d'action n'a pas été renseigné.").IsEphemeral().Send()
err := resp.Message("Le type d'action n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Action type not set", err.Error())
}
@ -66,7 +56,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
ts := t.StringValue()
lvl, ok := optMap["level"]
if !ok {
err := resp.Message("Le niveau n'a pas été renseigné.").IsEphemeral().Send()
err := resp.Message("Le niveau n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Level not set", err.Error())
}
@ -74,7 +64,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}
level := lvl.IntValue()
if level < 1 {
err := resp.Message("Le niveau doit forcément être supérieur à 0.").IsEphemeral().Send()
err := resp.Message("Le niveau doit forcément être supérieur à 0.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Invalid level", err.Error())
}
@ -83,7 +73,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
exp := xp.XPForLevel(uint(level))
r, ok := optMap["role"]
if !ok {
err := resp.Message("Le role n'a pas été renseigné.").IsEphemeral().Send()
err := resp.Message("Le rôle n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not set", err.Error())
}
@ -102,7 +92,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
case "del":
pos, r := cfg.FindXpRole(exp, role.ID)
if r == nil {
err := resp.Message("Le role n'a pas été trouvé dans la config.").IsEphemeral().Send()
err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not found (del)", err.Error())
}
@ -112,7 +102,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
case "edit":
pos, r := cfg.FindXpRole(exp, role.ID)
if r == nil {
err := resp.Message("Le role n'a pas été trouvé dans la config.").IsEphemeral().Send()
err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not found (edit)", err.Error())
}
@ -121,7 +111,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
r.RoleID = role.ID
cfg.XpRoles[pos] = *r
default:
err := resp.Message("Le type d'action n'est pas valide.").IsEphemeral().Send()
err := resp.Message("Le type d'action n'est pas valide.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Invalid action type", err.Error())
}
@ -129,7 +119,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}
// save
cfg.Save()
err := resp.Message("La configuration a bien été mise à jour.").IsEphemeral().Send()
err := resp.Message("La configuration a bien été mise à jour.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Config updated", err.Error())
}

10
go.mod
View file

@ -2,10 +2,14 @@ module github.com/anhgelus/les-copaings-bot
go 1.22
require github.com/anhgelus/gokord v0.2.0
require (
github.com/anhgelus/gokord v0.2.1
github.com/bwmarrin/discordgo v0.28.1
github.com/redis/go-redis/v9 v9.5.1
gorm.io/gorm v1.25.9
)
require (
github.com/bwmarrin/discordgo v0.28.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/gorilla/websocket v1.5.1 // indirect
@ -16,12 +20,10 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.1 // indirect
github.com/redis/go-redis/v9 v9.5.1 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
gorm.io/driver/postgres v1.5.7 // indirect
gorm.io/gorm v1.25.9 // indirect
)

42
go.sum
View file

@ -1,41 +1,7 @@
github.com/anhgelus/gokord v0.1.0 h1:FTaCc6mpInsJw5LZQMSc0CQk3rhMiTMiLYrkz31liMI=
github.com/anhgelus/gokord v0.1.0/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.1 h1:ZSNHA2DocqfadvFlrur7MDV+Newe5rXbqMlgPAXyDs8=
github.com/anhgelus/gokord v0.1.1/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.2 h1:+DMUXweXTQoKZblkP/IgYQsst1dCv4gwzHUb7LXtQ1k=
github.com/anhgelus/gokord v0.1.2/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414130304-4e4b63fbcee5 h1:5c6fo5kdNowNZ2fjIxlanb+36IoACDoC+xDclxsrY9s=
github.com/anhgelus/gokord v0.1.3-0.20240414130304-4e4b63fbcee5/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414131019-7aa4d9b782d9 h1:QU49AHXZK6YR8nctNNkYEIm8XVbDeX9gZj2sNJizMHc=
github.com/anhgelus/gokord v0.1.3-0.20240414131019-7aa4d9b782d9/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414131245-ffd200d5a39f h1:hoSuvF8odc+4iKSKfju0txUHFnnFFrMyFkn0Xgw+Am8=
github.com/anhgelus/gokord v0.1.3-0.20240414131245-ffd200d5a39f/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414131626-4b1333f66900 h1:eljywevvcOZOlauY2eKuU2K47NDLvo1vPWWTvjnYzHE=
github.com/anhgelus/gokord v0.1.3-0.20240414131626-4b1333f66900/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414132146-03e7ed2add2c h1:v0LA8+NnPrYgAbgMvaF4/8xt4aiPoHVzeg2C55hp9sI=
github.com/anhgelus/gokord v0.1.3-0.20240414132146-03e7ed2add2c/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
github.com/anhgelus/gokord v0.1.3-0.20240414132547-e356bd4cdbd2 h1:/Zv3M4PowSH+5q3GqOPmvJ1t8BTe8ZvMlo3Cd4qpnHk=
github.com/anhgelus/gokord v0.1.3-0.20240414132547-e356bd4cdbd2/go.mod h1:lRYqODauBGzkmjuIrklmCkUt9OMxnNvb1af8ifbjRIs=
github.com/anhgelus/gokord v0.1.3-0.20240414132927-426d437f7613 h1:mbZ5nKVtCo9pIDlVHRZ3yd0cBww+U4wQYHyq0S153T4=
github.com/anhgelus/gokord v0.1.3-0.20240414132927-426d437f7613/go.mod h1:lRYqODauBGzkmjuIrklmCkUt9OMxnNvb1af8ifbjRIs=
github.com/anhgelus/gokord v0.1.3 h1:27OS08egivF/KSIYNb+L0/xCv+4ENW0Rk4nLywc2bWY=
github.com/anhgelus/gokord v0.1.3/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.4 h1:hoe87eCcf+Y22WDKwesQuyvxna4SWXrjpYNpdwH8pbI=
github.com/anhgelus/gokord v0.1.4/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.5 h1:yFFKK6B1hCZU3mvoLAW2nZnjTkXJv7J7uqi/bWMuJbA=
github.com/anhgelus/gokord v0.1.5/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.6-0.20240415111450-5f4b048c7253 h1:XDES1W0OLHQMyU3+wNv96FjivpUXoi1s2+UEZjG7y14=
github.com/anhgelus/gokord v0.1.6-0.20240415111450-5f4b048c7253/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.6-0.20240415112117-6f6a99167c29 h1:ZpcDTpx0obVleuXAGj/PqjlFUUTo+MKMLMP0CngcDTU=
github.com/anhgelus/gokord v0.1.6-0.20240415112117-6f6a99167c29/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.6-0.20240415112732-e29b97ef3a65 h1:/Ho6Q18UwMNTIENOmsu0e64nZEB96xc9fSD/A55laEA=
github.com/anhgelus/gokord v0.1.6-0.20240415112732-e29b97ef3a65/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.6-0.20240415112938-8cc98f5fc515 h1:2ZGhq4WgtIdd8wPOk2K8QLSOlxi2ojduGaJ/yxm5+Mw=
github.com/anhgelus/gokord v0.1.6-0.20240415112938-8cc98f5fc515/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.1.6 h1:bBfiYc9BUpAHbE1VPqjJbRZtgVJryMe8KjJRfQ2aLqo=
github.com/anhgelus/gokord v0.1.6/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.2.0 h1:/bVOE/We9scbD5KN3QKrqG7oxQ3R8KD4n7+i7vwfv6o=
github.com/anhgelus/gokord v0.2.0/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.2.1-0.20240415131203-b822009881d2 h1:ADL+XltgbvdBUZ88yxEQIUJ7Eu+jbQw0ZRSVmcp+YZQ=
github.com/anhgelus/gokord v0.2.1-0.20240415131203-b822009881d2/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/anhgelus/gokord v0.2.1 h1:yFn7WM9PJHdMyfGH2GQ2Ubu+qMvfLJ7gUSzfm9zzihY=
github.com/anhgelus/gokord v0.2.1/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=

View file

@ -64,8 +64,7 @@ func main() {
"Rôle",
).IsRequired()).
SetHandler(commands.ConfigXP),
).
SetHandler(commands.Config)
)
bot := gokord.Bot{
Token: token,

View file

@ -21,12 +21,24 @@ const (
)
func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.Bot {
return
}
c := GetCopaing(m.Author.ID, m.GuildID)
// add xp
trimmed := utils.TrimMessage(strings.ToLower(m.Content))
c.AddXP(s, XPMessage(uint(len(trimmed)), calcDiversity(trimmed)), func(_ uint, _ uint) {
m.Member.User = m.Author
m.Member.GuildID = m.GuildID
c.AddXP(s, m.Member, XPMessage(uint(len(trimmed)), calcDiversity(trimmed)), func(_ uint, _ uint) {
if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil {
utils.SendAlert("xp/events.go - reaction add new level", "cannot add the reaction: "+err.Error())
utils.SendAlert(
"xp/events.go - add reaction for new level",
err.Error(),
"channel id",
m.ChannelID,
"message id",
m.Message.ID,
)
}
})
}
@ -119,7 +131,8 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r
timeInVocal = MaxTimeInVocal
}
c := GetCopaing(u.DiscordID, u.GuildID)
c.AddXP(s, XPVocal(uint(timeInVocal)), func(_ uint, _ uint) {
e.Member.GuildID = e.GuildID
c.AddXP(s, e.Member, XPVocal(uint(timeInVocal)), func(_ uint, _ uint) {
//TODO: handle new level in vocal
})
}

View file

@ -28,6 +28,6 @@ func XPForLevel(level uint) uint {
func Lose(time uint, xp uint) uint {
return uint(math.Floor(
math.Pow(float64(time), 2) * math.Pow(10, -2+math.Log(float64(time/85))) * math.Floor(float64(time/500)),
math.Pow(float64(time), 2) * math.Pow(10, -2+math.Log(float64(time/85))) * math.Floor(float64(xp/500)),
))
}

View file

@ -1,9 +1,44 @@
package xp
import (
"github.com/anhgelus/gokord/utils"
"github.com/anhgelus/les-copaings-bot/config"
"github.com/bwmarrin/discordgo"
"slices"
)
func onNewLevel(s *discordgo.Session, level uint) {
// check roles
func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) {
cfg := config.GetGuildConfig(m.GuildID)
xpForLevel := XPForLevel(level)
for _, role := range cfg.XpRoles {
if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) {
utils.SendDebug(
"Add role",
"role_id",
role.RoleID,
"user_id",
m.User.ID,
"guild_id",
m.GuildID,
)
err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.RoleID)
if err != nil {
utils.SendAlert("xp/level.go - Adding role", err.Error(), "role_id", role.RoleID)
}
} else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) {
utils.SendDebug(
"Remove role",
"role_id",
role.RoleID,
"user_id",
m.User.ID,
"guild_id",
m.GuildID,
)
err := s.GuildMemberRoleRemove(m.GuildID, m.User.ID, role.RoleID)
if err != nil {
utils.SendAlert("xp/level.go - Removing role", err.Error(), "role_id", role.RoleID)
}
}
}
}

View file

@ -31,14 +31,14 @@ func (c *Copaing) Save() {
gokord.DB.Save(c)
}
func (c *Copaing) AddXP(s *discordgo.Session, xp uint, fn func(uint, uint)) {
func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) {
pastLevel := Level(c.XP)
c.XP += xp
c.Save()
newLevel := Level(c.XP)
if newLevel > pastLevel {
fn(c.XP, newLevel)
onNewLevel(s, newLevel)
onNewLevel(s, m, newLevel)
}
}