129 lines
4.4 KiB
Go
129 lines
4.4 KiB
Go
|
package app
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/bwmarrin/discordgo"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
commands = []*discordgo.ApplicationCommand{
|
||
|
{
|
||
|
Name: "whitelist-add",
|
||
|
Description: "Add yourself to the whitelist",
|
||
|
Options: []*discordgo.ApplicationCommandOption{
|
||
|
{
|
||
|
Type: discordgo.ApplicationCommandOptionString,
|
||
|
Name: "minecraft-username",
|
||
|
Description: "Minecraft Username",
|
||
|
Required: true,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Name: "whitelist-remove",
|
||
|
Description: "Remove yourself from the whitelist",
|
||
|
Options: []*discordgo.ApplicationCommandOption{},
|
||
|
},
|
||
|
{
|
||
|
Name: "whitelist-show",
|
||
|
Description: "Display your whitelist link",
|
||
|
Options: []*discordgo.ApplicationCommandOption{},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
commandHandlers = map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){
|
||
|
"whitelist-add": func(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
// Access options in the order provided by the user.
|
||
|
options := i.ApplicationCommandData().Options
|
||
|
|
||
|
// Convert the slice into a map
|
||
|
optionMap := make(map[string]*discordgo.ApplicationCommandInteractionDataOption, len(options))
|
||
|
for _, opt := range options {
|
||
|
optionMap[opt.Name] = opt
|
||
|
}
|
||
|
|
||
|
requestedUsername := (optionMap["minecraft-username"]).StringValue()
|
||
|
invokingUserName := i.Member.User.Username
|
||
|
invokingUserID := i.Member.User.ID
|
||
|
|
||
|
// check requestedUsername validity
|
||
|
valid := checkMcUsernameValid(requestedUsername)
|
||
|
if !valid {
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s is not a valid minecraft username", requestedUsername))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
existingMCUsername, ok := db[invokingUserID]
|
||
|
if !ok { // invoking user does not currently have an mc username associated
|
||
|
// execute RCON
|
||
|
response, err := conn.Execute(fmt.Sprintf("whitelist add %s", requestedUsername))
|
||
|
if err != nil {
|
||
|
simpleResponse(s, i, fmt.Sprintf("Failed to add %s to whitelist: %s", requestedUsername, err.Error()))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// this can happen if the username is not a real player, OR if the user is already on the whitelist
|
||
|
// In both cases we want to exit early to avoid adding an invalid username to the db
|
||
|
if !strings.EqualFold(response, fmt.Sprintf("Added %s to the whitelist", requestedUsername)) {
|
||
|
simpleResponse(s, i, fmt.Sprintf("Failed to add %s to whitelist: %s", requestedUsername, response))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// save state to db
|
||
|
db[invokingUserID] = requestedUsername
|
||
|
SaveDB(dbPath, db)
|
||
|
|
||
|
// send response
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s linked minecraft username %s", invokingUserName, requestedUsername))
|
||
|
} else {
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s already has a linked minecraft username %s", invokingUserName, existingMCUsername))
|
||
|
}
|
||
|
|
||
|
},
|
||
|
"whitelist-remove": func(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
invokingUserName := i.Member.User.Username
|
||
|
invokingUserID := i.Member.User.ID
|
||
|
|
||
|
existingMCUsername, ok := db[invokingUserID]
|
||
|
if !ok { // invoking user does not currently have an mc username associated
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s does not have a linked minecraft username", invokingUserName))
|
||
|
} else {
|
||
|
// execute RCON
|
||
|
response, err := conn.Execute(fmt.Sprintf("whitelist remove %s", existingMCUsername))
|
||
|
if err != nil {
|
||
|
simpleResponse(s, i, fmt.Sprintf("Failed to remove %s from whitelist: %s", existingMCUsername, err.Error()))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// this can happen if the username is not a real player, OR if the user is already not on the whitelist
|
||
|
if !strings.EqualFold(response, fmt.Sprintf("Removed %s from the whitelist", existingMCUsername)) {
|
||
|
simpleResponse(s, i, fmt.Sprintf("Failed to remove %s from whitelist: %s", existingMCUsername, response))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// save state to db
|
||
|
delete(db, invokingUserID)
|
||
|
SaveDB(dbPath, db)
|
||
|
|
||
|
// send response
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s unlinked minecraft username %s", invokingUserName, existingMCUsername))
|
||
|
|
||
|
}
|
||
|
},
|
||
|
"whitelist-show": func(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
invokingUserName := i.Member.User.Username
|
||
|
invokingUserID := i.Member.User.ID
|
||
|
|
||
|
existingMCUsername, ok := db[invokingUserID]
|
||
|
|
||
|
if ok {
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s is %s", invokingUserName, existingMCUsername))
|
||
|
} else {
|
||
|
simpleResponse(s, i, fmt.Sprintf("%s does not have a linked minecraft username", invokingUserName))
|
||
|
}
|
||
|
},
|
||
|
}
|
||
|
)
|