/// <summary> /// Saves a received craft /// </summary> public static void SaveCraft(ClientStructure client, CraftLibraryDataMsgData data) { Task.Run(() => { var playerFolderType = Path.Combine(CraftFolder, client.PlayerName, data.Craft.CraftType.ToString()); if (!Directory.Exists(playerFolderType)) { Directory.CreateDirectory(playerFolderType); } var lastTime = LastRequest.GetOrAdd(client.PlayerName, DateTime.MinValue); if (DateTime.Now - lastTime > TimeSpan.FromMilliseconds(CraftSettings.SettingsStore.MinCraftLibraryRequestIntervalMs)) { LastRequest.AddOrUpdate(client.PlayerName, DateTime.Now, (key, existingVal) => DateTime.Now); var fileName = $"{data.Craft.CraftName}.craft"; var fullPath = Path.Combine(playerFolderType, fileName); if (FileHandler.FileExists(fullPath)) { LunaLog.Normal($"Overwriting craft {data.Craft.CraftName} ({data.Craft.NumBytes} bytes) from: {client.PlayerName}."); //Send a msg to all the players so they remove the old copy var deleteMsg = ServerContext.ServerMessageFactory.CreateNewMessageData <CraftLibraryDeleteRequestMsgData>(); deleteMsg.CraftToDelete.CraftType = data.Craft.CraftType; deleteMsg.CraftToDelete.CraftName = data.Craft.CraftName; deleteMsg.CraftToDelete.FolderName = data.Craft.FolderName; MessageQueuer.SendToAllClients <CraftLibrarySrvMsg>(deleteMsg); } else { LunaLog.Normal($"Saving craft {data.Craft.CraftName} ({data.Craft.NumBytes} bytes) from: {client.PlayerName}."); FileHandler.WriteToFile(fullPath, data.Craft.Data, data.Craft.NumBytes); } SendNotification(client.PlayerName); } else { LunaLog.Warning($"{client.PlayerName} is sending crafts too fast!"); return; } //Remove oldest crafts if the player has too many RemovePlayerOldestCrafts(playerFolderType); //Checks if we are above the max folders limit CheckMaxFolders(); }); }
private static void SaveNewCraft(CraftLibraryDataMsgData craftMsg) { var craft = new CraftEntry { CraftName = craftMsg.Craft.CraftName, CraftType = craftMsg.Craft.CraftType, FolderName = craftMsg.Craft.FolderName, CraftNumBytes = craftMsg.Craft.NumBytes, CraftData = new byte[craftMsg.Craft.NumBytes] }; Array.Copy(craftMsg.Craft.Data, craft.CraftData, craftMsg.Craft.NumBytes); if (System.CraftDownloaded.TryGetValue(craftMsg.Craft.FolderName, out var downloadedCrafts)) { downloadedCrafts.AddOrUpdate(craftMsg.Craft.CraftName, craft, (key, existingVal) => craft); } System.SaveCraftToDisk(craft); }