120 lines
3.9 KiB
Go
120 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/bwmarrin/discordgo"
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/exp/slices"
|
|
)
|
|
|
|
// Populate Users map for the first launch
|
|
// This variable will be keep as sort of cache for all
|
|
// operation
|
|
func populateUserRole(discordClient *discordgo.Session) error {
|
|
Users = make(map[string]*UserRole)
|
|
APIResponse, err := getUsers42CTF()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for id, rank := range APIResponse {
|
|
tmp, err := discordClient.GuildMember(guild, id)
|
|
if err == nil {
|
|
if slices.Contains(tmp.Roles, rolesID["top1"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top1"]}
|
|
} else if slices.Contains(tmp.Roles, rolesID["top10"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top10"]}
|
|
} else if slices.Contains(tmp.Roles, rolesID["top50"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top50"]}
|
|
} else {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: ""}
|
|
}
|
|
} else {
|
|
logrus.Error("ID not found", id)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func updateUserRole(discordClient *discordgo.Session, dryrun bool) error {
|
|
APIResponse, err := getUsers42CTF()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for id, rank := range APIResponse {
|
|
tmp, err := discordClient.GuildMember(guild, id)
|
|
if err == nil {
|
|
if slices.Contains(tmp.Roles, rolesID["top1"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top1"]}
|
|
} else if slices.Contains(tmp.Roles, rolesID["top10"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top10"]}
|
|
} else if slices.Contains(tmp.Roles, rolesID["top50"]) {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top50"]}
|
|
} else {
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: ""}
|
|
}
|
|
} else {
|
|
logrus.Error("ID not found", id)
|
|
}
|
|
if Users[id].Rank != rank {
|
|
logrus.Info("New rank (", rank, ") for user ", id)
|
|
if Users[id].CurrentRole != "" {
|
|
logrus.Info("Remove role for ", id)
|
|
removeRole(discordClient, guild, id, Users[id].CurrentRole, dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: ""}
|
|
}
|
|
if rank == 1 {
|
|
logrus.Info("Add role `top1` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top1"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top1"]}
|
|
} else if rank <= 10 {
|
|
logrus.Info("Add role `top10` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top10"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top10"]}
|
|
} else if rank <= 50 {
|
|
logrus.Info("Add role `top50` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top50"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top50"]}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func forceUpdate(discordClient *discordgo.Session, dryrun bool) (error) {
|
|
APIResponse, err := getUsers42CTF()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for id, rank := range APIResponse {
|
|
tmp, err := discordClient.GuildMember(guild, id)
|
|
if err == nil {
|
|
if slices.Contains(tmp.Roles, rolesID["top1"]) {
|
|
removeRole(discordClient, guild, id, rolesID["top1"], dryrun)
|
|
}
|
|
if slices.Contains(tmp.Roles, rolesID["top10"]) {
|
|
removeRole(discordClient, guild, id, rolesID["top10"], dryrun)
|
|
}
|
|
if slices.Contains(tmp.Roles, rolesID["top50"]) {
|
|
removeRole(discordClient, guild, id, rolesID["top50"], dryrun)
|
|
}
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: ""}
|
|
} else {
|
|
logrus.Error("ID not found", id)
|
|
}
|
|
if rank == 1 {
|
|
logrus.Info("Add role `top1` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top1"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top1"]}
|
|
} else if rank <= 10 {
|
|
logrus.Info("Add role `top10` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top10"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top10"]}
|
|
} else if rank <= 50 {
|
|
logrus.Info("Add role `top50` for ", id)
|
|
addRole(discordClient, guild, id, rolesID["top50"], dryrun)
|
|
Users[id] = &UserRole{Rank: rank, CurrentRole: rolesID["top50"]}
|
|
}
|
|
}
|
|
return nil
|
|
}
|