138 lines
4.5 KiB
Go
138 lines
4.5 KiB
Go
package mastodon
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ecdsa"
|
|
"crypto/elliptic"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// Notification hold information for mastodon notification.
|
|
type Notification struct {
|
|
ID ID `json:"id"`
|
|
Type string `json:"type"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Account Account `json:"account"`
|
|
Status *Status `json:"status"`
|
|
}
|
|
|
|
type PushSubscription struct {
|
|
ID ID `json:"id"`
|
|
Endpoint string `json:"endpoint"`
|
|
ServerKey string `json:"server_key"`
|
|
Alerts *PushAlerts `json:"alerts"`
|
|
}
|
|
|
|
type PushAlerts struct {
|
|
Follow *Sbool `json:"follow"`
|
|
Favourite *Sbool `json:"favourite"`
|
|
Reblog *Sbool `json:"reblog"`
|
|
Mention *Sbool `json:"mention"`
|
|
}
|
|
|
|
// GetNotifications return notifications.
|
|
func (c *Client) GetNotifications(ctx context.Context, pg *Pagination) ([]*Notification, error) {
|
|
var notifications []*Notification
|
|
err := c.doAPI(ctx, http.MethodGet, "/api/v1/notifications", nil, ¬ifications, pg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return notifications, nil
|
|
}
|
|
|
|
// GetNotification return notification.
|
|
func (c *Client) GetNotification(ctx context.Context, id ID) (*Notification, error) {
|
|
var notification Notification
|
|
err := c.doAPI(ctx, http.MethodGet, fmt.Sprintf("/api/v1/notifications/%v", id), nil, ¬ification, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ¬ification, nil
|
|
}
|
|
|
|
// DismissNotification deletes a single notification.
|
|
func (c *Client) DismissNotification(ctx context.Context, id ID) error {
|
|
params := url.Values{}
|
|
params.Add("id", string(id))
|
|
err := c.doAPI(ctx, http.MethodPost, "/api/v1/notifications/dismiss", params, nil, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ClearNotifications clear notifications.
|
|
func (c *Client) ClearNotifications(ctx context.Context) error {
|
|
return c.doAPI(ctx, http.MethodPost, "/api/v1/notifications/clear", nil, nil, nil)
|
|
}
|
|
|
|
// AddPushSubscription adds a new push subscription.
|
|
func (c *Client) AddPushSubscription(ctx context.Context, endpoint string, public ecdsa.PublicKey, shared []byte, alerts PushAlerts) (*PushSubscription, error) {
|
|
var subscription PushSubscription
|
|
pk := elliptic.Marshal(public.Curve, public.X, public.Y)
|
|
params := url.Values{}
|
|
params.Add("subscription[endpoint]", endpoint)
|
|
params.Add("subscription[keys][p256dh]", base64.RawURLEncoding.EncodeToString(pk))
|
|
params.Add("subscription[keys][auth]", base64.RawURLEncoding.EncodeToString(shared))
|
|
if alerts.Follow != nil {
|
|
params.Add("data[alerts][follow]", strconv.FormatBool(bool(*alerts.Follow)))
|
|
}
|
|
if alerts.Favourite != nil {
|
|
params.Add("data[alerts][favourite]", strconv.FormatBool(bool(*alerts.Favourite)))
|
|
}
|
|
if alerts.Reblog != nil {
|
|
params.Add("data[alerts][reblog]", strconv.FormatBool(bool(*alerts.Reblog)))
|
|
}
|
|
if alerts.Mention != nil {
|
|
params.Add("data[alerts][mention]", strconv.FormatBool(bool(*alerts.Mention)))
|
|
}
|
|
err := c.doAPI(ctx, http.MethodPost, "/api/v1/push/subscription", params, &subscription, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &subscription, nil
|
|
}
|
|
|
|
// UpdatePushSubscription updates which type of notifications are sent for the active push subscription.
|
|
func (c *Client) UpdatePushSubscription(ctx context.Context, alerts *PushAlerts) (*PushSubscription, error) {
|
|
var subscription PushSubscription
|
|
params := url.Values{}
|
|
if alerts.Follow != nil {
|
|
params.Add("data[alerts][follow]", strconv.FormatBool(bool(*alerts.Follow)))
|
|
}
|
|
if alerts.Mention != nil {
|
|
params.Add("data[alerts][favourite]", strconv.FormatBool(bool(*alerts.Favourite)))
|
|
}
|
|
if alerts.Reblog != nil {
|
|
params.Add("data[alerts][reblog]", strconv.FormatBool(bool(*alerts.Reblog)))
|
|
}
|
|
if alerts.Mention != nil {
|
|
params.Add("data[alerts][mention]", strconv.FormatBool(bool(*alerts.Mention)))
|
|
}
|
|
err := c.doAPI(ctx, http.MethodPut, "/api/v1/push/subscription", params, &subscription, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &subscription, nil
|
|
}
|
|
|
|
// RemovePushSubscription deletes the active push subscription.
|
|
func (c *Client) RemovePushSubscription(ctx context.Context) error {
|
|
return c.doAPI(ctx, http.MethodDelete, "/api/v1/push/subscription", nil, nil, nil)
|
|
}
|
|
|
|
// GetPushSubscription retrieves information about the active push subscription.
|
|
func (c *Client) GetPushSubscription(ctx context.Context) (*PushSubscription, error) {
|
|
var subscription PushSubscription
|
|
err := c.doAPI(ctx, http.MethodGet, "/api/v1/push/subscription", nil, &subscription, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &subscription, nil
|
|
}
|