Download plugin have progress status
This commit is contained in:
@@ -25,7 +25,6 @@ public class ApiManager
|
||||
AddEndpoint(new PluginListEndpoint());
|
||||
AddEndpoint(new PluginListInstalledEndpoint());
|
||||
AddEndpoint(new PluginInstallEndpoint());
|
||||
AddEndpoint(new PluginInstallGetProgressEndpoint());
|
||||
|
||||
AddEndpoint(new SettingsChangeEndpoint());
|
||||
AddEndpoint(new SettingsGetEndpoint());
|
||||
|
||||
@@ -23,7 +23,7 @@ public class PluginInstallEndpoint : IEndpoint
|
||||
return ApiResponse.Fail("Plugin not found.");
|
||||
}
|
||||
|
||||
await Application.CurrentApplication.PluginManager.InstallPluginWithNoProgress(pluginInfo);
|
||||
Application.CurrentApplication.PluginManager.InstallPluginWithNoProgress(pluginInfo);
|
||||
return ApiResponse.Ok();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Threading.Tasks;
|
||||
using DiscordBotCore.Interfaces.API;
|
||||
using DiscordBotCore.Others;
|
||||
|
||||
namespace DiscordBotCore.API.Endpoints.PluginManagement;
|
||||
|
||||
public class PluginInstallGetProgressEndpoint : IEndpoint
|
||||
{
|
||||
public string Path => "/api/plugin/install/progress";
|
||||
public EndpointType HttpMethod => EndpointType.Get;
|
||||
public async Task<ApiResponse> HandleRequest(string? jsonRequest)
|
||||
{
|
||||
if (!Application.CurrentApplication.PluginManager.InstallingPluginInformation.IsInstalling)
|
||||
{
|
||||
return ApiResponse.Fail("No plugin is currently being installed.");
|
||||
}
|
||||
|
||||
var progress = Application.CurrentApplication.PluginManager.InstallingPluginInformation.InstallationProgress;
|
||||
string stringProgress = progress.ToString(CultureInfo.InvariantCulture);
|
||||
var response = new Dictionary<string, string>
|
||||
{
|
||||
{"progress", stringProgress},
|
||||
{"pluginName", Application.CurrentApplication.PluginManager.InstallingPluginInformation.PluginName}
|
||||
};
|
||||
return ApiResponse.From(await JsonManager.ConvertToJsonString(response), true);
|
||||
}
|
||||
}
|
||||
@@ -31,8 +31,8 @@ internal class SocketResponse
|
||||
return new SocketResponse(data, true, true, false);
|
||||
}
|
||||
|
||||
internal static SocketResponse Fail()
|
||||
internal static SocketResponse Fail(bool closeConnection)
|
||||
{
|
||||
return new SocketResponse(new byte[0], true, false, false);
|
||||
return new SocketResponse(new byte[0], true, false, closeConnection);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,15 +6,17 @@ namespace DiscordBotCore.API.Sockets.Sockets;
|
||||
|
||||
internal class PluginDownloadProgressSocket : ISocket
|
||||
{
|
||||
private float value = 0.0f;
|
||||
public string Path => "/plugin/download/progress";
|
||||
public Task<SocketResponse> HandleRequest(byte[] request, int count)
|
||||
{
|
||||
value += 0.1f;
|
||||
string pluginName = Encoding.UTF8.GetString(request, 0, count);
|
||||
Application.CurrentApplication.Logger.Log($"Received plugin download progress for {pluginName}.");
|
||||
if (!Application.CurrentApplication.PluginManager.InstallingPluginInformation.IsInstalling)
|
||||
{
|
||||
return Task.FromResult(SocketResponse.Fail(true));
|
||||
}
|
||||
|
||||
float value = Application.CurrentApplication.PluginManager.InstallingPluginInformation.InstallationProgress;
|
||||
SocketResponse response = SocketResponse.From(Encoding.UTF8.GetBytes(value.ToString()));
|
||||
response.CloseConnectionAfterResponse = value > 1.0f;
|
||||
response.CloseConnectionAfterResponse = false;
|
||||
return Task.FromResult(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,48 +192,75 @@ public sealed class PluginManager
|
||||
|
||||
public async Task InstallPluginWithNoProgress(PluginOnlineInfo pluginData)
|
||||
{
|
||||
InstallingPluginInformation = new InstallingPluginInformation() {PluginName = pluginData.Name};
|
||||
|
||||
InstallingPluginInformation = new InstallingPluginInformation() { PluginName = pluginData.Name };
|
||||
|
||||
// Calculate the total number of steps: main file + dependencies
|
||||
int totalSteps = pluginData.HasFileDependencies ? pluginData.Dependencies.Count + 1 : 1;
|
||||
|
||||
float stepProgress = 1f / totalSteps;
|
||||
// Each step contributes this percentage to the total progress
|
||||
float stepFraction = 100f / totalSteps;
|
||||
|
||||
// Tracks the current cumulative progress in percentage
|
||||
float currentProgress = 0f;
|
||||
|
||||
|
||||
InstallingPluginInformation.IsInstalling = true;
|
||||
|
||||
IProgress<float> downloadProgress = new Progress<float>(f => InstallingPluginInformation.InstallationProgress = currentProgress + stepProgress * f);
|
||||
|
||||
|
||||
// Create a progress updater that maps the file's 0–100 progress to its portion of the total progress
|
||||
IProgress<float> downloadProgress = new Progress<float>(fileProgress =>
|
||||
{
|
||||
// Map the file progress (0-100) to the total progress
|
||||
InstallingPluginInformation.InstallationProgress = currentProgress + (fileProgress / 100f) * stepFraction;
|
||||
});
|
||||
|
||||
// Download the main plugin file and map its progress
|
||||
await ServerCom.DownloadFileAsync(pluginData.DownLoadLink,
|
||||
$"{Application.CurrentApplication.ApplicationEnvironmentVariables.Get<string>("PluginFolder")}/{pluginData.Name}.dll",
|
||||
downloadProgress
|
||||
);
|
||||
|
||||
|
||||
// Update cumulative progress after the main file
|
||||
currentProgress += stepFraction;
|
||||
|
||||
// Download file dependencies if they exist
|
||||
if (pluginData.HasFileDependencies)
|
||||
{
|
||||
foreach (var dependency in pluginData.Dependencies)
|
||||
{
|
||||
string dependencyLocation = GenerateDependencyRelativePath(pluginData.Name, dependency.DownloadLocation);
|
||||
string dependencyLocation =
|
||||
GenerateDependencyRelativePath(pluginData.Name, dependency.DownloadLocation);
|
||||
|
||||
// Download dependency and map its progress
|
||||
await ServerCom.DownloadFileAsync(dependency.DownloadLink, dependencyLocation, downloadProgress);
|
||||
|
||||
currentProgress += stepProgress;
|
||||
// Update cumulative progress after each dependency
|
||||
currentProgress += stepFraction;
|
||||
}
|
||||
}
|
||||
|
||||
// Run script dependencies if any (doesn't affect download progress percentage)
|
||||
if (pluginData.HasScriptDependencies)
|
||||
{
|
||||
foreach (var scriptDependency in pluginData.ScriptDependencies)
|
||||
{
|
||||
|
||||
string console = OperatingSystem.IsWindows() ? "start cmd.exe" : "bash";
|
||||
string arguments = OperatingSystem.IsWindows() ? $"/c {scriptDependency.ScriptContent}" : scriptDependency.ScriptContent;
|
||||
string console = OperatingSystem.IsWindows() ? "start cmd.exe" : "bash";
|
||||
string arguments = OperatingSystem.IsWindows()
|
||||
? $"/c {scriptDependency.ScriptContent}"
|
||||
: scriptDependency.ScriptContent;
|
||||
|
||||
await ServerCom.RunConsoleCommand(console, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
// Register the plugin in the database
|
||||
PluginInfo pluginInfo = PluginInfo.FromOnlineInfo(pluginData);
|
||||
|
||||
await AppendPluginToDatabase(pluginInfo);
|
||||
|
||||
InstallingPluginInformation.IsInstalling = false;
|
||||
InstallingPluginInformation.IsInstalling = false; // Mark installation as complete
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task InstallPluginWithProgressBar(PluginOnlineInfo pluginData, IProgress<float>? installProgress)
|
||||
{
|
||||
installProgress?.Report(0f);
|
||||
|
||||
Reference in New Issue
Block a user