diff --git a/_settings.json b/_settings.json index 0ab98c5..7c4d240 100644 --- a/_settings.json +++ b/_settings.json @@ -1,12 +1,13 @@ { "token": "BOT_TOKEN", - "server": "SERVER_ID", - "ranking": [ - ["1", "USER_ID"], - ["2", "USER_ID"], - ["3", "USER_ID"], - ["4", "USER_ID", "USER_ID"], - ["5", "USER_ID"] + "guild": "GUILD_ID", + "student_role": "STUDENT_ROLE_ID", + "leaderboard": [ + ["USER_ID"], + ["USER_ID"], + ["USER_ID", "USER_ID"], + ["USER_ID"], + ["USER_ID"] ], - "color": 16711935 + "color": 5069160 } diff --git a/main.go b/main.go index b04cc59..684138f 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "log" "os" "os/signal" + "slices" "strconv" "strings" @@ -13,11 +14,13 @@ import ( type Settings struct { Token string `json:"token"` - Server string `json:"server"` + Guild string `json:"guild"` + StudentRole string `json:"student_role"` Leaderboard [][]string `json:"leaderboard"` - Color int `json:"color"` - students map[string]int - rankings []map[string]struct{} + // Hex code for embeds color + Color int `json:"color"` + students map[string]int + rankings map[int]map[string]struct{} } var stg Settings @@ -31,12 +34,15 @@ func init() { log.Fatalf("Error while reading settings.json : %s", err.Error()) } stg.students = make(map[string]int, len(stg.Leaderboard)) - for i, r := range stg.Leaderboard { - stg.rankings = append(stg.rankings, make(map[string]struct{}, len(r))) + stg.rankings = make(map[int]map[string]struct{}, len(stg.Leaderboard)) + i := 1 + for _, r := range stg.Leaderboard { + stg.rankings[i] = make(map[string]struct{}, len(r)) for _, s := range r { stg.rankings[i][s] = struct{}{} stg.students[s] = i } + i += len(r) } } @@ -68,7 +74,7 @@ var duplicateNames = []string{ func init() { for rank, students := range stg.rankings { - rankName := strconv.Itoa(rank + 1) + rankName := strconv.Itoa(rank) for i := range len(students) { opt := dg.ApplicationCommandOption{ Type: dg.ApplicationCommandOptionUser, @@ -89,6 +95,7 @@ func init() { } func send_error(s *dg.Session, i *dg.Interaction, reason string) { + log.Printf("Sending error (\"%s\")", reason) s.InteractionRespond(i, &dg.InteractionResponse{ Type: dg.InteractionResponseChannelMessageWithSource, Data: &dg.InteractionResponseData{ @@ -128,20 +135,32 @@ var handlers = map[string]func(*dg.Session, *dg.InteractionCreate){ send_error(s, i.Interaction, "Invalid option type") return } - guess := val.Value.(string) - if _, ok := ids[guess]; ok { - send_error(s, i.Interaction, "Les doublons ne sont pas autorisés !") + guess := val.UserValue(s) + if _, ok := ids[guess.ID]; ok { + if i.Locale == dg.French { + send_error(s, i.Interaction, "Les doublons ne sont pas autorisés !") + } else { + send_error(s, i.Interaction, "Duplicates are not allowed!") + } return } 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, "_") guessRank, err := strconv.Atoi(grstr) - guessRank -= 1 - if err != nil || guessRank < 0 || stg.rankings[guessRank] == nil { + if err != nil || stg.rankings[guessRank] == nil { 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 { green += 1 } 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 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 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) } }