feat(level): update roles on new level
This commit is contained in:
parent
beb0ea0ca4
commit
9e6a5ce1d3
8 changed files with 78 additions and 73 deletions
|
@ -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
10
go.mod
|
@ -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
42
go.sum
|
@ -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=
|
||||
|
|
3
main.go
3
main.go
|
@ -64,8 +64,7 @@ func main() {
|
|||
"Rôle",
|
||||
).IsRequired()).
|
||||
SetHandler(commands.ConfigXP),
|
||||
).
|
||||
SetHandler(commands.Config)
|
||||
)
|
||||
|
||||
bot := gokord.Bot{
|
||||
Token: token,
|
||||
|
|
19
xp/events.go
19
xp/events.go
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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)),
|
||||
))
|
||||
}
|
||||
|
|
39
xp/level.go
39
xp/level.go
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue