private void Download() { var result = Post($"token={_token}&lastUpdate={Properties.Settings.Default.LastOnlineBackup}", DownloadUrl); if (string.IsNullOrEmpty(result)) { Logger.Warn("Error downloading items from remote backup server"); _nextDownload = DateTime.UtcNow.AddMinutes(30); return; } var obj = JsonConvert.DeserializeObject <PlayerItemBackupDownload>(result); if (obj.Success) { var existingItems = _playerItemDao.ListAll() .Where(m => m.OnlineId.HasValue) .Select(m => m.OnlineId.Value) .ToList(); var newItems = obj.Items.Where(onlineItem => !existingItems.Contains(onlineItem.OnlineId)).ToList(); foreach (var simplified in newItems) { var item = Map(simplified); // TODO: Get timestamp from server [on upload] _playerItemDao.Save(item); } foreach (var deleted in obj.Deleted) { var item = _playerItemDao.GetByOnlineId(deleted); if (item != null) { _playerItemDao.Remove(item); } } Logger.Info($"Added {obj.Items.Count} items after online sync"); Logger.Info($"Removed {obj.Deleted.Count} items after online sync"); // TODO: This is very low for every-day usage, and very high for frequent pc switch usage _nextDownload = DateTime.UtcNow.AddHours(1); if (obj.Items.Count > 0) { Properties.Settings.Default.LastOnlineBackup = obj.Items.Max(m => m.ModifiedDate); Properties.Settings.Default.Save(); } } else { HandleAuthenticationIssues(obj.ErrorCode); Logger.Warn($"Could not synchronize items from online backup. Error code {obj.ErrorCode}"); } }
public void TestRemoveHalfStack() { const long oid = 456499611; long id; { var item = new PlayerItem { BaseRecord = "for-testing-item-halfstack-removal", Mod = string.Empty, MinimumLevel = 200, LevelRequirement = 200, StackCount = 30, OnlineId = oid }; dao.Save(item); item.Id.Should().Be.GreaterThan(0); id = item.Id; } // Reduce to 15 { var reloaded = dao.GetByOnlineId(oid); reloaded.Id.Should().Be.EqualTo(id); reloaded.StackCount = 15; dao.Update(new List <PlayerItem> { reloaded }, true); } // Ensure the online ID has been cleared { var reloaded = dao.GetByOnlineId(oid); reloaded.Should().Be.Null(); } // Ensure the item still exists { var reloaded = dao.GetById(id); reloaded.Should().Not.Be.Null(); reloaded.Count.Should().Be.EqualTo(15); } // Ensure the old OID is marked for removal var deletionEntry = dao.GetItemsMarkedForOnlineDeletion().FirstOrDefault(m => m.OID == oid); deletionEntry.Should().Not.Be.Null(); }
public PlayerItem GetByOnlineId(long OID) { return(ThreadExecuter.Execute( () => repo.GetByOnlineId(OID) )); }