|
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/RasmusLindroth/go-mastodon"
|
|
|
|
|
"github.com/RasmusLindroth/tut/config"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type TimelineType uint
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) getStatusSimilar(fn func() ([]*mastodon.Status, error), timeline string) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := fn()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses {
|
|
|
|
|
item := NewStatusItem(s, false)
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) getUserSimilar(fn func() ([]*mastodon.Account, error), data interface{}) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
users, err := fn()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
ids := []string{}
|
|
|
|
|
for _, u := range users {
|
|
|
|
|
ids = append(ids, string(u.ID))
|
|
|
|
|
}
|
|
|
|
|
rel, err := ac.Client.GetAccountRelationships(context.Background(), ids)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, u := range users {
|
|
|
|
|
for _, r := range rel {
|
|
|
|
|
if u.ID == r.ID {
|
|
|
|
|
items = append(items, NewUserItem(&User{
|
|
|
|
|
Data: u,
|
|
|
|
|
Relation: r,
|
|
|
|
|
AdditionalData: data,
|
|
|
|
|
}, false))
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTimeline(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetTimelineHome(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "home")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTimelineFederated(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetTimelinePublic(context.Background(), false, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "public")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTimelineLocal(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetTimelinePublic(context.Background(), true, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "public")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetNotifications(nth []config.NotificationToHide, pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
toHide := []string{}
|
|
|
|
|
for _, n := range nth {
|
|
|
|
|
toHide = append(toHide, string(n))
|
|
|
|
|
}
|
|
|
|
|
notifications, err := ac.Client.GetNotificationsExclude(context.Background(), &toHide, pg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
ids := []string{}
|
|
|
|
|
for _, n := range notifications {
|
|
|
|
|
ids = append(ids, string(n.Account.ID))
|
|
|
|
|
}
|
|
|
|
|
rel, err := ac.Client.GetAccountRelationships(context.Background(), ids)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, n := range notifications {
|
|
|
|
|
for _, r := range rel {
|
|
|
|
|
if n.Account.ID == r.ID {
|
|
|
|
|
item := NewNotificationItem(n, &User{
|
|
|
|
|
Data: &n.Account, Relation: r,
|
|
|
|
|
})
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetHistory(status *mastodon.Status) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := ac.Client.GetStatusHistory(context.Background(), status.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses {
|
|
|
|
|
items = append(items, NewStatusHistoryItem(s))
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetThread(status *mastodon.Status) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := ac.Client.GetStatusContext(context.Background(), status.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses.Ancestors {
|
|
|
|
|
items = append(items, NewStatusItem(s, false))
|
|
|
|
|
}
|
|
|
|
|
items = append(items, NewStatusItem(status, false))
|
|
|
|
|
for _, s := range statuses.Descendants {
|
|
|
|
|
items = append(items, NewStatusItem(s, false))
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFavorites(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetFavourites(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "home")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetBookmarks(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetBookmarks(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "home")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetConversations(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
conversations, err := ac.Client.GetConversations(context.Background(), pg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, c := range conversations {
|
|
|
|
|
if c.LastStatus == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
item := NewStatusItem(c.LastStatus, false)
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetUsers(search string) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
var users []*mastodon.Account
|
|
|
|
|
var err error
|
|
|
|
|
if strings.HasPrefix(search, "@") && len(strings.Split(search, "@")) == 3 {
|
|
|
|
|
users, err = ac.Client.AccountsSearchResolve(context.Background(), search, 10, true)
|
|
|
|
|
}
|
|
|
|
|
if len(users) == 0 || err != nil {
|
|
|
|
|
users, err = ac.Client.AccountsSearchResolve(context.Background(), search, 10, false)
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
ids := []string{}
|
|
|
|
|
for _, u := range users {
|
|
|
|
|
ids = append(ids, string(u.ID))
|
|
|
|
|
}
|
|
|
|
|
rel, err := ac.Client.GetAccountRelationships(context.Background(), ids)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, u := range users {
|
|
|
|
|
for _, r := range rel {
|
|
|
|
|
if u.ID == r.ID {
|
|
|
|
|
items = append(items, NewUserItem(&User{
|
|
|
|
|
Data: u,
|
|
|
|
|
Relation: r,
|
|
|
|
|
}, false))
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetBoostsStatus(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetRebloggedBy(context.Background(), id, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFavoritesStatus(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetFavouritedBy(context.Background(), id, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFollowers(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetAccountFollowers(context.Background(), id, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFollowing(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetAccountFollowing(context.Background(), id, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetBlocking(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetBlocks(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetMuting(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetMutes(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFollowRequests(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetFollowRequests(context.Background(), pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetUser(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := ac.Client.GetAccountStatuses(context.Background(), id, pg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses {
|
|
|
|
|
item := NewStatusItem(s, false)
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetUserPinned(id mastodon.ID) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := ac.Client.GetAccountPinnedStatuses(context.Background(), id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses {
|
|
|
|
|
item := NewStatusItem(s, true)
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTags(pg *mastodon.Pagination) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
tags, err := ac.Client.TagsFollowed(context.Background(), pg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, t := range tags {
|
|
|
|
|
items = append(items, NewTagItem(t))
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetLists() ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
lists, err := ac.Client.GetLists(context.Background())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, l := range lists {
|
|
|
|
|
items = append(items, NewListsItem(l))
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetListStatuses(pg *mastodon.Pagination, id mastodon.ID) ([]Item, error) {
|
|
|
|
|
var items []Item
|
|
|
|
|
statuses, err := ac.Client.GetTimelineList(context.Background(), id, pg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return items, err
|
|
|
|
|
}
|
|
|
|
|
for _, s := range statuses {
|
|
|
|
|
item := NewStatusItem(s, false)
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetFollowingForList(pg *mastodon.Pagination, id mastodon.ID, data interface{}) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetAccountFollowing(context.Background(), id, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetListUsers(pg *mastodon.Pagination, id mastodon.ID, data interface{}) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Account, error) {
|
|
|
|
|
return ac.Client.GetListAccounts(context.Background(), id)
|
|
|
|
|
}
|
|
|
|
|
return ac.getUserSimilar(fn, data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTag(pg *mastodon.Pagination, search string) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
return ac.Client.GetTimelineHashtag(context.Background(), search, false, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "public")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ac *AccountClient) GetTagMultiple(pg *mastodon.Pagination, search string) ([]Item, error) {
|
|
|
|
|
fn := func() ([]*mastodon.Status, error) {
|
|
|
|
|
var s string
|
|
|
|
|
td := mastodon.TagData{}
|
|
|
|
|
parts := strings.Split(search, " ")
|
|
|
|
|
for i, p := range parts {
|
|
|
|
|
if i == 0 {
|
|
|
|
|
s = p
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if len(p) > 0 {
|
|
|
|
|
td.Any = append(td.Any, p)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ac.Client.GetTimelineHashtagMultiple(context.Background(), s, false, &td, pg)
|
|
|
|
|
}
|
|
|
|
|
return ac.getStatusSimilar(fn, "public")
|
|
|
|
|
}
|