mirror of
https://github.com/yawaflua/SPWorldsWrapper.git
synced 2025-12-11 16:16:22 +02:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac3322951e | ||
|
|
2d761867c0 | ||
|
|
0eea6db426 | ||
|
|
464afc5eb9 | ||
|
|
1fd7f08e0b | ||
|
|
98c69c5665 | ||
|
|
00688b7c6a | ||
|
|
01cc988f85 | ||
|
|
c84dbecbaf | ||
|
|
8b0043e1ab | ||
|
|
b513e9489d | ||
|
|
46f184d775 | ||
|
|
85c4d5e099 | ||
|
|
1f81fd5cbd | ||
|
|
1201e16caa | ||
|
|
a1862446a6 | ||
|
|
ea79677c2e | ||
|
|
df8bb5ab29 | ||
|
|
d4489ecf05 | ||
|
|
94794821ab | ||
|
|
88a021e2bb | ||
|
|
96237ce63b | ||
|
|
7330479487 | ||
|
|
24d944e1ce | ||
|
|
0b3b224eb1 | ||
|
|
77821e56f4 | ||
|
|
71ec3b5f1b | ||
|
|
eb07359b0f | ||
|
|
9df425f5e3 | ||
|
|
af04176488 | ||
|
|
4e4cc7b28a | ||
|
|
9b76b43dc9 |
10
.github/workflows/nuget.yml
vendored
10
.github/workflows/nuget.yml
vendored
@@ -12,13 +12,17 @@ jobs:
|
||||
- name: Setup .NET Core
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '8.x.x'
|
||||
dotnet-version: '7.x.x'
|
||||
- name: Set output
|
||||
id: vars
|
||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
||||
- name: Publish to NuGet
|
||||
uses: brandedoutcast/publish-nuget@v2
|
||||
uses: kelson-dev/publish-nuget-fixed@2.5.6
|
||||
with:
|
||||
PROJECT_FILE_PATH: SPWorldsWrapper/SPWorldsWrapper.csproj
|
||||
TAG_FORMAT: '*'
|
||||
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
|
||||
|
||||
20
README.md
20
README.md
@@ -1,9 +1,12 @@
|
||||
# SPWorldsWrapper
|
||||

|
||||
# ⚠ DEPRECATED ⚠
|
||||
Разработчики spworlds ввели динамичные токены, которые обновляются постоянно, из-за чего использование данной библиотеки вместе с использованием сайта, даже через VPN стало невозможным.
|
||||
|
||||
## SPWorldsWrapper
|
||||

