public async Task SyncAllVaults( params VaultIndex[] exclude) { List <VaultIndex> excludeVaults = new List <VaultIndex>(exclude); IEnumerable <VaultIndex> matches = VaultIndexes.Where(vi => vi.SyncMode == Common.SyncMode.CloudProvider && !excludeVaults.Contains(vi)); VaultIndex[] allCloudSyncVaults = matches.Any() ? matches.ToArray() : null; if (allCloudSyncVaults != null) { DLoggerManager.Instance.Logger.Log(LoggerMessageType.VerboseLow | LoggerMessageType.Information, "CloudStorageSyncManager Synchronising all cloud sync vaults."); foreach (VaultIndex curIndex in allCloudSyncVaults) { if (curIndex.SyncStatus.Status != CloudProviderSyncStatus.SyncStatus.UpToDate) { await SyncVault(curIndex); SyncComplete?.Invoke(this, EventArgs.Empty); } } } else { DLoggerManager.Instance.Logger.Log(LoggerMessageType.VerboseLow | LoggerMessageType.Information, "CloudStorageSyncManager No vaults configured for cloud synchronising, so skipping SyncAllVaults."); } }
public void SyncFiles() { var filesNeedAddToDB = new List <File>(); var filesNeedAddToLocal = new List <File>(); foreach (var localFile in Files) { if (!_dataProvider.FileExists(localFile.Path)) { filesNeedAddToDB.Add(localFile); } } foreach (var dbFilePath in _dataProvider.GetFilesPaths()) { var localFile = Files.FirstOrDefault(f => f.Path == dbFilePath); if (localFile == null) { filesNeedAddToLocal.Add(_dataProvider.GetFile(dbFilePath)); } } Files.AddRange(filesNeedAddToLocal); _dataProvider.AddFiles(filesNeedAddToDB.ToArray()); SyncComplete?.Invoke(this); }
private async void AllContactsFinished() { IsSyncing = false; await BookSyncContactsHelper.SaveBookSyncContacts(); //wait a second and then reset await Task.Delay(500); LoadContacts(); SyncComplete?.Invoke(this, new EventArgs()); }
/// <summary> /// Target syncing done as a coroutine, breaking between each sourceObject with field targets, /// to prevent attempting to set too many fields at once. /// </summary> public IEnumerator SyncFieldsCR() { if (flattenedTargets == null) { Debug.LogWarning($"No sync targets found for {name}"); yield break; } foreach (var kv in flattenedTargets) { var sourceObject = kv.Key; var targets = kv.Value; foreach (var target in targets) { var value = FirebaseRemoteConfig.GetValue(target.FullKeyString); if (value.Source == ValueSource.RemoteValue) { if (target.Field.GetValue(sourceObject)?.ToString() == value.StringValue) { continue; } object typedValue = value.StringValue; if (typeof(bool).IsAssignableFrom(target.Field.FieldType)) { typedValue = value.BooleanValue; } else if (typeof(double).IsAssignableFrom(target.Field.FieldType)) { typedValue = value.DoubleValue; } else if (typeof(int).IsAssignableFrom(target.Field.FieldType)) { typedValue = (int)value.LongValue; } target.Field.SetValue(sourceObject, typedValue); } else { Debug.Log($"No RemoteConfig value found for key {target.FullKeyString}"); } yield return(0); } } SyncComplete?.Invoke(this, null); }
private async System.Threading.Tasks.Task DoSync() { try { // Load config Config config = Config.LoadConfiguration(); if (string.IsNullOrEmpty(config.ModsDirectory) || string.IsNullOrEmpty(config.ResourcePackDirectory) || string.IsNullOrEmpty(config.ConfigFilesDirectory)) { Task.Errors.Add("Configuration file not setup"); SyncComplete?.Invoke(this, new EventArgs()); return; } HashSet <string> clientSideWhiteListMods = new HashSet <string>(); if (File.Exists("mods_white_list.txt")) { foreach (string line in File.ReadAllLines("mods_white_list.txt")) { clientSideWhiteListMods.Add(line); } } HashSet <string> clientSideWhiteListResourcePacks = new HashSet <string>(); if (File.Exists("resourcepacks_white_list.txt")) { foreach (string line in File.ReadAllLines("resourcepacks_white_list.txt")) { clientSideWhiteListResourcePacks.Add(line); } } List <Task> tasks = new List <Task>(); // Load database stuff List <MCSyncFile> syncFiles = await MCSyncFile.GetMCSyncFiles(); // Drive off of files List <string> handledFiles = new List <string>(); // Mod Files IEnumerable <MCSyncFile> modSyncFiles = syncFiles.Where(f => f.FileType == MCSyncFile.FileTypes.mods && IsDownloadTypeValid(config.Mode, f.DownloadType)); foreach (string file in Directory.EnumerateFiles(config.ModsDirectory, "*", SearchOption.AllDirectories)) { string strippedFile = StripDirectory(file, MCSyncFile.FileTypes.mods); byte[] fileHash = CalculateHash(file); MCSyncFile syncFile = modSyncFiles.FirstOrDefault(f => f.Filename == strippedFile); if (syncFile == null) { if (!clientSideWhiteListMods.Contains(strippedFile)) { // Extrinsic, delete Task deleteTask = new Task($"Delete mod file {strippedFile}", () => { File.Delete(file); return(true); }); tasks.Add(deleteTask); TaskAdded?.Invoke(this, deleteTask); } } else if (!syncFile.Checksum.SequenceEqual(fileHash)) { Task updateTask = new Task($"Update mod file {strippedFile}", () => DownloadFile(syncFile.FileType, config.ModsDirectory, strippedFile, syncFile.DownloadType)); tasks.Add(updateTask); TaskAdded?.Invoke(this, updateTask); } handledFiles.Add(strippedFile); } // Resource Pack Files IEnumerable <MCSyncFile> resourcePackSyncFiles = syncFiles.Where(f => f.FileType == MCSyncFile.FileTypes.resourcepacks && IsDownloadTypeValid(config.Mode, f.DownloadType)); foreach (string file in Directory.EnumerateFiles(config.ResourcePackDirectory, "*", SearchOption.AllDirectories)) { string strippedFile = StripDirectory(file, MCSyncFile.FileTypes.resourcepacks); byte[] fileHash = CalculateHash(file); MCSyncFile syncFile = resourcePackSyncFiles.FirstOrDefault(f => f.Filename == strippedFile); if (syncFile == null) { if (!clientSideWhiteListResourcePacks.Contains(strippedFile)) { // Extrinsic, delete Task deleteTask = new Task($"Delete resource pack file {strippedFile}", () => { File.Delete(file); return(true); }); tasks.Add(deleteTask); TaskAdded?.Invoke(this, deleteTask); } } else if (!syncFile.Checksum.SequenceEqual(fileHash)) { Task updateTask = new Task($"Update resource pack file {strippedFile}", () => DownloadFile(syncFile.FileType, config.ResourcePackDirectory, strippedFile, syncFile.DownloadType)); tasks.Add(updateTask); TaskAdded?.Invoke(this, updateTask); } handledFiles.Add(strippedFile); } // Config IEnumerable <MCSyncFile> configSyncFiles = syncFiles.Where(f => f.FileType == MCSyncFile.FileTypes.config && IsDownloadTypeValid(config.Mode, f.DownloadType)); foreach (MCSyncFile configFile in configSyncFiles) { if (File.Exists(config.ConfigFilesDirectory + "\\" + configFile.Filename)) { byte[] fileHash = CalculateHash(config.ConfigFilesDirectory + "\\" + configFile.Filename); if (!fileHash.SequenceEqual(configFile.Checksum)) { Task updateTask = new Task($"Update config file {configFile.Filename}", () => DownloadFile(configFile.FileType, config.ConfigFilesDirectory, configFile.Filename, configFile.DownloadType)); tasks.Add(updateTask); TaskAdded?.Invoke(this, updateTask); } handledFiles.Add(configFile.Filename); } } // Missing Files IEnumerable <MCSyncFile> missingFiles = syncFiles.Where(f => IsDownloadTypeValid(config.Mode, f.DownloadType) && !handledFiles.Contains(f.Filename)); foreach (MCSyncFile missingFile in missingFiles) { if (missingFile.FileType == MCSyncFile.FileTypes.resourcepacks) { Task.Informations.Add($"The resource pack {missingFile.Filename} has been added. Make sure to select it under the 'Available Resource Packs' column in the 'Options...'->'Resource Packs...' menu in Minecraft before attempting to join the server!"); } string directory = ""; switch (missingFile.FileType) { case MCSyncFile.FileTypes.mods: directory = config.ModsDirectory; break; case MCSyncFile.FileTypes.resourcepacks: directory = config.ResourcePackDirectory; break; case MCSyncFile.FileTypes.config: directory = config.ConfigFilesDirectory; break; } Task downloadTask = new Task($"Download {missingFile.FileType.ToString()} file {missingFile.Filename}", () => DownloadFile(missingFile.FileType, directory, missingFile.Filename, missingFile.DownloadType)); tasks.Add(downloadTask); TaskAdded?.Invoke(this, downloadTask); } // Perform Tasks foreach (Task task in tasks) { task.Execute(); } } catch (Exception ex) { Task.Errors.Add($"An unexpected error occurred during Sync: {ex.Message}"); } SyncComplete?.Invoke(this, new EventArgs()); }