diff --git a/go.mod b/go.mod index c355402..7eb5616 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/noqqe/serra go 1.14 require ( + github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/mitchellh/mapstructure v1.4.3 github.com/schollz/progressbar/v3 v3.8.5 github.com/spf13/cobra v1.3.0 diff --git a/go.sum b/go.sum index 1ac8c9a..5f43a30 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,11 @@ github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= diff --git a/src/serra/add.go b/src/serra/add.go index 24c4110..a722cee 100644 --- a/src/serra/add.go +++ b/src/serra/add.go @@ -2,8 +2,10 @@ package serra import ( "fmt" + "os" "strings" + "github.com/chzyer/readline" "github.com/spf13/cobra" "go.mongodb.org/mongo-driver/bson" ) @@ -11,6 +13,8 @@ import ( func init() { addCmd.Flags().Int64VarP(&count, "count", "c", 1, "Amount of cards to add") addCmd.Flags().BoolVarP(&unique, "unique", "u", false, "Only add card if not existent yet") + addCmd.Flags().BoolVarP(&interactive, "interactive", "i", false, "Spin up interactive terminal") + addCmd.Flags().StringVarP(&set, "set", "s", "", "Filter by set code (usg/mmq/vow)") rootCmd.AddCommand(addCmd) } @@ -22,51 +26,88 @@ var addCmd = &cobra.Command{ SilenceErrors: true, RunE: func(cmd *cobra.Command, cards []string) error { - client := storage_connect() - coll := &Collection{client.Database("serra").Collection("cards")} - defer storage_disconnect(client) - - // Loop over different cards - for _, card := range cards { - - // Check if card is already in collection - co, _ := coll.storage_find(bson.D{{"set", strings.Split(card, "/")[0]}, {"collectornumber", strings.Split(card, "/")[1]}}, bson.D{}) - - if len(co) >= 1 { - c := co[0] - - if unique { - LogMessage(fmt.Sprintf("Not adding \"%s\" (%s, %.2f %s) to Collection because it already exists.", c.Name, c.Rarity, c.getValue(), getCurrency()), "red") - continue - } - - modify_count_of_card(coll, &c, count) - // Give feedback of successfully added card - LogMessage(fmt.Sprintf("%dx \"%s\" (%s, %.2f %s) added to Collection.", c.SerraCount, c.Name, c.Rarity, c.getValue(), getCurrency()), "green") - - // If card is not already in collection, fetching from scyfall - } else { - - // Fetch card from scryfall - c, err := fetch_card(card) - if err != nil { - LogMessage(fmt.Sprintf("%v", err), "red") - continue - } - - // Write card to mongodb - c.SerraCount = count - err = coll.storage_add(c) - if err != nil { - LogMessage(fmt.Sprintf("%v", err), "red") - continue - } - - // Give feedback of successfully added card - LogMessage(fmt.Sprintf("%dx \"%s\" (%s, %.2f %s) added to Collection.", c.SerraCount, c.Name, c.Rarity, c.getValue(), getCurrency()), "green") - } + if interactive { + addCardsInteractive(unique, set) + } else { + addCards(cards, unique, count) } - storage_disconnect(client) return nil }, } + +func addCardsInteractive(unique bool, set string) { + + if len(set) == 0 { + LogMessage("Error: --set must be given in interactive mode", "red") + os.Exit(1) + } + + rl, err := readline.New(fmt.Sprintf("%s> ", set)) + if err != nil { + panic(err) + } + defer rl.Close() + + for { + line, err := rl.Readline() + if err != nil { // io.EOF + break + } + + // construct card input for addCards + card := []string{} + card = append(card, fmt.Sprintf("%s/%s", set, strings.TrimSpace(line))) + + addCards(card, unique, count) + } + +} + +func addCards(cards []string, unique bool, count int64) error { + client := storage_connect() + coll := &Collection{client.Database("serra").Collection("cards")} + defer storage_disconnect(client) + + // Loop over different cards + for _, card := range cards { + + // Check if card is already in collection + co, _ := coll.storage_find(bson.D{{"set", strings.Split(card, "/")[0]}, {"collectornumber", strings.Split(card, "/")[1]}}, bson.D{}) + + if len(co) >= 1 { + c := co[0] + + if unique { + LogMessage(fmt.Sprintf("Not adding \"%s\" (%s, %.2f %s) to Collection because it already exists.", c.Name, c.Rarity, c.getValue(), getCurrency()), "red") + continue + } + + modify_count_of_card(coll, &c, count) + // Give feedback of successfully added card + LogMessage(fmt.Sprintf("%dx \"%s\" (%s, %.2f %s) added to Collection.", c.SerraCount, c.Name, c.Rarity, c.getValue(), getCurrency()), "green") + + // If card is not already in collection, fetching from scyfall + } else { + + // Fetch card from scryfall + c, err := fetch_card(card) + if err != nil { + LogMessage(fmt.Sprintf("%v", err), "red") + continue + } + + // Write card to mongodb + c.SerraCount = count + err = coll.storage_add(c) + if err != nil { + LogMessage(fmt.Sprintf("%v", err), "red") + continue + } + + // Give feedback of successfully added card + LogMessage(fmt.Sprintf("%dx \"%s\" (%s, %.2f %s) added to Collection.", c.SerraCount, c.Name, c.Rarity, c.getValue(), getCurrency()), "green") + } + } + storage_disconnect(client) + return nil +} diff --git a/src/serra/root.go b/src/serra/root.go index 3ac20d5..710bbe5 100644 --- a/src/serra/root.go +++ b/src/serra/root.go @@ -11,6 +11,7 @@ var Version = "unknown" var count int64 var limit float64 +var interactive bool var name string var oracle string var rarity string