pleroma API client init
This commit is contained in:
parent
13192a1972
commit
ce757177c6
14 changed files with 506 additions and 0 deletions
37
Pleroma.Test.sln
Normal file
37
Pleroma.Test.sln
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.10.35027.167
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pleroma.Test", "Pleroma.Test\Pleroma.Test.csproj", "{38EB55E0-55FC-4D18-ADFC-28C3DC45DD97}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pleroma", "Pleroma\Pleroma.csproj", "{9E897444-04AE-4063-9945-9964F502994F}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HTTP", "HTTP\HTTP.csproj", "{7F622DB8-062D-4D21-8419-F3E5C7DAEC79}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{38EB55E0-55FC-4D18-ADFC-28C3DC45DD97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{38EB55E0-55FC-4D18-ADFC-28C3DC45DD97}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{38EB55E0-55FC-4D18-ADFC-28C3DC45DD97}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{38EB55E0-55FC-4D18-ADFC-28C3DC45DD97}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9E897444-04AE-4063-9945-9964F502994F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9E897444-04AE-4063-9945-9964F502994F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9E897444-04AE-4063-9945-9964F502994F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9E897444-04AE-4063-9945-9964F502994F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7F622DB8-062D-4D21-8419-F3E5C7DAEC79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7F622DB8-062D-4D21-8419-F3E5C7DAEC79}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7F622DB8-062D-4D21-8419-F3E5C7DAEC79}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7F622DB8-062D-4D21-8419-F3E5C7DAEC79}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {80040410-D102-4350-92BE-D3E98286B1C3}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
14
Pleroma.Test/Pleroma.Test.csproj
Normal file
14
Pleroma.Test/Pleroma.Test.csproj
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>disable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>Uwaa.Pleroma.Test</RootNamespace>
|
||||||
|
<AssemblyName>Uwaa.Pleroma.Test</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Pleroma\Pleroma.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
32
Pleroma.Test/Program.cs
Normal file
32
Pleroma.Test/Program.cs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma.Test;
|
||||||
|
|
||||||
|
static class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
MainInline().Wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async Task MainInline()
|
||||||
|
{
|
||||||
|
Pleroma client = new Pleroma("alpine1.local", "Bearer Y52OX25r7rp3Lyqa-oTibk5_4sLapEKBIsxa5vWMRtw");
|
||||||
|
Account account = await client.GetAccount();
|
||||||
|
Status[] statuses = await client.GetTimeline();
|
||||||
|
|
||||||
|
Console.WriteLine($"Account: {account} ({account.ID})");
|
||||||
|
Console.WriteLine("Public statuses:");
|
||||||
|
foreach (Status status in statuses)
|
||||||
|
{
|
||||||
|
Console.Write('\t');
|
||||||
|
Console.Write(status.CreatedAt.ToShortDateString());
|
||||||
|
Console.Write(' ');
|
||||||
|
Console.Write(status.CreatedAt.ToLongTimeString());
|
||||||
|
Console.Write(' ');
|
||||||
|
Console.WriteLine(status);
|
||||||
|
}
|
||||||
|
Console.ReadKey();
|
||||||
|
}
|
||||||
|
}
|
31
Pleroma.sln
Normal file
31
Pleroma.sln
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.10.35027.167
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pleroma", "Pleroma\Pleroma.csproj", "{2BDD2FEF-2B99-47AD-9C3B-B380DD8E6BB9}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HTTP", "HTTP\HTTP.csproj", "{8986A015-8FF2-42E3-9D74-58C8A1BABC44}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{2BDD2FEF-2B99-47AD-9C3B-B380DD8E6BB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2BDD2FEF-2B99-47AD-9C3B-B380DD8E6BB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2BDD2FEF-2B99-47AD-9C3B-B380DD8E6BB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2BDD2FEF-2B99-47AD-9C3B-B380DD8E6BB9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8986A015-8FF2-42E3-9D74-58C8A1BABC44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{8986A015-8FF2-42E3-9D74-58C8A1BABC44}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8986A015-8FF2-42E3-9D74-58C8A1BABC44}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{8986A015-8FF2-42E3-9D74-58C8A1BABC44}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {8D29C553-2975-44E6-9862-43D1D9ABEB75}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
76
Pleroma/API/PublishStatus.cs
Normal file
76
Pleroma/API/PublishStatus.cs
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma.API;
|
||||||
|
|
||||||
|
[JsonConverter(typeof(PublishStatusConverter))]
|
||||||
|
public class PublishStatus
|
||||||
|
{
|
||||||
|
public string Content { get; set; }
|
||||||
|
|
||||||
|
public bool Sensitive { get; set; }
|
||||||
|
|
||||||
|
public int? ExpiresIn { get; set; } = null!;
|
||||||
|
|
||||||
|
public string? ReplyTo { get; set; }
|
||||||
|
|
||||||
|
public StatusVisibility Visibility { get; set; } = StatusVisibility.Public;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called after the status has been successfully published.
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public Action? OnPublish;
|
||||||
|
|
||||||
|
public PublishStatus(string content)
|
||||||
|
{
|
||||||
|
Content = content ?? throw new ArgumentNullException(nameof(content));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PublishStatusConverter : JsonConverter<PublishStatus>
|
||||||
|
{
|
||||||
|
public sealed override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(PublishStatus);
|
||||||
|
|
||||||
|
public override PublishStatus Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(Utf8JsonWriter writer, PublishStatus status, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
writer.WriteStartObject();
|
||||||
|
|
||||||
|
writer.WritePropertyName("status");
|
||||||
|
writer.WriteStringValue(status.Content);
|
||||||
|
|
||||||
|
writer.WritePropertyName("content-type");
|
||||||
|
writer.WriteStringValue("text/plain");
|
||||||
|
|
||||||
|
if (status.Sensitive)
|
||||||
|
{
|
||||||
|
writer.WritePropertyName("sensitive");
|
||||||
|
writer.WriteBooleanValue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.ExpiresIn.HasValue)
|
||||||
|
{
|
||||||
|
writer.WritePropertyName("expires_in");
|
||||||
|
writer.WriteNumberValue(status.ExpiresIn.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.ReplyTo != null)
|
||||||
|
{
|
||||||
|
writer.WritePropertyName("in_reply_to_id");
|
||||||
|
writer.WriteStringValue(status.ReplyTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.Visibility != StatusVisibility.Public)
|
||||||
|
{
|
||||||
|
writer.WritePropertyName("visibility");
|
||||||
|
writer.WriteStringValue(status.Visibility.ToString().ToLowerInvariant());
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WriteEndObject();
|
||||||
|
}
|
||||||
|
}
|
32
Pleroma/Models/Account.cs
Normal file
32
Pleroma/Models/Account.cs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public class Account
|
||||||
|
{
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public string ID { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("bot")]
|
||||||
|
public bool Bot { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("display_name")]
|
||||||
|
public string DisplayName { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("username")]
|
||||||
|
public string Username { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("statuses_count")]
|
||||||
|
public uint StatusesCount { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("url")]
|
||||||
|
public string URL { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("followers_count")]
|
||||||
|
public uint Followers { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("following_count")]
|
||||||
|
public uint Following { get; set; }
|
||||||
|
|
||||||
|
public override string ToString() => $"@{Username}";
|
||||||
|
}
|
12
Pleroma/Models/Context.cs
Normal file
12
Pleroma/Models/Context.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public class Context
|
||||||
|
{
|
||||||
|
[JsonPropertyName("ancestors")]
|
||||||
|
public Status[] Ancestors { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("descendants")]
|
||||||
|
public Status[] Descendants { get; set; } = null!;
|
||||||
|
}
|
13
Pleroma/Models/PleromaException.cs
Normal file
13
Pleroma/Models/PleromaException.cs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public class PleromaException : Exception
|
||||||
|
{
|
||||||
|
[JsonPropertyName("error")]
|
||||||
|
public string Text { get; set; } = null!;
|
||||||
|
|
||||||
|
public override string Message => Text;
|
||||||
|
|
||||||
|
public override string ToString() => Text;
|
||||||
|
}
|
18
Pleroma/Models/PleromaObject.cs
Normal file
18
Pleroma/Models/PleromaObject.cs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public class PleromaObject
|
||||||
|
{
|
||||||
|
[JsonPropertyName("content")]
|
||||||
|
public Content Content { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("local")]
|
||||||
|
public bool Local { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Content
|
||||||
|
{
|
||||||
|
[JsonPropertyName("text/plain")]
|
||||||
|
public string Plain { get; set; } = null!;
|
||||||
|
}
|
54
Pleroma/Models/Status.cs
Normal file
54
Pleroma/Models/Status.cs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public class Status
|
||||||
|
{
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public string ID { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("content")]
|
||||||
|
public string HtmlContent { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("account")]
|
||||||
|
public Account Account { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("created_at")]
|
||||||
|
public DateTime CreatedAt { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("pleroma")]
|
||||||
|
public PleromaObject Pleroma { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("in_reply_to_account_id")]
|
||||||
|
public string? ReplyToAccount { get; set; } = null;
|
||||||
|
|
||||||
|
[JsonPropertyName("in_reply_to_id")]
|
||||||
|
public string? ReplyToStatus { get; set; } = null;
|
||||||
|
|
||||||
|
[JsonPropertyName("mentions")]
|
||||||
|
public Mention[] Mentions { get; set; } = Array.Empty<Mention>();
|
||||||
|
|
||||||
|
[JsonPropertyName("language")]
|
||||||
|
public string? Language { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("pinned")]
|
||||||
|
public bool Pinned { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public string Content => Pleroma?.Content.Plain ?? HtmlContent;
|
||||||
|
|
||||||
|
public bool CheckMention(string id)
|
||||||
|
{
|
||||||
|
return ReplyToAccount == id || Mentions.Any(m => m.ID == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString() => $"{Account?.Username ?? "unknown"}: \"{Content}\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Mention
|
||||||
|
{
|
||||||
|
public static implicit operator string(Mention mention) => mention.ID;
|
||||||
|
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public string ID { get; set; } = null!;
|
||||||
|
}
|
156
Pleroma/Pleroma.cs
Normal file
156
Pleroma/Pleroma.cs
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Uwaa.HTTP;
|
||||||
|
using Uwaa.Pleroma.API;
|
||||||
|
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A pleroma client.
|
||||||
|
/// </summary>
|
||||||
|
public class Pleroma
|
||||||
|
{
|
||||||
|
static readonly JsonSerializerOptions SerializerOptions = new()
|
||||||
|
{
|
||||||
|
PropertyNameCaseInsensitive = true,
|
||||||
|
NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString,
|
||||||
|
};
|
||||||
|
|
||||||
|
static readonly MIMEType JsonMIMEType = new("application", "json");
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The hostname of the pleroma instance.
|
||||||
|
/// </summary>
|
||||||
|
public string Host;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The full token, including the "Bearer" string.
|
||||||
|
/// </summary>
|
||||||
|
public string Authorization;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The user agent string.
|
||||||
|
/// </summary>
|
||||||
|
public string UserAgent = "Uwaa.Pleroma/0.0";
|
||||||
|
|
||||||
|
public Pleroma(string host, string authorization)
|
||||||
|
{
|
||||||
|
Host = host;
|
||||||
|
Authorization = authorization;
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task<T?> RequestJSON<T>(HttpRequest req) where T : class
|
||||||
|
{
|
||||||
|
req.Fields.UserAgent = UserAgent;
|
||||||
|
req.Fields.Authorization = Authorization;
|
||||||
|
|
||||||
|
HttpResponse res = await HttpClient.Request(Host, true, req);
|
||||||
|
|
||||||
|
if (res.StatusCode == 404)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (!res.Fields.ContentType.HasValue || !res.Fields.ContentType.Value.Match(JsonMIMEType))
|
||||||
|
throw new HttpException("Server did not respond with JSON" + (res.Content.HasValue ? ", got: " + res.Content.Value.AsText : null));
|
||||||
|
|
||||||
|
if (!res.Content.HasValue)
|
||||||
|
throw new HttpException("Server responded with no content");
|
||||||
|
|
||||||
|
string text = res.Content.Value.AsText;
|
||||||
|
|
||||||
|
if (res.StatusCode is >= 400 and < 600)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
PleromaException? err = JsonSerializer.Deserialize<PleromaException>(text, SerializerOptions);
|
||||||
|
if (err != null && err.Text != null)
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
catch (JsonException)
|
||||||
|
{
|
||||||
|
//Not an error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.StatusCode is >= 200 and < 300)
|
||||||
|
return JsonSerializer.Deserialize<T>(text, SerializerOptions) ?? throw new HttpException("Couldn't deserialize response");
|
||||||
|
else
|
||||||
|
throw new HttpException("Unknown error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Posts a status.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="status">The status data to send, including the content, visibility, etc.</param>
|
||||||
|
/// <returns>The status, if posting was successful.</returns>
|
||||||
|
public Task<Status> PostStatus(PublishStatus status)
|
||||||
|
{
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.POST, "/api/v1/statuses");
|
||||||
|
req.Content = new HttpContent(JsonMIMEType, JsonSerializer.SerializeToUtf8Bytes(status, SerializerOptions));
|
||||||
|
req.Fields.Accept = [JsonMIMEType];
|
||||||
|
return RequestJSON<Status>(req)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the latest statuses from the public timeline.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Status[]> GetTimeline()
|
||||||
|
{
|
||||||
|
//TODO: Parameters and selecting different timelines (home, public, bubble)
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.GET, "/api/v1/timelines/public");
|
||||||
|
req.Fields.Accept = [ JsonMIMEType ];
|
||||||
|
return RequestJSON<Status[]>(req)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the latest statuses from a user's timeline.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Status[]> GetTimeline(Account account)
|
||||||
|
=> GetTimeline(account.ID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the latest statuses from a user's timeline.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Status[]> GetTimeline(string account_id)
|
||||||
|
{
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.GET, $"/api/v1/accounts/{account_id}/statuses");
|
||||||
|
req.Fields.Accept = [JsonMIMEType];
|
||||||
|
return RequestJSON<Status[]>(req)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the account of the pleroma client.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Account> GetAccount()
|
||||||
|
{
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.GET, "/api/v1/accounts/verify_credentials");
|
||||||
|
req.Fields.Accept = [JsonMIMEType];
|
||||||
|
return RequestJSON<Account>(req)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches an account.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Account?> GetAccount(string id)
|
||||||
|
{
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.GET, $"/api/v1/accounts/{id}");
|
||||||
|
req.Fields.Accept = [JsonMIMEType];
|
||||||
|
return RequestJSON<Account>(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the context of a status.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Context?> GetContext(Status status)
|
||||||
|
=> GetContext(status.ID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetches the context of a status.
|
||||||
|
/// </summary>
|
||||||
|
public Task<Context?> GetContext(string status_id)
|
||||||
|
{
|
||||||
|
HttpRequest req = new HttpRequest(HttpMethod.GET, $"/api/v1/statuses/{status_id}/context");
|
||||||
|
req.Fields.Accept = [JsonMIMEType];
|
||||||
|
return RequestJSON<Context>(req);
|
||||||
|
}
|
||||||
|
}
|
20
Pleroma/Pleroma.csproj
Normal file
20
Pleroma/Pleroma.csproj
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>disable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>Uwaa.Pleroma</RootNamespace>
|
||||||
|
<AssemblyName>Uwaa.Pleroma</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\HTTP\HTTP.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Using Include="System" />
|
||||||
|
<Using Include="System.Collections.Generic" />
|
||||||
|
<Using Include="System.IO" />
|
||||||
|
<Using Include="System.Linq" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
1
Pleroma/README.md
Normal file
1
Pleroma/README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Simple pleroma API client for .NET
|
10
Pleroma/StatusVisibility.cs
Normal file
10
Pleroma/StatusVisibility.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
namespace Uwaa.Pleroma;
|
||||||
|
|
||||||
|
public enum StatusVisibility
|
||||||
|
{
|
||||||
|
Public,
|
||||||
|
Unlisted,
|
||||||
|
Private,
|
||||||
|
Local,
|
||||||
|
Direct,
|
||||||
|
}
|
Loading…
Reference in a new issue