FediGraph/firefish.go

152 lines
3.4 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
type FirefishShowResponse struct {
Id string `json:"id"`
Desc string `json:"description"`
}
type FirefishFollowersResponse struct {
ID string `json:"id"`
Followee FirefishMetaUser `json:"followee"`
}
type FirefishFolloweeResponse struct {
ID string `json:"id"`
Follower FirefishMetaUser `json:"follower"`
}
type FirefishMetaUser struct {
Username string `json:"username"`
Host string `json:"host"`
}
func FirefishShowUser(u User) FirefishShowResponse {
showuserjson := []byte(fmt.Sprintf(`{"username": "%s"}`, u.Name))
client := &http.Client{}
req, err := http.NewRequest("POST", "https://"+u.Instance+"/api/users/show", bytes.NewBuffer(showuserjson))
if err != nil {
fmt.Printf("error: %s\n", err)
return FirefishShowResponse{
Id: "",
}
}
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return FirefishShowResponse{
Id: "",
}
}
defer resp.Body.Close()
jsonDecoder := json.NewDecoder(resp.Body)
var showuser FirefishShowResponse
err = jsonDecoder.Decode(&showuser)
if err != nil {
fmt.Printf("error: %s\n", err)
return FirefishShowResponse{
Id: "",
}
}
return showuser
}
func FirefishGetFollowing(u User) []User {
client := &http.Client{}
showuser := FirefishShowUser(u)
if !checkConsent(showuser.Desc) {
return nil
}
followersjson := []byte(fmt.Sprintf(`{"userId": "%s", "limit": %s}`, showuser.Id, "100"))
req, err := http.NewRequest("POST", "https://"+u.Instance+"/api/users/following", bytes.NewBuffer(followersjson))
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
jsonDecoder := json.NewDecoder(resp.Body)
var followers []FirefishFollowersResponse
err = jsonDecoder.Decode(&followers)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
var followerlist []User
var tempuser User
for _, f := range followers {
var host string
if f.Followee.Host == "" {
host = u.Instance
} else {
host = f.Followee.Host
}
tempuser = MakeUser(f.Followee.Username + "@" + host)
followerlist = append(followerlist, tempuser)
}
return followerlist
}
func FirefishGetFollowers(u User) []User {
client := &http.Client{}
showuser := FirefishShowUser(u)
if !checkConsent(showuser.Desc) {
return nil
}
followersjson := []byte(fmt.Sprintf(`{"userId": "%s", "limit": %s}`, showuser.Id, "100"))
req, err := http.NewRequest("POST", "https://"+u.Instance+"/api/users/followers", bytes.NewBuffer(followersjson))
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
jsonDecoder := json.NewDecoder(resp.Body)
var followers []FirefishFolloweeResponse
err = jsonDecoder.Decode(&followers)
if err != nil {
fmt.Printf("error: %s\n", err)
return nil
}
var followerlist []User
var tempuser User
for _, f := range followers {
var host string
if f.Follower.Host == "" {
host = u.Instance
} else {
host = f.Follower.Host
}
if f.Follower.Username == "" {
continue
}
tempuser = MakeUser(f.Follower.Username + "@" + host)
followerlist = append(followerlist, tempuser)
}
return followerlist
}