Files
SethDiscordBot/WebUI/Components/Pages/Plugins/Local.razor
2025-06-17 17:20:03 +03:00

169 lines
5.3 KiB
Plaintext

@page "/plugins/local"
@rendermode InteractiveServer
@using DiscordBotCore.Logging
@using DiscordBotCore.PluginManagement
@using DiscordBotCore.PluginManagement.Loading
@using DiscordBotCore.PluginManagement.Models
@inject IPluginManager PluginManager
@inject ILogger Logger
@inject IPluginLoader PluginLoader
@inject NavigationManager Navigation
<h3>Installed Plugins</h3>
<button class="btn btn-outline-success" @onclick="NavigateToAddPlugin">
<span class="bi me-1"></span> Add Local
</button>
<table class="table table-responsive">
<thead>
<tr>
<th>Name</th>
<th>Version</th>
<th>Offline Added</th>
<th>Actions</th>
@* <th> *@
@* <button class="btn btn-outline-success" @onclick="NavigateToAddPlugin"> *@
@* <span class="bi me-1"></span> Add Local *@
@* </button> *@
@* </th> *@
</tr>
</thead>
<tbody>
@foreach (var plugin in _installedPlugins)
{
<tr>
<td>@plugin.Name</td>
<td>@plugin.Version</td>
<td>@(plugin.IsOfflineAdded ? "Yes" : "No")</td>
<td >
<button class="btn btn-danger btn-sm m-1" @onclick="async () => await DeletePluginButtonClick(plugin)">Delete</button>
@if (!plugin.IsOfflineAdded)
{
<button class="btn btn-info btn-sm m-1" @onclick="async () => await PluginDetailsButtonClick(plugin)">Details</button>
}
</td>
@* <td></td> *@
</tr>
}
</tbody>
</table>
@if (_showPluginDetailsModal && _selectedPluginDetails != null)
{
<div class="modal show d-block" tabindex="-1" style="background-color: rgba(0,0,0,0.5);">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Plugin Details: @_selectedPluginDetails.Name</h5>
<button type="button" class="btn-close" @onclick="ClosePluginDetailsModal"></button>
</div>
<div class="modal-body">
<p><strong>Version:</strong> @_selectedPluginDetails.Version</p>
<p><strong>Author:</strong> @_selectedPluginDetails.Author</p>
<p><strong>Description:</strong> @_selectedPluginDetails.Description</p>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" @onclick="ClosePluginDetailsModal">Close</button>
</div>
</div>
</div>
</div>
}
@code {
private readonly List<InstalledPlugin> _installedPlugins = new List<InstalledPlugin>();
private bool _showPluginDetailsModal;
private OnlinePlugin? _selectedPluginDetails;
private async Task DeletePluginButtonClick(InstalledPlugin plugin)
{
await PluginLoader.UnloadAllPlugins();
Logger.Log($"Deleting plugin {plugin.Name}", this);
var response = await PluginManager.UninstallPluginByName(plugin.Name);
if (!response.IsSuccess)
{
Logger.Log(response.Message, this, LogType.Error);
return;
}
_installedPlugins.RemoveAll(p => p.Name == plugin.Name);
Logger.Log($"Plugin {plugin.Name} deleted", this);
await PluginLoader.LoadPlugins();
StateHasChanged();
}
private async Task PluginDetailsButtonClick(InstalledPlugin plugin)
{
Logger.Log($"Getting plugin details for {plugin.Name}", this);
var response = await PluginManager.GetPluginDataByName(plugin.Name);
if (!response.IsSuccess)
{
Logger.Log(response.Message, this, LogType.Error);
return;
}
_selectedPluginDetails = response.Data;
_showPluginDetailsModal = true;
Logger.Log($"Plugin details for {plugin.Name} retrieved", this);
StateHasChanged();
}
private void ClosePluginDetailsModal()
{
Logger.Log("Closing plugin details modal", this);
_showPluginDetailsModal = false;
_selectedPluginDetails = null;
StateHasChanged();
}
protected override async Task OnInitializedAsync()
{
Logger.Log("Local plugins page initialized", this);
var plugins = await PluginManager.GetInstalledPlugins();
if (!plugins.Any())
{
Logger.Log("No plugins found", this, LogType.Warning);
return;
}
Logger.Log($"Found {plugins.Count} plugins", this);
_installedPlugins.Clear();
foreach (var plugin in plugins)
{
var installedPlugin = new InstalledPlugin
{
Name = plugin.PluginName,
Version = plugin.PluginVersion,
IsOfflineAdded = plugin.IsOfflineAdded
};
_installedPlugins.Add(installedPlugin);
}
StateHasChanged();
}
private class InstalledPlugin
{
public string Name { get; set; }
public string Version { get; set; }
public bool IsOfflineAdded { get; set; }
}
private void NavigateToAddPlugin()
{
Navigation.NavigateTo("/plugins/add-local");
}
}