Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Dynamic Quota Cap v1.0.2
BepInEx/plugins/dynamicquotacap/DynamicQuotaCap.dll
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DynamicQuotaCap.Configuration; using DynamicQuotaCap.Patches; using DynamicQuotaCap.Services; using HarmonyLib; using LethalConstellations.PluginCore; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace DynamicQuotaCap { [BepInPlugin("com.example.dynamicquotacap", "Dynamic Quota Cap", "1.0.0")] public class Plugin : BaseUnityPlugin { private Harmony _harmony; private ConfigManager _configManager; private LoggingService _loggingService; private QuotaCapService _quotaCapService; private ConstellationConfigGenerator _constellationConfigGenerator; private void Awake() { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown _configManager = new ConfigManager(((BaseUnityPlugin)this).Config, ((BaseUnityPlugin)this).Logger); _loggingService = new LoggingService(((BaseUnityPlugin)this).Logger, _configManager); _loggingService.LogInfo("Initializing Dynamic Quota Cap plugin"); try { _configManager.LoadConfiguration(); _quotaCapService = new QuotaCapService(_configManager, _loggingService); _constellationConfigGenerator = new ConstellationConfigGenerator(_configManager, ((BaseUnityPlugin)this).Logger); TimeOfDayPatch.Initialize(_quotaCapService, _loggingService); if (!TimeOfDayPatch.ValidatePatchPrerequisites()) { _loggingService.LogError("Failed to validate patch prerequisites. Some functionality may not work."); } _harmony = new Harmony("com.example.dynamicquotacap"); _harmony.PatchAll(); _loggingService.LogInfo("Harmony patches applied"); GenerateConstellationConfigs(); _loggingService.LogInfo("Dynamic Quota Cap plugin initialized successfully"); } catch (Exception ex) { _loggingService.LogError("Failed to initialize plugin: " + ex.Message, ex); } } private void GenerateConstellationConfigs() { try { _loggingService.LogMethodStart("GenerateConstellationConfigs"); bool flag = _constellationConfigGenerator.GenerateConstellationConfigs(); if (flag) { _loggingService.LogConfigGeneration(_configManager.ConstellationCaps.Count, success: true); } else { _loggingService.LogConfigGeneration(_configManager.ConstellationCaps.Count, success: false, "Initial generation failed, retry may be attempted"); if (_constellationConfigGenerator.CanRetry()) { _loggingService.LogInfo("Attempting immediate retry for constellation config generation"); flag = _constellationConfigGenerator.ImmediateRetry(); if (flag) { _loggingService.LogConfigGeneration(_configManager.ConstellationCaps.Count, success: true); } else { _loggingService.LogError("Failed to generate constellation configs after retry"); } } } _loggingService.LogMethodEnd("GenerateConstellationConfigs", flag); } catch (Exception ex) { _loggingService.LogError("Error in GenerateConstellationConfigs: " + ex.Message, ex); } } public void GenerateConfigs() { GenerateConstellationConfigs(); } public ConfigManager GetConfigManager() { return _configManager; } public QuotaCapService GetQuotaCapService() { return _quotaCapService; } public LoggingService GetLoggingService() { return _loggingService; } public ConstellationConfigGenerator GetConstellationConfigGenerator() { return _constellationConfigGenerator; } private void OnDestroy() { try { _loggingService?.LogInfo("Dynamic Quota Cap plugin shutting down"); Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } _configManager?.SaveConfiguration(); _loggingService?.LogInfo("Dynamic Quota Cap plugin shutdown complete"); } catch (Exception ex) { ManualLogSource logger = ((BaseUnityPlugin)this).Logger; if (logger != null) { logger.LogError((object)("Error during plugin shutdown: " + ex.Message)); } } } } } namespace DynamicQuotaCap.Services { public class LoggingService { private readonly ManualLogSource _logger; private readonly ConfigManager _configManager; public LoggingService(ManualLogSource logger, ConfigManager configManager) { _logger = logger ?? throw new ArgumentNullException("logger"); _configManager = configManager ?? throw new ArgumentNullException("configManager"); } public void LogDebug(string message) { ConfigManager configManager = _configManager; if (configManager != null && (configManager.EnableDebug?.Value).GetValueOrDefault()) { _logger.LogInfo((object)("[DEBUG] " + message)); } } public void LogInfo(string message) { _logger.LogInfo((object)message); } public void LogWarning(string message) { _logger.LogWarning((object)message); } public void LogError(string message) { _logger.LogError((object)message); } public void LogError(string message, Exception exception) { _logger.LogError((object)(message + ": " + exception.Message)); if (exception.InnerException != null) { _logger.LogError((object)("Inner exception: " + exception.InnerException.Message)); } } public void LogStructured(LogLevel level, string category, string message, object data = null) { string text = "[" + category + "] " + message; if (data != null) { text += $" | Data: {data}"; } switch (level) { case LogLevel.Debug: LogDebug(text); break; case LogLevel.Info: LogInfo(text); break; case LogLevel.Warning: LogWarning(text); break; case LogLevel.Error: LogError(text); break; case LogLevel.Fatal: _logger.LogFatal((object)text); break; default: LogInfo(text); break; } } public void LogMethodStart(string methodName, object parameters = null) { string text = "Starting " + methodName; if (parameters != null) { text += $" with parameters: {parameters}"; } LogDebug(text); } public void LogMethodEnd(string methodName, object result = null) { string text = "Finished " + methodName; if (result != null) { text += $" with result: {result}"; } LogDebug(text); } public void LogQuotaCapApplication(string constellation, int originalQuota, int newQuota, int capValue, bool capEnabled) { if (!capEnabled) { LogDebug($"Quota cap disabled for constellation '{constellation}'. Original quota: {originalQuota}"); } else if (capValue == -1) { LogDebug($"Quota cap set to disabled (-1) for constellation '{constellation}'. Original quota: {originalQuota}"); } else if (originalQuota > capValue) { LogInfo($"Quota capped for constellation '{constellation}': {originalQuota} -> {newQuota} (cap: {capValue})"); } else { LogDebug($"Quota within cap for constellation '{constellation}': {originalQuota} (cap: {capValue})"); } } public void LogConfigGeneration(int constellationCount, bool success, string errorMessage = null) { if (success) { LogInfo($"Configuration generation completed successfully for {constellationCount} constellations"); return; } LogError($"Configuration generation failed for {constellationCount} constellations"); if (!string.IsNullOrEmpty(errorMessage)) { LogError("Error details: " + errorMessage); } } public void LogPatchApplication(string patchName, bool success, string errorMessage = null) { if (success) { LogInfo("Patch '" + patchName + "' applied successfully"); return; } LogError("Patch '" + patchName + "' failed to apply"); if (!string.IsNullOrEmpty(errorMessage)) { LogError("Patch error details: " + errorMessage); } } } public enum LogLevel { Debug, Info, Warning, Error, Fatal } public class QuotaCapService { private readonly ConfigManager _configManager; private readonly LoggingService _loggingService; public QuotaCapService(ConfigManager configManager, LoggingService loggingService) { _configManager = configManager ?? throw new ArgumentNullException("configManager"); _loggingService = loggingService ?? throw new ArgumentNullException("loggingService"); } public int CalculateQuotaCap(string constellation, int currentQuota) { _loggingService.LogMethodStart("CalculateQuotaCap", new { constellation, currentQuota }); try { if (string.IsNullOrEmpty(constellation)) { _loggingService.LogDebug("Not in any constellation, skipping quota cap"); _loggingService.LogMethodEnd("CalculateQuotaCap", currentQuota); return currentQuota; } if (_configManager.ConstellationCaps.Count == 0) { _loggingService.LogDebug("No constellation configs generated yet, skipping quota cap"); _loggingService.LogMethodEnd("CalculateQuotaCap", currentQuota); return currentQuota; } int constellationCap = GetConstellationCap(constellation); bool flag = IsQuotaCapEnabled(constellation); _loggingService.LogDebug($"Constellation '{constellation}' - Cap: {constellationCap}, Enabled: {flag}"); int num = ApplyQuotaCapLogic(currentQuota, constellationCap, flag, constellation); _loggingService.LogQuotaCapApplication(constellation, currentQuota, num, constellationCap, flag); _loggingService.LogMethodEnd("CalculateQuotaCap", num); return num; } catch (Exception exception) { _loggingService.LogError("Error calculating quota cap for constellation '" + constellation + "'", exception); _loggingService.LogMethodEnd("CalculateQuotaCap", currentQuota); return currentQuota; } } public int GetConstellationCap(string constellation) { try { if (_configManager.ConstellationCaps.TryGetValue(constellation, out var value)) { return value.Value; } _loggingService.LogDebug("No specific config found for constellation '" + constellation + "', using default cap"); return GetDefaultQuotaCap(); } catch (Exception exception) { _loggingService.LogError("Error getting constellation cap for '" + constellation + "'", exception); return GetDefaultQuotaCap(); } } public bool IsQuotaCapEnabled(string constellation) { try { if (_configManager.ConstellationCapEnabled.TryGetValue(constellation, out var value)) { return value.Value; } _loggingService.LogDebug("No enabled config found for constellation '" + constellation + "', defaulting to enabled"); return true; } catch (Exception exception) { _loggingService.LogError("Error checking if quota cap is enabled for constellation '" + constellation + "'", exception); return true; } } public int GetDefaultQuotaCap() { return 4000; } public bool ValidateQuotaValue(int quota) { try { if (quota == -1) { return true; } if (quota < 0) { _loggingService.LogWarning($"Invalid quota value detected: {quota}. Quota should be non-negative."); return false; } if (quota > 1000000) { _loggingService.LogWarning($"Quota value {quota} seems unusually high. Consider reviewing configuration."); return true; } return true; } catch (Exception exception) { _loggingService.LogError($"Error validating quota value: {quota}", exception); return false; } } private int ApplyQuotaCapLogic(int currentQuota, int cap, bool enabled, string constellation) { if (!enabled) { _loggingService.LogDebug("Quota cap disabled for constellation '" + constellation + "'"); return currentQuota; } if (cap == -1) { _loggingService.LogDebug("Quota cap disabled (-1) for constellation '" + constellation + "'"); return currentQuota; } if (!ValidateQuotaValue(cap)) { _loggingService.LogWarning($"Invalid cap value {cap} for constellation '{constellation}', using default"); cap = GetDefaultQuotaCap(); } if (currentQuota > cap) { _loggingService.LogDebug($"Quota ({currentQuota}) exceeds cap ({cap}) for constellation '{constellation}', applying cap"); return cap; } _loggingService.LogDebug($"Quota ({currentQuota}) is within cap ({cap}) for constellation '{constellation}'"); return currentQuota; } public Dictionary<string, (int Cap, bool Enabled)> GetQuotaCapStatus() { Dictionary<string, (int, bool)> dictionary = new Dictionary<string, (int, bool)>(); try { foreach (string key in _configManager.ConstellationCaps.Keys) { int constellationCap = GetConstellationCap(key); bool item = IsQuotaCapEnabled(key); dictionary[key] = (constellationCap, item); } } catch (Exception exception) { _loggingService.LogError("Error getting quota cap status", exception); } return dictionary; } public bool ResetAllQuotaCapsToDefaults() { try { _loggingService.LogInfo("Resetting all quota caps to default values"); foreach (string key in _configManager.ConstellationCaps.Keys) { if (_configManager.ConstellationCaps.TryGetValue(key, out var value)) { value.Value = 4000; _loggingService.LogDebug($"Reset cap for constellation '{key}' to {4000}"); } if (_configManager.ConstellationCapEnabled.TryGetValue(key, out var value2)) { value2.Value = true; _loggingService.LogDebug("Reset enabled state for constellation '" + key + "' to true"); } } _configManager.SaveConfiguration(); _loggingService.LogInfo("All quota caps reset to default values successfully"); return true; } catch (Exception exception) { _loggingService.LogError("Error resetting quota caps to defaults", exception); return false; } } } } namespace DynamicQuotaCap.Patches { public static class PatchConstants { public static class Defaults { public const int PatchRetryDelayMs = 1000; public const int MaxPatchRetries = 3; public const int PatchTimeoutMs = 5000; } public static class ErrorMessages { public const string TimeOfDayClassNotFound = "TimeOfDay class not found for patching"; public const string SetNewProfitQuotaMethodNotFound = "SetNewProfitQuota method not found in TimeOfDay class"; public const string PatchApplicationFailed = "Failed to apply TimeOfDay patch"; public const string PatchAlreadyApplied = "TimeOfDay patch is already applied"; public const string QuotaCapServiceNotAvailable = "QuotaCapService is not available for patch execution"; } public static class LogCategories { public const string PatchApplication = "PatchApplication"; public const string PatchExecution = "PatchExecution"; public const string PatchError = "PatchError"; public const string QuotaCap = "QuotaCap"; } public static class Parameters { public const string ProfitQuota = "profitQuota"; public const string ProfitQuotaField = "___profitQuota"; } public const string TimeOfDaySetNewProfitQuotaMethod = "SetNewProfitQuota"; public const string TimeOfDayClassName = "TimeOfDay"; public const string TimeOfDayPatchId = "com.example.dynamicquotacap.timedofday.patch"; public const string TimeOfDayPatchDescription = "Applies quota cap logic to profit quota setting"; } [HarmonyPatch(typeof(TimeOfDay))] internal class TimeOfDayPatch { private static QuotaCapService _quotaCapService; private static LoggingService _loggingService; public static void Initialize(QuotaCapService quotaCapService, LoggingService loggingService) { _quotaCapService = quotaCapService ?? throw new ArgumentNullException("quotaCapService"); _loggingService = loggingService ?? throw new ArgumentNullException("loggingService"); _loggingService.LogInfo("TimeOfDayPatch initialized with services"); } [HarmonyPatch("SetNewProfitQuota")] [HarmonyPostfix] private static void SetNewProfitQuotaPostfix(ref int ___profitQuota) { try { if (_quotaCapService == null || _loggingService == null) { Console.WriteLine("[DynamicQuotaCap] QuotaCapService is not available for patch execution"); return; } _loggingService.LogMethodStart("SetNewProfitQuotaPostfix", new { originalQuota = ___profitQuota }); string currentConstellation = Collections.CurrentConstellation; _loggingService.LogDebug($"Applying quota cap logic - Current constellation: '{currentConstellation}', New quota: {___profitQuota}"); int num = _quotaCapService.CalculateQuotaCap(currentConstellation, ___profitQuota); if (num != ___profitQuota) { _loggingService.LogInfo($"Quota modified by patch: {___profitQuota} -> {num}"); ___profitQuota = num; } _loggingService.LogMethodEnd("SetNewProfitQuotaPostfix", ___profitQuota); } catch (Exception ex) { string text = "Exception in TimeOfDayPatch: " + ex.Message; Console.WriteLine("[DynamicQuotaCap] " + text); _loggingService?.LogError(text, ex); if (ex.InnerException != null) { Console.WriteLine("[DynamicQuotaCap] Inner exception: " + ex.InnerException.Message); _loggingService?.LogError("Inner exception in TimeOfDayPatch: " + ex.InnerException.Message, ex.InnerException); } } } public static bool IsPatchInitialized() { return _quotaCapService != null && _loggingService != null; } public static string GetCurrentConstellationForDebug() { try { return Collections.CurrentConstellation ?? "Unknown"; } catch { return "Error"; } } public static bool ValidatePatchPrerequisites() { try { Type typeFromHandle = typeof(TimeOfDay); if (typeFromHandle == null) { Console.WriteLine("[DynamicQuotaCap] TimeOfDay class not found for patching"); return false; } MethodInfo method = typeFromHandle.GetMethod("SetNewProfitQuota"); if (method == null) { Console.WriteLine("[DynamicQuotaCap] SetNewProfitQuota method not found in TimeOfDay class"); return false; } Type typeFromHandle2 = typeof(Collections); if (typeFromHandle2 == null) { Console.WriteLine("[DynamicQuotaCap] LethalConstellations.Collections not found"); return false; } PropertyInfo property = typeFromHandle2.GetProperty("CurrentConstellation"); if (property == null) { Console.WriteLine("[DynamicQuotaCap] CurrentConstellation property not found in LethalConstellations.Collections"); return false; } _loggingService?.LogInfo("TimeOfDay patch prerequisites validated successfully"); return true; } catch (Exception ex) { Console.WriteLine("[DynamicQuotaCap] Error validating patch prerequisites: " + ex.Message); _loggingService?.LogError("Error validating patch prerequisites: " + ex.Message, ex); return false; } } public static bool ApplyPatchManually(Harmony harmony) { try { if (!ValidatePatchPrerequisites()) { return false; } if (!IsPatchInitialized()) { Console.WriteLine("[DynamicQuotaCap] Cannot apply patch: services not initialized"); return false; } _loggingService?.LogPatchApplication("com.example.dynamicquotacap.timedofday.patch", success: true); return true; } catch (Exception ex) { Console.WriteLine("[DynamicQuotaCap] Failed to apply TimeOfDay patch: " + ex.Message); _loggingService?.LogError("Failed to apply TimeOfDay patch: " + ex.Message, ex); return false; } } } } namespace DynamicQuotaCap.Configuration { public static class ConfigConstants { public static class Sections { public const string General = "General"; public const string QuotaCaps = "Quota Caps"; public const string QuotaCapToggles = "Quota Cap Toggles"; } public static class Keys { public const string EnableDebug = "EnableDebug"; public const string ConstellationCapFormat = "{0}_Cap"; public const string ConstellationEnabledFormat = "{0}_Enabled"; } public static class Descriptions { public const string EnableDebug = "Toggle the debug stuff"; public const string ConstellationCap = "Quota cap for {0} {1}"; public const string ConstellationEnabled = "Enable quota cap for {0} {1}"; } public static class Files { public const string LethalConstellationsMainConfig = "com.github.darmuh.LethalConstellations.cfg"; public const string LethalConstellationsGeneratedConfig = "LethalConstellations_Generated.cfg"; public const string ConstellationWordLineFormat = "ConstellationWord = "; } public const bool DefaultDebugEnabled = true; public const int DefaultQuotaCap = 4000; public const int DisabledQuotaCapValue = -1; public const string DefaultConstellationWord = "Constellation"; } public class ConfigManager { private readonly ConfigFile _configFile; private readonly ManualLogSource _logger; private bool _saveOnConfigSet = true; public Dictionary<string, ConfigEntry<int>> ConstellationCaps { get; } = new Dictionary<string, ConfigEntry<int>>(); public Dictionary<string, ConfigEntry<bool>> ConstellationCapEnabled { get; } = new Dictionary<string, ConfigEntry<bool>>(); public ConfigEntry<bool> EnableDebug { get; private set; } public bool SaveOnConfigSet { get { return _saveOnConfigSet; } set { _saveOnConfigSet = value; _configFile.SaveOnConfigSet = value; } } public ConfigManager(ConfigFile configFile, ManualLogSource logger) { _configFile = configFile ?? throw new ArgumentNullException("configFile"); _logger = logger ?? throw new ArgumentNullException("logger"); } public void LoadConfiguration() { try { _logger.LogInfo((object)"Loading configuration..."); LoadGeneralSettings(); _logger.LogInfo((object)"Configuration loaded successfully"); } catch (Exception ex) { _logger.LogError((object)("Error loading configuration: " + ex.Message)); throw; } } public void SaveConfiguration() { try { _configFile.Save(); _logger.LogInfo((object)"Configuration saved successfully"); } catch (Exception ex) { _logger.LogError((object)("Error saving configuration: " + ex.Message)); throw; } } public void ReloadConfiguration() { try { _configFile.Reload(); _logger.LogInfo((object)"Configuration reloaded successfully"); } catch (Exception ex) { _logger.LogError((object)("Error reloading configuration: " + ex.Message)); throw; } } public ConfigEntry<T> GetConfigEntry<T>(string section, string key, T defaultValue, string description) { try { return _configFile.Bind<T>(section, key, defaultValue, description); } catch (Exception ex) { _logger.LogError((object)("Error getting config entry '" + section + "." + key + "': " + ex.Message)); throw; } } public bool ValidateConfig() { try { _logger.LogInfo((object)"Validating configuration..."); if (EnableDebug == null) { _logger.LogError((object)"Debug configuration entry is null"); return false; } foreach (KeyValuePair<string, ConfigEntry<int>> constellationCap in ConstellationCaps) { if (constellationCap.Value == null) { _logger.LogError((object)("Constellation cap entry for '" + constellationCap.Key + "' is null")); return false; } if (constellationCap.Value.Value < -1) { _logger.LogWarning((object)$"Constellation cap value for '{constellationCap.Key}' is invalid: {constellationCap.Value.Value}"); } } foreach (KeyValuePair<string, ConfigEntry<bool>> item in ConstellationCapEnabled) { if (item.Value == null) { _logger.LogError((object)("Constellation enabled entry for '" + item.Key + "' is null")); return false; } } _logger.LogInfo((object)"Configuration validation completed successfully"); return true; } catch (Exception ex) { _logger.LogError((object)("Error validating configuration: " + ex.Message)); return false; } } public void CreateConstellationConfigEntries(string constellationName, string constellationWord) { try { if (string.IsNullOrEmpty(constellationName)) { _logger.LogError((object)"Constellation name cannot be null or empty"); return; } if (string.IsNullOrEmpty(constellationWord)) { constellationWord = "Constellation"; } string key = $"{constellationName}_Cap"; string description = $"Quota cap for {constellationName} {constellationWord.ToLower()}"; ConstellationCaps[constellationName] = GetConfigEntry("Quota Caps", key, 4000, description); string key2 = $"{constellationName}_Enabled"; string description2 = $"Enable quota cap for {constellationName} {constellationWord.ToLower()}"; ConstellationCapEnabled[constellationName] = GetConfigEntry("Quota Cap Toggles", key2, defaultValue: true, description2); _logger.LogInfo((object)("Created configuration entries for constellation: " + constellationName)); } catch (Exception ex) { _logger.LogError((object)("Error creating constellation config entries for '" + constellationName + "': " + ex.Message)); } } private void LoadGeneralSettings() { EnableDebug = GetConfigEntry("General", "EnableDebug", defaultValue: true, "Toggle the debug stuff"); } } public class ConstellationConfigGenerator { private readonly ConfigManager _configManager; private readonly ManualLogSource _logger; private int _retryCount = 0; private const int MaxRetries = 3; private const int RetryDelayMs = 5000; public ConstellationConfigGenerator(ConfigManager configManager, ManualLogSource logger) { _configManager = configManager ?? throw new ArgumentNullException("configManager"); _logger = logger ?? throw new ArgumentNullException("logger"); } public bool GenerateConstellationConfigs() { try { _logger.LogInfo((object)"Generating constellation configs from LethalConstellations config file"); string constellationWord = GetConstellationWord(); _logger.LogInfo((object)("Using constellation word: " + constellationWord)); List<string> list = ParseConstellationNames(constellationWord); if (list.Count == 0) { _logger.LogWarning((object)"No constellations found in LethalConstellations config file"); return RetryConfigGeneration(); } _logger.LogInfo((object)$"Found {list.Count} constellations, generating config entries"); foreach (string item in list) { _configManager.CreateConstellationConfigEntries(item, constellationWord); } _configManager.SaveConfiguration(); _logger.LogInfo((object)$"Constellation quota cap configurations generated and saved - Created {list.Count} entries"); _retryCount = 0; return true; } catch (Exception ex) { _logger.LogError((object)("Error generating constellation configs: " + ex.Message)); return RetryConfigGeneration(); } } private string GetConstellationWord() { try { string path = Path.Combine(Paths.ConfigPath, "com.github.darmuh.LethalConstellations.cfg"); if (!File.Exists(path)) { _logger.LogWarning((object)"LethalConstellations main config file not found, using default constellation word"); return "Constellation"; } string[] array = File.ReadAllLines(path); string[] array2 = array; foreach (string text in array2) { if (text.StartsWith("ConstellationWord = ")) { string text2 = text.Substring("ConstellationWord = ".Length).Trim(); _logger.LogInfo((object)("Found custom constellation word: " + text2)); return text2; } } _logger.LogWarning((object)"Constellation word not found in config, using default"); return "Constellation"; } catch (Exception ex) { _logger.LogError((object)("Error getting constellation word: " + ex.Message)); return "Constellation"; } } private List<string> ParseConstellationNames(string constellationWord) { List<string> list = new List<string>(); try { string path = Path.Combine(Paths.ConfigPath, "LethalConstellations_Generated.cfg"); if (!File.Exists(path)) { _logger.LogWarning((object)"LethalConstellations generated config file not found"); return list; } string[] array = File.ReadAllLines(path); string text = "[" + constellationWord + " "; string[] array2 = array; foreach (string text2 in array2) { if (text2.StartsWith(text)) { int length = text.Length; string text3 = text2.Substring(length, text2.Length - length - 1); list.Add(text3); _logger.LogInfo((object)("Found " + constellationWord.ToLower() + ": " + text3)); } } } catch (Exception ex) { _logger.LogError((object)("Error parsing constellation names: " + ex.Message)); } return list; } private bool RetryConfigGeneration() { if (_retryCount >= 3) { _logger.LogError((object)"Max retry attempts reached for constellation config generation"); _retryCount = 0; return false; } _retryCount++; _logger.LogInfo((object)$"Will retry constellation config generation in {5} seconds (attempt {_retryCount}/{3})"); return false; } public void ResetRetryCount() { _retryCount = 0; } public int GetRetryCount() { return _retryCount; } public bool CanRetry() { return _retryCount < 3; } public bool ImmediateRetry() { if (!CanRetry()) { return false; } return GenerateConstellationConfigs(); } } }