Revert "Merge pull request #106 from Moonlight-Panel/DiscordBot"

This reverts commit f71fcc0f5d, reversing
changes made to e0bea9b61c.
This commit is contained in:
Marcel Baumgartner
2023-04-29 23:37:03 +02:00
parent f71fcc0f5d
commit ca64184faf
152 changed files with 9159 additions and 3251 deletions

View File

@@ -0,0 +1,206 @@
using Logging.Net;
using Renci.SshNet;
using ConnectionInfo = Renci.SshNet.ConnectionInfo;
namespace Moonlight.App.Helpers.Files;
public class SftpFileAccess : FileAccess
{
private readonly string SftpHost;
private readonly string SftpUser;
private readonly string SftpPassword;
private readonly int SftpPort;
private readonly bool ForceUserDir;
private readonly SftpClient Client;
private string InternalPath
{
get
{
if (ForceUserDir)
return $"/home/{SftpUser}{CurrentPath}";
return InternalPath;
}
}
public SftpFileAccess(string sftpHost, string sftpUser, string sftpPassword, int sftpPort,
bool forceUserDir = false)
{
SftpHost = sftpHost;
SftpUser = sftpUser;
SftpPassword = sftpPassword;
SftpPort = sftpPort;
ForceUserDir = forceUserDir;
Client = new(
new ConnectionInfo(
SftpHost,
SftpPort,
SftpUser,
new PasswordAuthenticationMethod(
SftpUser,
SftpPassword
)
)
);
}
private void EnsureConnect()
{
if (!Client.IsConnected)
Client.Connect();
}
public override Task<FileData[]> Ls()
{
EnsureConnect();
var x = new List<FileData>();
foreach (var file in Client.ListDirectory(InternalPath))
{
if (file.Name != "." && file.Name != "..")
{
x.Add(new()
{
Name = file.Name,
Size = file.Attributes.Size,
IsFile = !file.IsDirectory
});
}
}
return Task.FromResult(x.ToArray());
}
public override Task Cd(string dir)
{
var x = Path.Combine(CurrentPath, dir).Replace("\\", "/") + "/";
x = x.Replace("//", "/");
CurrentPath = x;
return Task.CompletedTask;
}
public override Task Up()
{
CurrentPath = Path.GetFullPath(Path.Combine(CurrentPath, "..")).Replace("\\", "/").Replace("C:", "");
return Task.CompletedTask;
}
public override Task SetDir(string dir)
{
CurrentPath = dir;
return Task.CompletedTask;
}
public override Task<string> Read(FileData fileData)
{
EnsureConnect();
var textStream = Client.Open(InternalPath.TrimEnd('/') + "/" + fileData.Name, FileMode.Open);
if (textStream == null)
return Task.FromResult("");
var streamReader = new StreamReader(textStream);
var text = streamReader.ReadToEnd();
streamReader.Close();
textStream.Close();
return Task.FromResult(text);
}
public override Task Write(FileData fileData, string content)
{
EnsureConnect();
var textStream = Client.Open(InternalPath.TrimEnd('/') + "/" + fileData.Name, FileMode.Create);
var streamWriter = new StreamWriter(textStream);
streamWriter.Write(content);
streamWriter.Flush();
textStream.Flush();
streamWriter.Close();
textStream.Close();
return Task.CompletedTask;
}
public override async Task Upload(string name, Stream stream, Action<int>? progressUpdated = null)
{
var dataStream = new SyncStreamAdapter(stream);
await Task.Factory.FromAsync((x, _) => Client.BeginUploadFile(dataStream, InternalPath + name, x, null, u =>
{
progressUpdated?.Invoke((int)((long)u / stream.Length));
}),
Client.EndUploadFile, null);
}
public override Task MkDir(string name)
{
Client.CreateDirectory(InternalPath + name);
return Task.CompletedTask;
}
public override Task<string> Pwd()
{
return Task.FromResult(CurrentPath);
}
public override Task<string> DownloadUrl(FileData fileData)
{
throw new NotImplementedException();
}
public override Task<Stream> DownloadStream(FileData fileData)
{
var stream = new MemoryStream(100 * 1024 * 1024);
Client.DownloadFile(InternalPath + fileData.Name, stream);
return Task.FromResult<Stream>(stream);
}
public override Task Delete(FileData fileData)
{
Client.Delete(InternalPath + fileData.Name);
return Task.CompletedTask;
}
public override Task Move(FileData fileData, string newPath)
{
Client.RenameFile(InternalPath + fileData.Name, InternalPath + newPath);
return Task.CompletedTask;
}
public override Task Compress(params FileData[] files)
{
throw new NotImplementedException();
}
public override Task Decompress(FileData fileData)
{
throw new NotImplementedException();
}
public override Task<string> GetLaunchUrl()
{
return Task.FromResult($"sftp://{SftpUser}@{SftpHost}:{SftpPort}");
}
public override object Clone()
{
return new SftpFileAccess(SftpHost, SftpUser, SftpPassword, SftpPort, ForceUserDir);
}
}

View File

