Added purchasing feature straight from listing

This commit is contained in:
t94j0
2017-08-04 11:24:32 -04:00
parent 202a034bd2
commit c29a45322c
6 changed files with 91 additions and 5 deletions
+10
View File
@@ -53,6 +53,16 @@ Choose an option: 0
Success!
```
Another way to purchase domains is actually to use output from the `list` command. This is useful if you want to leave AIRMASTER alone for a while while you grab a coffee, or while you're reading documentation on Windows Me because your target is using that for some reason.
```
AIRMASTER list --file ~/Downloads/domains.txt > /tmp/available
*20 minuites later* - Edit list from /tmp/available as you'd like to
AIRMASTER purchase --list /tmp/available
```
The help *should* be obvious, so if you are stuck, try using `AIRMASTER --help`. (Although if you are still stuck, please create an issue)
## Config
+5 -1
View File
@@ -2,6 +2,7 @@ package cmd
import (
"fmt"
"os"
"github.com/t94j0/AIRMASTER/domain"
@@ -70,6 +71,9 @@ func init() {
listCmd.Flags().StringP("file", "f", "", "File used for checking domains")
listCmd.Flags().StringSliceP("keyword", "k", nil, "Keyword for searching domains")
listCmd.Flags().Int("pages", 10, "How many pages of data to get when using the --keyword option")
viper.BindPFlags(listCmd.Flags())
if err := viper.BindPFlags(listCmd.Flags()); err != nil {
fmt.Fprintln(os.Stderr, "Error binding flags:", err)
os.Exit(1)
}
}
+71
View File
@@ -0,0 +1,71 @@
package cmd
import (
"bufio"
"fmt"
"net/url"
"os"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/t94j0/AIRMASTER/domain"
)
// purchaseCmd represents the purchase command
var purchaseCmd = &cobra.Command{
Use: "purchase",
Short: "Purchase domains straight after listing",
Long: `Purchase should be used if you just want to purchase one domain or from a
previous listing. This can be more efficent if you want to leave the "list"
command running for a long time.
Example: AIRMASTER purchase --domain "maxh.io"
or
AIRMASTER list --file ./domains.txt > categorized_domains.txt
cat categorized_domains.txt | AIRMASTER purchase`,
Run: func(cmd *cobra.Command, args []string) {
if viper.GetString("domain") != "" {
singleDomain := domain.NewDomain(viper.GetString("domain"), "")
singleDomain.PromptPurchase()
} else if viper.GetString("list") != "" {
file, err := os.Open(viper.GetString("list"))
if err != nil {
fmt.Fprintln(os.Stderr, "Could not open file:", err)
return
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
// Remove final newline character
urlLine := strings.Trim(scanner.Text(), "\n")
// Get just the URL (http://maxh.io)
urlCat := strings.Split(urlLine, "-")
if len(urlCat) != 2 {
fmt.Printf("URL \"%s\" is malformed. Please use output from `AIRMASTER list`\n", urlLine)
continue
}
urlLine = strings.TrimRight(urlCat[0], " ")
categorization := strings.TrimLeft(urlCat[1], " ")
urlObj, err := url.Parse(urlLine)
if err != nil {
fmt.Println("Failed parsing URL:", urlLine)
continue
}
singleDomain := domain.NewDomain(urlObj.Host, categorization)
singleDomain.PromptPurchase()
}
}
},
}
func init() {
RootCmd.AddCommand(purchaseCmd)
purchaseCmd.Flags().StringP("domain", "d", "", "Used to purchase a single domain")
purchaseCmd.Flags().StringP("list", "l", "", "Specify output from `list` to get a purchase prompt")
if err := viper.BindPFlags(purchaseCmd.Flags()); err != nil {
fmt.Println("Error binding flags:", err)
os.Exit(1)
}
}
+1 -1
View File
@@ -57,7 +57,7 @@ func initConfig() {
// If a config file is found, read it in.
if err := viper.ReadInConfig(); err == nil {
fmt.Println("Using config file:", viper.ConfigFileUsed())
fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed())
} else {
fmt.Println(err)
os.Exit(1)
+1 -1
View File
@@ -74,7 +74,7 @@ func CheckDomain(domain string, client *http.Client) error {
newDomain.PromptPurchase()
return nil
}
fmt.Println("Found:", cat.URL, "-", categorization)
fmt.Println(cat.URL, "-", categorization)
return nil
}
default:
+3 -2
View File
@@ -44,6 +44,7 @@ func (d *Domain) PromptPurchase() {
// Get all registrars that have the domain available
availableRegistrars, prices := getAvailability(d.URL, allRegistrars)
if len(availableRegistrars) == 0 {
fmt.Fprintln(os.Stderr, "No available registrars found for domain:", d.URL)
return
}
@@ -77,11 +78,11 @@ func (d *Domain) PromptPurchase() {
input = strings.Trim(input, "\n")
choice, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Please input a number...")
fmt.Fprintln(os.Stderr, "Please input a number...")
continue
}
if len(availableRegistrars) < choice || choice < -1 {
fmt.Println("Not a choice")
fmt.Fprintln(os.Stderr, "Not a choice")
continue
}