145 lines
2.8 KiB
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
|
|
}
|