Improve performance, fix issues with confirmation, allow specifying multiple phrases for oracle text

This commit is contained in:
shylie 2026-02-09 14:38:10 -05:00
parent cea9a47de4
commit 1ffd466dfc
6 changed files with 70 additions and 14 deletions

View File

@ -156,7 +156,7 @@ func addCards(cards []string, unique bool, count int64) error {
}
// Write card to mongodb
var total int64 = 0
var total int64
if foil {
c.SerraCountFoil = count
c.SerraCountFoilDeck = 0

View File

@ -23,7 +23,7 @@ func init() {
cardCmd.Flags().StringVarP(&name, "name", "n", "", "Name of the card (regex compatible)")
cardCmd.Flags().Int64VarP(&cmc, "cmc", "m", -1, "Cumulative mana cost of card")
cardCmd.Flags().StringVarP(&color, "color", "i", "", "Color identity of card (w,u,b,r,g)")
cardCmd.Flags().StringVarP(&oracle, "oracle", "o", "", "Contains string in card text")
cardCmd.Flags().StringArrayVarP(&oracle, "oracle", "o", []string{}, "Contains string in card text")
cardCmd.Flags().StringVarP(&cardType, "type", "t", "", "Contains string in card type line")
cardCmd.Flags().Int64VarP(&count, "min-count", "c", 0, "Occource more than X in your collection")
cardCmd.Flags().BoolVarP(&detail, "detail", "d", false, "Show details for cards (url)")
@ -73,7 +73,7 @@ func ShowCard(cardids []string) {
}
}
func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bool, skip, limit int64, omitInDeck bool) []Card {
func Cards(rarity, set, sortby, name string, oracle []string, cardType string, reserved, foil bool, skip, limit int64, omitInDeck bool) []Card {
client := storageConnect()
coll := &Collection{client.Database("serra").Collection("cards")}
defer storageDisconnect(client)
@ -125,8 +125,10 @@ func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bo
filter = append(filter, bson.E{"cmc", cmc})
}
if len(oracle) > 0 {
filter = append(filter, bson.E{"oracletext", bson.D{{"$regex", ".*" + oracle + ".*"}, {"$options", "i"}}})
for _, o:= range oracle {
if len(o) > 0 {
filter = append(filter, bson.E{"oracletext", bson.D{{"$regex", ".*" + o + ".*"}, {"$options", "i"}}})
}
}
if len(cardType) > 0 {

View File

@ -312,12 +312,11 @@ func coloredValue(value float64) string {
func askConfirmation(card *Card) bool {
drawImage(card)
response := "some invalid response"
for response != "y" && response != "n" {
fmt.Println("Is this correct (y/n)?")
var char = 'x'
for char != 'y' && char != 'n' {
fmt.Scanf("%c\n", &char)
fmt.Scanln(&response)
}
return char == 'y'
return response == "y"
}

56
pkg/serra/initialize.go Normal file
View File

@ -0,0 +1,56 @@
package serra
import (
"context"
"github.com/spf13/cobra"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
func init() {
rootCmd.AddCommand(initializeCmd)
}
var initializeCmd = &cobra.Command{
Use: "init",
Short: "Initialize database",
Long: "Create database optimization structures",
SilenceErrors: true,
RunE: func(cmd *cobra.Command, _ []string) error {
return initializeDatabase()
},
}
func initializeDatabase() error {
client := storageConnect()
l := Logger()
defer storageDisconnect(client)
// create sets collection
client.Database("serra").Collection("sets")
// create total collection and insert entry if it doesn't exist
totalcoll := &Collection{client.Database("serra").Collection("total")}
totalcoll.InsertOne(context.TODO(), Total{ID: "1", Value: []PriceEntry{}})
cardscoll := &Collection{client.Database("serra").Collection("cards")}
fieldsToIndex := []string{ "name", "prices.eur", "prices.usd", "collectornumber", "serra_created" }
for _, fieldName := range fieldsToIndex {
if createIndex(cardscoll, fieldName) != nil {
l.Warnf("Failed to create index on field '%s'", fieldName)
}
}
return nil
}
func createIndex(coll *Collection, fieldName string) error {
indexModel := mongo.IndexModel{
Keys: bson.D{{fieldName, 1}},
}
_, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
return err
}

View File

@ -24,7 +24,7 @@ var (
limit float64
name string
omitInDeck bool
oracle string
oracle []string
port uint64
rarity string
reserved bool
@ -44,7 +44,6 @@ var rootCmd = &cobra.Command{
}
func Execute() {
l := Logger()
if err := rootCmd.Execute(); err != nil {
l.Fatal(err)

View File

@ -71,7 +71,7 @@ func landingPage(c *gin.Context) {
sets := Sets("release")
// Fetch all results based on filter criteria
cards := Cards("", query.Set, query.Sort, query.Name, "", "", false, false, query.Page*int64(limit), limit, false)
cards := Cards("", query.Set, query.Sort, query.Name, []string{}, "", false, false, query.Page*int64(limit), limit, false)
// Construct quick way for counting results
filter := bson.D{}