103 lines
1.8 KiB
Go
103 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
|
|
"git.birbmc.com/Etzelia/falseknees"
|
|
)
|
|
|
|
var (
|
|
randomFlag bool
|
|
imageFlag bool
|
|
outFlag string
|
|
)
|
|
|
|
func main() {
|
|
flag.BoolVar(&randomFlag, "random", false, "get a random comic")
|
|
flag.BoolVar(&imageFlag, "image", false, "get the image response for a comic")
|
|
flag.StringVar(&outFlag, "out", "", "where to write the response (default: stdout)")
|
|
flag.Parse()
|
|
|
|
comicNum := 0
|
|
if flag.NArg() > 0 {
|
|
arg := flag.Arg(0)
|
|
i, err := strconv.Atoi(arg)
|
|
if err != nil {
|
|
fmt.Printf("Specific comic must be a number: %v\n", err)
|
|
return
|
|
}
|
|
comicNum = i
|
|
}
|
|
out := os.Stdout
|
|
if outFlag != "" {
|
|
fi, err := os.Create(outFlag)
|
|
if err != nil {
|
|
fmt.Printf("Could not create file %s: %v\n", outFlag, err)
|
|
return
|
|
}
|
|
defer fi.Close()
|
|
out = fi
|
|
}
|
|
|
|
if err := run(comicNum, out); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}
|
|
|
|
func run(comicNum int, out io.WriteCloser) error {
|
|
|
|
client := falseknees.New()
|
|
var comic *falseknees.Comic
|
|
var err error
|
|
if randomFlag {
|
|
comic, err = client.Random(context.Background())
|
|
} else if comicNum == 0 {
|
|
comic, err = client.Current(context.Background())
|
|
} else {
|
|
comic, err = client.Comic(context.Background(), comicNum)
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if imageFlag {
|
|
return image(comic.Img, out)
|
|
}
|
|
|
|
format := `Comic: %d
|
|
Title: %s
|
|
Image: %s
|
|
`
|
|
if _, err := fmt.Fprintf(out, format,
|
|
comic.Num,
|
|
comic.Title,
|
|
comic.Img); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func image(img string, out io.WriteCloser) error {
|
|
req, err := http.NewRequest(http.MethodGet, img, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if _, err := io.Copy(out, resp.Body); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|