diff --git a/friday/main.go b/friday/main.go new file mode 100644 index 0000000..8713d21 --- /dev/null +++ b/friday/main.go @@ -0,0 +1,101 @@ +package main + +import ( + "encoding/json" + "flag" + "io/ioutil" + "log" + "math/rand" + "net/http" + "strconv" + "strings" + "time" + + "github.com/hamcha/clessy/tg" +) + +const APIUrl = "https://api.datamarket.azure.com/Bing/Search/v1/Image?$format=json&Query=%27jojo%20bizarre%20adventure%20friday%20know%20your%20meme%27" + +type BingAPISearchResult struct { + MediaUrl string +} + +type BingAPIResponseData struct { + Results []BingAPISearchResult `json:"results"` +} + +type BingAPIResponse struct { + Data BingAPIResponseData `json:"d"` +} + +func assert(err error) { + if err != nil { + panic(err) + } +} + +func main() { + brokerAddr := flag.String("broker", "localhost:7314", "Broker address:port") + apiKey := flag.String("apiKey", "", "Bing Search API key") + chatId := flag.Int64("chatId", -1001063099772, "Chat to write to") + flag.Parse() + + broker, err := tg.ConnectToBroker(*brokerAddr) + assert(err) + log.Println("Connected to broker") + defer broker.Close() + + req, err := http.NewRequest("GET", APIUrl, nil) + assert(err) + req.SetBasicAuth(*apiKey, *apiKey) + resp, err := http.DefaultClient.Do(req) + assert(err) + log.Println("Connecting to Bing API") + + var body BingAPIResponse + err = json.NewDecoder(resp.Body).Decode(&body) + resp.Body.Close() + assert(err) + log.Println("Successfully obtained JSON of miracles") + + images := body.Data.Results + imgcount := len(body.Data.Results) + rand.Seed(time.Now().Unix()) + + for attempt := 0; attempt < 10; attempt += 1 { + imgindex := rand.Int() % imgcount + chosen := images[imgindex].MediaUrl + log.Println("Trying " + chosen) + + resp, err := http.Get(chosen) + if err != nil { + log.Println("Cannot GET url, trying new image") + continue + } + + data, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + log.Println("Cannot read data, trying new image") + continue + } + log.Println("Read " + strconv.Itoa(len(data)) + " bytes from " + chosen) + + ctype := strings.SplitN(resp.Header.Get("Content-Type"), "/", 2) + if len(ctype) < 2 { + log.Println("Cannot read type (" + resp.Header.Get("Content-Type") + "), trying new image") + continue + } else { + // DOES THIS FIX THINGS?? + ctype[1] = strings.Replace(ctype[1], "jpeg", "jpg", 1) + } + log.Println("Type is " + ctype[1]) + + broker.SendPhoto(&tg.APIChat{ChatID: *chatId}, data, "jojo."+ctype[1], "IT IS FRIDAY MY DUDES", nil) + + log.Println("Sent SendPhoto request to " + strconv.FormatInt(*chatId, 10)) + return + } + + log.Fatalln("FRIDAY has failed, too many attemps") +}