Add tag support
This commit is contained in:
parent
d2b4dc535a
commit
bdd392b310
31
mastoUtil.go
31
mastoUtil.go
|
@ -147,3 +147,34 @@ func getThread(baseURL, tootId string) (Thread, error) {
|
||||||
|
|
||||||
return thread, nil
|
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
|
||||||
|
}
|
||||||
|
|
51
server.go
51
server.go
|
@ -73,24 +73,24 @@ func getRawURL(conn *tls.Conn) (string, error) {
|
||||||
return fmt.Sprintf("gemini://%s", rawURL), nil
|
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)
|
rawURL, err := getRawURL(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
parsedURL, err := url.Parse(rawURL)
|
parsedURL, err := url.Parse(rawURL)
|
||||||
if err != nil {
|
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) {
|
func handleConn(conn *tls.Conn, baseURL, title, home_message string) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
path, err := getPath(conn)
|
path, query, err := getPath(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("get url: %s", err)
|
log.Println("get url: %s", err)
|
||||||
_, err = fmt.Fprintf(conn, "59 Can't parse request\r\n")
|
_, 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
|
// home
|
||||||
if path == "" || path == "/" {
|
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 {
|
if err != nil {
|
||||||
log.Println("send error: %s", err)
|
log.Println("send error: %s", err)
|
||||||
return
|
return
|
||||||
|
@ -164,6 +164,17 @@ Feel free to contribute, send feedback or share ideas.
|
||||||
log.Println("send: %s", err)
|
log.Println("send: %s", err)
|
||||||
return
|
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 {
|
} else {
|
||||||
_, err = fmt.Fprintf(conn, "59 Invalid request\r\n")
|
_, err = fmt.Fprintf(conn, "59 Invalid request\r\n")
|
||||||
if err != nil {
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue