update sub command + check if users submited are students

This commit is contained in:
Arkitu 2026-01-19 19:07:58 +01:00
parent 2fa3be3a8b
commit f3d17ad78b
2 changed files with 60 additions and 24 deletions

View File

@ -1,12 +1,13 @@
{ {
"token": "BOT_TOKEN", "token": "BOT_TOKEN",
"server": "SERVER_ID", "guild": "GUILD_ID",
"ranking": [ "student_role": "STUDENT_ROLE_ID",
["1", "USER_ID"], "leaderboard": [
["2", "USER_ID"], ["USER_ID"],
["3", "USER_ID"], ["USER_ID"],
["4", "USER_ID", "USER_ID"], ["USER_ID", "USER_ID"],
["5", "USER_ID"] ["USER_ID"],
["USER_ID"]
], ],
"color": 16711935 "color": 5069160
} }

61
main.go
View File

@ -5,6 +5,7 @@ import (
"log" "log"
"os" "os"
"os/signal" "os/signal"
"slices"
"strconv" "strconv"
"strings" "strings"
@ -13,11 +14,13 @@ import (
type Settings struct { type Settings struct {
Token string `json:"token"` Token string `json:"token"`
Server string `json:"server"` Guild string `json:"guild"`
StudentRole string `json:"student_role"`
Leaderboard [][]string `json:"leaderboard"` Leaderboard [][]string `json:"leaderboard"`
// Hex code for embeds color
Color int `json:"color"` Color int `json:"color"`
students map[string]int students map[string]int
rankings []map[string]struct{} rankings map[int]map[string]struct{}
} }
var stg Settings var stg Settings
@ -31,12 +34,15 @@ func init() {
log.Fatalf("Error while reading settings.json : %s", err.Error()) log.Fatalf("Error while reading settings.json : %s", err.Error())
} }
stg.students = make(map[string]int, len(stg.Leaderboard)) stg.students = make(map[string]int, len(stg.Leaderboard))
for i, r := range stg.Leaderboard { stg.rankings = make(map[int]map[string]struct{}, len(stg.Leaderboard))
stg.rankings = append(stg.rankings, make(map[string]struct{}, len(r))) i := 1
for _, r := range stg.Leaderboard {
stg.rankings[i] = make(map[string]struct{}, len(r))
for _, s := range r { for _, s := range r {
stg.rankings[i][s] = struct{}{} stg.rankings[i][s] = struct{}{}
stg.students[s] = i stg.students[s] = i
} }
i += len(r)
} }
} }
@ -68,7 +74,7 @@ var duplicateNames = []string{
func init() { func init() {
for rank, students := range stg.rankings { for rank, students := range stg.rankings {
rankName := strconv.Itoa(rank + 1) rankName := strconv.Itoa(rank)
for i := range len(students) { for i := range len(students) {
opt := dg.ApplicationCommandOption{ opt := dg.ApplicationCommandOption{
Type: dg.ApplicationCommandOptionUser, Type: dg.ApplicationCommandOptionUser,
@ -89,6 +95,7 @@ func init() {
} }
func send_error(s *dg.Session, i *dg.Interaction, reason string) { func send_error(s *dg.Session, i *dg.Interaction, reason string) {
log.Printf("Sending error (\"%s\")", reason)
s.InteractionRespond(i, &dg.InteractionResponse{ s.InteractionRespond(i, &dg.InteractionResponse{
Type: dg.InteractionResponseChannelMessageWithSource, Type: dg.InteractionResponseChannelMessageWithSource,
Data: &dg.InteractionResponseData{ Data: &dg.InteractionResponseData{
@ -128,20 +135,32 @@ var handlers = map[string]func(*dg.Session, *dg.InteractionCreate){
send_error(s, i.Interaction, "Invalid option type") send_error(s, i.Interaction, "Invalid option type")
return return
} }
guess := val.Value.(string) guess := val.UserValue(s)
if _, ok := ids[guess]; ok { if _, ok := ids[guess.ID]; ok {
if i.Locale == dg.French {
send_error(s, i.Interaction, "Les doublons ne sont pas autorisés !") send_error(s, i.Interaction, "Les doublons ne sont pas autorisés !")
} else {
send_error(s, i.Interaction, "Duplicates are not allowed!")
}
return return
} else { } else {
ids[guess] = struct{}{} ids[guess.ID] = struct{}{}
}
if mem, err := s.GuildMember(stg.Guild, guess.ID); err != nil || !slices.Contains(mem.Roles, stg.StudentRole) {
if i.Locale == dg.French {
send_error(s, i.Interaction, "<@"+guess.ID+"> n'est pas un élève !")
} else {
send_error(s, i.Interaction, "<@"+guess.ID+"> is not a student!")
}
return
} }
grstr, _, _ := strings.Cut(opt.Name, "_") grstr, _, _ := strings.Cut(opt.Name, "_")
guessRank, err := strconv.Atoi(grstr) guessRank, err := strconv.Atoi(grstr)
guessRank -= 1 if err != nil || stg.rankings[guessRank] == nil {
if err != nil || guessRank < 0 || stg.rankings[guessRank] == nil {
send_error(s, i.Interaction, "Invalid option name") send_error(s, i.Interaction, "Invalid option name")
return
} }
if num, ok := stg.students[guess]; ok { if num, ok := stg.students[guess.ID]; ok {
if num == guessRank { if num == guessRank {
green += 1 green += 1
} else { } else {
@ -149,7 +168,7 @@ var handlers = map[string]func(*dg.Session, *dg.InteractionCreate){
} }
} }
guesses = append(guesses, strconv.Itoa(guessRank+1)+": <@"+guess+">") guesses = append(guesses, strconv.Itoa(guessRank)+": <@"+guess.ID+">")
} }
var cmdAuthor string var cmdAuthor string
if i.Member != nil { if i.Member != nil {
@ -175,6 +194,22 @@ var handlers = map[string]func(*dg.Session, *dg.InteractionCreate){
}, },
}, },
}) })
if green == len(stg.students) {
var winTitle string
if i.Locale == dg.French {
winTitle = "🎉 " + cmdAuthor + " a gagné !"
} else {
winTitle = "🎉 " + cmdAuthor + " has won!"
}
s.FollowupMessageCreate(i.Interaction, true, &dg.WebhookParams{
Embeds: []*dg.MessageEmbed{
&dg.MessageEmbed{
Color: 0x00FF00,
Title: winTitle,
},
},
})
}
}, },
} }
@ -201,7 +236,7 @@ func main() {
// Create commands // Create commands
for _, d := range descs { for _, d := range descs {
if _, err := s.ApplicationCommandCreate(s.State.User.ID, stg.Server, d); err != nil { if _, err := s.ApplicationCommandCreate(s.State.User.ID, stg.Guild, d); err != nil {
log.Panicf("Failed to create command : %s", err) log.Panicf("Failed to create command : %s", err)
} }
} }