@@ -1,15 +1,23 @@
namespace Moonlight.App.Helpers;
using Logging.Net;
namespace Moonlight.App.Helpers;
public static class ParseHelper
{
public static int MinecraftToInt(string raw)
{
var versionWithoutPre = raw.Split("-")[0];
var versionWithoutPre = raw.Split("_")[0];
versionWithoutPre = versionWithoutPre.Split("-")[0];
// Fuck you 1.7.10 ;)
versionWithoutPre = versionWithoutPre.Replace("1.7.10", "1.7");
if (versionWithoutPre.Count(x => x == "."[0]) == 1)
versionWithoutPre += ".0";
return int.Parse(versionWithoutPre.Replace(".", ""));
var x = versionWithoutPre.Replace(".", "");
return int.Parse(x);
}
public static string FirstPartStartingWithNumber(string raw)
@@ -29,4 +37,61 @@ public static class ParseHelper
return res;
}
public static string GetHighestVersion(string[] versions)
{
// Initialize the highest version to the first version in the array
string highestVersion = versions[0];
// Loop through the remaining versions in the array
for (int i = 1; i < versions.Length; i++)
{
// Compare the current version to the highest version
if (CompareVersions(versions[i], highestVersion) > 0)
{
// If the current version is higher, update the highest version
highestVersion = versions[i];
}
}
return highestVersion;
}
public static int CompareVersions(string version1, string version2)
{
// Split the versions into their component parts
string[] version1Parts = version1.Split('.');
string[] version2Parts = version2.Split('.');
// Compare each component part in turn
for (int i = 0; i < version1Parts.Length && i < version2Parts.Length; i++)
{
int part1 = int.Parse(version1Parts[i]);
int part2 = int.Parse(version2Parts[i]);
if (part1 < part2)
{
return -1;
}
else if (part1 > part2)
{
return 1;
}
}
// If we get here, the versions are equal up to the length of the shorter one.
// If one version has more parts than the other, the longer one is considered higher.
if (version1Parts.Length < version2Parts.Length)
{
return -1;
}
else if (version1Parts.Length > version2Parts.Length)
{
return 1;
}
else
{
return 0;
}
}
}

View File

@@ -1,220 +0,0 @@
using System.Text;
using Moonlight.App.Database.Entities;
using Moonlight.App.Exceptions;
using Newtonsoft.Json;
using RestSharp;
namespace Moonlight.App.Helpers;
public class PleskApiHelper
{
private readonly RestClient Client;
public PleskApiHelper()
{
Client = new();
}
public async Task<T> Get<T>(PleskServer server, string resource)
{
var request = CreateRequest(server, resource);
request.Method = Method.Get;
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
return JsonConvert.DeserializeObject<T>(response.Content!)!;
}
public async Task<string> GetRaw(PleskServer server, string resource)
{
var request = CreateRequest(server, resource);
request.Method = Method.Get;
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
return response.Content!;
}
public async Task<T> Post<T>(PleskServer server, string resource, object? body)
{
var request = CreateRequest(server, resource);
request.Method = Method.Post;
request.AddParameter("text/plain",
JsonConvert.SerializeObject(body),
ParameterType.RequestBody
);
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
return JsonConvert.DeserializeObject<T>(response.Content!)!;
}
public async Task Post(PleskServer server, string resource, object? body)
{
var request = CreateRequest(server, resource);
request.Method = Method.Post;
if(body != null)
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
}
public async Task PostRaw(PleskServer server, string resource, object body)
{
var request = CreateRequest(server, resource);
request.Method = Method.Post;
request.AddParameter("text/plain", body, ParameterType.RequestBody);
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
}
public async Task Delete(PleskServer server, string resource, object? body)
{
var request = CreateRequest(server, resource);
request.Method = Method.Delete;
if(body != null)
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
}
public async Task Put(PleskServer server, string resource, object? body)
{
var request = CreateRequest(server, resource);
request.Method = Method.Put;
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
var response = await Client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
if (response.StatusCode != 0)
{
throw new PleskException(
$"An error occured: ({response.StatusCode}) {response.Content}",
(int)response.StatusCode
);
}
else
{
throw new Exception($"An internal error occured: {response.ErrorMessage}");
}
}
}
private RestRequest CreateRequest(PleskServer pleskServer, string resource)
{
var url = $"{pleskServer.ApiUrl}/" + resource;
var request = new RestRequest(url);
var ba = Convert.ToBase64String(Encoding.UTF8.GetBytes(pleskServer.ApiKey));
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddHeader("Authorization", "Basic " + ba);
return request;
}
}

View File

@@ -0,0 +1,58 @@
namespace Moonlight.App.Helpers;
public class SyncStreamAdapter : Stream
{
private readonly Stream _stream;
public SyncStreamAdapter(Stream stream)
{
_stream = stream ?? throw new ArgumentNullException(nameof(stream));
}
public override bool CanRead => _stream.CanRead;
public override bool CanSeek => _stream.CanSeek;
public override bool CanWrite => _stream.CanWrite;
public override long Length => _stream.Length;
public override long Position
{
get => _stream.Position;
set => _stream.Position = value;
}
public override void Flush()
{
_stream.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
var task = Task.Run(() => _stream.ReadAsync(buffer, offset, count));
return task.GetAwaiter().GetResult();
}
public override long Seek(long offset, SeekOrigin origin)
{
return _stream.Seek(offset, origin);
}
public override void SetLength(long value)
{
_stream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
var task = Task.Run(() => _stream.WriteAsync(buffer, offset, count));
task.GetAwaiter().GetResult();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_stream?.Dispose();
}
base.Dispose(disposing);
}
}