diff --git a/ArchiSteamFarm/ASF.cs b/ArchiSteamFarm/ASF.cs index 44ab01a8c..80582deb4 100644 --- a/ArchiSteamFarm/ASF.cs +++ b/ArchiSteamFarm/ASF.cs @@ -46,6 +46,9 @@ namespace ArchiSteamFarm { [PublicAPI] public static GlobalConfig GlobalConfig { get; private set; } + [PublicAPI] + public static GlobalDatabase GlobalDatabase { get; private set; } + [PublicAPI] public static WebBrowser WebBrowser { get; internal set; } @@ -104,6 +107,20 @@ namespace ArchiSteamFarm { GlobalConfig = globalConfig; } + internal static void InitGlobalDatabase(GlobalDatabase globalDatabase) { + if (globalDatabase == null) { + ArchiLogger.LogNullError(nameof(globalDatabase)); + + return; + } + + if (GlobalDatabase != null) { + return; + } + + GlobalDatabase = globalDatabase; + } + internal static async Task RestartOrExit() { if (Program.RestartAllowed && GlobalConfig.AutoRestart) { ArchiLogger.LogGenericInfo(Strings.Restarting); @@ -543,12 +560,12 @@ namespace ArchiSteamFarm { } // Ensure that we ask for a list of servers if we don't have any saved servers available - IEnumerable servers = await Program.GlobalDatabase.ServerListProvider.FetchServerListAsync().ConfigureAwait(false); + IEnumerable servers = await GlobalDatabase.ServerListProvider.FetchServerListAsync().ConfigureAwait(false); if (servers?.Any() != true) { ArchiLogger.LogGenericInfo(string.Format(Strings.Initializing, nameof(SteamDirectory))); - SteamConfiguration steamConfiguration = SteamConfiguration.Create(builder => builder.WithProtocolTypes(GlobalConfig.SteamProtocols).WithCellID(Program.GlobalDatabase.CellID).WithServerListProvider(Program.GlobalDatabase.ServerListProvider).WithHttpClientFactory(() => WebBrowser.GenerateDisposableHttpClient())); + SteamConfiguration steamConfiguration = SteamConfiguration.Create(builder => builder.WithProtocolTypes(GlobalConfig.SteamProtocols).WithCellID(GlobalDatabase.CellID).WithServerListProvider(GlobalDatabase.ServerListProvider).WithHttpClientFactory(() => WebBrowser.GenerateDisposableHttpClient())); try { await SteamDirectory.LoadAsync(steamConfiguration).ConfigureAwait(false); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 85ed1c864..e226ef844 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -213,7 +213,7 @@ namespace ArchiSteamFarm { ArchiWebHandler = new ArchiWebHandler(this); - SteamConfiguration steamConfiguration = SteamConfiguration.Create(builder => builder.WithProtocolTypes(ASF.GlobalConfig.SteamProtocols).WithCellID(Program.GlobalDatabase.CellID).WithServerListProvider(Program.GlobalDatabase.ServerListProvider).WithHttpClientFactory(() => ArchiWebHandler.GenerateDisposableHttpClient())); + SteamConfiguration steamConfiguration = SteamConfiguration.Create(builder => builder.WithProtocolTypes(ASF.GlobalConfig.SteamProtocols).WithCellID(ASF.GlobalDatabase.CellID).WithServerListProvider(ASF.GlobalDatabase.ServerListProvider).WithHttpClientFactory(() => ArchiWebHandler.GenerateDisposableHttpClient())); // Initialize SteamClient = new SteamClient(steamConfiguration); @@ -501,7 +501,7 @@ namespace ArchiSteamFarm { } if ((hoursPlayed < CardsFarmer.HoursForRefund) && !BotConfig.IdleRefundableGames) { - HashSet packageIDs = Program.GlobalDatabase.GetPackageIDs(appID); + HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(appID); if (packageIDs == null) { return (0, DateTime.MaxValue); @@ -1781,7 +1781,7 @@ namespace ArchiSteamFarm { SteamUser.LogOn( new SteamUser.LogOnDetails { AuthCode = AuthCode, - CellID = Program.GlobalDatabase.CellID, + CellID = ASF.GlobalDatabase.CellID, LoginID = LoginID, LoginKey = loginKey, Password = password, @@ -2028,14 +2028,14 @@ namespace ArchiSteamFarm { continue; } - if (!Program.GlobalDatabase.PackagesData.TryGetValue(license.PackageID, out (uint ChangeNumber, HashSet _) packageData) || (packageData.ChangeNumber < license.LastChangeNumber)) { + if (!ASF.GlobalDatabase.PackagesData.TryGetValue(license.PackageID, out (uint ChangeNumber, HashSet _) packageData) || (packageData.ChangeNumber < license.LastChangeNumber)) { packagesToRefresh[license.PackageID] = (uint) license.LastChangeNumber; } } if (packagesToRefresh.Count > 0) { ArchiLogger.LogGenericInfo(Strings.BotRefreshingPackagesData); - await Program.GlobalDatabase.RefreshPackages(this, packagesToRefresh).ConfigureAwait(false); + await ASF.GlobalDatabase.RefreshPackages(this, packagesToRefresh).ConfigureAwait(false); ArchiLogger.LogGenericInfo(Strings.Done); } @@ -2161,8 +2161,8 @@ namespace ArchiSteamFarm { ArchiLogger.LogGenericWarning(Strings.BotAccountLocked); } - if ((callback.CellID != 0) && (callback.CellID != Program.GlobalDatabase.CellID)) { - await Program.GlobalDatabase.SetCellID(callback.CellID).ConfigureAwait(false); + if ((callback.CellID != 0) && (callback.CellID != ASF.GlobalDatabase.CellID)) { + await ASF.GlobalDatabase.SetCellID(callback.CellID).ConfigureAwait(false); } if (!HasMobileAuthenticator) { diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index 384fade05..07a19c140 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -1129,7 +1129,7 @@ namespace ArchiSteamFarm { foreach (Game game in GamesToFarm) { DateTime redeemDate = DateTime.MinValue; - HashSet packageIDs = Program.GlobalDatabase.GetPackageIDs(game.AppID); + HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(game.AppID); if (packageIDs != null) { foreach (uint packageID in packageIDs) { diff --git a/ArchiSteamFarm/GlobalDatabase.cs b/ArchiSteamFarm/GlobalDatabase.cs index 213017381..2699f85fb 100644 --- a/ArchiSteamFarm/GlobalDatabase.cs +++ b/ArchiSteamFarm/GlobalDatabase.cs @@ -31,9 +31,9 @@ using JetBrains.Annotations; using Newtonsoft.Json; namespace ArchiSteamFarm { - internal sealed class GlobalDatabase : IDisposable { + public sealed class GlobalDatabase : IDisposable { [JsonProperty(Required = Required.DisallowNull)] - internal readonly Guid Guid = Guid.NewGuid(); + public readonly Guid Guid = Guid.NewGuid(); [JsonProperty(Required = Required.DisallowNull)] internal readonly ConcurrentDictionary AppIDs)> PackagesData = new ConcurrentDictionary AppIDs)>(); diff --git a/ArchiSteamFarm/Program.cs b/ArchiSteamFarm/Program.cs index b17d46df1..4abc3f056 100644 --- a/ArchiSteamFarm/Program.cs +++ b/ArchiSteamFarm/Program.cs @@ -40,7 +40,6 @@ namespace ArchiSteamFarm { internal static class Program { internal static byte LoadBalancingDelay => Math.Max(ASF.GlobalConfig?.LoginLimiterDelay ?? 0, GlobalConfig.DefaultLoginLimiterDelay); - internal static GlobalDatabase GlobalDatabase { get; private set; } internal static bool ProcessRequired { get; private set; } internal static bool RestartAllowed { get; private set; } = true; @@ -337,9 +336,9 @@ namespace ArchiSteamFarm { await Task.Delay(5 * 1000).ConfigureAwait(false); } - GlobalDatabase = await GlobalDatabase.CreateOrLoad(globalDatabaseFile).ConfigureAwait(false); + GlobalDatabase globalDatabase = await GlobalDatabase.CreateOrLoad(globalDatabaseFile).ConfigureAwait(false); - if (GlobalDatabase == null) { + if (globalDatabase == null) { ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorDatabaseInvalid, globalDatabaseFile)); await Task.Delay(5 * 1000).ConfigureAwait(false); await Exit(1).ConfigureAwait(false); @@ -347,9 +346,11 @@ namespace ArchiSteamFarm { return; } + ASF.InitGlobalDatabase(globalDatabase); + // If debugging is on, we prepare debug directory prior to running if (Debugging.IsUserDebugging) { - ASF.ArchiLogger.LogGenericDebug(SharedInfo.GlobalDatabaseFileName + ": " + JsonConvert.SerializeObject(GlobalDatabase, Formatting.Indented)); + ASF.ArchiLogger.LogGenericDebug(SharedInfo.GlobalDatabaseFileName + ": " + JsonConvert.SerializeObject(ASF.GlobalDatabase, Formatting.Indented)); Logging.EnableTraceLogging(); if (Directory.Exists(SharedInfo.DebugDirectory)) { diff --git a/ArchiSteamFarm/Statistics.cs b/ArchiSteamFarm/Statistics.cs index fc52f381d..877a735ed 100644 --- a/ArchiSteamFarm/Statistics.cs +++ b/ArchiSteamFarm/Statistics.cs @@ -98,7 +98,7 @@ namespace ArchiSteamFarm { Dictionary data = new Dictionary(2) { { "SteamID", Bot.SteamID.ToString() }, - { "Guid", Program.GlobalDatabase.Guid.ToString("N") } + { "Guid", ASF.GlobalDatabase.Guid.ToString("N") } }; // Listing is free to deny our announce request, hence we don't retry @@ -166,7 +166,7 @@ namespace ArchiSteamFarm { Dictionary data = new Dictionary(9) { { "SteamID", Bot.SteamID.ToString() }, - { "Guid", Program.GlobalDatabase.Guid.ToString("N") }, + { "Guid", ASF.GlobalDatabase.Guid.ToString("N") }, { "Nickname", nickname ?? "" }, { "AvatarHash", avatarHash ?? "" }, { "GamesCount", inventory.Select(item => item.RealAppID).Distinct().Count().ToString() },