enbas/internal/model/notification.go

110 lines
3 KiB
Go
Raw Normal View History

// 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"
2024-06-03 11:16:19 +01:00
"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"
)
2024-06-03 11:16:19 +01:00
func (n NotificationType) MessageFormat() string {
mapped := map[NotificationType]string{
2024-06-03 11:16:19 +01:00
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 {
2024-06-03 11:16:19 +01:00
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"`
}
2024-06-03 11:16:19 +01:00
func (n Notification) Display(noColor bool) string {
return fmt.Sprintf(n.Type.MessageFormat(), utilities.DisplayNameFormat(noColor, n.Account.DisplayName) + " (@" + n.Account.Acct + ")")
}