diff --git a/src/Plugin.Common.UnitTests/Plugin.Common.UnitTests.csproj b/src/Plugin.Common.UnitTests/Plugin.Common.UnitTests.csproj
new file mode 100644
index 00000000..e8444af2
--- /dev/null
+++ b/src/Plugin.Common.UnitTests/Plugin.Common.UnitTests.csproj
@@ -0,0 +1,31 @@
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+
+ net462
+ false
+ ServerManagerTool.Plugin.Common.UnitTests
+ ServerManager.Plugin.Common.UnitTests
+
+
+ none
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Plugin.Common.UnitTests/PluginHelperUnitTest.cs b/src/Plugin.Common.UnitTests/PluginHelperUnitTest.cs
new file mode 100644
index 00000000..afac442e
--- /dev/null
+++ b/src/Plugin.Common.UnitTests/PluginHelperUnitTest.cs
@@ -0,0 +1,36 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using ServerManagerTool.Plugin.Common;
+using ServerManagerTool.Plugin.Common.Lib;
+using System.Collections.Generic;
+
+namespace Plugin.Common.UnitTests
+{
+ [TestClass]
+ public class PluginHelperUnitTest
+ {
+ [TestMethod]
+ public void PluginHelper_HandleAlert_When_SingleLineMessage_Then_Valid()
+ {
+ // Arrange
+ PluginHelper.Instance.SetFetchProfileCallback(FetchProfiles);
+
+ // Act
+ var profileList = PluginHelper.Instance.FetchProfileList();
+
+ // Assert
+ Assert.IsNotNull(profileList);
+ Assert.IsTrue(profileList.Count == 3);
+ }
+
+ public IList FetchProfiles()
+ {
+ return new List()
+ {
+ new Profile() { ProfileName = "Profile 1", InstallationFolder = @"d:\asmdata\servers\server1" },
+ new Profile() { ProfileName = "Profile 2", InstallationFolder = @"d:\asmdata\servers\server2" },
+ new Profile() { ProfileName = "Profile 3", InstallationFolder = @"d:\asmdata\servers\server3" },
+ };
+ }
+
+ }
+}
diff --git a/src/Plugin.Discord.Guide/Capture.PNG b/src/Plugin.Discord.Guide/Capture.PNG
new file mode 100644
index 00000000..abceaf74
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture1.PNG b/src/Plugin.Discord.Guide/Capture1.PNG
new file mode 100644
index 00000000..b18ec1e4
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture1.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture2.PNG b/src/Plugin.Discord.Guide/Capture2.PNG
new file mode 100644
index 00000000..5e5dea3d
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture2.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture3.PNG b/src/Plugin.Discord.Guide/Capture3.PNG
new file mode 100644
index 00000000..310e903a
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture3.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture4.PNG b/src/Plugin.Discord.Guide/Capture4.PNG
new file mode 100644
index 00000000..98965219
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture4.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture5.PNG b/src/Plugin.Discord.Guide/Capture5.PNG
new file mode 100644
index 00000000..a8863e82
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture5.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture6.PNG b/src/Plugin.Discord.Guide/Capture6.PNG
new file mode 100644
index 00000000..59b010dd
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture6.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture7.PNG b/src/Plugin.Discord.Guide/Capture7.PNG
new file mode 100644
index 00000000..fa4ef3cf
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture7.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture8.PNG b/src/Plugin.Discord.Guide/Capture8.PNG
new file mode 100644
index 00000000..7ddfd3d3
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture8.PNG differ
diff --git a/src/Plugin.Discord.Guide/Capture9.PNG b/src/Plugin.Discord.Guide/Capture9.PNG
new file mode 100644
index 00000000..178a5bfd
Binary files /dev/null and b/src/Plugin.Discord.Guide/Capture9.PNG differ
diff --git a/src/Plugin.Discord.Guide/CaptureA.PNG b/src/Plugin.Discord.Guide/CaptureA.PNG
new file mode 100644
index 00000000..af7c77c1
Binary files /dev/null and b/src/Plugin.Discord.Guide/CaptureA.PNG differ
diff --git a/src/Plugin.Discord.Guide/CaptureB.PNG b/src/Plugin.Discord.Guide/CaptureB.PNG
new file mode 100644
index 00000000..5facfe43
Binary files /dev/null and b/src/Plugin.Discord.Guide/CaptureB.PNG differ
diff --git a/src/Plugin.Discord.Guide/Discord Plugin Guide.docx b/src/Plugin.Discord.Guide/Discord Plugin Guide.docx
new file mode 100644
index 00000000..e9725ba8
Binary files /dev/null and b/src/Plugin.Discord.Guide/Discord Plugin Guide.docx differ
diff --git a/src/Plugin.Discord.UnitTests/DiscordPluginUnitTest.cs b/src/Plugin.Discord.UnitTests/DiscordPluginUnitTest.cs
new file mode 100644
index 00000000..ff62a4b9
--- /dev/null
+++ b/src/Plugin.Discord.UnitTests/DiscordPluginUnitTest.cs
@@ -0,0 +1,318 @@
+using ServerManagerTool.Plugin.Discord;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using System.Text;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using ServerManagerTool.Plugin.Common.Lib;
+
+namespace Plugin.Discord.UnitTests
+{
+ [TestClass]
+ public class DiscordPluginUnitTest
+ {
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SingleLineMessage_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("The server has been started.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 1", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SingleLineUnicodeMessage_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("Требуется перезагрузка сервера. Сейчас сервер будет выключен.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 1", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SingleLineSpecialCharacterMessage_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("Update performed, includes: Structures Plus (S+) (731604991)");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 1", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_MultipleLineMessage_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("The server is being shutdown.");
+ alertMessage.AppendLine("Please logout to avoid profile corruption.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Shutdown, "Server 2", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_MultipleLineMessageInOneLine_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ //var alertMessage = new StringBuilder();
+ //alertMessage.AppendLine("The server is being shutdown.\r\nPlease logout to avoid profile corruption.");
+ var alertMessage = "Server restart required.\r\n\r\nServer will restart in {minutes} minutes. \r\n\r\nPlease logout before restart to prevent character corruption.";
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Shutdown, "Server 2", alertMessage);
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_ErrorAlertType_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("The server encountered an error while starting.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Error, "Server 1", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SingleLineMessageToUnknownProfileName_Then_NoAlertSent()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("The server has been started.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_ExtraLongMessage_Then_AlertTruncated()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage = new StringBuilder();
+ alertMessage.AppendLine("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ac lorem pretium, volutpat massa ut, iaculis augue. Aenean condimentum gravida laoreet. Morbi mattis leo non enim imperdiet dignissim. Donec et consectetur est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur leo ipsum, commodo sed ante eu, vulputate maximus nulla. In sollicitudin, magna ut fringilla scelerisque, neque nulla semper nunc, at tempus nibh mi quis diam. Nunc quis tortor neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.");
+ alertMessage.AppendLine("Maecenas ultrices in est a iaculis.Sed eget pharetra nibh.Duis luctus neque id iaculis vestibulum.Duis condimentum sapien metus, at pretium dui aliquam ullamcorper.Sed at efficitur tellus.Praesent eget ex blandit orci venenatis fringilla et in ex.Curabitur id mauris sed augue pharetra ornare.Integer at malesuada nisl, id blandit orci.");
+ alertMessage.AppendLine("Ut ac dolor non ex porta lobortis.Aliquam sollicitudin nec justo ac finibus.Aliquam condimentum malesuada luctus.Nam ut ornare justo, a scelerisque sapien.Vivamus eget nisi risus.Morbi ut tellus ultricies arcu sagittis eleifend.Praesent eu augue in eros egestas rhoncus eu sed quam.");
+ alertMessage.AppendLine("Quisque quis facilisis ipsum.In egestas pulvinar urna, id maximus lorem vehicula nec.Fusce vel nibh tincidunt, semper risus a, consectetur nunc.Morbi at lorem libero.Donec diam eros, aliquet in enim vitae, ornare malesuada nisi.Donec a mi pharetra dolor dignissim dapibus at vel velit.Praesent tincidunt, ipsum eget finibus cursus, ex turpis accumsan dui, ut hendrerit ante tortor vitae urna.Nulla faucibus ipsum nec tellus congue rhoncus.Maecenas sed tortor placerat, lobortis arcu sit amet, pellentesque sapien.Praesent sit amet feugiat massa.");
+ alertMessage.AppendLine("Vestibulum eu felis accumsan, vehicula metus ut, gravida nulla.Sed pharetra sed ex vel sodales.In vestibulum, nisl vitae ultricies mattis, lacus massa maximus nunc, id suscipit lorem ligula id tortor.Donec porttitor diam ac turpis posuere aliquam.Phasellus non sed.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Shutdown, "Server 3", alertMessage.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SendingMultipleMessagesSingleServer_Then_Valid()
+ {
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ SendMultipleMessages(plugin, "Server 1");
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SendingMultipleMessagesMultipleServers_Sync_Then_Valid()
+ {
+ // Arrange
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ var alertMessage1 = new StringBuilder();
+ alertMessage1.AppendLine("Message 1 - shutdown 1.");
+ var alertMessage2 = new StringBuilder();
+ alertMessage2.AppendLine("Message 2 - shutdown 2.");
+ var alertMessage3 = new StringBuilder();
+ alertMessage3.AppendLine("Message 3 - start.");
+ var alertMessage4 = new StringBuilder();
+ alertMessage4.AppendLine("Message 4 - update reason.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 1", alertMessage1.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 2", alertMessage1.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 3", alertMessage1.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 4", alertMessage1.ToString());
+ Task.Delay(2000).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 1", alertMessage2.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 2", alertMessage2.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 3", alertMessage2.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, "Server 4", alertMessage2.ToString());
+ Task.Delay(2000).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 1", alertMessage3.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 2", alertMessage3.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 3", alertMessage3.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, "Server 4", alertMessage3.ToString());
+ Task.Delay(2000).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.UpdateResults, "Server 1", alertMessage4.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.UpdateResults, "Server 2", alertMessage4.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.UpdateResults, "Server 3", alertMessage4.ToString());
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.UpdateResults, "Server 4", alertMessage4.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_HandleAlert_When_SendingMultipleMessagesMultipleServers_ASync_Then_Valid()
+ {
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ Parallel.For(1, 9, (i) => {
+ switch (i)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ SendMultipleMessages(plugin, $"Server {i}");
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ SendMultipleErrors(plugin, $"Server {i-4}");
+ break;
+ }
+ });
+ }
+
+ private void SendMultipleMessages(DiscordPlugin plugin, string profileName)
+ {
+ // Arrange
+ Random rnd = new Random();
+ var alertMessage1 = new StringBuilder();
+ alertMessage1.AppendLine("Message 1 - shutdown 1.");
+ var alertMessage2 = new StringBuilder();
+ alertMessage2.AppendLine("Message 2 - shutdown 2.");
+ var alertMessage3 = new StringBuilder();
+ alertMessage3.AppendLine("Message 3 - start.");
+ var alertMessage4 = new StringBuilder();
+ alertMessage4.AppendLine("Message 4 - update reason.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, profileName, alertMessage1.ToString());
+ Task.Delay(rnd.Next(1000, 5000)).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.ShutdownMessage, profileName, alertMessage2.ToString());
+ Task.Delay(rnd.Next(1000, 5000)).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Startup, profileName, alertMessage3.ToString());
+ Task.Delay(rnd.Next(1000, 5000)).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.UpdateResults, profileName, alertMessage4.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ private void SendMultipleErrors(DiscordPlugin plugin, string profileName)
+ {
+ // Arrange
+ Random rnd = new Random();
+ var alertMessage1 = new StringBuilder();
+ alertMessage1.AppendLine("Error 1.");
+ var alertMessage2 = new StringBuilder();
+ alertMessage2.AppendLine("Error 2.");
+
+ // Act
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Error, profileName, alertMessage1.ToString());
+ Task.Delay(rnd.Next(1000, 5000)).Wait();
+ plugin.HandleAlert(ServerManagerTool.Plugin.Common.AlertType.Error, profileName, alertMessage2.ToString());
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_OpenConfigForm()
+ {
+ // Arrange
+ ServerManagerTool.Plugin.Common.PluginHelper.Instance.SetFetchProfileCallback(FetchProfiles);
+
+ var plugin = new DiscordPlugin();
+ plugin.Initialize();
+
+ // Act
+ plugin.OpenConfigForm(null);
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ [TestMethod]
+ public void DiscordPlugin_OpenConfigForm_DebugMode()
+ {
+ // Arrange
+ ServerManagerTool.Plugin.Common.PluginHelper.Instance.SetFetchProfileCallback(FetchProfiles);
+
+ var plugin = new DiscordPlugin();
+ plugin.BetaEnabled = true;
+ plugin.Initialize();
+
+ // Act
+ plugin.OpenConfigForm(null);
+
+ // Assert
+ Assert.IsTrue(true);
+ }
+
+ private IList FetchProfiles()
+ {
+ return new List()
+ {
+ new Profile() { ProfileName = "Profile 1", InstallationFolder = @"d:\asmdata\servers\server1" },
+ new Profile() { ProfileName = "Profile 2", InstallationFolder = @"d:\asmdata\servers\server2" },
+ new Profile() { ProfileName = "Profile 3", InstallationFolder = @"d:\asmdata\servers\server3" },
+ };
+ }
+ }
+}
diff --git a/src/Plugin.Discord.UnitTests/Plugin.Discord.UnitTests.csproj b/src/Plugin.Discord.UnitTests/Plugin.Discord.UnitTests.csproj
new file mode 100644
index 00000000..ba23acff
--- /dev/null
+++ b/src/Plugin.Discord.UnitTests/Plugin.Discord.UnitTests.csproj
@@ -0,0 +1,31 @@
+
+
+ %24/Development/ServerManagers/Main/Plugin.Discord.UnitTests
+ {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
+ https://dev.azure.com/bretthewitson
+ .
+
+
+ net462
+ false
+ ServerManagerTool.Plugin.Discord.UnitTests
+ ServerManager.Plugin.Discord.UnitTests
+
+
+ none
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Plugin.Discord.UnitTests/Properties/AssemblyInfo.cs b/src/Plugin.Discord.UnitTests/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..20e3f1a8
--- /dev/null
+++ b/src/Plugin.Discord.UnitTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,19 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("Plugin.Discord.UnitTests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Bletch1971")]
+[assembly: AssemblyProduct("Plugin.Discord.UnitTests")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: ComVisible(false)]
+
+[assembly: Guid("8d13fc88-9508-4c3a-8ed0-f7bd46e343cc")]
+
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/Server-Managers.sln b/src/Server-Managers.sln
index 7cddbc75..b3341fea 100644
--- a/src/Server-Managers.sln
+++ b/src/Server-Managers.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31911.196
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.Common", "ServerManager.Common\ServerManager.Common.csproj", "{7C99D9F7-0C65-4116-927A-94EB018C88FD}"
EndProject
@@ -40,7 +40,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARKServerManager.Common", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConanServerManager.Common", "ConanServerManager.Common\ConanServerManager.Common.csproj", "{630422CA-4BCC-4D1D-9701-87D8EAF0B209}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerManager.WebApplication", "ServerManager.WebApplication\ServerManager.WebApplication.csproj", "{39C42E58-36BD-4C6B-9AD2-7F9EBCA7A68A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.WebApplication", "ServerManager.WebApplication\ServerManager.WebApplication.csproj", "{39C42E58-36BD-4C6B-9AD2-7F9EBCA7A68A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plugin.Common.UnitTests", "Plugin.Common.UnitTests\Plugin.Common.UnitTests.csproj", "{A8BFC452-5BE8-41E7-BD1D-C29B944185CE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plugin.Discord.UnitTests", "Plugin.Discord.UnitTests\Plugin.Discord.UnitTests.csproj", "{1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -133,6 +137,18 @@ Global
{39C42E58-36BD-4C6B-9AD2-7F9EBCA7A68A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{39C42E58-36BD-4C6B-9AD2-7F9EBCA7A68A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{39C42E58-36BD-4C6B-9AD2-7F9EBCA7A68A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Debug - Beta|Any CPU.ActiveCfg = Debug|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Debug - Beta|Any CPU.Build.0 = Debug|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Debug - Beta|Any CPU.ActiveCfg = Debug|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Debug - Beta|Any CPU.Build.0 = Debug|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -145,6 +161,8 @@ Global
{D2EE1483-021F-4900-BBE8-88338D1386F4} = {44D8A1A2-01FF-4DD3-A201-AD9A26F7798D}
{96832688-29BD-464F-9DCE-482E37BFC751} = {44D8A1A2-01FF-4DD3-A201-AD9A26F7798D}
{4CA9C894-518F-42D7-BBE2-CFDFE7A03F8A} = {44D8A1A2-01FF-4DD3-A201-AD9A26F7798D}
+ {A8BFC452-5BE8-41E7-BD1D-C29B944185CE} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
+ {1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4201246C-6E53-4209-883D-A4F084C19187}