From 76a1538c1d68f902f95c9dc9e4eb7e71f183aaa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=A8=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B8=D0=B9?= Date: Sun, 10 Dec 2023 23:24:33 +0300 Subject: [PATCH] Add project files --- SPWorldsWrapper.sln | 25 +++++ SPWorldsWrapper/SPWorldsWrapper.csproj | 13 +++ SPWorldsWrapper/SPWrapper.cs | 126 +++++++++++++++++++++++++ SPWorldsWrapper/Types/SPCity.cs | 18 ++++ SPWorldsWrapper/Types/SPUser.cs | 50 ++++++++++ 5 files changed, 232 insertions(+) create mode 100644 SPWorldsWrapper.sln create mode 100644 SPWorldsWrapper/SPWorldsWrapper.csproj create mode 100644 SPWorldsWrapper/SPWrapper.cs create mode 100644 SPWorldsWrapper/Types/SPCity.cs create mode 100644 SPWorldsWrapper/Types/SPUser.cs diff --git a/SPWorldsWrapper.sln b/SPWorldsWrapper.sln new file mode 100644 index 0000000..26b10b2 --- /dev/null +++ b/SPWorldsWrapper.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34322.80 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPWorldsWrapper", "SPWorldsWrapper\SPWorldsWrapper.csproj", "{5A89AD72-343F-45FE-A7FB-555C30649C95}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5A89AD72-343F-45FE-A7FB-555C30649C95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A89AD72-343F-45FE-A7FB-555C30649C95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A89AD72-343F-45FE-A7FB-555C30649C95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A89AD72-343F-45FE-A7FB-555C30649C95}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C084B287-A3A3-4153-B1B9-11CAB8B0A942} + EndGlobalSection +EndGlobal diff --git a/SPWorldsWrapper/SPWorldsWrapper.csproj b/SPWorldsWrapper/SPWorldsWrapper.csproj new file mode 100644 index 0000000..3b5b170 --- /dev/null +++ b/SPWorldsWrapper/SPWorldsWrapper.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/SPWorldsWrapper/SPWrapper.cs b/SPWorldsWrapper/SPWrapper.cs new file mode 100644 index 0000000..222f095 --- /dev/null +++ b/SPWorldsWrapper/SPWrapper.cs @@ -0,0 +1,126 @@ +using Newtonsoft.Json; +using SPWorldsWrapper.Types; +using System.Net; +using System.Net.Http.Json; +using System.Text.Json.Nodes; + +namespace SPWorldsWrapper +{ + public class SPWrapper + { + public readonly HttpClient client; + + /// + /// Асинхронный wrapper для работы напрямую с сайтом, а не с API SPWorlds.ru + /// + /// Токен от сайта(смотреть README.md) + public SPWrapper(string token) + { + var cookieContainer = new CookieContainer(); + var handler = new HttpClientHandler() { CookieContainer = cookieContainer }; + client = new(handler); + client.BaseAddress = new Uri("https://spworlds.ru/api/"); + cookieContainer.Add(client.BaseAddress, new Cookie("jeff", token)); + spwLogin(); + + } + /// + /// Авторизация на сайте. Постоянное обновление не требуется, но желательно. + /// Следите за выводом в консоль, там должны быть ваши данные о всех серверах. + /// Если иное - токен слетел! + /// + /// Ничего + public async Task spwLogin() + { + var content = new StringContent(@"{}"); + var responseMessage = await client.PostAsync("auth/refresh_token", content); + await Console.Out.WriteLineAsync(await responseMessage.Content.ReadAsStringAsync()); + } + /// + /// Получение данных пользователя по юзернейму. + /// Рекомендованное использование: + /// + /// SPWrapper Wrapper = new ("aA11Bb"); + /// SPUser user; + /// try + /// { + /// user = await spwrapper.getUserData("yawaflua"); + /// } + /// catch (Exception ex) + /// { + /// // Ваша логика + /// } + /// + /// + /// Никнейм пользователя(из майнкрафта) + /// var a = "a"; + /// пользователь от сайта, или ошибку. + public async Task getUserData(string userName) + { + var request = await client.GetAsync($"pl/accounts/{userName}"); + await Console.Out.WriteLineAsync(request.Content.ReadAsStringAsync().Result); + SPUser response = JsonConvert.DeserializeObject(request.Content.ReadAsStringAsync().Result.ToString()); + return response; + } + /// + /// Получение всех городов на сайте. + /// + /// Список из , содержащий все города на сервере + public async Task> getAllSities() + { + var citiesArray = new List(); + var request = await client.GetAsync("https://spworlds.ru/api/pl/cities"); + JsonNode jsonBody = await request.Content.ReadFromJsonAsync(); + foreach (JsonNode node in jsonBody.AsArray()) + { + citiesArray.Add(JsonConvert.DeserializeObject(node.ToJsonString())); + } + return citiesArray; + } + + /// + /// Добавление города на карту(прим. у вас должна быть роль Картограф на карте, иначе будет ошибка) + /// + /// Город, который вы хотите добавить + /// или null, если нет роли картографа. + public async Task addSityOnMap(SPCity city) + { + try + { + var request = await client.PostAsync("https://spworlds.ru/api/pl/cities", JsonContent.Create(city)); + if (request.StatusCode.HasFlag(HttpStatusCode.OK)) + { + return city; + } + else + { + throw new Exception($"Unknown error from site! {request.Content.ReadAsStringAsync().Result}"); + } + } + catch (Exception ex) + { + await Console.Out.WriteLineAsync(ex.Message); + return null; + } + + } + /// + /// Удаление города с карты(прим. у вас должна быть роль Картограф на карте, иначе будет ошибка) + /// + /// Город, который вы хотите удалить + /// : удаленный город или если нет роли игрок + public async Task deleteSityFromMap(SPCity city) + { + var request = await client.DeleteAsync($"https://spworlds.ru/api/pl/cities/{city.id}"); + if (request.StatusCode.Equals(200)) + { + return city; + } + else + { + return null; + } + + } + } +} diff --git a/SPWorldsWrapper/Types/SPCity.cs b/SPWorldsWrapper/Types/SPCity.cs new file mode 100644 index 0000000..aebf55a --- /dev/null +++ b/SPWorldsWrapper/Types/SPCity.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SPWorldsWrapper.Types +{ + public class SPCity + { + public string? mayor { get; set; } + public string? description { get; set; } + public string? id { get; set; } + public string name { get; set; } + public int x { get; set; } + public int z { get; set; } + } +} diff --git a/SPWorldsWrapper/Types/SPUser.cs b/SPWorldsWrapper/Types/SPUser.cs new file mode 100644 index 0000000..ddde6b8 --- /dev/null +++ b/SPWorldsWrapper/Types/SPUser.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SPWorldsWrapper.Types +{ + public class CardsOwned + { + public string name { get; set; } + public int color { get; set; } + public string number { get; set; } + public string id { get; set; } + } + + public class City + { + public Mayor mayor { get; set; } + public string name { get; set; } + public int x { get; set; } + public int z { get; set; } + } + + public class Mayor + { + public string id { get; set; } + } + + public class SPUser + { + public string id { get; set; } + public bool isBanned { get; set; } + public User user { get; set; } + public List roles { get; set; } + public City? city { get; set; } + public string status { get; set; } + public DateTime createdAt { get; set; } + public List cardsOwned { get; set; } + public bool isFollowed { get; set; } + public bool isFollowingYou { get; set; } + } + + public class User + { + public bool isAdmin { get; set; } + public string minecraftUUID { get; set; } + public string username { get; set; } + } +}