16 Commits

Author SHA1 Message Date
Дмитрий Шиманский
e9a51cd600 add so many features likely:
- Cards
- Groups
- Posts
- Many parser objects
2024-02-02 21:33:50 +03:00
Dima yawaflua Andreev
85c4d5e099 Update SPWorldsWrapper.csproj 2024-01-19 20:00:58 +03:00
Dima yawaflua Andreev
1f81fd5cbd Update README.md 2024-01-19 19:59:45 +03:00
Дмитрий Шиманский
1201e16caa Add auth exception class for better readibility 2023-12-27 23:15:39 +03:00
Дмитрий Шиманский
a1862446a6 Hotfix and some code review 2023-12-16 21:27:10 +03:00
Dima yawaflua
ea79677c2e Update SPWorldsWrapper.csproj 2023-12-12 18:29:03 +03:00
Dima yawaflua
df8bb5ab29 Create README.md 2023-12-12 18:27:01 +03:00
Dima yawaflua
d4489ecf05 Update SPWorldsWrapper.csproj 2023-12-12 18:23:20 +03:00
Dima yawaflua
94794821ab Update SPWorldsWrapper.csproj 2023-12-12 18:21:36 +03:00
Dima yawaflua
88a021e2bb Update nuget.yml 2023-12-12 16:28:10 +03:00
Dima yawaflua
96237ce63b Update README.md 2023-12-12 16:03:04 +03:00
Dima yawaflua
7330479487 Update README.md 2023-12-11 00:45:50 +03:00
Dima yawaflua
24d944e1ce Update README.md 2023-12-11 00:45:39 +03:00
Dima yawaflua
0b3b224eb1 Update SPWorldsWrapper.csproj 2023-12-11 00:44:12 +03:00
Dima yawaflua
77821e56f4 Update SPWorldsWrapper.csproj 2023-12-11 00:42:18 +03:00
Dima yawaflua
71ec3b5f1b Update SPWorldsWrapper.csproj 2023-12-11 00:41:50 +03:00
6 changed files with 137 additions and 38 deletions

View File

@@ -21,5 +21,8 @@ jobs:
with:
PROJECT_FILE_PATH: SPWorldsWrapper/SPWorldsWrapper.csproj
VERSION_STATIC: ${{ steps.vars.outputs.tags }}
TAG_COMMIT: true
TAG_FORMAT: '*'
NUGET_KEY: ${{secrets.NUGET_API_KEY}}
NUGET_SOURCE: https://api.nuget.org
INCLUDE_SYMBOLS: false

View File

