feat: leveling system

This commit is contained in:
2026-03-17 15:35:25 +00:00
parent 2bce787c05
commit 8ba26f8bb9
9 changed files with 271 additions and 381 deletions
+2 -2
View File
@@ -56,9 +56,9 @@ func (r *Repo) UpsertLevel(ctx context.Context, lvl *Level) error {
func (r *Repo) SetLevel(ctx context.Context, guildID, userID int64, level int) error {
const q = `
INSERT INTO levels (guild, user_id, level, xp)
VALUES ($1, $2, $3, 99)
VALUES ($1, $2, $3, 0)
ON CONFLICT (guild, user_id)
DO UPDATE SET level = EXCLUDED.level, xp = 99
DO UPDATE SET level = EXCLUDED.level, xp = 0
`
_, err := r.db.ExecContext(ctx, q, guildID, userID, level)
return err
+34
View File
@@ -9,6 +9,12 @@ type Repo struct {
db *sql.DB
}
type LevelReward struct {
GuildID int64
Level int
RoleID int64
}
func NewRepo(db *sql.DB) *Repo {
return &Repo{db: db}
}
@@ -95,6 +101,34 @@ func (r *Repo) SetRoleRewardForLevel(ctx context.Context, guildID int64, level i
return err
}
func (r *Repo) ListRoleRewards(ctx context.Context, guildID int64, limit int) ([]*LevelReward, error) {
const q = `
SELECT levelreq, role
FROM levelrewards
WHERE guild_id = $1
ORDER BY levelreq ASC
LIMIT $2
`
rows, err := r.db.QueryContext(ctx, q, guildID, limit)
if err != nil {
return nil, err
}
defer rows.Close()
out := make([]*LevelReward, 0, limit)
for rows.Next() {
rw := &LevelReward{GuildID: guildID}
if err := rows.Scan(&rw.Level, &rw.RoleID); err != nil {
return nil, err
}
out = append(out, rw)
}
if err := rows.Err(); err != nil {
return nil, err
}
return out, nil
}
func (r *Repo) SetLevelUpChannel(ctx context.Context, guildID int64, channelID int64) error {
const q = `
INSERT INTO levelup (guild_id, levelup_channel_id)