Compare commits
2 commits
0f7668a046
...
c2957c179d
Author | SHA1 | Date | |
---|---|---|---|
c2957c179d | |||
2919bb9fa2 |
5 changed files with 168 additions and 11 deletions
33
internal/client/notifications.go
Normal file
33
internal/client/notifications.go
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"codeflow.dananglin.me.uk/apollo/enbas/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (g *Client) GetNotifications(limit int) ([]model.Notification, error) {
|
||||||
|
path := fmt.Sprintf("/api/v1/notifications?limit=%d", limit)
|
||||||
|
url := g.Authentication.Instance + path
|
||||||
|
|
||||||
|
var notifications []model.Notification
|
||||||
|
|
||||||
|
if err := g.sendRequest(http.MethodGet, url, nil, ¬ifications); err != nil {
|
||||||
|
return nil, fmt.Errorf("received an error after sending the request to get your notifications: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifications, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Client) GetNotification() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Client) DeleteAllNotifications() error {
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -45,4 +45,5 @@ const (
|
||||||
resourceStatus = "status"
|
resourceStatus = "status"
|
||||||
resourceTimeline = "timeline"
|
resourceTimeline = "timeline"
|
||||||
resourceBookmarks = "bookmarks"
|
resourceBookmarks = "bookmarks"
|
||||||
|
resourceNotification = "notification"
|
||||||
)
|
)
|
||||||
|
|
|
@ -67,6 +67,7 @@ func (s *ShowExecutor) Execute() error {
|
||||||
resourceFollowing: s.showFollowing,
|
resourceFollowing: s.showFollowing,
|
||||||
resourceBlocked: s.showBlocked,
|
resourceBlocked: s.showBlocked,
|
||||||
resourceBookmarks: s.showBookmarks,
|
resourceBookmarks: s.showBookmarks,
|
||||||
|
resourceNotification: s.showNotifications,
|
||||||
}
|
}
|
||||||
|
|
||||||
doFunc, ok := funcMap[s.resourceType]
|
doFunc, ok := funcMap[s.resourceType]
|
||||||
|
@ -329,3 +330,16 @@ func (s *ShowExecutor) showBookmarks(gtsClient *client.Client) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ShowExecutor) showNotifications(gts *client.Client) error {
|
||||||
|
notifications, err := gts.GetNotifications(s.limit)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to retrieve your notifications: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range notifications {
|
||||||
|
utilities.Display(notifications[i], *s.topLevelFlags.NoColor)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
109
internal/model/notification.go
Normal file
109
internal/model/notification.go
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NotificationType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
NotificationTypeFollow NotificationType = iota
|
||||||
|
NotificationTypeFollowRequest
|
||||||
|
NotificationTypeMention
|
||||||
|
NotificationTypeReblog
|
||||||
|
NotificationTypeFavourite
|
||||||
|
NotificationTypePoll
|
||||||
|
NotificationTypeStatus
|
||||||
|
NotificationTypeUnknown
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
notificationFollow = "follow"
|
||||||
|
notificationFollowRequest = "follow_request"
|
||||||
|
notificationMention = "mention"
|
||||||
|
notificationReblog = "reblog"
|
||||||
|
notificationFavourite = "favourite"
|
||||||
|
notificationPoll = "poll"
|
||||||
|
notificationStatus = "status"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (n NotificationType) MessageFormat() string {
|
||||||
|
mapped := map[NotificationType]string{
|
||||||
|
NotificationTypeFollow: "%s followed you",
|
||||||
|
NotificationTypeFollowRequest: "%s has requested to follow you",
|
||||||
|
NotificationTypeMention: "%s has mentioned you in this status",
|
||||||
|
NotificationTypeReblog: "%s reposted this status from you",
|
||||||
|
NotificationTypeFavourite: "%s liked this status from you",
|
||||||
|
NotificationTypePoll: "A poll from %s that you have voted in has ended",
|
||||||
|
NotificationTypeStatus: "%s has posted this status",
|
||||||
|
}
|
||||||
|
|
||||||
|
output, ok := mapped[n]
|
||||||
|
if !ok {
|
||||||
|
return "You have received a notification of an unknown type"
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseNotificationType(value string) (NotificationType, error) {
|
||||||
|
mapped := map[string]NotificationType{
|
||||||
|
notificationFollow: NotificationTypeFollow,
|
||||||
|
notificationFollowRequest: NotificationTypeFollowRequest,
|
||||||
|
notificationMention: NotificationTypeMention,
|
||||||
|
notificationReblog: NotificationTypeReblog,
|
||||||
|
notificationFavourite: NotificationTypeFavourite,
|
||||||
|
notificationPoll: NotificationTypePoll,
|
||||||
|
notificationStatus: NotificationTypeStatus,
|
||||||
|
}
|
||||||
|
|
||||||
|
output, ok := mapped[value]
|
||||||
|
if !ok {
|
||||||
|
return NotificationTypeUnknown, UnknownNotificationError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NotificationType) UnmarshalJSON(data []byte) error {
|
||||||
|
var (
|
||||||
|
value string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
if err = json.Unmarshal(data, &value); err != nil {
|
||||||
|
return fmt.Errorf("unable to unmarshal the data: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignore the error if the notification type from another Fediverse service
|
||||||
|
// is not known by enbas. It will be seen as an unknown notification to the user.
|
||||||
|
*n, _ = ParseNotificationType(value)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnknownNotificationError struct{}
|
||||||
|
|
||||||
|
func (e UnknownNotificationError) Error() string {
|
||||||
|
return "unknown notification type"
|
||||||
|
}
|
||||||
|
|
||||||
|
type Notification struct {
|
||||||
|
Account *Account `json:"account"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
ID string `json:"id"`
|
||||||
|
Status *Status `json:"status"`
|
||||||
|
Type NotificationType `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n Notification) Display(noColor bool) string {
|
||||||
|
return fmt.Sprintf(n.Type.MessageFormat(), utilities.DisplayNameFormat(noColor, n.Account.DisplayName) + " (@" + n.Account.Acct + ")")
|
||||||
|
}
|
|
@ -83,7 +83,7 @@ type Poll struct {
|
||||||
|
|
||||||
type PollOption struct {
|
type PollOption struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
VotesCount string `json:"votes_count"`
|
VotesCount int `json:"votes_count"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StatusReblogged struct {
|
type StatusReblogged struct {
|
||||||
|
|
Loading…
Reference in a new issue