From 1c5dbb7bc5d9083565e3ccfde4ae7514a7b07d06 Mon Sep 17 00:00:00 2001 From: Edward Tirado Jr Date: Sun, 16 Feb 2025 20:53:39 -0600 Subject: [PATCH] Initial commit --- .env_example | 5 +++ .gitignore | 2 + README.md | 17 ++++++++ go.mod | 5 +++ go.sum | 2 + main.go | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 146 insertions(+) create mode 100644 .env_example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.env_example b/.env_example new file mode 100644 index 0000000..70fa8dd --- /dev/null +++ b/.env_example @@ -0,0 +1,5 @@ +#Rename this file to .env and update the fields +SURVEY_ID=12345 +API_TOKEN=my_sg_api_token +API_SECRET=my_sg_api_secret +JSON_PATH=/path/to/responses.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ea061 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +friendSay diff --git a/README.md b/README.md new file mode 100644 index 0000000..7816481 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# FriendSay + +Takes responses from a two question survey and randomly selects one to display on Cowsay. + +The result should look something like this when piped into Cowsay: +``` + __________________________________ +/ Boy are you looking good today! \ +| | + Ed / + ---------------------------------- + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..60e58f8 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/tiradoe/friendSay + +go 1.14 + +require github.com/joho/godotenv v1.3.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ead7071 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c4fd77d --- /dev/null +++ b/main.go @@ -0,0 +1,115 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "math/rand" + "net/http" + "os" + "path/filepath" + "time" + + "github.com/joho/godotenv" +) + +const nameQuestionId = "3" +const messageQuestionId = "2" + +type FriendResponse struct { + Name string `json:"name"` + Message string `json:"message"` +} + +func main() { + err := godotenv.Load(filepath.Join("./", ".env")) + if err != nil { + log.Fatal("Error loading .env file: ", err.Error()) + } + + arguments := os.Args[1:] + + // Only call the API if the --fetch argument is provided + if len(arguments) > 0 && arguments[0] == "--fetch" { + responses := getResponses() + writeJson(responses) + os.Exit(0) + } + + getMessage() +} + +// Get a list of the survey responses from SurveyGizmo +func getResponses() []FriendResponse { + var result map[string]interface{} + var FriendResponses []FriendResponse + surveyId := os.Getenv("SURVEY_ID") + apiToken := os.Getenv("API_TOKEN") + apiSecret := os.Getenv("API_SECRET") + + response, err := http.Get("https://restapi.surveygizmo.com/v5/survey/" + surveyId + + "/surveyresponse?api_token=" + apiToken + + "&api_token_secret=" + apiSecret) + if err != nil { + log.Fatal(err.Error()) + } + + defer response.Body.Close() + + body, err := ioutil.ReadAll(response.Body) + if err != nil { + log.Fatal(err.Error()) + } + json.Unmarshal([]byte(body), &result) + + responseData := result["data"].([]interface{}) + + for _, value := range responseData { + surveyData := value.(map[string]interface{})["survey_data"] + message := getAnswer(surveyData, messageQuestionId) + respondentName := getAnswer(surveyData, nameQuestionId) + FriendResponses = append(FriendResponses, FriendResponse{ + Name: respondentName, + Message: message, + }) + } + + return FriendResponses +} + +// Parse the response for the actual answer +func getAnswer(surveyData interface{}, questionID string) string { + return fmt.Sprintf("%s", surveyData.(map[string]interface{})[questionID].(map[string]interface{})["answer"]) +} + +// Save the responses to a JSON file +func writeJson(responses []FriendResponse) { + jsonResponses, err := json.Marshal(responses) + if err != nil { + log.Fatal(err.Error()) + } + + ioutil.WriteFile(os.Getenv("JSON_PATH"), jsonResponses, 0644) +} + +// Grab a random response from the JSON file and print it to STDOUT +// for cowsay (or whatever) to use +func getMessage() { + var messages []FriendResponse + + rand.Seed(time.Now().UTC().UnixNano()) + + jsonFile, err := os.Open(os.Getenv("JSON_PATH")) + if err != nil { + log.Fatal("Failed to open JSON file: ", err.Error()) + } + + defer jsonFile.Close() + + byteValue, _ := ioutil.ReadAll(jsonFile) + json.Unmarshal(byteValue, &messages) + + message := messages[rand.Intn(len(messages))] + fmt.Println(message.Message, "\n", message.Name) +}