using Lava.NET.Types.Enums; using Lava.NET.Types.LavaAPI; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json.Nodes; namespace Lava.NET { /// /// Ограниченный класс, который используется как базовый для бизнес части и публичной части Lava API. Использование нежелательно! /// /// Токен от Lava.ru /// Тип вашего аккаунта public class ILavaAPI(string token, LavaType type) { internal readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new("https://api.lava.ru/") }; internal async Task SendRequest(string path, LavaType? neededType, HttpMethod method, string? body = null) { if (neededType != LavaType.any && neededType != type) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type"); _httpClient.DefaultRequestHeaders.Authorization = new("", token); using (var message = new HttpRequestMessage(method, path)) { message.Content = body == null ? new StringContent(body.ToString()) : null; var req = await _httpClient.SendAsync(message); return await req.Content.ReadAsStringAsync(); } } public async Task CreatePaymentAsync(PaymentRequest data) => JsonConvert.DeserializeObject(await SendRequest("invoice/create", LavaType.any, HttpMethod.Post, data.ToString())); public async Task GetPaymentInfoAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("invoice/info", LavaType.any, HttpMethod.Post, id)); public async Task SetWebhookUrl(string url) => await SendRequest("invoice/set-webhook", LavaType.any, HttpMethod.Post, url); public async Task pingAsync() => JsonNode.Parse(await SendRequest("test/ping", LavaType.any, HttpMethod.Get))?["status"]?.ToString().Equals(true) ?? false; } public class PublicLavaAPI : ILavaAPI { // Для обычных юзеров + общедоступное public PublicLavaAPI(string token) : base(token, LavaType.wallet) { } public async Task getWallets() => JsonConvert.DeserializeObject(await SendRequest("wallet/list", LavaType.wallet, HttpMethod.Get)); public async Task MakeWithdraw(Withdraw withdraw) => JsonConvert.DeserializeObject(await SendRequest("withdraw/create", LavaType.wallet, HttpMethod.Post, withdraw.ToString())); public async Task InfoWithdrawAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("withdraw/info", LavaType.wallet, HttpMethod.Post, id)); public async Task MakeTransfer(Transfer data) => JsonConvert.DeserializeObject(await SendRequest("transfer/create", LavaType.wallet, HttpMethod.Post, data.ToString())); public async Task GetTransferDataAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("transfer/info", LavaType.wallet, HttpMethod.Post, id)); public async Task GetTransactionsAsync(TransactionParam? transaction = null) => JsonConvert.DeserializeObject(await SendRequest("transactions/list", LavaType.wallet, HttpMethod.Post, transaction?.ToString())); public async Task GetSBPBanksAsync() => JsonConvert.DeserializeObject(await SendRequest("withdraw/get-sbp-bank-list", LavaType.wallet, HttpMethod.Post)); } public class BusinessLavaAPI(string token) : ILavaAPI(token, LavaType.business) { internal async Task SendRequest(string path, LavaType? neededType = LavaType.business, HttpMethod? method = null, string? body = null, bool isSpecial = true) { method ??= HttpMethod.Post; if (neededType != LavaType.any && neededType != LavaType.business) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type"); _httpClient.DefaultRequestHeaders.Authorization = new("", token); if (isSpecial) { _httpClient.DefaultRequestHeaders.Accept.Add(new("application/json")); _httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json"); } using (var message = new HttpRequestMessage(method, path)) { message.Content = body == null ? new StringContent(body.ToString()) : null; var req = await _httpClient.SendAsync(message); return await req.Content.ReadAsStringAsync(); } } public async Task CreatePayoffAsync(PayoffRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/create", body: request.ToString())); public async Task GetPayoffDataAsync(PayoffDataRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/info", body: request.ToString())); public async Task GetPayoffTariffAsync(PayoffTariffRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/get-tariffs", body: request.ToString())); public async Task CheckPayoffTariffAsync(PayoffCheckoutRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/check-wallet", body: request.ToString())); // В разработке... } }