diff --git a/ArchiSteamFarm/ArchiServiceInstaller.cs b/ArchiSteamFarm/ArchiServiceInstaller.cs
new file mode 100644
index 000000000..8f2508fcb
--- /dev/null
+++ b/ArchiSteamFarm/ArchiServiceInstaller.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.ServiceProcess;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ArchiSteamFarm
+{
+ [RunInstaller(true)]
+ public sealed class ArchiServiceInstaller : System.Configuration.Install.Installer
+ {
+ public ArchiServiceInstaller()
+ {
+ ServiceInstaller serviceInstaller = new ServiceInstaller();
+ ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();
+
+ serviceInstaller.ServiceName = SharedInfo.ServiceName;
+ serviceInstaller.DisplayName = SharedInfo.ServiceDescription;
+
+ //defaulting to only starting when a user starts it, can be easily changed after install
+ serviceInstaller.StartType = ServiceStartMode.Manual;
+
+ //system account, requires admin privilege to install
+ serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
+
+ Installers.Add(serviceInstaller);
+ Installers.Add(serviceProcessInstaller);
+ }
+ }
+}
diff --git a/ArchiSteamFarm/ArchiSteamFarm.csproj b/ArchiSteamFarm/ArchiSteamFarm.csproj
index b4b6cdef0..0615e1ab3 100644
--- a/ArchiSteamFarm/ArchiSteamFarm.csproj
+++ b/ArchiSteamFarm/ArchiSteamFarm.csproj
@@ -88,16 +88,22 @@
True
+
+
+
+
+ Component
+
@@ -123,7 +129,9 @@
-
+
+ Designer
+
PreserveNewest
diff --git a/ArchiSteamFarm/Program.cs b/ArchiSteamFarm/Program.cs
index f6564a5ae..4c1c4b08b 100644
--- a/ArchiSteamFarm/Program.cs
+++ b/ArchiSteamFarm/Program.cs
@@ -30,6 +30,7 @@ using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;
using ArchiSteamFarm.JSON;
@@ -276,7 +277,7 @@ namespace ArchiSteamFarm {
return null;
}
- if (GlobalConfig.Headless) {
+ if (GlobalConfig.Headless || !Environment.UserInteractive) {
Logging.LogGenericWarning("Received a request for user input, but process is running in headless mode!");
return null;
}
@@ -517,13 +518,52 @@ namespace ArchiSteamFarm {
}
private static void Main(string[] args) {
- Init(args);
+ if (!Environment.UserInteractive)
+ {
+ //Running as service
+ using (var service = new Service())
+ ServiceBase.Run(service);
+ }
+ else
+ {
+ //Console app
+ Init(args);
- // Wait for signal to shutdown
- ShutdownResetEvent.Wait();
+ // Wait for signal to shutdown
+ ShutdownResetEvent.Wait();
- // We got a signal to shutdown
- Exit();
+ // We got a signal to shutdown
+ Exit();
+ }
}
- }
+
+
+ sealed class Service : ServiceBase
+ {
+ public Service()
+ {
+ ServiceName = SharedInfo.ServiceName;
+ }
+
+ protected override void OnStart(string[] args)
+ {
+ //Services must not block, they have 30 seconds to return from the start method or are killed
+ new Thread(() =>
+ {
+ Init(args);
+ ShutdownResetEvent.Wait();
+ Stop();
+
+ }).Start();
+
+
+ }
+
+ protected override void OnStop()
+ {
+ ShutdownResetEvent.Set();
+ }
+ }
+ }
+
}
diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs
index 6b45b9f56..b2666c7b6 100644
--- a/ArchiSteamFarm/SharedInfo.cs
+++ b/ArchiSteamFarm/SharedInfo.cs
@@ -28,5 +28,7 @@ namespace ArchiSteamFarm {
internal const string Version = "2.1.1.3";
internal const string GithubRepo = "JustArchi/ArchiSteamFarm";
+ internal const string ServiceName = "ArchiSteamFarm";
+ internal const string ServiceDescription = "ASF is an application that allows you to farm steam cards using multiple steam accounts simultaneously.";
}
}