diff --git a/mastoUtil.go b/mastoUtil.go index 84dcc8e..21a1310 100644 --- a/mastoUtil.go +++ b/mastoUtil.go @@ -147,3 +147,34 @@ func getThread(baseURL, tootId string) (Thread, error) { return thread, nil } + +func getTag(baseURL, tag string) ([]Blog, error) { + if baseURL == "" || tag == "" { + log.Println("baseURL or tag is empty") + return nil, fmt.Errorf("baseURL or tag is empty") + } + + resp, err := http.Get(baseURL + "/api/v1/timelines/tag/" + tag) + if err != nil { + log.Println("Mastodon API request: %s", err) + return nil, fmt.Errorf("API request failed") + } + + defer resp.Body.Close() + + if resp.StatusCode != 200 { + log.Println("Mastodon API response: %s", resp.Status) + return nil, fmt.Errorf("API response is not 200") + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println("Mastodon response body: %s", err) + return nil, fmt.Errorf("Failed to read response") + } + + var blogs []Blog + json.Unmarshal(body, &blogs) + + return blogs, nil +} diff --git a/server.go b/server.go index 6ddabd7..ec92464 100644 --- a/server.go +++ b/server.go @@ -73,24 +73,24 @@ func getRawURL(conn *tls.Conn) (string, error) { return fmt.Sprintf("gemini://%s", rawURL), nil } -func getPath(conn *tls.Conn) (string, error) { +func getPath(conn *tls.Conn) (string, string, error) { rawURL, err := getRawURL(conn) if err != nil { - return "", err + return "", "", err } parsedURL, err := url.Parse(rawURL) if err != nil { - return "", err + return "", "", err } - return parsedURL.Path, nil + return parsedURL.Path, parsedURL.RawQuery, nil } func handleConn(conn *tls.Conn, baseURL, title, home_message string) { defer conn.Close() - path, err := getPath(conn) + path, query, err := getPath(conn) if err != nil { log.Println("get url: %s", err) _, err = fmt.Fprintf(conn, "59 Can't parse request\r\n") @@ -103,7 +103,7 @@ func handleConn(conn *tls.Conn, baseURL, title, home_message string) { // home if path == "" || path == "/" { - _, err = fmt.Fprintf(conn, "20 text/gemini\r\n# " + title + "\n\n" + home_message + "\n\n=> /about About MastoGem") + _, err = fmt.Fprintf(conn, "20 text/gemini\r\n# " + title + "\n\n" + home_message + "\n\n=> /tag Search for a tag\n=> /about About MastoGem") if err != nil { log.Println("send error: %s", err) return @@ -164,6 +164,17 @@ Feel free to contribute, send feedback or share ideas. log.Println("send: %s", err) return } + } /* tag */ else if strings.HasPrefix(path, "/tag") { + if query == "" { + _, err = fmt.Fprintf(conn, "10 Enter a tag name\r\n") + if err != nil { + log.Println("send: %s", err) + return + } + return + } + + printTag(conn, baseURL, query) } else { _, err = fmt.Fprintf(conn, "59 Invalid request\r\n") if err != nil { @@ -269,3 +280,31 @@ func printThread(conn *tls.Conn, baseURL, tootID string) { } } } + +func printTag(conn *tls.Conn, baseURL, tag string) { + toots, err := getTag(baseURL, tag) + if err != nil { + _, err = fmt.Fprintf(conn, "40 Remote mastodon instance failed\r\n") + if err != nil { + log.Println("handleConn: %s", err) + return + } + return + } + + // Print header + _, err = fmt.Fprintf(conn, "20 text/gemini\r\n# Toots for " + tag + "\n") + if err != nil { + log.Println("handleConn: %s", err) + return + } + + // Print toots + for _, toot := range toots { + _, err = fmt.Fprintf(conn, "\n```\n* Posted on " + toot.Date + " by " + toot.Author.Name + " *\n```\n" + removeHTMLTags(toot.Content) + "\n=> /profile/" + toot.Author.Id + " More toots from " + toot.Author.Name + "\n") + if err != nil { + log.Println("handleConn: %s", err) + return + } + } +}