mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Added built-in plugin copying
This commit is contained in:
parent
cad98ae850
commit
254a8e311f
@ -113,6 +113,7 @@
|
|||||||
<Compile Include="Constants.cs" />
|
<Compile Include="Constants.cs" />
|
||||||
<Compile Include="Events\DeviceEventArgs.cs" />
|
<Compile Include="Events\DeviceEventArgs.cs" />
|
||||||
<Compile Include="Exceptions\ArtemisCoreException.cs" />
|
<Compile Include="Exceptions\ArtemisCoreException.cs" />
|
||||||
|
<Compile Include="Extensions\DirectoryInfoExtensions.cs" />
|
||||||
<Compile Include="Extensions\RgbColorExtensions.cs" />
|
<Compile Include="Extensions\RgbColorExtensions.cs" />
|
||||||
<Compile Include="Extensions\RgbRectangleExtensions.cs" />
|
<Compile Include="Extensions\RgbRectangleExtensions.cs" />
|
||||||
<Compile Include="Models\DataModelDescription.cs" />
|
<Compile Include="Models\DataModelDescription.cs" />
|
||||||
|
|||||||
15
src/Artemis.Core/Extensions/DirectoryInfoExtensions.cs
Normal file
15
src/Artemis.Core/Extensions/DirectoryInfoExtensions.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Artemis.Core.Extensions
|
||||||
|
{
|
||||||
|
public static class DirectoryInfoExtensions
|
||||||
|
{
|
||||||
|
public static void CopyFilesRecursively(this DirectoryInfo source, DirectoryInfo target)
|
||||||
|
{
|
||||||
|
foreach (var dir in source.GetDirectories())
|
||||||
|
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
|
||||||
|
foreach (var file in source.GetFiles())
|
||||||
|
file.CopyTo(Path.Combine(target.FullName, file.Name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -39,6 +39,7 @@ namespace Artemis.Core.Services
|
|||||||
throw new ArtemisCoreException("Cannot initialize the core as it is already initialized.");
|
throw new ArtemisCoreException("Cannot initialize the core as it is already initialized.");
|
||||||
|
|
||||||
// Initialize the services
|
// Initialize the services
|
||||||
|
await Task.Run(() => _pluginService.CopyBuiltInPlugins());
|
||||||
await Task.Run(() => _pluginService.LoadPlugins());
|
await Task.Run(() => _pluginService.LoadPlugins());
|
||||||
|
|
||||||
OnInitialized();
|
OnInitialized();
|
||||||
|
|||||||
@ -13,6 +13,12 @@ namespace Artemis.Core.Services.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
bool LoadingPlugins { get; }
|
bool LoadingPlugins { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy built-in plugins from the executable directory to the plugins directory if the version is higher
|
||||||
|
/// (higher or equal if compiled as debug)
|
||||||
|
/// </summary>
|
||||||
|
void CopyBuiltInPlugins();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads all installed plugins. If plugins already loaded this will reload them all
|
/// Loads all installed plugins. If plugins already loaded this will reload them all
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using System.Linq;
|
|||||||
using AppDomainToolkit;
|
using AppDomainToolkit;
|
||||||
using Artemis.Core.Events;
|
using Artemis.Core.Events;
|
||||||
using Artemis.Core.Exceptions;
|
using Artemis.Core.Exceptions;
|
||||||
|
using Artemis.Core.Extensions;
|
||||||
using Artemis.Core.Plugins.Abstract;
|
using Artemis.Core.Plugins.Abstract;
|
||||||
using Artemis.Core.Plugins.Exceptions;
|
using Artemis.Core.Plugins.Exceptions;
|
||||||
using Artemis.Core.Plugins.Models;
|
using Artemis.Core.Plugins.Models;
|
||||||
@ -30,6 +31,7 @@ namespace Artemis.Core.Services
|
|||||||
_kernel = kernel;
|
_kernel = kernel;
|
||||||
_plugins = new List<PluginInfo>();
|
_plugins = new List<PluginInfo>();
|
||||||
|
|
||||||
|
// Ensure the plugins directory exists
|
||||||
if (!Directory.Exists(Constants.DataFolder + "plugins"))
|
if (!Directory.Exists(Constants.DataFolder + "plugins"))
|
||||||
Directory.CreateDirectory(Constants.DataFolder + "plugins");
|
Directory.CreateDirectory(Constants.DataFolder + "plugins");
|
||||||
}
|
}
|
||||||
@ -37,6 +39,54 @@ namespace Artemis.Core.Services
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool LoadingPlugins { get; private set; }
|
public bool LoadingPlugins { get; private set; }
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public void CopyBuiltInPlugins()
|
||||||
|
{
|
||||||
|
var pluginDirectory = new DirectoryInfo(Path.Combine(Constants.DataFolder, "plugins"));
|
||||||
|
|
||||||
|
// Iterate built-in plugins
|
||||||
|
var varBuiltInPluginDirectory = new DirectoryInfo(Path.Combine(Directory.GetCurrentDirectory(), "Plugins"));
|
||||||
|
foreach (var subDirectory in varBuiltInPluginDirectory.EnumerateDirectories())
|
||||||
|
{
|
||||||
|
// Load the metadata
|
||||||
|
var builtInMetadataFile = Path.Combine(subDirectory.FullName, "plugin.json");
|
||||||
|
if (!File.Exists(builtInMetadataFile))
|
||||||
|
throw new ArtemisPluginException("Couldn't find the built-in plugins metadata file at " + builtInMetadataFile);
|
||||||
|
|
||||||
|
var builtInPluginInfo = JsonConvert.DeserializeObject<PluginInfo>(File.ReadAllText(builtInMetadataFile));
|
||||||
|
|
||||||
|
// Find the matching plugin in the plugin folder
|
||||||
|
var match = pluginDirectory.EnumerateDirectories().FirstOrDefault(d => d.Name == subDirectory.Name);
|
||||||
|
if (match == null)
|
||||||
|
CopyBuiltInPlugin(subDirectory);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var metadataFile = Path.Combine(match.FullName, "plugin.json");
|
||||||
|
if (!File.Exists(metadataFile))
|
||||||
|
CopyBuiltInPlugin(subDirectory);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Compare versions, copy if the same when debugging
|
||||||
|
var pluginInfo = JsonConvert.DeserializeObject<PluginInfo>(File.ReadAllText(builtInMetadataFile));
|
||||||
|
#if DEBUG
|
||||||
|
if (builtInPluginInfo.Version >= pluginInfo.Version)
|
||||||
|
CopyBuiltInPlugin(subDirectory);
|
||||||
|
#else
|
||||||
|
if (builtInPluginInfo.Version > pluginInfo.Version)
|
||||||
|
CopyBuiltInPlugin(subDirectory);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ArtemisPluginException("Failed read plugin metadata needed to install built-in plugin", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void LoadPlugins()
|
public void LoadPlugins()
|
||||||
{
|
{
|
||||||
@ -54,8 +104,8 @@ namespace Artemis.Core.Services
|
|||||||
_childKernel = new ChildKernel(_kernel);
|
_childKernel = new ChildKernel(_kernel);
|
||||||
|
|
||||||
// Load the plugin assemblies into the plugin context
|
// Load the plugin assemblies into the plugin context
|
||||||
var directory = new DirectoryInfo(Path.Combine(Constants.DataFolder, "plugins"));
|
var pluginDirectory = new DirectoryInfo(Path.Combine(Constants.DataFolder, "plugins"));
|
||||||
foreach (var subDirectory in directory.EnumerateDirectories())
|
foreach (var subDirectory in pluginDirectory.EnumerateDirectories())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -236,6 +286,17 @@ namespace Artemis.Core.Services
|
|||||||
UnloadPlugins();
|
UnloadPlugins();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CopyBuiltInPlugin(DirectoryInfo builtInPluginDirectory)
|
||||||
|
{
|
||||||
|
var pluginDirectory = new DirectoryInfo(Path.Combine(Constants.DataFolder, "plugins", builtInPluginDirectory.Name));
|
||||||
|
|
||||||
|
// Remove the old directory if it exists
|
||||||
|
if (Directory.Exists(pluginDirectory.FullName))
|
||||||
|
Directory.Delete(pluginDirectory.FullName, true);
|
||||||
|
Directory.CreateDirectory(pluginDirectory.FullName);
|
||||||
|
|
||||||
|
builtInPluginDirectory.CopyFilesRecursively(pluginDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
#region Events
|
#region Events
|
||||||
|
|
||||||
|
|||||||
@ -73,7 +73,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>(robocopy $(TargetDir) %25ProgramData%25\Artemis\plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
<PostBuildEvent>(robocopy $(TargetDir) $(SolutionDir)\Artemis.UI\$(OutDir)\Plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="..\packages\RGB.NET.Resources.Corsair.0.3.0.234\build\RGB.NET.Resources.Corsair.targets" Condition="Exists('..\packages\RGB.NET.Resources.Corsair.0.3.0.234\build\RGB.NET.Resources.Corsair.targets')" />
|
<Import Project="..\packages\RGB.NET.Resources.Corsair.0.3.0.234\build\RGB.NET.Resources.Corsair.targets" Condition="Exists('..\packages\RGB.NET.Resources.Corsair.0.3.0.234\build\RGB.NET.Resources.Corsair.targets')" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
|||||||
@ -86,6 +86,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>(robocopy $(TargetDir) %25ProgramData%25\Artemis\plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
<PostBuildEvent>(robocopy $(TargetDir) $(SolutionDir)\Artemis.UI\$(OutDir)\Plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -95,6 +95,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>(robocopy $(TargetDir) %25ProgramData%25\Artemis\plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
<PostBuildEvent>(robocopy $(TargetDir) $(SolutionDir)\Artemis.UI\$(OutDir)\Plugins\$(ProjectName) /E /NFL /NDL /NJH /NJS /nc /ns /np) ^& IF %25ERRORLEVEL%25 LEQ 4 exit /B 0</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -1,5 +1,5 @@
|
|||||||
using System.IO;
|
using System;
|
||||||
using System.Reflection;
|
using System.IO;
|
||||||
using Artemis.Storage.Entities;
|
using Artemis.Storage.Entities;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using SQLitePCL;
|
using SQLitePCL;
|
||||||
@ -14,12 +14,12 @@ namespace Artemis.Storage
|
|||||||
|
|
||||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
{
|
{
|
||||||
// var dbLocation = @"C:\Repos\Artemis\src\Artemis.Storage\Storage.db";
|
// ReSharper disable once RedundantAssignment - Used if not debugging
|
||||||
|
var dbLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Artemis\\Storage.db");
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
var dbLocation = Path.GetFullPath(Path.Combine(Assembly.GetEntryAssembly().Location, @"..\..\..\..\Artemis.Storage\Storage.db"));
|
dbLocation = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\..\Artemis.Storage\Storage.db"));
|
||||||
#else
|
|
||||||
var dbLocation = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Artemis\\Storage.db";
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
optionsBuilder.UseSqlite("Data Source=" + dbLocation);
|
optionsBuilder.UseSqlite("Data Source=" + dbLocation);
|
||||||
|
|
||||||
// Requires Microsoft.Data.Sqlite in the startup project
|
// Requires Microsoft.Data.Sqlite in the startup project
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user