|
||||
|
||||
Actions pass:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Это довольно простой wrapper для работы с сайтом, а не с апи. Он позволяет:
|
||||
@@ -11,11 +14,16 @@ Actions pass:
|
||||
- Добавлять/удалять города на карте(ПРИ НАЛИЧИИ РОЛИ КАРТОГРАФА)
|
||||
- Получать любые данные, используя HttpClient, внутри класса
|
||||
|
||||
# Добавление функций
|
||||
## Установка
|
||||
```cli
|
||||
dotnet add package SPWorldsWrapper
|
||||
```
|
||||
|
||||
## Добавление функций
|
||||
Если вы хотите помочь с разработкой, просьба создать Pull Request, где будет созданы нужные методы и, желательно, комментарии к ним.
|
||||
Если вы хотите помочь с расширением этого wrapper`a, просьба создать Issue, где вы подробно изложите, что именно вам надо.
|
||||
|
||||
# Использование
|
||||
## Использование
|
||||
## Перевод игроку, имея только никнейм
|
||||
Ниже есть пример использования. В ходе этого примера мы переводим игроку 1 АР, получая карту по никнейму, а потом переводя на нее ары(через [библиотеку](https://github.com/Mih4n/spworlds-csharp-library)).
|
||||
```cs
|
||||
@@ -33,6 +41,6 @@ SPWorlds sp = new SPworlds("[ваш айди]","[ваш токен]");
|
||||
SPUser user = await wrapper.getUserData("yawaflua");
|
||||
sp.CreateTransaction(user.CardsOwned.First().number, 1, "Привет от yawaflua")
|
||||
```
|
||||
# FAQ
|
||||
## 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 из-за большой стоимость и ужасного качества поддержки и серверов, но это выбор каждого.
|
||||
|
||||
43
SPWorldsWrapper/README.md
Normal file
43
SPWorldsWrapper/README.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# SPWorldsWrapper
|
||||

|
||||
|
||||
Actions pass:
|
||||
|
||||
|
||||

|
||||
|
||||
Это довольно простой 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 из-за большой стоимость и ужасного качества поддержки и серверов, но это выбор каждого.
|
||||
@@ -1,13 +1,22 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<PackageId>SPWorldsWrapper</PackageId>
|
||||
<Description>Библиотека для работы с сайтом spworlds.ru</Description>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<Version>1.0.6</Version>
|
||||
<Authors>yawaflua</Authors>
|
||||
<Company>yawaflua</Company>
|
||||
<RepositoryUrl>https://github.com/yawaflua/SPWorldsWrapper</RepositoryUrl>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
|
||||
@@ -1,27 +1,48 @@
|
||||
using Newtonsoft.Json;
|
||||
using SPWorldsWrapper.Types;
|
||||
using SPWorldsWrapper.Types.Enums;
|
||||
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 ServerError : Exception
|
||||
{
|
||||
public ServerError(string? message, Exception? innerException) : base(message, innerException) { }
|
||||
public ServerError() : base() { }
|
||||
public ServerError(string? message) : base(message) { }
|
||||
}
|
||||
public class SPWrapper
|
||||
{
|
||||
public readonly HttpClient client;
|
||||
private readonly Servers server;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Асинхронный wrapper для работы напрямую с сайтом, а не с API SPWorlds.ru
|
||||
/// </summary>
|
||||
/// <param name="token">Токен от сайта(смотреть README.md)</param>
|
||||
public SPWrapper(string token)
|
||||
public SPWrapper(string token, Servers server)
|
||||
{
|
||||
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();
|
||||
var spwLoginMethod = spwLogin();
|
||||
if (!spwLoginMethod.Result)
|
||||
throw new AuthentificationError("Ошибка парсинга данных от сайта. Проверьте токен, IP сервера и статус сайта SPWORLDS.RU");
|
||||
if (server == Servers.pl)
|
||||
throw new ServerError("Ошибка! PL закрыт, из-за этого wrapper работать не будет");
|
||||
this.server = server;
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
@@ -30,11 +51,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 +88,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());
|
||||
var request = await client.GetAsync($"{server}/accounts/{userName}");
|
||||
SPUser? response = JsonConvert.DeserializeObject<SPUser>(request.Content.ReadAsStringAsync().Result.ToString());
|
||||
return response;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -69,7 +102,7 @@ namespace SPWorldsWrapper
|
||||
public async Task<IEnumerable<SPCity>> getAllSities()
|
||||
{
|
||||
var citiesArray = new List<SPCity>();
|
||||
var request = await client.GetAsync("https://spworlds.ru/api/pl/cities");
|
||||
var request = await client.GetAsync($"{server}/cities");
|
||||
JsonNode jsonBody = await request.Content.ReadFromJsonAsync<JsonNode>();
|
||||
foreach (JsonNode node in jsonBody.AsArray())
|
||||
{
|
||||
@@ -87,7 +120,7 @@ namespace SPWorldsWrapper
|
||||
{
|
||||
try
|
||||
{
|
||||
var request = await client.PostAsync("https://spworlds.ru/api/pl/cities", JsonContent.Create(city));
|
||||
var request = await client.PostAsync($"{server}/cities", JsonContent.Create(city));
|
||||
if (request.StatusCode.HasFlag(HttpStatusCode.OK))
|
||||
{
|
||||
return city;
|
||||
@@ -111,7 +144,7 @@ namespace SPWorldsWrapper
|
||||
/// <returns><see cref="SPCity"/>: удаленный город или <see cref="null"/> если нет роли игрок</returns>
|
||||
public async Task<SPCity?> deleteSityFromMap(SPCity city)
|
||||
{
|
||||
var request = await client.DeleteAsync($"https://spworlds.ru/api/pl/cities/{city.id}");
|
||||
var request = await client.DeleteAsync($"{server}/cities/{city.id}");
|
||||
if (request.StatusCode.Equals(200))
|
||||
{
|
||||
return city;
|
||||
|
||||
16
SPWorldsWrapper/Types/Enums/Servers.cs
Normal file
16
SPWorldsWrapper/Types/Enums/Servers.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SPWorldsWrapper.Types.Enums
|
||||
{
|
||||
public enum Servers
|
||||
{
|
||||
spm,
|
||||
sp,
|
||||
pl,
|
||||
spb
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user