package public import ( "context" "strconv" "velox-bot/internal/commands/fun/shared" "velox-bot/internal/db/services" rpssvc "velox-bot/internal/db/services/rps" "github.com/bwmarrin/discordgo" ) var Rps = &discordgo.ApplicationCommand{ Name: "rps", Description: "Plays Rock Paper Scissors with you", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionString, Name: "hand", Description: "Choose between ✌️, ✋ or 🤜", Required: true, Choices: []*discordgo.ApplicationCommandOptionChoice{ {Name: "✌️ - Scissors", Value: string(rpssvc.HandScissors)}, {Name: "✋ - Paper", Value: string(rpssvc.HandPaper)}, {Name: "🤜 - Rock", Value: string(rpssvc.HandRock)}, }, }, }, Contexts: &[]discordgo.InteractionContextType{ discordgo.InteractionContextGuild, }, } func RpsHandler(s *discordgo.Session, i *discordgo.InteractionCreate) { if i.GuildID == "" { shared.Respond(s, i, "This command can only be used in a server.") return } if services.Global == nil || services.Global.RPS == nil { shared.RespondEphemeral(s, i, "RPS service is not available.") return } data := i.ApplicationCommandData() if len(data.Options) == 0 { shared.RespondEphemeral(s, i, "Invalid hand! Please choose between ✌️, ✋ or 🤜") return } handStr := data.Options[0].StringValue() userHand, ok := rpssvc.ParseHand(handStr) if !ok { shared.RespondEphemeral(s, i, "Invalid hand! Please choose between ✌️, ✋ or 🤜") return } guildID, err := strconv.ParseInt(i.GuildID, 10, 64) if err != nil { shared.RespondEphemeral(s, i, "Invalid guild.") return } user := i.User if i.Member != nil && i.Member.User != nil { user = i.Member.User } if user == nil { return } userID, err := strconv.ParseInt(user.ID, 10, 64) if err != nil { shared.RespondEphemeral(s, i, "Invalid user.") return } out, err := services.Global.RPS.Play(context.Background(), guildID, userID, userHand) if err != nil { shared.RespondEphemeral(s, i, "Failed to play RPS.") return } color := 0xEF4444 switch out.Result { case rpssvc.ResultWin: color = 0x22C55E case rpssvc.ResultTie: color = 0xF59E0B } embed := &discordgo.MessageEmbed{ Title: string(out.Result), Description: user.Mention() + " vs bot", Color: color, Fields: []*discordgo.MessageEmbedField{ {Name: "Your hand", Value: out.UserHand.String(), Inline: true}, {Name: "Bot hand", Value: out.BotHand.String(), Inline: true}, {Name: "Score", Value: strconv.Itoa(out.Score), Inline: true}, }, } _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Embeds: []*discordgo.MessageEmbed{embed}, }, }) }