11 Commits

Author SHA1 Message Date
Dima yawaflua Andreev
ac3322951e Merge pull request #4 from yawaflua/yawaflua-patch-3
Update README.md
2024-02-25 20:19:44 +03:00
Dima yawaflua Andreev
2d761867c0 Update README.md 2024-02-25 20:19:28 +03:00
Dima yawaflua Andreev
0eea6db426 Update nuget.yml 2024-01-20 02:42:07 +03:00
Dima yawaflua Andreev
464afc5eb9 Update SPWorldsWrapper.csproj 2024-01-20 02:36:27 +03:00
Дмитрий Шиманский
1fd7f08e0b Add server filter 2024-01-20 02:34:19 +03:00
Dima yawaflua Andreev
98c69c5665 Update nuget.yml 2024-01-19 20:13:24 +03:00
Dima yawaflua Andreev
00688b7c6a Merge pull request #3 from yawaflua/yawaflua-patch-2
End downscale from .NET8 to .NET7
2024-01-19 20:10:18 +03:00
Dima yawaflua Andreev
01cc988f85 Update SPWorldsWrapper.csproj 2024-01-19 20:08:34 +03:00
Dima yawaflua Andreev
c84dbecbaf Merge pull request #2 from yawaflua/yawaflua-patch-2-1
Update nuget.yml
2024-01-19 20:08:06 +03:00
Dima yawaflua Andreev
8b0043e1ab Update nuget.yml 2024-01-19 20:07:44 +03:00
Dima yawaflua Andreev
b513e9489d Update SPWorldsWrapper.csproj 2024-01-19 20:06:02 +03:00
5 changed files with 44 additions and 17 deletions

View File

@@ -12,17 +12,17 @@ jobs:
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '7.x.x'
- name: Set output - name: Set output
id: vars id: vars
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
- name: Publish to NuGet - name: Publish to NuGet
uses: brandedoutcast/publish-nuget@v2 uses: kelson-dev/publish-nuget-fixed@2.5.6
with: with:
PROJECT_FILE_PATH: SPWorldsWrapper/SPWorldsWrapper.csproj PROJECT_FILE_PATH: SPWorldsWrapper/SPWorldsWrapper.csproj
VERSION_STATIC: ${{ steps.vars.outputs.tags }} VERSION_STATIC: ${{ steps.vars.outputs.tags }}
TAG_COMMIT: true TAG_COMMIT: true
TAG_FORMAT: '*' TAG_FORMAT: "*"
NUGET_KEY: ${{secrets.NUGET_API_KEY}} NUGET_KEY: ${{secrets.NUGET_API_KEY}}
NUGET_SOURCE: https://api.nuget.org NUGET_SOURCE: https://api.nuget.org
INCLUDE_SYMBOLS: false INCLUDE_SYMBOLS: false

View File

