diff --git a/Tribufu.sln b/Tribufu.sln
index b3ff43a..251d9ef 100644
--- a/Tribufu.sln
+++ b/Tribufu.sln
@@ -7,6 +7,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tribufu.Generated", "src\Tr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tribufu.Example", "src\Tribufu.Example\Tribufu.Example.csproj", "{D6392A29-E2DC-4050-B4C1-B279DD2D226D}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tribufu.SafeCheck", "src\Tribufu.SafeCheck\Tribufu.SafeCheck.csproj", "{B1463692-23C0-435B-A018-B6ED8F305E8D}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -53,8 +57,23 @@ Global
{D6392A29-E2DC-4050-B4C1-B279DD2D226D}.Release|x64.Build.0 = Release|Any CPU
{D6392A29-E2DC-4050-B4C1-B279DD2D226D}.Release|x86.ActiveCfg = Release|Any CPU
{D6392A29-E2DC-4050-B4C1-B279DD2D226D}.Release|x86.Build.0 = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|x64.Build.0 = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Debug|x86.Build.0 = Debug|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|x64.ActiveCfg = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|x64.Build.0 = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|x86.ActiveCfg = Release|Any CPU
+ {B1463692-23C0-435B-A018-B6ED8F305E8D}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {B1463692-23C0-435B-A018-B6ED8F305E8D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
+ EndGlobalSection
EndGlobal
diff --git a/src/Tribufu.Example/Program.cs b/src/Tribufu.Example/Program.cs
index 5462790..e959a55 100644
--- a/src/Tribufu.Example/Program.cs
+++ b/src/Tribufu.Example/Program.cs
@@ -3,6 +3,7 @@
using dotenv.net;
using Tribufu.Generated.Client;
+using Tribufu.SafeCheck;
namespace Tribufu.Test
{
@@ -19,7 +20,9 @@ namespace Tribufu.Test
try
{
- var result = await tribufu.GetUserInfoAsync();
+ //var result = await tribufu.GetUserInfoAsync();
+ var safecheck = new TribufuSafeCheck(apiKey, "http://localhost:5100");
+ var result = await safecheck.CheckImageAsync("");
Console.WriteLine(result);
}
catch (ApiException e)
diff --git a/src/Tribufu.Example/Tribufu.Example.csproj b/src/Tribufu.Example/Tribufu.Example.csproj
index a6fbc73..9c38972 100644
--- a/src/Tribufu.Example/Tribufu.Example.csproj
+++ b/src/Tribufu.Example/Tribufu.Example.csproj
@@ -10,5 +10,6 @@
+
diff --git a/src/Tribufu.SafeCheck/README.md b/src/Tribufu.SafeCheck/README.md
new file mode 100644
index 0000000..54c1ab5
--- /dev/null
+++ b/src/Tribufu.SafeCheck/README.md
@@ -0,0 +1 @@
+# Tribufu
diff --git a/src/Tribufu.SafeCheck/SafeCheckDetections.cs b/src/Tribufu.SafeCheck/SafeCheckDetections.cs
new file mode 100644
index 0000000..702817d
--- /dev/null
+++ b/src/Tribufu.SafeCheck/SafeCheckDetections.cs
@@ -0,0 +1,25 @@
+// Copyright (c) Tribufu. All Rights Reserved.
+// SPDX-License-Identifier: MIT
+
+using Newtonsoft.Json;
+
+namespace Tribufu.SafeCheck
+{
+ public class SafeCheckDetections
+ {
+ [JsonProperty("sexy")]
+ public double Sexy { get; set; }
+
+ [JsonProperty("porn")]
+ public double Porn { get; set; }
+
+ [JsonProperty("neutral")]
+ public double Neutral { get; set; }
+
+ [JsonProperty("hentai")]
+ public double Hentai { get; set; }
+
+ [JsonProperty("drawing")]
+ public double Drawing { get; set; }
+ }
+}
diff --git a/src/Tribufu.SafeCheck/SafeCheckRequest.cs b/src/Tribufu.SafeCheck/SafeCheckRequest.cs
new file mode 100644
index 0000000..4ec0c96
--- /dev/null
+++ b/src/Tribufu.SafeCheck/SafeCheckRequest.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Tribufu. All Rights Reserved.
+// SPDX-License-Identifier: MIT
+
+using Newtonsoft.Json;
+
+namespace Tribufu.SafeCheck
+{
+ public class SafeCheckRequest
+ {
+ [JsonProperty("image_url")]
+ public string ImageUrl { get; set; }
+
+ public SafeCheckRequest(string imageUrl)
+ {
+ ImageUrl = imageUrl;
+ }
+ }
+}
diff --git a/src/Tribufu.SafeCheck/SafeCheckResponse.cs b/src/Tribufu.SafeCheck/SafeCheckResponse.cs
new file mode 100644
index 0000000..b7b91ce
--- /dev/null
+++ b/src/Tribufu.SafeCheck/SafeCheckResponse.cs
@@ -0,0 +1,19 @@
+// Copyright (c) Tribufu. All Rights Reserved.
+// SPDX-License-Identifier: MIT
+
+using Newtonsoft.Json;
+
+namespace Tribufu.SafeCheck
+{
+ public class SafecheckResponse
+ {
+ [JsonProperty("safe")]
+ public bool Safe { get; set; }
+
+ [JsonProperty("reason")]
+ public string? Reason { get; set; }
+
+ [JsonProperty("detections")]
+ public SafeCheckDetections? Detections { get; set; }
+ }
+}
diff --git a/src/Tribufu.SafeCheck/Tribufu.SafeCheck.csproj b/src/Tribufu.SafeCheck/Tribufu.SafeCheck.csproj
new file mode 100644
index 0000000..35bdc2a
--- /dev/null
+++ b/src/Tribufu.SafeCheck/Tribufu.SafeCheck.csproj
@@ -0,0 +1,27 @@
+
+
+ Tribufu.SafeCheck
+ Tribufu SafeCheck
+ README.md
+
+
+ Properties
+ true
+ true
+ enable
+ enable
+ Library
+ net6.0
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Tribufu.SafeCheck/TribufuSafeCheck.cs b/src/Tribufu.SafeCheck/TribufuSafeCheck.cs
new file mode 100644
index 0000000..04af734
--- /dev/null
+++ b/src/Tribufu.SafeCheck/TribufuSafeCheck.cs
@@ -0,0 +1,56 @@
+// Copyright (c) Tribufu. All Rights Reserved.
+// SPDX-License-Identifier: MIT
+
+using Newtonsoft.Json;
+using RestSharp;
+
+namespace Tribufu.SafeCheck
+{
+ public sealed class TribufuSafeCheck
+ {
+ private readonly RestClient _client;
+
+ private readonly string? _apiKey;
+
+ public const string DefaultBaseUrl = "https://safecheck.tribufu.com";
+
+ public TribufuSafeCheck(string? apiKey = null, string baseUrl = DefaultBaseUrl)
+ {
+ var options = new RestClientOptions(baseUrl)
+ {
+ UserAgent = TribufuApi.GetUserAgent(),
+ };
+
+ _client = new RestClient(options);
+ _apiKey = apiKey;
+ }
+
+ public async Task CheckImageAsync(string imageUrl)
+ {
+ if (string.IsNullOrWhiteSpace(imageUrl))
+ {
+ throw new ArgumentException("Image URL cannot be null or empty.", nameof(imageUrl));
+ }
+
+ var request = new RestRequest("/image", Method.Post);
+ request.AddHeader("Content-Type", "application/json");
+
+ if (!string.IsNullOrEmpty(_apiKey))
+ {
+ request.AddHeader("Authorization", $"ApiKey {_apiKey}");
+ }
+
+ var requestBody = new SafeCheckRequest(imageUrl);
+ request.AddStringBody(JsonConvert.SerializeObject(requestBody), DataFormat.Json);
+
+ var response = await _client.ExecuteAsync(request);
+ if (!response.IsSuccessful)
+ {
+ throw new Exception($"Request failed: {response.StatusCode} - {response.Content}");
+ }
+
+ var result = JsonConvert.DeserializeObject(response.Content!);
+ return result?.Safe ?? false;
+ }
+ }
+}