2023-03-12 15:00:57 +00:00
|
|
|
// GoToSocial
|
|
|
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2021-03-11 13:30:14 +00:00
|
|
|
|
2021-05-08 12:25:55 +00:00
|
|
|
package model
|
2021-03-11 13:30:14 +00:00
|
|
|
|
2023-11-17 10:35:28 +00:00
|
|
|
import "github.com/superseriousbusiness/gotosocial/internal/language"
|
|
|
|
|
2021-08-02 17:06:44 +00:00
|
|
|
// Status models a status or post.
|
2021-07-31 15:49:59 +00:00
|
|
|
//
|
|
|
|
// swagger:model status
|
2021-03-11 13:30:14 +00:00
|
|
|
type Status struct {
|
2021-07-31 15:49:59 +00:00
|
|
|
// ID of the status.
|
|
|
|
// example: 01FBVD42CQ3ZEEVMW180SBX03B
|
2021-03-11 13:30:14 +00:00
|
|
|
ID string `json:"id"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// The date when this status was created (ISO 8601 Datetime).
|
|
|
|
// example: 2021-07-30T09:20:25+00:00
|
2021-03-11 13:30:14 +00:00
|
|
|
CreatedAt string `json:"created_at"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// ID of the status being replied to.
|
|
|
|
// example: 01FBVD42CQ3ZEEVMW180SBX03B
|
2022-09-02 15:00:11 +00:00
|
|
|
// nullable: true
|
|
|
|
InReplyToID *string `json:"in_reply_to_id"`
|
2021-03-11 13:30:14 +00:00
|
|
|
// ID of the account being replied to.
|
2021-07-31 15:49:59 +00:00
|
|
|
// example: 01FBVD42CQ3ZEEVMW180SBX03B
|
2022-09-02 15:00:11 +00:00
|
|
|
// nullable: true
|
|
|
|
InReplyToAccountID *string `json:"in_reply_to_account_id"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Status contains sensitive content.
|
|
|
|
// example: false
|
2021-03-11 13:30:14 +00:00
|
|
|
Sensitive bool `json:"sensitive"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Subject, summary, or content warning for the status.
|
|
|
|
// example: warning nsfw
|
2021-05-27 14:06:24 +00:00
|
|
|
SpoilerText string `json:"spoiler_text"`
|
2021-03-11 13:30:14 +00:00
|
|
|
// Visibility of this status.
|
2021-07-31 15:49:59 +00:00
|
|
|
// example: unlisted
|
2021-04-19 17:42:19 +00:00
|
|
|
Visibility Visibility `json:"visibility"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Primary language of this status (ISO 639 Part 1 two-letter language code).
|
2022-12-15 08:41:49 +00:00
|
|
|
// Will be null if language is not known.
|
2021-07-31 15:49:59 +00:00
|
|
|
// example: en
|
2022-12-15 08:41:49 +00:00
|
|
|
Language *string `json:"language"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// ActivityPub URI of the status. Equivalent to the status's activitypub ID.
|
|
|
|
// example: https://example.org/users/some_user/statuses/01FBVD42CQ3ZEEVMW180SBX03B
|
2021-03-11 13:30:14 +00:00
|
|
|
URI string `json:"uri"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// The status's publicly available web URL. This link will only work if the visibility of the status is 'public'.
|
|
|
|
// example: https://example.org/@some_user/statuses/01FBVD42CQ3ZEEVMW180SBX03B
|
2021-03-11 13:30:14 +00:00
|
|
|
URL string `json:"url"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Number of replies to this status, according to our instance.
|
2021-03-11 13:30:14 +00:00
|
|
|
RepliesCount int `json:"replies_count"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Number of times this status has been boosted/reblogged, according to our instance.
|
2021-03-11 13:30:14 +00:00
|
|
|
ReblogsCount int `json:"reblogs_count"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Number of favourites/likes this status has received, according to our instance.
|
2021-03-11 13:30:14 +00:00
|
|
|
FavouritesCount int `json:"favourites_count"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// This status has been favourited by the account viewing it.
|
2021-03-11 13:30:14 +00:00
|
|
|
Favourited bool `json:"favourited"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// This status has been boosted/reblogged by the account viewing it.
|
2021-03-11 13:30:14 +00:00
|
|
|
Reblogged bool `json:"reblogged"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// Replies to this status have been muted by the account viewing it.
|
2021-03-11 13:30:14 +00:00
|
|
|
Muted bool `json:"muted"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// This status has been bookmarked by the account viewing it.
|
2021-03-11 13:30:14 +00:00
|
|
|
Bookmarked bool `json:"bookmarked"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// This status has been pinned by the account viewing it (only relevant for your own statuses).
|
2022-05-28 17:59:55 +00:00
|
|
|
Pinned bool `json:"pinned"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// The content of this status. Should be HTML, but might also be plaintext in some cases.
|
|
|
|
// example: <p>Hey this is a status!</p>
|
2021-03-11 13:30:14 +00:00
|
|
|
Content string `json:"content"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// The status that this status reblogs/boosts.
|
|
|
|
// nullable: true
|
2022-05-28 17:59:55 +00:00
|
|
|
Reblog *StatusReblogged `json:"reblog"`
|
2021-07-31 15:49:59 +00:00
|
|
|
// The application used to post this status, if visible.
|
2022-09-02 15:00:11 +00:00
|
|
|
Application *Application `json:"application,omitempty"`
|
2021-03-11 13:30:14 +00:00
|
|
|
// The account that authored this status.
|
|
|
|
Account *Account `json:"account"`
|
|
|
|
// Media that is attached to this status.
|
2023-12-09 15:54:38 +00:00
|
|
|
MediaAttachments []*Attachment `json:"media_attachments"`
|
2021-03-11 13:30:14 +00:00
|
|
|
// Mentions of users within the status content.
|
|
|
|
Mentions []Mention `json:"mentions"`
|
|
|
|
// Hashtags used within the status content.
|
|
|
|
Tags []Tag `json:"tags"`
|
|
|
|
// Custom emoji to be used when rendering status content.
|
|
|
|
Emojis []Emoji `json:"emojis"`
|
|
|
|
// Preview card for links included within status content.
|
2022-09-02 15:00:11 +00:00
|
|
|
// nullable: true
|
2021-03-11 13:30:14 +00:00
|
|
|
Card *Card `json:"card"`
|
|
|
|
// The poll attached to the status.
|
2022-09-02 15:00:11 +00:00
|
|
|
// nullable: true
|
2021-03-11 13:30:14 +00:00
|
|
|
Poll *Poll `json:"poll"`
|
|
|
|
// Plain-text source of a status. Returned instead of content when status is deleted,
|
|
|
|
// so the user may redraft from the source text without the client having to reverse-engineer
|
|
|
|
// the original text from the HTML content.
|
2022-09-02 15:00:11 +00:00
|
|
|
Text string `json:"text,omitempty"`
|
2024-05-06 11:49:08 +00:00
|
|
|
// A list of filters that matched this status and why they matched, if there are any such filters.
|
|
|
|
Filtered []FilterResult `json:"filtered,omitempty"`
|
2024-07-17 14:46:52 +00:00
|
|
|
// The interaction policy for this status, as set by the status author.
|
|
|
|
InteractionPolicy InteractionPolicy `json:"interaction_policy"`
|
2024-07-12 18:36:03 +00:00
|
|
|
}
|
2023-11-17 10:35:28 +00:00
|
|
|
|
2024-07-12 18:36:03 +00:00
|
|
|
// WebStatus is like *model.Status, but contains
|
|
|
|
// additional fields used only for HTML templating.
|
|
|
|
//
|
|
|
|
// swagger:ignore
|
|
|
|
type WebStatus struct {
|
|
|
|
*Status
|
2023-11-17 10:35:28 +00:00
|
|
|
|
2024-07-15 09:47:57 +00:00
|
|
|
// Web version of media
|
|
|
|
// attached to this status.
|
|
|
|
MediaAttachments []*WebAttachment `json:"media_attachments"`
|
|
|
|
|
2024-07-12 18:36:03 +00:00
|
|
|
// Template-ready language tag and
|
|
|
|
// string, based on *status.Language.
|
|
|
|
LanguageTag *language.Language
|
2023-11-22 11:17:42 +00:00
|
|
|
|
|
|
|
// Template-ready poll options with vote shares
|
|
|
|
// calculated as a percentage of total votes.
|
2024-07-12 18:36:03 +00:00
|
|
|
PollOptions []WebPollOption
|
2023-12-27 10:23:52 +00:00
|
|
|
|
|
|
|
// Status is from a local account.
|
2024-07-12 18:36:03 +00:00
|
|
|
Local bool
|
|
|
|
|
|
|
|
// Level of indentation at which to
|
|
|
|
// display this status in the web view.
|
|
|
|
Indent int
|
|
|
|
|
2024-07-13 10:26:16 +00:00
|
|
|
// This status is the last visible status
|
|
|
|
// in the main thread, so everything below
|
|
|
|
// can be considered "replies".
|
|
|
|
ThreadLastMain bool
|
|
|
|
|
|
|
|
// This status is the one around which
|
|
|
|
// the thread context was constructed.
|
|
|
|
ThreadContextStatus bool
|
|
|
|
|
|
|
|
// This status is the first visibile status
|
|
|
|
// after the "main" thread, so it and everything
|
2024-07-12 18:36:03 +00:00
|
|
|
// below it can be considered "replies".
|
|
|
|
ThreadFirstReply bool
|
2021-03-11 13:30:14 +00:00
|
|
|
}
|
2021-04-19 17:42:19 +00:00
|
|
|
|
2022-02-05 11:47:38 +00:00
|
|
|
/*
|
|
|
|
** The below functions are added onto the API model status so that it satisfies
|
|
|
|
** the Preparable interface in internal/timeline.
|
|
|
|
*/
|
|
|
|
|
|
|
|
func (s *Status) GetID() string {
|
|
|
|
return s.ID
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Status) GetAccountID() string {
|
|
|
|
if s.Account != nil {
|
|
|
|
return s.Account.ID
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Status) GetBoostOfID() string {
|
|
|
|
if s.Reblog != nil {
|
|
|
|
return s.Reblog.ID
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Status) GetBoostOfAccountID() string {
|
|
|
|
if s.Reblog != nil && s.Reblog.Account != nil {
|
|
|
|
return s.Reblog.Account.ID
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2021-08-02 17:06:44 +00:00
|
|
|
// StatusReblogged represents a reblogged status.
|
|
|
|
//
|
|
|
|
// swagger:model statusReblogged
|
|
|
|
type StatusReblogged struct {
|
|
|
|
*Status
|
|
|
|
}
|
|
|
|
|
|
|
|
// StatusCreateRequest models status creation parameters.
|
|
|
|
//
|
2024-03-06 17:05:45 +00:00
|
|
|
// swagger:ignore
|
2021-04-19 17:42:19 +00:00
|
|
|
type StatusCreateRequest struct {
|
2021-08-02 17:06:44 +00:00
|
|
|
// Text content of the status.
|
|
|
|
// If media_ids is provided, this becomes optional.
|
|
|
|
// Attaching a poll is optional while status is provided.
|
2021-05-17 17:06:58 +00:00
|
|
|
Status string `form:"status" json:"status" xml:"status"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// Array of Attachment ids to be attached as media.
|
|
|
|
// If provided, status becomes optional, and poll cannot be used.
|
2022-07-22 11:43:51 +00:00
|
|
|
MediaIDs []string `form:"media_ids[]" json:"media_ids" xml:"media_ids"`
|
2021-04-19 17:42:19 +00:00
|
|
|
// Poll to include with this status.
|
2021-05-17 17:06:58 +00:00
|
|
|
Poll *PollRequest `form:"poll" json:"poll" xml:"poll"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// ID of the status being replied to, if status is a reply.
|
2021-05-17 17:06:58 +00:00
|
|
|
InReplyToID string `form:"in_reply_to_id" json:"in_reply_to_id" xml:"in_reply_to_id"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// Status and attached media should be marked as sensitive.
|
2021-05-17 17:06:58 +00:00
|
|
|
Sensitive bool `form:"sensitive" json:"sensitive" xml:"sensitive"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// Text to be shown as a warning or subject before the actual content.
|
|
|
|
// Statuses are generally collapsed behind this field.
|
2021-05-17 17:06:58 +00:00
|
|
|
SpoilerText string `form:"spoiler_text" json:"spoiler_text" xml:"spoiler_text"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// Visibility of the posted status.
|
2021-05-17 17:06:58 +00:00
|
|
|
Visibility Visibility `form:"visibility" json:"visibility" xml:"visibility"`
|
2021-08-02 17:06:44 +00:00
|
|
|
// ISO 8601 Datetime at which to schedule a status.
|
2022-09-28 17:30:40 +00:00
|
|
|
// Providing this parameter will cause ScheduledStatus to be returned instead of Status.
|
2021-08-02 17:06:44 +00:00
|
|
|
// Must be at least 5 minutes in the future.
|
2021-05-17 17:06:58 +00:00
|
|
|
ScheduledAt string `form:"scheduled_at" json:"scheduled_at" xml:"scheduled_at"`
|
2021-04-19 17:42:19 +00:00
|
|
|
// ISO 639 language code for this status.
|
2021-05-17 17:06:58 +00:00
|
|
|
Language string `form:"language" json:"language" xml:"language"`
|
2023-03-02 11:06:40 +00:00
|
|
|
// Content type to use when parsing this status.
|
|
|
|
ContentType StatusContentType `form:"content_type" json:"content_type" xml:"content_type"`
|
2021-04-19 17:42:19 +00:00
|
|
|
}
|
|
|
|
|
2021-08-02 17:06:44 +00:00
|
|
|
// Visibility models the visibility of a status.
|
2021-07-31 15:49:59 +00:00
|
|
|
//
|
2022-09-28 17:30:40 +00:00
|
|
|
// swagger:enum statusVisibility
|
|
|
|
// swagger:type string
|
2021-04-19 17:42:19 +00:00
|
|
|
type Visibility string
|
|
|
|
|
|
|
|
const (
|
2021-07-31 15:49:59 +00:00
|
|
|
// VisibilityPublic is visible to everyone, and will be available via the web even for nonauthenticated users.
|
2021-04-19 17:42:19 +00:00
|
|
|
VisibilityPublic Visibility = "public"
|
2021-07-31 15:49:59 +00:00
|
|
|
// VisibilityUnlisted is visible to everyone, but only on home timelines, lists, etc.
|
2021-04-19 17:42:19 +00:00
|
|
|
VisibilityUnlisted Visibility = "unlisted"
|
2021-07-31 15:49:59 +00:00
|
|
|
// VisibilityPrivate is visible only to followers of the account that posted the status.
|
2021-04-19 17:42:19 +00:00
|
|
|
VisibilityPrivate Visibility = "private"
|
2021-07-31 15:49:59 +00:00
|
|
|
// VisibilityMutualsOnly is visible only to mutual followers of the account that posted the status.
|
|
|
|
VisibilityMutualsOnly Visibility = "mutuals_only"
|
|
|
|
// VisibilityDirect is visible only to accounts tagged in the status. It is equivalent to a direct message.
|
2021-04-19 17:42:19 +00:00
|
|
|
VisibilityDirect Visibility = "direct"
|
|
|
|
)
|
2021-05-08 12:25:55 +00:00
|
|
|
|
2021-10-04 13:24:19 +00:00
|
|
|
// AdvancedStatusCreateForm wraps the mastodon-compatible status create form along with the GTS advanced
|
2021-05-15 09:58:11 +00:00
|
|
|
// visibility settings.
|
2021-08-02 17:06:44 +00:00
|
|
|
//
|
2024-03-06 17:05:45 +00:00
|
|
|
// swagger:ignore
|
2021-05-08 12:25:55 +00:00
|
|
|
type AdvancedStatusCreateForm struct {
|
|
|
|
StatusCreateRequest
|
|
|
|
AdvancedVisibilityFlagsForm
|
|
|
|
}
|
|
|
|
|
2021-05-15 09:58:11 +00:00
|
|
|
// AdvancedVisibilityFlagsForm allows a few more advanced flags to be set on new statuses, in addition
|
|
|
|
// to the standard mastodon-compatible ones.
|
2021-08-02 17:06:44 +00:00
|
|
|
//
|
2024-03-06 17:05:45 +00:00
|
|
|
// swagger:ignore
|
2021-05-08 12:25:55 +00:00
|
|
|
type AdvancedVisibilityFlagsForm struct {
|
2021-08-02 17:06:44 +00:00
|
|
|
// This status will be federated beyond the local timeline(s).
|
2021-05-17 17:06:58 +00:00
|
|
|
Federated *bool `form:"federated" json:"federated" xml:"federated"`
|
2021-05-08 12:25:55 +00:00
|
|
|
}
|
2021-07-26 18:25:54 +00:00
|
|
|
|
2023-03-02 11:06:40 +00:00
|
|
|
// StatusContentType is the content type with which to parse the submitted status.
|
|
|
|
// Can be either text/plain or text/markdown. Empty will default to text/plain.
|
2021-08-02 17:06:44 +00:00
|
|
|
//
|
2023-03-02 11:06:40 +00:00
|
|
|
// swagger:enum statusContentType
|
2022-09-28 17:30:40 +00:00
|
|
|
// swagger:type string
|
2023-03-02 11:06:40 +00:00
|
|
|
type StatusContentType string
|
2021-07-26 18:25:54 +00:00
|
|
|
|
2023-03-02 11:06:40 +00:00
|
|
|
// Content type to use when parsing submitted status into an html-formatted status
|
2022-08-06 10:09:21 +00:00
|
|
|
const (
|
2023-03-02 11:06:40 +00:00
|
|
|
StatusContentTypePlain StatusContentType = "text/plain"
|
|
|
|
StatusContentTypeMarkdown StatusContentType = "text/markdown"
|
|
|
|
StatusContentTypeDefault = StatusContentTypePlain
|
2022-08-06 10:09:21 +00:00
|
|
|
)
|
2024-04-17 12:06:49 +00:00
|
|
|
|
2024-04-17 12:49:20 +00:00
|
|
|
// StatusSource represents the source text of a
|
|
|
|
// status as submitted to the API when it was created.
|
|
|
|
//
|
|
|
|
// swagger:model statusSource
|
|
|
|
type StatusSource struct {
|
|
|
|
// ID of the status.
|
|
|
|
// example: 01FBVD42CQ3ZEEVMW180SBX03B
|
|
|
|
ID string `json:"id"`
|
|
|
|
// Plain-text source of a status.
|
2024-04-18 11:22:55 +00:00
|
|
|
Text string `json:"text"`
|
2024-04-17 12:49:20 +00:00
|
|
|
// Plain-text version of spoiler text.
|
|
|
|
SpoilerText string `json:"spoiler_text"`
|
|
|
|
}
|
|
|
|
|
2024-04-17 12:06:49 +00:00
|
|
|
// StatusEdit represents one historical revision of a status, containing
|
|
|
|
// partial information about the state of the status at that revision.
|
|
|
|
//
|
|
|
|
// swagger:model statusEdit
|
|
|
|
type StatusEdit struct {
|
|
|
|
// The content of this status at this revision.
|
|
|
|
// Should be HTML, but might also be plaintext in some cases.
|
|
|
|
// example: <p>Hey this is a status!</p>
|
|
|
|
Content string `json:"content"`
|
|
|
|
// Subject, summary, or content warning for the status at this revision.
|
|
|
|
// example: warning nsfw
|
|
|
|
SpoilerText string `json:"spoiler_text"`
|
|
|
|
// Status marked sensitive at this revision.
|
|
|
|
// example: false
|
|
|
|
Sensitive bool `json:"sensitive"`
|
|
|
|
// The date when this revision was created (ISO 8601 Datetime).
|
|
|
|
// example: 2021-07-30T09:20:25+00:00
|
|
|
|
CreatedAt string `json:"created_at"`
|
|
|
|
// The account that authored this status.
|
|
|
|
Account *Account `json:"account"`
|
|
|
|
// The poll attached to the status at this revision.
|
|
|
|
// Note that edits changing the poll options will be collapsed together into one edit, since this action resets the poll.
|
|
|
|
// nullable: true
|
|
|
|
Poll *Poll `json:"poll"`
|
|
|
|
// Media that is attached to this status.
|
|
|
|
MediaAttachments []*Attachment `json:"media_attachments"`
|
|
|
|
// Custom emoji to be used when rendering status content.
|
|
|
|
Emojis []Emoji `json:"emojis"`
|
|
|
|
}
|