@@ -1,9 +1,9 @@
# SPWorldsWrapper
![](https://img.shields.io/badge/dotnet-.NET_8-green)
![](https://img.shields.io/badge/dotnet-.NET_7-green)
Actions pass:
![](https://github.com/yawaflua/SPWorldsWrapper/actions/workflows/nuget.yml/badge.svg)
![](https://github.com/yawaflua/SPWorldsWrapper/actions/workflows/dotnet.yml/badge.svg)
Это довольно простой wrapper для работы с сайтом, а не с апи. Он позволяет:
@@ -11,6 +11,11 @@ Actions pass:
- Добавлять/удалять города на карте(ПРИ НАЛИЧИИ РОЛИ КАРТОГРАФА)
- Получать любые данные, используя HttpClient, внутри класса
# Установка
```cli
dotnet add package SPWorldsWrapper
```
# Добавление функций
Если вы хотите помочь с разработкой, просьба создать Pull Request, где будет созданы нужные методы и, желательно, комментарии к ним.
Если вы хотите помочь с расширением этого wrapper`a, просьба создать Issue, где вы подробно изложите, что именно вам надо.

43
SPWorldsWrapper/README.md Normal file
View File

@@ -0,0 +1,43 @@
# SPWorldsWrapper
![](https://img.shields.io/badge/dotnet-.NET_8-green)
Actions pass:
![](https://github.com/yawaflua/SPWorldsWrapper/actions/workflows/dotnet.yml/badge.svg)
Это довольно простой wrapper для работы с сайтом, а не с апи. Он позволяет:
- Находить более расширные данные о пользователь от сайта, нежели стандартные апи.
- Добавлять/удалять города на карте(ПРИ НАЛИЧИИ РОЛИ КАРТОГРАФА)
- Получать любые данные, используя HttpClient, внутри класса
# Установка
```cli
dotnet add package SPWorldsWrapper
```
# Добавление функций
Если вы хотите помочь с разработкой, просьба создать Pull Request, где будет созданы нужные методы и, желательно, комментарии к ним.
Если вы хотите помочь с расширением этого wrapper`a, просьба создать Issue, где вы подробно изложите, что именно вам надо.
# Использование
## Перевод игроку, имея только никнейм
Ниже есть пример использования. В ходе этого примера мы переводим игроку 1 АР, получая карту по никнейму, а потом переводя на нее ары(через [библиотеку](https://github.com/Mih4n/spworlds-csharp-library)).
```cs
using SPWorldsWrapper;
using SPWorlds;
// инициилизация конструктора
// Токен надо получать на сайте, либо через cookies, либо через проверку request
SPWrapper wrapper = new SPWrapper ("AaBbCcDd:123123123");
// использование сторонней библиотеки от Mih4n
//! ТОКЕНЫ ДЛЯ SPWorlds и SPWrapper РАЗНЫЕ !
SPWorlds sp = new SPworlds("[ваш айди]","[ваш токен]");
// Пример, перевод на карту игрока по никнейму:
SPUser user = await wrapper.getUserData("yawaflua");
sp.CreateTransaction(user.CardsOwned.First().number, 1, "Привет от yawaflua")
```
# FAQ
- Где получить токен для использования? - [тут](https://github.com/yawaflua/SPWorldsWrapper/blob/master/GETTOKEN.md)
- Как сделать так, чтобы токен не слетал? - Надо использовать впн, с выходной точкой в виде вашего сервера. Я использую [tailscale](https://tailscale.com/), но в России его больше нельзя скачать. Можно попробовать настроить OpenVPN или иные сервисы. [Тут](https://habr.com/ru/companies/ruvds/articles/726718/) например описано, как можно легко поднять с помощью сервиса RuVDS, где вы получите и VPN, и VDS. Я бы не советовал исполользовать RuVDS из-за большой стоимость и ужасного качества поддержки и серверов, но это выбор каждого.

View File

@@ -1,10 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>1.0.1</Version>
<PackageId>SPWorldsWrapper</PackageId>
<Description>Библиотека для работы с сайтом spworlds.ru</Description>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<Version>1.0.2</Version>
<Authors>yawaflua</Authors>
<Company>yawaflua</Company>
<RepositoryUrl>https://github.com/yawaflua/SPWorldsWrapper</RepositoryUrl>
</PropertyGroup>
<ItemGroup>

View File

@@ -2,13 +2,22 @@
using SPWorldsWrapper.Types;
using System.Net;
using System.Net.Http.Json;
using System.Reflection.Metadata.Ecma335;
using System.Text.Json.Nodes;
namespace SPWorldsWrapper
{
public class AuthentificationError : Exception
{
public AuthentificationError(string? message, Exception? innerException) : base(message, innerException) { }
public AuthentificationError() : base() { }
public AuthentificationError(string? message) : base(message) { }
}
public class SPWrapper
{
public readonly HttpClient client;
/// <summary>
/// Асинхронный wrapper для работы напрямую с сайтом, а не с API SPWorlds.ru
@@ -21,7 +30,11 @@ namespace SPWorldsWrapper
client = new(handler);
client.BaseAddress = new Uri("https://spworlds.ru/api/");
cookieContainer.Add(client.BaseAddress, new Cookie("jeff", token));
spwLogin();
var spwLoginMethod = spwLogin();
if (!spwLoginMethod.Result)
{
throw new AuthentificationError("Ошибка парсинга данных от сайта. Проверьте токен, IP сервера и статус сайта SPWORLDS.RU");
}
}
/// <summary>
@@ -30,11 +43,24 @@ namespace SPWorldsWrapper
/// Если иное - токен слетел!
/// </summary>
/// <returns>Ничего</returns>
public async Task spwLogin()
public async Task<bool> spwLogin()
{
var content = new StringContent(@"{}");
var responseMessage = await client.PostAsync("auth/refresh_token", content);
await Console.Out.WriteLineAsync(await responseMessage.Content.ReadAsStringAsync());
var bodyFromSPW = await responseMessage.Content.ReadAsStringAsync();
var serializedBody = JsonNode.Parse(bodyFromSPW);
if (serializedBody == null)
{
Console.Error.WriteLine("error: Some error returned from site.");
Console.WriteLine("debug: please, check your authorization token");
}
else
{
Console.WriteLine(await responseMessage.Content.ReadAsStringAsync());
}
return serializedBody != null;
}
/// <summary>
/// Получение данных пользователя по юзернейму.
@@ -54,12 +80,11 @@ namespace SPWorldsWrapper
/// </summary>
/// <param name="userName">Никнейм пользователя(из майнкрафта)</param>
/// <example> var a = "a";</example>
/// <returns><see cref="SPUser" /> пользователь от сайта, или ошибку.</returns>
public async Task<SPUser> getUserData(string userName)
/// <returns><see cref="SPUser" /> пользователь от сайта, или null.</returns>
public async Task<SPUser?> getUserData(string userName)
{
var request = await client.GetAsync($"pl/accounts/{userName}");
await Console.Out.WriteLineAsync(request.Content.ReadAsStringAsync().Result);
SPUser response = JsonConvert.DeserializeObject<SPUser>(request.Content.ReadAsStringAsync().Result.ToString());
SPUser? response = JsonConvert.DeserializeObject<SPUser>(request.Content.ReadAsStringAsync().Result.ToString());
return response;
}
/// <summary>

View File

@@ -1,4 +1,6 @@
using System;
using Microsoft.VisualBasic;
using SPWorldsWrapper.Types.UserTypes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,45 +8,59 @@ 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<string> roles { get; set; }
public string[] roles { get; set; }
public City? city { get; set; }
public string status { get; set; }
public DateTime createdAt { get; set; }
public List<CardsOwned> 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; }
public Dictionary<string, object> toKeyValuePairs()
{
string cards = "[\n";
foreach (var card in cardsOwned)
{
cards += " {\n";
foreach (var kvp in card.toKeyValuePairs())
{
cards += $" {kvp.Key}: {kvp.Value},\n";
}
cards += " },\n";
}
cards += "]";
return new ()
{
{ "id", id },
{ "isBanned", isBanned },
{ "status", status },
{ "created_at", createdAt },
{ "isFollowed", isFollowed },
{ "isFollowingYou", isFollowingYou },
{ "user", user.ToString() },
{ "roles", $"[{string.Join(", ", roles)}]" },
{ "city", city?.ToString() ?? "Null" },
{ "cardsOwner", cards },
};
}
public override string ToString()
{
string stringToReturn = "{\n";
foreach (var kvp in toKeyValuePairs())
{
stringToReturn += $"\n {kvp.Key}: {kvp.Value},";
}
stringToReturn += "\n}";
return stringToReturn;
}
}
}