You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
2.7 KiB

package main
import (
"context"
"errors"
"github.com/mattn/go-mastodon"
)
type TimelineType uint
const (
TimelineHome TimelineType = iota
TimelineDirect
TimelineLocal
TimelineFederated
)
type API struct {
Client *mastodon.Client
}
type AccountRegister struct {
Account
AuthURI string
}
func (api *API) SetClient(c *mastodon.Client) {
api.Client = c
}
func (api *API) getStatuses(tl TimelineType, pg *mastodon.Pagination) ([]*mastodon.Status, error) {
var statuses []*mastodon.Status
var err error
switch tl {
case TimelineHome:
statuses, err = api.Client.GetTimelineHome(context.Background(), pg)
case TimelineDirect:
statuses, err = api.Client.GetTimelineDirect(context.Background(), pg)
case TimelineLocal:
statuses, err = api.Client.GetTimelinePublic(context.Background(), true, pg)
case TimelineFederated:
statuses, err = api.Client.GetTimelinePublic(context.Background(), false, pg)
default:
err = errors.New("No timeline selected")
}
return statuses, err
}
func (api *API) GetStatuses(tl TimelineType) ([]*mastodon.Status, error) {
return api.getStatuses(tl, nil)
}
func (api *API) GetStatusesOlder(tl TimelineType, s *mastodon.Status) ([]*mastodon.Status, bool, error) {
pg := &mastodon.Pagination{
MaxID: s.ID,
}
statuses, err := api.getStatuses(tl, pg)
if err != nil {
return statuses, false, err
}
if pg.MinID == "" {
return statuses, false, err
}
return statuses, true, err
}
func (api *API) GetStatusesNewer(tl TimelineType, s *mastodon.Status) ([]*mastodon.Status, bool, error) {
pg := &mastodon.Pagination{
MinID: s.ID,
}
statuses, err := api.getStatuses(tl, pg)
if err != nil {
return statuses, false, err
}
if pg.MaxID == "" {
return statuses, false, err
}
return statuses, true, err
}
func (api *API) GetThread(s *mastodon.Status) ([]*mastodon.Status, int, error) {
cont, err := api.Client.GetStatusContext(context.Background(), s.ID)
if err != nil {
return nil, 0, err
}
thread := cont.Ancestors
thread = append(thread, s)
thread = append(thread, cont.Descendants...)
return thread, len(cont.Ancestors), nil
}
func (api *API) Boost(s *mastodon.Status) error {
_, err := api.Client.Reblog(context.Background(), s.ID)
return err
}
func (api *API) Unboost(s *mastodon.Status) error {
_, err := api.Client.Unreblog(context.Background(), s.ID)
return err
}
func (api *API) Favorite(s *mastodon.Status) error {
_, err := api.Client.Favourite(context.Background(), s.ID)
return err
}
func (api *API) Unfavorite(s *mastodon.Status) error {
_, err := api.Client.Unfavourite(context.Background(), s.ID)
return err
}
func (api *API) DeleteStatus(s *mastodon.Status) error {
//TODO: check user here?
return api.Client.DeleteStatus(context.Background(), s.ID)
}