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; + } + } +}