From ede07b71ce2eb48feb2f2e3894f3dc2456d75b72 Mon Sep 17 00:00:00 2001 From: Daniel Tam Date: Sat, 6 Jun 2020 04:29:32 -0500 Subject: [PATCH] switched to third party json parser, jsonpaser --- bunnybot.go | 2 +- func-images.go | 51 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/bunnybot.go b/bunnybot.go index e56bf43..706367e 100644 --- a/bunnybot.go +++ b/bunnybot.go @@ -64,7 +64,7 @@ func message_create (s *discordgo.Session, m *discordgo.MessageCreate) { // awwnime (test) if message == "awwnime" { - s.ChannelMessageSend(m.ChannelID, get_redditbooru("awwnime")) + s.ChannelMessageSend(m.ChannelID, get_redditbooru_image("awwnime")) } //get_redditbooru("awwnime") diff --git a/func-images.go b/func-images.go index 5b97915..259e0eb 100644 --- a/func-images.go +++ b/func-images.go @@ -1,17 +1,38 @@ +/* +This contains our functions used for image searches" +*/ + package main import ( "io/ioutil" "net/http" - "encoding/json" "time" "math/rand" + "fmt" + "strconv" + + "github.com/buger/jsonparser" ) -func get_redditbooru(sub string) string{ +// get the length of array for our parser +func getArrayLen(value []byte) (int, error) { + ret := 0 + arrayCallback := func(value []byte, dataType jsonparser.ValueType, offset int, err error) { + ret++ + } + + if _, err := jsonparser.ArrayEach(value, arrayCallback); err != nil { + return 0, fmt.Errorf("getArrayLen ArrayEach error: %v", err) + } + return ret, nil +} + +// redditbooru request +func get_redditbooru_image(sub string) string{ // create the proper url with the subreddit url := "https://" + sub + ".redditbooru.com/images/?limit=1000" - + // set 5 second timeout on request client := http.Client { Timeout: 5 * time.Second, @@ -19,26 +40,24 @@ func get_redditbooru(sub string) string{ // get the content of the page resp, err := client.Get(url) - defer resp.Body.Close() - // read html as slice of bytes + // read response out, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } - // convert output to string - jsonout := string(out) - - // convert to proper json - var results []map[string] interface {} - json.Unmarshal([]byte(jsonout), &results) - // randomize the seed rand.Seed(time.Now().UnixNano()) - - // select a random image to return - return results[rand.Intn(len(results))]["cdnUrl"].(string) -} + // get a random number for the image + outlen,err := getArrayLen(out) + random_img := rand.Intn(outlen) + + // select a random url from our list + img_url,err := jsonparser.GetString(out, "[" + strconv.Itoa(random_img) + "]", "cdnUrl") + + return img_url + +}