2023-01-01 22:50:39 -05:00
using System ;
using System.Collections.Generic ;
using System.IO ;
2023-07-03 23:24:35 -04:00
using System.Linq ;
2023-01-01 22:50:39 -05:00
using System.Net.Http ;
using System.Net.Http.Json ;
using System.Text.Json ;
using System.Text.Json.Serialization.Metadata ;
2023-07-03 23:24:35 -04:00
using System.Threading ;
2023-01-01 22:50:39 -05:00
using System.Threading.Tasks ;
2023-07-03 23:24:35 -04:00
using Luski.net.Enums ;
using Luski.net.Interfaces ;
using Luski.net.JsonTypes.BaseTypes ;
using File = System . IO . File ;
2023-01-01 22:50:39 -05:00
namespace Luski.net ;
2023-07-08 09:06:13 -04:00
public partial class Server
2023-01-01 22:50:39 -05:00
{
2023-07-10 14:19:03 -04:00
internal Server ( string Domain , string API_Version )
2023-07-10 07:35:05 -04:00
{
2023-07-10 14:19:03 -04:00
this . Domain = Domain ;
this . ApiVersion = API_Version ;
Storage = new ( Domain ) ;
EncryptionHandler = new ( Domain , API_Version , Storage ) ;
2023-07-10 07:35:05 -04:00
}
2023-07-10 14:19:03 -04:00
public ServerEncryption EncryptionHandler { get ; }
public ServerStorage Storage { get ; }
2023-07-03 23:24:35 -04:00
public async Task < byte [ ] > GetAvatar ( CancellationToken CancellationToken )
2023-01-01 22:50:39 -05:00
{
2023-07-10 07:35:05 -04:00
bool isc = File . Exists ( Storage . GetStorageDirectory ( StorageDirectory . ServerAssets ) + "Icon" ) ;
if ( ! isc ) await GetFromServer ( $"socketserver/Avatar/" , Storage . GetStorageDirectory ( StorageDirectory . ServerAssets ) + "Icon" , CancellationToken ) ;
return Storage . GetResourceBytes ( StorageDirectory . ServerAssets , "Icon" ) ;
2023-01-01 22:50:39 -05:00
}
2023-07-03 23:24:35 -04:00
public void SendServer < Tvalue > ( Tvalue Payload , JsonTypeInfo < Tvalue > jsonTypeInfo ) where Tvalue : IncomingWSS
2023-01-01 22:50:39 -05:00
{
ServerOut ? . Send ( JsonSerializer . Serialize ( Payload , jsonTypeInfo ) ) ;
}
2023-07-03 23:24:35 -04:00
public HttpResponseMessage GetFromServer ( string Path , CancellationToken CancellationToken , params KeyValuePair < string , string? > [ ] Headers )
2023-01-01 22:50:39 -05:00
{
using HttpClient web = new ( ) ;
web . Timeout = TimeSpan . FromSeconds ( 10 ) ;
if ( ! login ) web . DefaultRequestHeaders . Add ( "token" , Token ) ;
if ( Headers is not null & & Headers . Length > 0 ) foreach ( KeyValuePair < string , string? > header in Headers ) web . DefaultRequestHeaders . Add ( header . Key , header . Value ) ;
2023-07-03 23:24:35 -04:00
return web . GetAsync ( $"https://{Domain}/{ApiVersion}/{Path}" , cancellationToken : CancellationToken ) . Result ;
2023-01-01 22:50:39 -05:00
}
2023-07-03 23:24:35 -04:00
public Task GetFromServer ( string Path , string File , CancellationToken CancellationToken , params KeyValuePair < string , string? > [ ] Headers )
2023-01-01 22:50:39 -05:00
{
using HttpClient web = new ( ) ;
web . Timeout = TimeSpan . FromMinutes ( 10 ) ;
if ( ! login ) web . DefaultRequestHeaders . Add ( "token" , Token ) ;
if ( Headers is not null & & Headers . Length > 0 ) foreach ( KeyValuePair < string , string? > header in Headers ) web . DefaultRequestHeaders . Add ( header . Key , header . Value ) ;
2023-07-03 23:24:35 -04:00
HttpResponseMessage Response = web . GetAsync ( $"https://{Domain}/{ApiVersion}/{Path}" , CancellationToken ) . Result ;
Stream stream = Response . Content . ReadAsStreamAsync ( CancellationToken ) . Result ;
2023-01-01 22:50:39 -05:00
using FileStream fs = System . IO . File . Create ( File ) ;
stream . CopyTo ( fs ) ;
return Task . CompletedTask ;
}
2023-07-03 23:24:35 -04:00
public async Task < Tresult > GetFromServer < Tresult > ( string Path , JsonTypeInfo < Tresult > Type , CancellationToken CancellationToken , params KeyValuePair < string , string? > [ ] Headers ) where Tresult : IncomingHTTP , new ( )
2023-01-01 22:50:39 -05:00
{
2023-07-03 23:24:35 -04:00
HttpResponseMessage ServerResponce = GetFromServer ( Path , CancellationToken , Headers ) ;
2023-01-01 22:50:39 -05:00
if ( ! ServerResponce . IsSuccessStatusCode ) return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with status code {(int)ServerResponce.StatusCode}:{ServerResponce.StatusCode}" } ;
2023-07-03 23:24:35 -04:00
Tresult ? temp = JsonSerializer . Deserialize ( ServerResponce . Content . ReadAsStreamAsync ( CancellationToken ) . Result , Type ) ;
2023-01-01 22:50:39 -05:00
if ( temp is null ) return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with empty data" } ;
return temp ;
}
2023-07-03 23:24:35 -04:00
public async Task < Tresult > SendServer < Tvalue , Tresult > ( string Path , Tvalue Payload , JsonTypeInfo < Tvalue > jsonTypeInfo , JsonTypeInfo < Tresult > ReturnjsonTypeInfo , CancellationToken CancellationToken , params KeyValuePair < string , string? > [ ] Headers ) where Tvalue : IWebRequest where Tresult : IncomingHTTP , new ( )
2023-01-01 22:50:39 -05:00
{
using HttpClient web = new ( ) ;
if ( ! login ) web . DefaultRequestHeaders . Add ( "token" , Token ) ;
if ( Headers is not null & & Headers . Length > 0 ) foreach ( KeyValuePair < string , string? > header in Headers ) web . DefaultRequestHeaders . Add ( header . Key , header . Value ) ;
2023-07-03 23:24:35 -04:00
HttpResponseMessage ServerResponce = web . PostAsJsonAsync ( $"https://{Domain}/{ApiVersion}/{Path}" , Payload , jsonTypeInfo , CancellationToken ) . Result ;
2023-01-01 22:50:39 -05:00
if ( ! ServerResponce . IsSuccessStatusCode ) return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with status code {(int)ServerResponce.StatusCode}:{ServerResponce.StatusCode}" } ;
Tresult error = new ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with empty data" } ;
2023-07-03 23:24:35 -04:00
if ( string . IsNullOrWhiteSpace ( ServerResponce . Content . ReadAsStringAsync ( CancellationToken ) . Result ) ) return error ;
2023-01-01 22:50:39 -05:00
try
{
2023-07-03 23:24:35 -04:00
Tresult ? temp = JsonSerializer . Deserialize ( ServerResponce . Content . ReadAsStreamAsync ( CancellationToken ) . Result , ReturnjsonTypeInfo ) ;
2023-01-01 22:50:39 -05:00
if ( temp is null ) return error ;
return temp ;
}
catch { return error ; }
}
2023-07-03 23:24:35 -04:00
public async Task < Tresult > SendServer < Tresult > ( string Path , string File , JsonTypeInfo < Tresult > ReturnjsonTypeInfo , CancellationToken CancellationToken , params KeyValuePair < string , string? > [ ] Headers ) where Tresult : IncomingHTTP , new ( )
2023-01-01 22:50:39 -05:00
{
var fs = System . IO . File . OpenRead ( File ) ;
try
{
using HttpClient web = new ( ) ;
if ( ! login ) web . DefaultRequestHeaders . Add ( "token" , Token ) ;
web . Timeout = new TimeSpan ( 0 , 10 , 0 ) ;
if ( Headers is not null & & Headers . Length > 0 ) foreach ( KeyValuePair < string , string? > header in Headers ) web . DefaultRequestHeaders . Add ( header . Key , header . Value ) ;
2023-07-03 23:24:35 -04:00
HttpResponseMessage ServerResponce = web . PostAsync ( $"https://{Domain}/{ApiVersion}/{Path}" , new StreamContent ( fs ) , CancellationToken ) . Result ;
2023-01-01 22:50:39 -05:00
if ( ! ServerResponce . IsSuccessStatusCode ) return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with status code {(int)ServerResponce.StatusCode}:{ServerResponce.StatusCode}" } ;
try
{
2023-07-03 23:24:35 -04:00
Tresult ? temp = JsonSerializer . Deserialize ( ServerResponce . Content . ReadAsStreamAsync ( CancellationToken ) . Result , ReturnjsonTypeInfo ) ;
2023-01-01 22:50:39 -05:00
if ( temp is null ) return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with empty data" } ;
return temp ;
}
catch { return new Tresult ( ) { StatusCode = ServerResponce . StatusCode , Error = ErrorCode . ServerError , ErrorMessage = $"Server responded with empty data" } ; }
}
finally
{
fs . Close ( ) ;
}
}
2023-07-03 23:24:35 -04:00
}