Esempio n. 1
0
// CartRemove removes an item from the cart
func CartRemove(c *cli.Context) {
	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	defer conf.Flush()

	cartName := conf.CartNameFromCache(c.Args().Get(1))

	cartItemID, exists := conf.CartItemIDFromCache(cartName, c.Args().First())
	if !exists {
		fmt.Fprintln(os.Stderr, "Cannot look up CartItemId")
		os.Exit(1)
	}

	cart, exists := conf.Carts[cartName]
	if !exists {
		fmt.Fprintln(os.Stderr, "Cannot look up Cart")
		os.Exit(1)
	}

	response, err := api.CartModify(cart.CartID, cart.HMAC, map[string]int{
		cartItemID: 0,
	})

	if err != nil {
		panic(err)
	}

	conf.Carts[cartName].HMAC = response.Cart.HMAC

	fmt.Printf("Removed item from cart %s\n", cartName)
}
Esempio n. 2
0
// Open opens a product on the amazon website
func Open(c *cli.Context) {
	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	asin, exists := conf.ASINFromCache("Products", c.Args().First())
	if !exists {
		fmt.Fprintln(os.Stderr, "Cannot look up ASIN")
		os.Exit(1)
	}

	result, err := api.ItemLookup(asin, "Small")

	if err != nil {
		panic(err)
	}

	browser.OpenURL(result.Items.ItemList[0].DetailPageURL)
}
Esempio n. 3
0
// CartAdd adds an item to the cart
func CartAdd(c *cli.Context) {
	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	defer conf.Flush()

	asin, exists := conf.ASINFromCache("Products", c.Args().First())
	if !exists {
		fmt.Fprintln(os.Stderr, "Cannot look up ASIN")
		os.Exit(1)
	}

	cartName := conf.CartNameFromCache(c.Args().Get(1))

	if cart, exists := conf.Carts[cartName]; !exists {
		createResponse, createErr := api.CartCreate(map[string]int{
			asin: 1,
		})

		if createErr != nil {
			panic(createErr)
		}

		conf.Carts[cartName] = &config.Cart{
			Name:    cartName,
			Created: time.Now(),
			CartID:  createResponse.Cart.CartID,
			HMAC:    createResponse.Cart.HMAC,
		}
	} else {
		addResponse, addErr := api.CartAdd(cart.CartID, cart.HMAC, map[string]int{
			asin: 1,
		})

		if addErr != nil {
			panic(addErr)
		}

		conf.Carts[cartName].HMAC = addResponse.Cart.HMAC
	}

	fmt.Printf("Added item to cart %s\n", cartName)
}
Esempio n. 4
0
// CartInfo prints information about a cart
func CartInfo(c *cli.Context) {
	color.Allow(c)

	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	defer conf.Flush()

	cartName := conf.CartNameFromCache(c.Args().First())

	if cart, exists := conf.Carts[cartName]; !exists {
		fmt.Fprintf(os.Stderr, "Cart %s is unknown\n", cartName)
		os.Exit(1)
	} else {
		fmt.Printf("\nCart %s\n\n", color.Header(cart.Name))

		getResponse, getErr := api.CartGet(cart.CartID, cart.HMAC)

		if getErr != nil {
			panic(getErr)
		}

		index := 1
		cache := make(map[string]string)
		for _, item := range getResponse.Cart.CartItems.CartItemList {
			fmt.Printf("(%s) %-45.45s %9s [×%d]\n",
				color.ShortID(strconv.Itoa(index)),
				item.Title,
				item.ItemTotal.FormattedPrice,
				item.Quantity)
			cache[strconv.Itoa(index)] = item.CartItemID
			index++
		}
		conf.ResultCache["Cart"+strings.Title(cartName)+"Items"] = cache

		if len(getResponse.Cart.CartItems.CartItemList) == 0 {
			fmt.Println("Cart is empty")
		} else {
			fmt.Printf("\nSubtotal %s\n\n", color.Bold(getResponse.Cart.SubTotal.FormattedPrice))
		}
	}
}
Esempio n. 5
0
// Checkout initiates the checkout for a cart
func Checkout(c *cli.Context) {
	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	defer conf.Flush()

	cartName := conf.CartNameFromCache(c.Args().First())

	if cart, exists := conf.Carts[cartName]; exists {
		if getResponse, getErr := api.CartGet(cart.CartID, cart.HMAC); getErr == nil {
			delete(conf.Carts, cartName)
			browser.OpenURL(getResponse.Cart.PurchaseURL)
		} else {
			panic(getErr)
		}
	} else {
		fmt.Fprintf(os.Stderr, "Cart %s is unknown\n", cartName)
		os.Exit(1)
	}
}
Esempio n. 6
0
// Search does a product search
func Search(c *cli.Context) {
	color.Allow(c)

	search := strings.Replace(strings.Join(c.Args(), "+"), " ", "+", -1)
	page := c.Int("page")
	sort := c.String("sort")
	searchIndex := c.String("index")
	api := api.Create(c.GlobalString("locale"))

	conf := config.GetConfig()
	defer conf.Flush()

	params := map[string]string{
		"Keywords":      search,
		"ResponseGroup": "ItemAttributes,Small,EditorialReview,OfferSummary,BrowseNodes",
		"ItemPage":      strconv.FormatInt(int64(page), 10),
	}
	if sort != "" {
		params["Sort"] = sort
	}
	result, err := api.ItemSearch(searchIndex, params)

	if err != nil {
		panic(err)
	}

	fmt.Printf("\nFound %d results matching query %s\n\n", result.Items.TotalResults, color.Header("'%s'", search))

	cache := make(map[string]string)
	for index, item := range result.Items.ItemList {
		price := item.ItemAttributes.ListPrice.FormattedPrice

		if price == "" {
			if lowestNew := item.OfferSummary.LowestNewPrice; lowestNew.Amount != 0 {
				price = fmt.Sprintf("%s (new)", lowestNew.FormattedPrice)
			} else if lowestUsed := item.OfferSummary.LowestUsedPrice; lowestUsed.Amount != 0 {
				price = fmt.Sprintf("%s (used)", lowestUsed.FormattedPrice)
			} else {
				price = "n/a"
			}
		}

		year := item.ItemAttributes.PublicationDate
		if year == "" {
			year = item.ItemAttributes.ReleaseDate
		}
		if year != "" {
			year = fmt.Sprintf(" (%4.4s)", year)
		}

		ratingFormatted := ""
		if !c.Bool("no-rating") {
			rating, err := helper.Rating(item.ASIN, api.Locale)
			if err != nil {
				panic(err)
			}

			ratingFormatted = fmt.Sprintf("%-5s ", helper.FormatRating(rating))
		}

		normalizedIndex := index + 1
		cache[strconv.Itoa(normalizedIndex)] = item.ASIN

		maxLen := math.Min(float64(52-len(year)), float64(len(item.ItemAttributes.Title)))
		fmt.Printf("(%s) %-52s %s%s [%s]\n",
			color.ShortID("%2d", normalizedIndex),
			fmt.Sprintf("%s%s", item.ItemAttributes.Title[:int(maxLen)], year),
			color.Faint(ratingFormatted),
			color.Bold("%9s", price),
			item.ItemAttributes.Binding)
	}
	conf.ResultCache["Products"] = cache

	fmt.Printf("\nPage %d of %d\n\n", page, result.Items.TotalPages)
}
Esempio n. 7
0
// Info prints information about a product
func Info(c *cli.Context) {
	color.Allow(c)

	api := api.Create(c.GlobalString("locale"))
	config := config.GetConfig()

	asin, exists := config.ASINFromCache("Products", c.Args().First())
	if !exists {
		fmt.Fprintln(os.Stderr, "Cannot look up ASIN")
		os.Exit(1)
	}

	result, err := api.ItemLookup(asin, "ItemAttributes,Small,OfferFull,EditorialReview")
	if err != nil {
		panic(err)
	}

	item := result.Items.ItemList[0]
	rating, err := helper.Rating(item.ASIN, api.Locale)
	if err != nil {
		panic(err)
	}

	year := item.ItemAttributes.PublicationDate
	if year == "" {
		year = item.ItemAttributes.ReleaseDate
	}
	if year != "" {
		year = fmt.Sprintf(" - %4.4s", year)
	}

	fmt.Printf("%s %s\n", color.Header(item.ItemAttributes.Title), helper.FormatRating(rating))

	fmt.Println(color.Faint(fmt.Sprintf("(%s) %s%s",
		strings.Join(item.ItemAttributes.Languages.Languages(), ", "),
		item.ItemAttributes.Binding,
		year)))

	fmt.Println("")
	if item.ItemAttributes.ListPrice.FormattedPrice != "" {
		fmt.Printf("%s\n", color.Bold(item.ItemAttributes.ListPrice.FormattedPrice))
	}
	if item.OfferSummary.TotalNew > 0 {
		fmt.Printf("%d new from %s\t", item.OfferSummary.TotalNew, item.OfferSummary.LowestNewPrice.FormattedPrice)
	}
	if item.OfferSummary.TotalUsed > 0 {
		fmt.Printf("%d used from %s\t", item.OfferSummary.TotalUsed, item.OfferSummary.LowestUsedPrice.FormattedPrice)
	}
	fmt.Printf("\n\n")

	if len(item.ItemAttributes.Authors) > 0 {
		fmt.Println(color.Header("AUTHORS"))
		for _, author := range item.ItemAttributes.Authors {
			fmt.Printf("\t%s\n", author)
		}
	}

	if item.ItemAttributes.Publisher != "" {
		fmt.Printf("%s\n\t%s\n", color.Header("PUBLISHER"), item.ItemAttributes.Publisher)
	}

	if item.ItemAttributes.Edition != "" {
		fmt.Printf("%s\n\t%s\n", color.Header("EDITION"), item.ItemAttributes.Edition)
	}

	if item.ItemAttributes.ISBN != "" {
		fmt.Printf("%s\n\t%s\n", color.Header("ISBN"), item.ItemAttributes.ISBN)
	}

	if len(item.EditorialReviews.EditorialReviewList) > 0 {
		fmt.Println(color.Header(strings.ToUpper(item.EditorialReviews.EditorialReviewList[0].Source)))
		fmt.Println(helper.FormatText(item.EditorialReviews.EditorialReviewList[0].Content, 80, "\t"))
	}
}