diff --git a/Libraries/SPTarkov.Server.Assets/Assets/database/locales/server/en.json b/Libraries/SPTarkov.Server.Assets/Assets/database/locales/server/en.json
index cc92f3ba..33e408f1 100644
--- a/Libraries/SPTarkov.Server.Assets/Assets/database/locales/server/en.json
+++ b/Libraries/SPTarkov.Server.Assets/Assets/database/locales/server/en.json
@@ -730,5 +730,6 @@
"chatbot-forced_event_enabled": "%s event has been enabled, restart your game client before starting a raid",
"chatbot-added_stash_rows_please_restart": "Added 2 rows to stash, please restart your game to see them",
"chatbot-snow_enabled": "Snow is enabled for all subsequent raids until the server is restarted",
- "chatbot-summer_enabled": "Summer has been enabled for all subsequent raids until the server is restarted"
-}
+ "chatbot-summer_enabled": "Summer has been enabled for all subsequent raids until the server is restarted",
+ "webserver_already_running": "Another copy of the webserver is already running. Please shut it down before starting a new one."
+}
\ No newline at end of file
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/HttpServerHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/HttpServerHelper.cs
index a9f09294..ad844256 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/HttpServerHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/HttpServerHelper.cs
@@ -54,6 +54,28 @@ public class HttpServerHelper(ConfigServer configServer)
return $"wss://{BuildUrl()}";
}
+ ///
+ /// Method to determine if another version of the server is already running
+ ///
+ /// bool isAlreadyRunning
+ public async Task IsAlreadyRunning()
+ {
+ try
+ {
+ var handler = new HttpClientHandler()
+ {
+ ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
+ };
+ var http = new HttpClient(handler);
+ var res = await http.PostAsync($"{GetBackendUrl()}/launcher/ping", null);
+ return res.IsSuccessStatusCode;
+ }
+ catch (Exception )
+ {
+ return false;
+ }
+ }
+
public void SendTextJson(HttpResponse resp, object output)
{
resp.Headers.Append("Content-Type", mime["json"]);
diff --git a/Libraries/SPTarkov.Server.Core/Utils/App.cs b/Libraries/SPTarkov.Server.Core/Utils/App.cs
index 98195eac..f20e56cd 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/App.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/App.cs
@@ -1,5 +1,6 @@
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.DI;
+using SPTarkov.Server.Core.Helpers;
using SPTarkov.Server.Core.Models.Spt.Config;
using SPTarkov.Server.Core.Models.Utils;
using SPTarkov.Server.Core.Servers;
@@ -17,6 +18,7 @@ public class App
protected DatabaseService _databaseService;
protected EncodingUtil _encodingUtil;
protected HttpServer _httpServer;
+ protected HttpServerHelper _httpServerHelper;
protected LocalisationService _localisationService;
protected ISptLogger _logger;
@@ -36,7 +38,8 @@ public class App
HttpServer httpServer,
DatabaseService databaseService,
IEnumerable onLoadComponents,
- IEnumerable onUpdateComponents
+ IEnumerable onUpdateComponents,
+ HttpServerHelper httpServerHelper
)
{
_logger = logger;
@@ -46,6 +49,7 @@ public class App
_configServer = configServer;
_encodingUtil = encodingUtil;
_httpServer = httpServer;
+ _httpServerHelper = httpServerHelper;
_databaseService = databaseService;
_onLoad = onLoadComponents;
_onUpdate = onUpdateComponents;
@@ -58,6 +62,13 @@ public class App
// execute onLoad callbacks
_logger.Info(_localisationService.GetText("executing_startup_callbacks"));
+ var isAlreadyRunning = await _httpServerHelper.IsAlreadyRunning();
+ if (isAlreadyRunning)
+ {
+ _logger.Critical(_localisationService.GetText("webserver_already_running"));
+ await Task.Delay(Timeout.Infinite);
+ }
+
if (_logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"OS: {Environment.OSVersion.Version} | {Environment.OSVersion.Platform}");