update sub command + check if users submited are students
This commit is contained in:
parent
2fa3be3a8b
commit
f3d17ad78b
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
67
main.go
67
main.go
@ -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"`
|
||||||
Color int `json:"color"`
|
// Hex code for embeds color
|
||||||
students map[string]int
|
Color int `json:"color"`
|
||||||
rankings []map[string]struct{}
|
students map[string]int
|
||||||
|
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 {
|
||||||
send_error(s, i.Interaction, "Les doublons ne sont pas autorisés !")
|
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
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user