@@ -1,4 +1,7 @@
# SPWorldsWrapper # ⚠ DEPRECATED ⚠
Разработчики spworlds ввели динамичные токены, которые обновляются постоянно, из-за чего использование данной библиотеки вместе с использованием сайта, даже через VPN стало невозможным.
## SPWorldsWrapper
![](https://img.shields.io/badge/dotnet-.NET_7-green) ![](https://img.shields.io/badge/dotnet-.NET_7-green)
Actions pass: Actions pass:
@@ -11,16 +14,16 @@ Actions pass:
- Добавлять/удалять города на карте(ПРИ НАЛИЧИИ РОЛИ КАРТОГРАФА) - Добавлять/удалять города на карте(ПРИ НАЛИЧИИ РОЛИ КАРТОГРАФА)
- Получать любые данные, используя HttpClient, внутри класса - Получать любые данные, используя HttpClient, внутри класса
# Установка ## Установка
```cli ```cli
dotnet add package SPWorldsWrapper dotnet add package SPWorldsWrapper
``` ```
# Добавление функций ## Добавление функций
Если вы хотите помочь с разработкой, просьба создать Pull Request, где будет созданы нужные методы и, желательно, комментарии к ним. Если вы хотите помочь с разработкой, просьба создать Pull Request, где будет созданы нужные методы и, желательно, комментарии к ним.
Если вы хотите помочь с расширением этого wrapper`a, просьба создать Issue, где вы подробно изложите, что именно вам надо. Если вы хотите помочь с расширением этого wrapper`a, просьба создать Issue, где вы подробно изложите, что именно вам надо.
# Использование ## Использование
## Перевод игроку, имея только никнейм ## Перевод игроку, имея только никнейм
Ниже есть пример использования. В ходе этого примера мы переводим игроку 1 АР, получая карту по никнейму, а потом переводя на нее ары(через [библиотеку](https://github.com/Mih4n/spworlds-csharp-library)). Ниже есть пример использования. В ходе этого примера мы переводим игроку 1 АР, получая карту по никнейму, а потом переводя на нее ары(через [библиотеку](https://github.com/Mih4n/spworlds-csharp-library)).
```cs ```cs
@@ -38,6 +41,6 @@ SPWorlds sp = new SPworlds("[ваш айди]","[ваш токен]");
SPUser user = await wrapper.getUserData("yawaflua"); SPUser user = await wrapper.getUserData("yawaflua");
sp.CreateTransaction(user.CardsOwned.First().number, 1, "Привет от yawaflua") sp.CreateTransaction(user.CardsOwned.First().number, 1, "Привет от yawaflua")
``` ```
# FAQ ## FAQ
- Где получить токен для использования? - [тут](https://github.com/yawaflua/SPWorldsWrapper/blob/master/GETTOKEN.md) - Где получить токен для использования? - [тут](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 из-за большой стоимость и ужасного качества поддержки и серверов, но это выбор каждого. - Как сделать так, чтобы токен не слетал? - Надо использовать впн, с выходной точкой в виде вашего сервера. Я использую [tailscale](https://tailscale.com/), но в России его больше нельзя скачать. Можно попробовать настроить OpenVPN или иные сервисы. [Тут](https://habr.com/ru/companies/ruvds/articles/726718/) например описано, как можно легко поднять с помощью сервиса RuVDS, где вы получите и VPN, и VDS. Я бы не советовал исполользовать RuVDS из-за большой стоимость и ужасного качества поддержки и серверов, но это выбор каждого.

View File

@@ -7,7 +7,7 @@
<PackageId>SPWorldsWrapper</PackageId> <PackageId>SPWorldsWrapper</PackageId>
<Description>Библиотека для работы с сайтом spworlds.ru</Description> <Description>Библиотека для работы с сайтом spworlds.ru</Description>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<Version>1.0.2</Version> <Version>1.0.6</Version>
<Authors>yawaflua</Authors> <Authors>yawaflua</Authors>
<Company>yawaflua</Company> <Company>yawaflua</Company>
<RepositoryUrl>https://github.com/yawaflua/SPWorldsWrapper</RepositoryUrl> <RepositoryUrl>https://github.com/yawaflua/SPWorldsWrapper</RepositoryUrl>

View File

@@ -1,5 +1,6 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using SPWorldsWrapper.Types; using SPWorldsWrapper.Types;
using SPWorldsWrapper.Types.Enums;
using System.Net; using System.Net;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Reflection.Metadata.Ecma335; using System.Reflection.Metadata.Ecma335;
@@ -13,17 +14,23 @@ namespace SPWorldsWrapper
public AuthentificationError() : base() { } public AuthentificationError() : base() { }
public AuthentificationError(string? message) : base(message) { } 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 class SPWrapper
{ {
public readonly HttpClient client; public readonly HttpClient client;
private readonly Servers server;
/// <summary> /// <summary>
/// Асинхронный wrapper для работы напрямую с сайтом, а не с API SPWorlds.ru /// Асинхронный wrapper для работы напрямую с сайтом, а не с API SPWorlds.ru
/// </summary> /// </summary>
/// <param name="token">Токен от сайта(смотреть README.md)</param> /// <param name="token">Токен от сайта(смотреть README.md)</param>
public SPWrapper(string token) public SPWrapper(string token, Servers server)
{ {
var cookieContainer = new CookieContainer(); var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler() { CookieContainer = cookieContainer }; var handler = new HttpClientHandler() { CookieContainer = cookieContainer };
@@ -32,9 +39,10 @@ namespace SPWorldsWrapper
cookieContainer.Add(client.BaseAddress, new Cookie("jeff", token)); cookieContainer.Add(client.BaseAddress, new Cookie("jeff", token));
var spwLoginMethod = spwLogin(); var spwLoginMethod = spwLogin();
if (!spwLoginMethod.Result) if (!spwLoginMethod.Result)
{
throw new AuthentificationError("Ошибка парсинга данных от сайта. Проверьте токен, IP сервера и статус сайта SPWORLDS.RU"); throw new AuthentificationError("Ошибка парсинга данных от сайта. Проверьте токен, IP сервера и статус сайта SPWORLDS.RU");
} if (server == Servers.pl)
throw new ServerError("Ошибка! PL закрыт, из-за этого wrapper работать не будет");
this.server = server;
} }
/// <summary> /// <summary>
@@ -83,7 +91,7 @@ namespace SPWorldsWrapper
/// <returns><see cref="SPUser" /> пользователь от сайта, или null.</returns> /// <returns><see cref="SPUser" /> пользователь от сайта, или null.</returns>
public async Task<SPUser?> getUserData(string userName) public async Task<SPUser?> getUserData(string userName)
{ {
var request = await client.GetAsync($"pl/accounts/{userName}"); var request = await client.GetAsync($"{server}/accounts/{userName}");
SPUser? response = JsonConvert.DeserializeObject<SPUser>(request.Content.ReadAsStringAsync().Result.ToString()); SPUser? response = JsonConvert.DeserializeObject<SPUser>(request.Content.ReadAsStringAsync().Result.ToString());
return response; return response;
} }
@@ -94,7 +102,7 @@ namespace SPWorldsWrapper
public async Task<IEnumerable<SPCity>> getAllSities() public async Task<IEnumerable<SPCity>> getAllSities()
{ {
var citiesArray = new List<SPCity>(); 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>(); JsonNode jsonBody = await request.Content.ReadFromJsonAsync<JsonNode>();
foreach (JsonNode node in jsonBody.AsArray()) foreach (JsonNode node in jsonBody.AsArray())
{ {
@@ -112,7 +120,7 @@ namespace SPWorldsWrapper
{ {
try 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)) if (request.StatusCode.HasFlag(HttpStatusCode.OK))
{ {
return city; return city;
@@ -136,7 +144,7 @@ namespace SPWorldsWrapper
/// <returns><see cref="SPCity"/>: удаленный город или <see cref="null"/> если нет роли игрок</returns> /// <returns><see cref="SPCity"/>: удаленный город или <see cref="null"/> если нет роли игрок</returns>
public async Task<SPCity?> deleteSityFromMap(SPCity city) 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)) if (request.StatusCode.Equals(200))
{ {
return city; return city;

View 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
}
}