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."; } }