Changed Sqlite to microsoft sqlite implementation
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<DebugType>full</DebugType>
|
||||
|
||||
12
DiscordBotCore/API/Endpoints/ApiEndpointBase.cs
Normal file
12
DiscordBotCore/API/Endpoints/ApiEndpointBase.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using DiscordBotCore.Online;
|
||||
|
||||
namespace DiscordBotCore.API.Endpoints;
|
||||
|
||||
public class ApiEndpointBase
|
||||
{
|
||||
internal IPluginManager PluginManager { get; }
|
||||
public ApiEndpointBase(IPluginManager pluginManager)
|
||||
{
|
||||
PluginManager = pluginManager;
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ public class ApiManager
|
||||
AddEndpoint(new HomeEndpoint());
|
||||
AddEndpoint(new PluginListEndpoint());
|
||||
AddEndpoint(new PluginListInstalledEndpoint());
|
||||
AddEndpoint(new PluginInstallEndpoint());
|
||||
AddEndpoint(new PluginInstallEndpoint(Application.CurrentApplication.PluginManager));
|
||||
|
||||
AddEndpoint(new SettingsChangeEndpoint());
|
||||
AddEndpoint(new SettingsGetEndpoint());
|
||||
|
||||
@@ -2,28 +2,34 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using DiscordBotCore.Interfaces.API;
|
||||
using DiscordBotCore.Online;
|
||||
using DiscordBotCore.Others;
|
||||
using DiscordBotCore.Plugin;
|
||||
|
||||
namespace DiscordBotCore.API.Endpoints.PluginManagement;
|
||||
|
||||
public class PluginInstallEndpoint : IEndpoint
|
||||
public class PluginInstallEndpoint : ApiEndpointBase, IEndpoint
|
||||
{
|
||||
public PluginInstallEndpoint(IPluginManager pluginManager) : base(pluginManager)
|
||||
{
|
||||
}
|
||||
|
||||
public string Path => "/api/plugin/install";
|
||||
public EndpointType HttpMethod => EndpointType.Post;
|
||||
|
||||
public async Task<ApiResponse> HandleRequest(string? jsonRequest)
|
||||
{
|
||||
Dictionary<string, string> jsonDict = await JsonManager.ConvertFromJson<Dictionary<string, string>>(jsonRequest);
|
||||
string pluginName = jsonDict["pluginName"];
|
||||
|
||||
OnlinePlugin? pluginInfo = await Application.CurrentApplication.PluginManager.GetPluginDataByName(pluginName);
|
||||
OnlinePlugin? pluginInfo = await PluginManager.GetPluginDataByName(pluginName);
|
||||
|
||||
if (pluginInfo == null)
|
||||
{
|
||||
return ApiResponse.Fail("Plugin not found.");
|
||||
}
|
||||
|
||||
Application.CurrentApplication.PluginManager.InstallPluginNoProgress(pluginInfo);
|
||||
PluginManager.InstallPluginNoProgress(pluginInfo);
|
||||
return ApiResponse.Ok();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SQLite;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace DiscordBotCore.Database;
|
||||
|
||||
public class SqlDatabase
|
||||
{
|
||||
private readonly SQLiteConnection _Connection;
|
||||
private readonly SqliteConnection _Connection;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize a SQL connection by specifying its private path
|
||||
@@ -17,10 +17,9 @@ public class SqlDatabase
|
||||
/// <param name="fileName">The path to the database (it is starting from ./Data/Resources/)</param>
|
||||
public SqlDatabase(string fileName)
|
||||
{
|
||||
if (!File.Exists(fileName))
|
||||
SQLiteConnection.CreateFile(fileName);
|
||||
var connectionString = $"URI=file:{fileName}";
|
||||
_Connection = new SQLiteConnection(connectionString);
|
||||
var connectionString = $"Data Source={fileName}";
|
||||
_Connection = new SqliteConnection(connectionString);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +52,7 @@ public class SqlDatabase
|
||||
|
||||
query += ")";
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
await command.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
@@ -77,7 +76,7 @@ public class SqlDatabase
|
||||
|
||||
query += ")";
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
@@ -92,7 +91,7 @@ public class SqlDatabase
|
||||
{
|
||||
var query = $"DELETE FROM {tableName} WHERE {KeyName} = '{KeyValue}'";
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
await command.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
@@ -107,7 +106,7 @@ public class SqlDatabase
|
||||
{
|
||||
var query = $"DELETE FROM {tableName} WHERE {KeyName} = '{KeyValue}'";
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
@@ -341,7 +340,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var answer = await command.ExecuteNonQueryAsync();
|
||||
return answer;
|
||||
}
|
||||
@@ -355,7 +354,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
_Connection.Open();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var r = command.ExecuteNonQuery();
|
||||
|
||||
return r;
|
||||
@@ -370,7 +369,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var reader = await command.ExecuteReaderAsync();
|
||||
|
||||
var values = new object[reader.FieldCount];
|
||||
@@ -394,7 +393,7 @@ public class SqlDatabase
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
var p = CreateParameter(parameter);
|
||||
@@ -423,7 +422,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
_Connection.Open();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var reader = command.ExecuteReader();
|
||||
|
||||
var values = new object[reader.FieldCount];
|
||||
@@ -445,7 +444,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var reader = await command.ExecuteReaderAsync();
|
||||
|
||||
var values = new object[reader.FieldCount];
|
||||
@@ -463,7 +462,7 @@ public class SqlDatabase
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
var p = CreateParameter(parameter);
|
||||
@@ -493,7 +492,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
_Connection.Open();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var reader = command.ExecuteReader();
|
||||
|
||||
var values = new object[reader.FieldCount];
|
||||
@@ -516,7 +515,7 @@ public class SqlDatabase
|
||||
{
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
var reader = await command.ExecuteReaderAsync();
|
||||
|
||||
if (!reader.HasRows)
|
||||
@@ -541,9 +540,10 @@ public class SqlDatabase
|
||||
/// <param name="name">The name of the parameter</param>
|
||||
/// <param name="value">The value of the parameter</param>
|
||||
/// <returns>The SQLiteParameter that has the name, value and DBType set according to your inputs</returns>
|
||||
private static SQLiteParameter? CreateParameter(string name, object value)
|
||||
private static SqliteParameter? CreateParameter(string name, object value)
|
||||
{
|
||||
var parameter = new SQLiteParameter(name);
|
||||
var parameter = new SqliteParameter();
|
||||
parameter.ParameterName = name;
|
||||
parameter.Value = value;
|
||||
|
||||
if (value is string)
|
||||
@@ -598,7 +598,7 @@ public class SqlDatabase
|
||||
/// </summary>
|
||||
/// <param name="parameterValues">The parameter raw inputs. The Key is name and the Value is the value of the parameter</param>
|
||||
/// <returns>The SQLiteParameter that has the name, value and DBType set according to your inputs</returns>
|
||||
private static SQLiteParameter? CreateParameter(KeyValuePair<string, object> parameterValues)
|
||||
private static SqliteParameter? CreateParameter(KeyValuePair<string, object> parameterValues)
|
||||
{
|
||||
return CreateParameter(parameterValues.Key, parameterValues.Value);
|
||||
}
|
||||
@@ -614,7 +614,7 @@ public class SqlDatabase
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
var p = CreateParameter(parameter);
|
||||
@@ -638,7 +638,7 @@ public class SqlDatabase
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
var p = CreateParameter(parameter);
|
||||
@@ -672,7 +672,7 @@ public class SqlDatabase
|
||||
if (!_Connection.State.HasFlag(ConnectionState.Open))
|
||||
await _Connection.OpenAsync();
|
||||
|
||||
var command = new SQLiteCommand(query, _Connection);
|
||||
var command = new SqliteCommand(query, _Connection);
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
var p = CreateParameter(parameter);
|
||||
|
||||
@@ -4,9 +4,12 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Discord.Net" Version="3.15.3" />
|
||||
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.118" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<UpToDateCheckInput Remove="UI\Controls\MessageBox.axaml" />
|
||||
|
||||
@@ -7,11 +7,12 @@ using DiscordBotCore.Plugin;
|
||||
|
||||
namespace DiscordBotCore.Online.Helpers;
|
||||
|
||||
internal class PluginRepository : IPluginRepository
|
||||
public class PluginRepository : IPluginRepository
|
||||
{
|
||||
private readonly IPluginRepositoryConfiguration _pluginRepositoryConfiguration;
|
||||
private readonly HttpClient _httpClient;
|
||||
internal PluginRepository(IPluginRepositoryConfiguration pluginRepositoryConfiguration)
|
||||
public HttpClient _httpClient;
|
||||
|
||||
public PluginRepository(IPluginRepositoryConfiguration pluginRepositoryConfiguration)
|
||||
{
|
||||
_pluginRepositoryConfiguration = pluginRepositoryConfiguration;
|
||||
_httpClient = new HttpClient();
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using DiscordBotCore.Interfaces.PluginManagement;
|
||||
|
||||
namespace DiscordBotCore.Online.Helpers;
|
||||
@@ -10,6 +11,7 @@ public class PluginRepositoryConfiguration : IPluginRepositoryConfiguration
|
||||
public string PluginRepositoryLocation { get; }
|
||||
public string DependenciesRepositoryLocation { get; }
|
||||
|
||||
[JsonConstructor]
|
||||
public PluginRepositoryConfiguration(string baseUrl, string pluginRepositoryLocation, string dependenciesRepositoryLocation)
|
||||
{
|
||||
BaseUrl = baseUrl;
|
||||
|
||||
@@ -9,7 +9,24 @@ using DiscordBotCore.Plugin;
|
||||
|
||||
namespace DiscordBotCore.Online;
|
||||
|
||||
public sealed class PluginManager
|
||||
public interface IPluginManager
|
||||
{
|
||||
Task<List<OnlinePlugin>> GetPluginsList();
|
||||
Task<OnlinePlugin?> GetPluginDataByName(string pluginName);
|
||||
Task AppendPluginToDatabase(PluginInfo pluginData);
|
||||
Task<List<PluginInfo>> GetInstalledPlugins();
|
||||
Task<bool> IsPluginInstalled(string pluginName);
|
||||
Task<bool> MarkPluginToUninstall(string pluginName);
|
||||
Task UninstallMarkedPlugins();
|
||||
Task<string?> GetDependencyLocation(string dependencyName);
|
||||
Task<string?> GetDependencyLocation(string dependencyName, string pluginName);
|
||||
string GenerateDependencyRelativePath(string pluginName, string dependencyPath);
|
||||
Task InstallPluginNoProgress(OnlinePlugin plugin);
|
||||
Task<Tuple<Dictionary<string, string>, List<OnlineDependencyInfo>>> GatherInstallDataForPlugin(OnlinePlugin plugin);
|
||||
Task SetEnabledStatus(string pluginName, bool status);
|
||||
}
|
||||
|
||||
public sealed class PluginManager : IPluginManager
|
||||
{
|
||||
private static readonly string _LibrariesBaseFolder = "Libraries";
|
||||
private readonly IPluginRepository _PluginRepository;
|
||||
|
||||
45
SethCoreTests/ApiTests.cs
Normal file
45
SethCoreTests/ApiTests.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using DiscordBotCore;
|
||||
using DiscordBotCore.API.Endpoints.PluginManagement;
|
||||
using DiscordBotCore.Online;
|
||||
using DiscordBotCore.Plugin;
|
||||
using Moq;
|
||||
|
||||
namespace SethCoreTests;
|
||||
|
||||
public class PluginInstallEndpointTests
|
||||
{
|
||||
private readonly Mock<IPluginManager> _mockPluginManager;
|
||||
private readonly PluginInstallEndpoint _endpoint;
|
||||
|
||||
public PluginInstallEndpointTests()
|
||||
{
|
||||
_mockPluginManager = new Mock<IPluginManager>();
|
||||
_endpoint = new PluginInstallEndpoint(_mockPluginManager.Object);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HandleRequest_SuccessfulPluginInstallation_ReturnsOk()
|
||||
{
|
||||
var pluginName = "TestPlugin";
|
||||
var pluginInfo = new OnlinePlugin(1, pluginName, "Description", "1.0", "Author", "http://link", 1);
|
||||
_mockPluginManager.Setup(pm => pm.GetPluginDataByName(pluginName)).ReturnsAsync(pluginInfo);
|
||||
_mockPluginManager.Setup(pm => pm.InstallPluginNoProgress(pluginInfo)).Returns(Task.CompletedTask);
|
||||
|
||||
var jsonRequest = $"{{\"pluginName\":\"{pluginName}\"}}";
|
||||
var response = await _endpoint.HandleRequest(jsonRequest);
|
||||
|
||||
Assert.True(response.Success);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HandleRequest_PluginNotFound_ReturnsFail()
|
||||
{
|
||||
var pluginName = "NonExistentPlugin";
|
||||
_mockPluginManager.Setup(pm => pm.GetPluginDataByName(pluginName)).ReturnsAsync((OnlinePlugin?)null);
|
||||
|
||||
var jsonRequest = $"{{\"pluginName\":\"{pluginName}\"}}";
|
||||
var response = await _endpoint.HandleRequest(jsonRequest);
|
||||
|
||||
Assert.False(response.Success);
|
||||
}
|
||||
}
|
||||
69
SethCoreTests/PluginRepositoryTests.cs
Normal file
69
SethCoreTests/PluginRepositoryTests.cs
Normal file
@@ -0,0 +1,69 @@
|
||||
using System.Net;
|
||||
using DiscordBotCore.Interfaces.PluginManagement;
|
||||
using DiscordBotCore.Online.Helpers;
|
||||
using Moq;
|
||||
using Moq.Protected;
|
||||
|
||||
namespace SethCoreTests;
|
||||
|
||||
public class PluginRepositoryTests
|
||||
{
|
||||
private readonly Mock<IPluginRepositoryConfiguration> _mockConfig;
|
||||
private readonly Mock<HttpMessageHandler> _mockHttpMessageHandler;
|
||||
private readonly PluginRepository _pluginRepository;
|
||||
|
||||
public PluginRepositoryTests()
|
||||
{
|
||||
_mockConfig = new Mock<IPluginRepositoryConfiguration>();
|
||||
_mockConfig.SetupGet(c => c.BaseUrl).Returns("http://localhost/");
|
||||
_mockConfig.SetupGet(c => c.PluginRepositoryLocation).Returns("api/plugins/");
|
||||
_mockConfig.SetupGet(c => c.DependenciesRepositoryLocation).Returns("api/dependencies/");
|
||||
|
||||
_mockHttpMessageHandler = new Mock<HttpMessageHandler>();
|
||||
var httpClient = new HttpClient(_mockHttpMessageHandler.Object)
|
||||
{
|
||||
BaseAddress = new System.Uri(_mockConfig.Object.BaseUrl)
|
||||
};
|
||||
|
||||
_pluginRepository = new PluginRepository(_mockConfig.Object)
|
||||
{
|
||||
_httpClient = httpClient
|
||||
};
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetAllPlugins_ReturnsListOfPlugins()
|
||||
{
|
||||
var pluginsJson = "[{\"PluginId\":1,\"PluginName\":\"TestPlugin\",\"PluginDescription\":\"Description\",\"LatestVersion\":\"1.0\",\"PluginAuthor\":\"Author\",\"PluginLink\":\"http://link\",\"OperatingSystem\":1}]";
|
||||
_mockHttpMessageHandler.Protected()
|
||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
||||
.ReturnsAsync(new HttpResponseMessage
|
||||
{
|
||||
StatusCode = HttpStatusCode.OK,
|
||||
Content = new StringContent(pluginsJson)
|
||||
});
|
||||
|
||||
var result = await _pluginRepository.GetAllPlugins();
|
||||
|
||||
Assert.Single(result);
|
||||
Assert.Equal("TestPlugin", result[0].PluginName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetPluginById_ReturnsPlugin()
|
||||
{
|
||||
var pluginJson = "{\"PluginId\":1,\"PluginName\":\"TestPlugin\",\"PluginDescription\":\"Description\",\"LatestVersion\":\"1.0\",\"PluginAuthor\":\"Author\",\"PluginLink\":\"http://link\",\"OperatingSystem\":1}";
|
||||
_mockHttpMessageHandler.Protected()
|
||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
||||
.ReturnsAsync(new HttpResponseMessage
|
||||
{
|
||||
StatusCode = HttpStatusCode.OK,
|
||||
Content = new StringContent(pluginJson)
|
||||
});
|
||||
|
||||
var result = await _pluginRepository.GetPluginById(1);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal("TestPlugin", result.PluginName);
|
||||
}
|
||||
}
|
||||
28
SethCoreTests/SethCoreTests.csproj
Normal file
28
SethCoreTests/SethCoreTests.csproj
Normal file
@@ -0,0 +1,28 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.0"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
|
||||
<PackageReference Include="Moq" Version="4.20.72" />
|
||||
<PackageReference Include="xunit" Version="2.5.3"/>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\DiscordBotCore\DiscordBotCore.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -25,6 +25,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CppCompatibilityModule", "M
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscordBotWebUI", "DiscordBotWebUI\DiscordBotWebUI.csproj", "{8683B195-B729-48BB-805A-D44CA98A0BF6}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SethTests", "SethTests", "{9D2F471B-89EE-4F17-B1EA-869069A9A3B8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SethCoreTests", "SethCoreTests\SethCoreTests.csproj", "{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -63,6 +67,10 @@ Global
|
||||
{8683B195-B729-48BB-805A-D44CA98A0BF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8683B195-B729-48BB-805A-D44CA98A0BF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8683B195-B729-48BB-805A-D44CA98A0BF6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -73,6 +81,7 @@ Global
|
||||
{FCE9743F-7EB4-4639-A080-FCDDFCC7D689} = {5CF9AD7B-6BF0-4035-835F-722F989C01E1}
|
||||
{F3C61A47-F758-4145-B496-E3ECCF979D89} = {5CF9AD7B-6BF0-4035-835F-722F989C01E1}
|
||||
{C67908F9-4A55-4DD8-B993-C26C648226F1} = {EA4FA308-7B2C-458E-8485-8747D745DD59}
|
||||
{AB4BD8D1-7384-4669-9D75-3BBECFA0A96E} = {9D2F471B-89EE-4F17-B1EA-869069A9A3B8}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF}
|
||||
|
||||
Reference in New Issue
Block a user