aboutsummaryrefslogtreecommitdiff
path: root/xp/level.go
blob: bbcc71faddd1039769b3471c35bd779ee482f173 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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, 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)
			}
		}
	}
}

func LastEventUpdate(c *Copaing) {
	h := c.HourSinceLastEvent()
	l := Lose(h, c.XP)
	xp := c.XPAlreadyRemoved()
	oldXP := c.XP
	if l-xp < 0 {
		utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp)
		c.XP = 0
	} else {
		calc := int(c.XP) - int(l) + int(c.XPAlreadyRemoved())
		if calc < 0 {
			c.XP = 0
		} else {
			c.XP = uint(calc)
		}
	}
	if oldXP != c.XP {
		c.Save()
	}
	c.SetLastEvent()
}

func XPUpdate(c *Copaing) {
	oldXP := c.XP
	if oldXP == 0 {
		return
	}
	h := c.HourSinceLastEvent()
	l := Lose(h, c.XP)
	xp := c.XPAlreadyRemoved()
	if l-xp < 0 {
		utils.SendWarn("lose - xp_removed is negative", "lose", l, "xp removed", xp)
		c.AddXPAlreadyRemoved(0)
	} else {
		calc := int(c.XP) - int(l) + int(xp)
		if calc < 0 {
			c.AddXPAlreadyRemoved(c.XP)
			c.XP = 0
		} else {
			c.XP = uint(calc)
			c.AddXPAlreadyRemoved(l - xp)
		}
	}
	if oldXP != c.XP {
		utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID)
		c.Save()
	}
}

//func PeriodicReducer(s *discordgo.Session) {
//	var wg sync.WaitGroup
//	for _, g := range s.State.Guilds {
//		for _, m := range utils.FetchGuildUser(s, g.ID) {
//			if m.User.Bot {
//				continue
//			}
//			wg.Add(1)
//			go func() {
//				utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name)
//				c := GetCopaing(m.User.ID, g.ID)
//				XPUpdate(c)
//				wg.Done()
//			}()
//		}
//		wg.Wait() // finish the entire guild before starting another
//		utils.SendDebug("Guild finished", "guild", g.Name)
//		time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API
//	}
//	utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds))
//}