diff --git a/modules/secretsanta/component.go b/modules/secretsanta/component.go index 441959c..7593c54 100644 --- a/modules/secretsanta/component.go +++ b/modules/secretsanta/component.go @@ -59,12 +59,22 @@ func (c Component) HandleModal(s *discordgo.Session, i *discordgo.InteractionCre // pop the first level identifier util.ShiftL(ids) - switch util.ShiftL(ids) { + modalID := util.ShiftL(ids) + c.Interaction.GuildID = util.ShiftL(ids) + if c.Interaction.GuildID != "" { + if err := c.getPlayer(); err != nil { + log.Printf("ERROR: could not get player: %+v", err) + c.ReplyError() + return + } + } + + switch modalID { case "set_address": - c.handleModalSetAddress(ids) + c.handleModalSetAddress() return case "add_package_tracking": - c.handleModalAddPackageTracking(ids) + c.handleModalAddPackageTracking() return default: log.Printf("Unknown modal submit ID: %s", c.modal.CustomID) diff --git a/modules/secretsanta/handleComponentInvite.go b/modules/secretsanta/handleComponentInvite.go index a89a6b2..e5548e9 100644 --- a/modules/secretsanta/handleComponentInvite.go +++ b/modules/secretsanta/handleComponentInvite.go @@ -4,42 +4,51 @@ import ( "cake4everybot/data/lang" "cake4everybot/util" "fmt" - "strings" "github.com/bwmarrin/discordgo" ) func (c Component) handleInvite(ids []string) { - switch util.ShiftL(ids) { + action := util.ShiftL(ids) + c.Interaction.GuildID = util.ShiftL(ids) + if c.Interaction.GuildID != "" { + if err := c.getPlayer(); err != nil { + log.Printf("ERROR: could not get player: %+v", err) + c.ReplyError() + return + } + } + + switch action { case "show_match": - c.handleInviteShowMatch(ids) + c.handleInviteShowMatch() return case "set_address": - c.handleInviteSetAddress(ids) + c.handleInviteSetAddress() return case "nudge_match": - c.handleInviteNudgeMatch(ids) + c.handleInviteNudgeMatch() return case "confirm_nudge": - c.handleInviteConfirmNudge(ids) + c.handleInviteConfirmNudge() return case "send_package": - c.handleInviteSendPackage(ids) + c.handleInviteSendPackage() return case "add_package_tracking": - c.handleAddPackageTracking(ids) + c.handleAddPackageTracking() return case "show_package_tracking": - c.handleShowPackageTracking(ids) + c.handleShowPackageTracking() return case "confirm_send_package": - c.handleInviteConfirmSendPackage(ids) + c.handleInviteConfirmSendPackage() return case "received_package": - c.handleInviteReceivedPackage(ids) + c.handleInviteReceivedPackage() return case "confirm_received_package": - c.handleInviteConfirmReceivedPackage(ids) + c.handleInviteConfirmReceivedPackage() return case "delete": err := c.Session.ChannelMessageDelete(c.Interaction.ChannelID, c.Interaction.Message.ID) @@ -53,49 +62,30 @@ func (c Component) handleInvite(ids []string) { } } -func (c Component) handleInviteShowMatch(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - - e := util.AuthoredEmbed(c.Session, player.Match.Member, tp+"display") - e.Title = fmt.Sprintf(lang.GetDefault(tp+"msg.invite.show_match.title"), player.Match.Member.DisplayName()) +func (c Component) handleInviteShowMatch() { + e := util.AuthoredEmbed(c.Session, c.player.Match.Member, tp+"display") + e.Title = fmt.Sprintf(lang.GetDefault(tp+"msg.invite.show_match.title"), c.player.Match.Member.DisplayName()) e.Description = lang.GetDefault(tp + "msg.invite.show_match.description") e.Color = 0x690042 e.Fields = append(e.Fields, &discordgo.MessageEmbedField{ Name: lang.GetDefault(tp + "msg.invite.show_match.address"), - Value: fmt.Sprintf("```\n%s\n```\n%s", player.Match.Address, lang.GetDefault(tp+"msg.invite.show_match.nudge_description")), + Value: fmt.Sprintf("```\n%s\n```\n%s", c.player.Match.Address, lang.GetDefault(tp+"msg.invite.show_match.nudge_description")), }) - if player.Match.Address == "" { + if c.player.Match.Address == "" { e.Fields[0].Value = lang.GetDefault(tp + "msg.invite.show_match.address_not_set") } util.SetEmbedFooter(c.Session, tp+"display", e) var components []discordgo.MessageComponent - if player.SendPackage == 0 { + if c.player.SendPackage == 0 { components = append(components, util.CreateButtonComponent( fmt.Sprintf("secretsanta.invite.nudge_match.%s", c.Interaction.GuildID), lang.GetDefault(tp+"msg.invite.button.nudge_match"), discordgo.SecondaryButton, util.GetConfigComponentEmoji("secretsanta.invite.nudge_match"), )) - if player.Match.Address != "" { + if c.player.Match.Address != "" { components = append(components, util.CreateButtonComponent( fmt.Sprintf("secretsanta.invite.send_package.%s", c.Interaction.GuildID), lang.GetDefault(tp+"msg.invite.button.send_package"), @@ -118,44 +108,24 @@ func (c Component) handleInviteShowMatch(ids []string) { } } -func (c Component) handleInviteSetAddress(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - +func (c Component) handleInviteSetAddress() { c.ReplyModal("secretsanta.set_address."+c.Interaction.GuildID, lang.GetDefault(tp+"msg.invite.modal.set_address.title"), discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.TextInput{ CustomID: "address", Label: lang.GetDefault(tp + "msg.invite.modal.set_address.label"), Style: discordgo.TextInputParagraph, Placeholder: lang.GetDefault(tp + "msg.invite.modal.set_address.placeholder"), - Value: player.Address, + Value: c.player.Address, Required: true, }, }}) } -func (c Component) handleInviteNudgeMatch(ids []string) { +func (c Component) handleInviteNudgeMatch() { c.ReplyComponentsHiddenSimpleEmbedUpdate( []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( - "secretsanta.invite.confirm_nudge."+strings.Join(ids, "."), + "secretsanta.invite.confirm_nudge."+c.Interaction.GuildID, lang.GetDefault(tp+"msg.invite.button.nudge_match"), discordgo.PrimaryButton, util.GetConfigComponentEmoji("secretsanta.invite.nudge_match"), @@ -165,41 +135,22 @@ func (c Component) handleInviteNudgeMatch(ids []string) { lang.GetDefault(tp+"msg.invite.nudge_match.confirm")) } -func (c Component) handleInviteConfirmNudge(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - player.Match.PendingNudge = true - err = c.setPlayers(players) +func (c Component) handleInviteConfirmNudge() { + c.player.Match.PendingNudge = true + err := c.setPlayers() if err != nil { log.Printf("ERROR: could not set players: %+v", err) c.ReplyError() return } - matchChannel, err := c.Session.UserChannelCreate(player.Match.User.ID) + matchChannel, err := c.Session.UserChannelCreate(c.player.Match.User.ID) if err != nil { - log.Printf("ERROR: could not create DM channel with user %s: %+v", player.Match.User.ID, err) + log.Printf("ERROR: could not create DM channel with user %s: %+v", c.player.Match.User.ID, err) c.ReplyError() return } - _, err = c.Session.ChannelMessageEditEmbed(matchChannel.ID, player.Match.MessageID, player.Match.InviteEmbed(c.Session)) + _, err = c.Session.ChannelMessageEditEmbed(matchChannel.ID, c.player.Match.MessageID, c.player.Match.InviteEmbed(c.Session)) if err != nil { log.Printf("ERROR: could not edit match message embed: %+v", err) c.ReplyError() @@ -208,7 +159,7 @@ func (c Component) handleInviteConfirmNudge(ids []string) { data := &discordgo.MessageSend{ Content: lang.GetDefault(tp + "msg.invite.nudge_received"), - Reference: &discordgo.MessageReference{MessageID: player.Match.MessageID}, + Reference: &discordgo.MessageReference{MessageID: c.player.Match.MessageID}, Components: []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( "secretsanta.invite.delete", @@ -225,7 +176,7 @@ func (c Component) handleInviteConfirmNudge(ids []string) { return } - _, err = c.Session.ChannelMessageEditEmbed(c.Interaction.ChannelID, player.MessageID, player.InviteEmbed(c.Session)) + _, err = c.Session.ChannelMessageEditEmbed(c.Interaction.ChannelID, c.player.MessageID, c.player.InviteEmbed(c.Session)) if err != nil { log.Printf("ERROR: could not edit invite message embed: %+v", err) c.ReplyError() @@ -234,11 +185,11 @@ func (c Component) handleInviteConfirmNudge(ids []string) { c.ReplyHiddenSimpleEmbedUpdate(0x690042, lang.GetDefault(tp+"msg.invite.nudge_match.success")) } -func (c Component) handleInviteSendPackage(ids []string) { +func (c Component) handleInviteSendPackage() { c.ReplyComponentsHiddenSimpleEmbedUpdate( []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( - "secretsanta.invite.confirm_send_package."+strings.Join(ids, "."), + "secretsanta.invite.confirm_send_package."+c.Interaction.GuildID, lang.GetDefault(tp+"msg.invite.button.send_package"), discordgo.SuccessButton, util.GetConfigComponentEmoji("secretsanta.invite.send_package"), @@ -248,105 +199,47 @@ func (c Component) handleInviteSendPackage(ids []string) { lang.GetDefault(tp+"msg.invite.send_package.confirm")) } -func (c Component) handleAddPackageTracking(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - +func (c Component) handleAddPackageTracking() { c.ReplyModal("secretsanta.add_package_tracking."+c.Interaction.GuildID, lang.GetDefault(tp+"msg.invite.modal.add_package_tracking.title"), discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.TextInput{ CustomID: "package_tracking", Label: lang.GetDefault(tp + "msg.invite.modal.add_package_tracking.label"), Style: discordgo.TextInputParagraph, Placeholder: lang.GetDefault(tp + "msg.invite.modal.add_package_tracking.placeholder"), - Value: player.PackageTracking, + Value: c.player.PackageTracking, Required: false, }, }}) } -func (c Component) handleShowPackageTracking(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - - c.ReplyHiddenSimpleEmbedf(0x690042, "## %s\n%s", lang.GetDefault(tp+"msg.invite.package_tracking.title"), c.getSantaForPlayer(player.User.ID).PackageTracking) +func (c Component) handleShowPackageTracking() { + c.ReplyHiddenSimpleEmbedf(0x690042, "## %s\n%s", lang.GetDefault(tp+"msg.invite.package_tracking.title"), c.getSantaForPlayer(c.player.User.ID).PackageTracking) } -func (c Component) handleInviteConfirmSendPackage(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - player.SendPackage = 1 - player.Match.PendingNudge = false - err = c.setPlayers(players) +func (c Component) handleInviteConfirmSendPackage() { + c.player.SendPackage = 1 + c.player.Match.PendingNudge = false + err := c.setPlayers() if err != nil { log.Printf("ERROR: could not set players: %+v", err) c.ReplyError() return } - if _, _, ok = c.updateInviteMessage(player); !ok { + var ok bool + if _, _, ok = c.updateInviteMessage(c.player); !ok { c.ReplyError() return } var matchChannel *discordgo.Channel - if matchChannel, _, ok = c.updateInviteMessage(player.Match); !ok { + if matchChannel, _, ok = c.updateInviteMessage(c.player.Match); !ok { c.ReplyError() return } data := &discordgo.MessageSend{ Content: lang.GetDefault(tp + "msg.invite.send_package"), - Reference: &discordgo.MessageReference{MessageID: player.Match.MessageID}, + Reference: &discordgo.MessageReference{MessageID: c.player.Match.MessageID}, Components: []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( "secretsanta.invite.delete", @@ -365,11 +258,11 @@ func (c Component) handleInviteConfirmSendPackage(ids []string) { c.ReplyHiddenSimpleEmbedUpdate(0x690042, lang.GetDefault(tp+"msg.invite.send_package.success")) } -func (c Component) handleInviteReceivedPackage(ids []string) { +func (c Component) handleInviteReceivedPackage() { c.ReplyComponentsHiddenSimpleEmbed( []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( - "secretsanta.invite.confirm_received_package."+strings.Join(ids, "."), + "secretsanta.invite.confirm_received_package."+c.Interaction.GuildID, lang.GetDefault(tp+"msg.invite.button.received_package"), discordgo.SuccessButton, util.GetConfigComponentEmoji("secretsanta.invite.received_package"), @@ -379,36 +272,18 @@ func (c Component) handleInviteReceivedPackage(ids []string) { lang.GetDefault(tp+"msg.invite.received_package.confirm")) } -func (c Component) handleInviteConfirmReceivedPackage(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - santaPlayer := c.getSantaForPlayer(player.User.ID) +func (c Component) handleInviteConfirmReceivedPackage() { + santaPlayer := c.getSantaForPlayer(c.player.User.ID) santaPlayer.SendPackage = 2 - err = c.setPlayers(players) + err := c.setPlayers() if err != nil { log.Printf("ERROR: could not set players: %+v", err) c.ReplyError() return } - if _, _, ok = c.updateInviteMessage(player); !ok { + var ok bool + if _, _, ok = c.updateInviteMessage(c.player); !ok { c.ReplyError() return } diff --git a/modules/secretsanta/handleComponentSetup.go b/modules/secretsanta/handleComponentSetup.go index d78a7c4..579b843 100644 --- a/modules/secretsanta/handleComponentSetup.go +++ b/modules/secretsanta/handleComponentSetup.go @@ -57,7 +57,8 @@ func (c Component) handleSetupInvite() { return } - err = c.setPlayers(players) + allPlayers[c.Interaction.GuildID] = players + err = c.setPlayers() if err != nil { log.Printf("ERROR: could not save players to file: %+v", err) c.ReplyError() diff --git a/modules/secretsanta/handleModal.go b/modules/secretsanta/handleModal.go index 382dee3..3fa1bd3 100644 --- a/modules/secretsanta/handleModal.go +++ b/modules/secretsanta/handleModal.go @@ -8,49 +8,30 @@ import ( "github.com/bwmarrin/discordgo" ) -func (c Component) handleModalSetAddress(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - +func (c Component) handleModalSetAddress() { addressFiled := c.modal.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) - if addressFiled.Value == player.Address { + if addressFiled.Value == c.player.Address { c.ReplyHidden(lang.GetDefault(tp + "msg.invite.set_address.not_changed")) return } - player.Address = addressFiled.Value - player.PendingNudge = false - err = c.setPlayers(players) + c.player.Address = addressFiled.Value + c.player.PendingNudge = false + err := c.setPlayers() if err != nil { log.Printf("ERROR: could not set players: %+v", err) c.ReplyError() return } - _, err = c.Session.ChannelMessageEditEmbed(c.Interaction.ChannelID, player.MessageID, player.InviteEmbed(c.Session)) + _, err = c.Session.ChannelMessageEditEmbed(c.Interaction.ChannelID, c.player.MessageID, c.player.InviteEmbed(c.Session)) if err != nil { - log.Printf("ERROR: could not update bot message for %s '%s/%s': %+v", player.DisplayName(), c.Interaction.ChannelID, player.MessageID, err) + log.Printf("ERROR: could not update bot message for %s '%s/%s': %+v", c.player.DisplayName(), c.Interaction.ChannelID, c.player.MessageID, err) c.ReplyError() return } - santaPlayer := c.getSantaForPlayer(player.User.ID) + santaPlayer := c.getSantaForPlayer(c.player.User.ID) santaChannel, err := c.Session.UserChannelCreate(santaPlayer.User.ID) if err != nil { log.Printf("ERROR: could not get user channel for %s: %+v", santaPlayer.DisplayName(), err) @@ -85,7 +66,7 @@ func (c Component) handleModalSetAddress(ids []string) { Color: 0x00FF00, Fields: []*discordgo.MessageEmbedField{{ Name: lang.GetDefault(tp + "msg.invite.set_address.changed"), - Value: fmt.Sprintf("```\n%s\n```", player.Address), + Value: fmt.Sprintf("```\n%s\n```", c.player.Address), }}, } @@ -93,34 +74,15 @@ func (c Component) handleModalSetAddress(ids []string) { c.ReplyHiddenEmbed(e) } -func (c Component) handleModalAddPackageTracking(ids []string) { - c.Interaction.GuildID = util.ShiftL(ids) - players, err := c.getPlayers() - if err != nil { - log.Printf("ERROR: could not get players: %+v", err) - c.ReplyError() - return - } - if len(players) == 0 { - log.Printf("ERROR: no players in guild %s", c.Interaction.GuildID) - c.ReplyError() - return - } - player, ok := players[c.Interaction.User.ID] - if !ok { - log.Printf("ERROR: could not find player %s in guild %s: %+v", c.Interaction.User.ID, c.Interaction.GuildID, c.Interaction.User.ID) - c.ReplyError() - return - } - +func (c Component) handleModalAddPackageTracking() { packageTrackingField := c.modal.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) - if packageTrackingField.Value == player.PackageTracking { + if packageTrackingField.Value == c.player.PackageTracking { c.ReplyHidden(lang.GetDefault(tp + "msg.invite.add_package_tracking.not_changed")) return } - player.PackageTracking = packageTrackingField.Value - err = c.setPlayers(players) + c.player.PackageTracking = packageTrackingField.Value + err := c.setPlayers() if err != nil { log.Printf("ERROR: could not set players: %+v", err) c.ReplyError() @@ -128,14 +90,15 @@ func (c Component) handleModalAddPackageTracking(ids []string) { } var matchChannel *discordgo.Channel - if matchChannel, _, ok = c.updateInviteMessage(player.Match); !ok { + var ok bool + if matchChannel, _, ok = c.updateInviteMessage(c.player.Match); !ok { c.ReplyError() return } - if player.PackageTracking != "" { + if c.player.PackageTracking != "" { _, err = c.Session.ChannelMessageSendComplex(matchChannel.ID, &discordgo.MessageSend{ Content: lang.GetDefault(tp + "msg.invite.add_package_tracking.santa_updated"), - Reference: &discordgo.MessageReference{MessageID: player.Match.MessageID}, + Reference: &discordgo.MessageReference{MessageID: c.player.Match.MessageID}, Components: []discordgo.MessageComponent{discordgo.ActionsRow{Components: []discordgo.MessageComponent{ util.CreateButtonComponent( "secretsanta.invite.delete", @@ -146,7 +109,7 @@ func (c Component) handleModalAddPackageTracking(ids []string) { }}}, }) if err != nil { - log.Printf("ERROR: could not send package tracking update message for %s '%s/%s': %+v", player.Match.DisplayName(), matchChannel.ID, player.Match.MessageID, err) + log.Printf("ERROR: could not send package tracking update message for %s '%s/%s': %+v", c.player.Match.DisplayName(), matchChannel.ID, c.player.Match.MessageID, err) c.ReplyError() return } diff --git a/modules/secretsanta/handlerMessageSetup.go b/modules/secretsanta/handlerMessageSetup.go index 4778995..967878d 100644 --- a/modules/secretsanta/handlerMessageSetup.go +++ b/modules/secretsanta/handlerMessageSetup.go @@ -70,7 +70,8 @@ func (cmd MsgCmd) handler() { } util.AddEmbedField(e, lang.GetDefault(tp+"msg.setup.users"), names, false) - err = cmd.setPlayers(players) + allPlayers[cmd.Interaction.GuildID] = players + err = cmd.setPlayers() if err != nil { log.Printf("Error on set players: %v\n", err) cmd.ReplyError() diff --git a/modules/secretsanta/secretsantabase.go b/modules/secretsanta/secretsantabase.go index 17eab14..9cf62e1 100644 --- a/modules/secretsanta/secretsantabase.go +++ b/modules/secretsanta/secretsantabase.go @@ -25,6 +25,29 @@ type secretSantaBase struct { util.InteractionUtil member *discordgo.Member user *discordgo.User + player *player +} + +// getPlayer gets the player for the current user in the current guild. +func (ssb *secretSantaBase) getPlayer() error { + if ssb.Interaction.GuildID == "" { + return fmt.Errorf("guild ID is empty") + } + + players, err := ssb.getPlayers() + if err != nil { + return fmt.Errorf("get players: %w", err) + } + if len(players) == 0 { + return fmt.Errorf("no players in guild %s", ssb.Interaction.GuildID) + } + + player, ok := players[ssb.Interaction.User.ID] + if !ok { + return fmt.Errorf("could not find player %s in guild %s", ssb.Interaction.User.ID, ssb.Interaction.GuildID) + } + ssb.player = player + return nil } // getPlayers returns the list of players for the current guild. If it is the first time, it loads @@ -81,12 +104,16 @@ func (ssb secretSantaBase) getSantaForPlayer(playerID string) *player { } // setPlayers sets the players for the current guild. -func (ssb secretSantaBase) setPlayers(players map[string]*player) (err error) { - if _, err = ssb.getPlayers(); err != nil { - return err +func (ssb secretSantaBase) setPlayers() (err error) { + if allPlayers == nil { + players, err := ssb.getPlayers() + if err != nil { + return fmt.Errorf("get players: %w", err) + } + + allPlayers[ssb.Interaction.GuildID] = players } - allPlayers[ssb.Interaction.GuildID] = players playersData, err := json.Marshal(allPlayers) if err != nil { return fmt.Errorf("marshal players file: %v", err)