diff --git a/Mastonet.Entities/Status.cs b/Mastonet.Entities/Status.cs
index 9ca3624..77045cc 100644
--- a/Mastonet.Entities/Status.cs
+++ b/Mastonet.Entities/Status.cs
@@ -198,3 +198,51 @@ public class Status
[JsonPropertyName("pinned")]
public bool? Pinned { get; set; }
}
+
+public class StatusParameters
+{
+ ///
+ /// The text of the status
+ ///
+ public string Status { get; set; } = string.Empty;
+
+ ///
+ /// Either "direct", "private", "unlisted" or "public"
+ ///
+ public Visibility? Visibility { get; set; }
+
+ ///
+ /// Local ID of the status you want to reply to
+ ///
+ public string? ReplyStatusId { get; set; }
+
+ ///
+ /// Array of media IDs to attach to the status (maximum 4)
+ ///
+ public IEnumerable? MediaIds { get; set; }
+
+ ///
+ /// Set this to mark the media of the status as NSFW
+ ///
+ public bool Sensitive { get; set; }
+
+ ///
+ /// Text to be shown as a warning before the actual content
+ ///
+ public string? SpoilerText { get; set; }
+
+ ///
+ /// DateTime to schedule posting of status
+ ///
+ public DateTime? ScheduledAt { get; set; }
+
+ ///
+ /// Override language code of the toot (ISO 639-2)
+ ///
+ public string? Language { get; set; }
+
+ ///
+ /// Nested parameters to attach a poll to the status
+ ///
+ public PollParameters? PollParameters { get; set; }
+}
diff --git a/Mastonet/MastodonClient.Status.cs b/Mastonet/MastodonClient.Status.cs
index f730c39..8f3ea06 100644
--- a/Mastonet/MastodonClient.Status.cs
+++ b/Mastonet/MastodonClient.Status.cs
@@ -91,7 +91,7 @@ public Task> GetFavouritedBy(string statusId, ArrayOptions
/// Returns Status
public Task PublishStatus(string status, Visibility? visibility = null, string? replyStatusId = null,
IEnumerable? mediaIds = null, bool sensitive = false, string? spoilerText = null,
- DateTime? scheduledAt = null, string? language = null, PollParameters? poll = null)
+ DateTime? scheduledAt = null, string? language = null, PollParameters? pollParameters = null)
{
if (string.IsNullOrEmpty(status) && (mediaIds == null || !mediaIds.Any()))
{
@@ -141,18 +141,86 @@ public Task PublishStatus(string status, Visibility? visibility = null,
data.Add(new KeyValuePair("language", language));
}
- if (poll != null)
+ if (pollParameters != null)
{
- data.AddRange(poll.Options.Select(option => new KeyValuePair("poll[options][]", option)));
- data.Add(new KeyValuePair("poll[expires_in]", poll.ExpiresIn.TotalSeconds.ToString()));
- if (poll.Multiple.HasValue)
+ data.AddRange(pollParameters.Options.Select(option => new KeyValuePair("poll[options][]", option)));
+ data.Add(new KeyValuePair("poll[expires_in]", pollParameters.ExpiresIn.TotalSeconds.ToString()));
+ if (pollParameters.Multiple.HasValue)
{
- data.Add(new KeyValuePair("poll[multiple]", poll.Multiple.Value.ToString().ToLowerInvariant()));
+ data.Add(new KeyValuePair("poll[multiple]", pollParameters.Multiple.Value.ToString().ToLowerInvariant()));
}
- if (poll.HideTotals.HasValue)
+ if (pollParameters.HideTotals.HasValue)
+ {
+ data.Add(new KeyValuePair("poll[hide_totals]", pollParameters.HideTotals.Value.ToString().ToLowerInvariant()));
+ }
+ }
+
+ return Post("/api/v1/statuses", data);
+ }
+
+ public Task PublishStatus(StatusParameters statusParameters)
+ {
+ if (string.IsNullOrEmpty(statusParameters.Status) && (statusParameters.MediaIds == null || !statusParameters.MediaIds.Any()))
+ {
+ throw new ArgumentException("A status must have either text (status) or media (mediaIds)", nameof(statusParameters.Status));
+ }
+
+ var data = new List>()
+ {
+ new KeyValuePair("status", statusParameters.Status),
+ };
+
+ if (!string.IsNullOrEmpty(statusParameters.ReplyStatusId))
+ {
+ data.Add(new KeyValuePair("in_reply_to_id", statusParameters.ReplyStatusId!));
+ }
+
+ if (statusParameters.MediaIds != null)
+ {
+ foreach (var mediaId in statusParameters.MediaIds)
+ {
+ data.Add(new KeyValuePair("media_ids[]", mediaId));
+ }
+ }
+
+ if (statusParameters.Sensitive)
+ {
+ data.Add(new KeyValuePair("sensitive", "true"));
+ }
+
+ if (statusParameters.SpoilerText != null)
+ {
+ data.Add(new KeyValuePair("spoiler_text", statusParameters.SpoilerText));
+ }
+
+ if (statusParameters.Visibility.HasValue)
+ {
+ data.Add(new KeyValuePair("visibility", statusParameters.Visibility.Value.ToString().ToLowerInvariant()));
+ }
+
+ if (statusParameters.ScheduledAt.HasValue)
+ {
+ data.Add(new KeyValuePair("scheduled_at", statusParameters.ScheduledAt.Value.ToString("o")));
+ }
+
+ if (statusParameters.Language != null)
+ {
+ data.Add(new KeyValuePair("language", statusParameters.Language));
+ }
+
+ if (statusParameters.PollParameters != null)
+ {
+ data.AddRange(statusParameters.PollParameters.Options.Select(option => new KeyValuePair("poll[options][]", option)));
+ data.Add(new KeyValuePair("poll[expires_in]", statusParameters.PollParameters.ExpiresIn.TotalSeconds.ToString()));
+ if (statusParameters.PollParameters.Multiple.HasValue)
+ {
+ data.Add(new KeyValuePair("poll[multiple]", statusParameters.PollParameters.Multiple.Value.ToString().ToLowerInvariant()));
+ }
+
+ if (statusParameters.PollParameters.HideTotals.HasValue)
{
- data.Add(new KeyValuePair("poll[hide_totals]", poll.HideTotals.Value.ToString().ToLowerInvariant()));
+ data.Add(new KeyValuePair("poll[hide_totals]", statusParameters.PollParameters.HideTotals.Value.ToString().ToLowerInvariant()));
}
}