FediGraph/mastodon.go

145 lines
2.8 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
)
type MastodonLookupResponse struct {
Id string `json:"id"`
Note string `json:"note"`
}
type MastodonFollowingNode struct {
Username string `json:"username"`
Acct string `json:"acct"`
}
func MastodonGetId(u User) string {
return MastodonGetUser(u).Id
}
func MastodonGetUser(u User) MastodonLookupResponse {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://"+u.Instance+"/api/v1/accounts/lookup?acct="+u.Name, nil)
if err != nil {
fmt.Printf("error: %s\n", err)
return MastodonLookupResponse{
Id: "",
Note: "",
}
}
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return MastodonLookupResponse{
Id: "",
Note: "",
}
}
jsonDecoder := json.NewDecoder(resp.Body)
var lookup MastodonLookupResponse
err = jsonDecoder.Decode(&lookup)
if err != nil {
fmt.Printf("error: %s\n", err)
return MastodonLookupResponse{
Id: "",
Note: "",
}
}
return lookup
}
func MastodonGetFollowing(u User) []User {
client := &http.Client{}
if !checkConsent(MastodonGetUser(u).Note) {
return nil
}
req, err := http.NewRequest("GET", "https://"+u.Instance+"/api/v1/accounts/"+MastodonGetId(u)+"/following?limit=80", nil)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
jsonDecoder := json.NewDecoder(resp.Body)
var following []MastodonFollowingNode
err = jsonDecoder.Decode(&following)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
var users []User
for _, user := range following {
var tempuser User
if user.Acct == user.Username {
// same instance
tempuser = MakeUser(user.Acct + "@" + u.Instance)
} else {
// different instance
tempuser = MakeUser(user.Acct)
}
users = append(users, tempuser)
}
return users
}
func MastodonGetFollowers(u User) []User {
client := &http.Client{}
if !checkConsent(MastodonGetUser(u).Note) {
return nil
}
req, err := http.NewRequest("GET", "https://"+u.Instance+"/api/v1/accounts/"+MastodonGetId(u)+"/followers?limit=80", nil)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
jsonDecoder := json.NewDecoder(resp.Body)
var followers []MastodonFollowingNode
err = jsonDecoder.Decode(&followers)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
var users []User
for _, user := range followers {
var tempuser User
if user.Acct == user.Username {
// same instance
tempuser = MakeUser(user.Acct + "@" + u.Instance)
} else {
// different instance
tempuser = MakeUser(user.Acct)
}
users = append(users, tempuser)
}
return users
}