public async Task CollectingGameService_WhenPlayersOrFursuitsHaveSameCollectionCount_ThenWhoeverAchievedItFirstRanksHigher() { var players = new RegSysIdentityRecord[3]; var tokens = new TokenRecord[3]; var fursuitBadges = new FursuitBadgeRecord[3]; // 3 players, each with suit for (int i = 0; i < 3; i++) { players[i] = await CreateRegSysIdentityAsync(); tokens[i] = await CreateTokenAsync(); fursuitBadges[i] = await CreateFursuitBadgeAsync(players[i].Uid); await _collectingGameService.RegisterTokenForFursuitBadgeForOwnerAsync( players[i].Uid, fursuitBadges[i].Id, tokens[i].Value); } // Each catches everyone else. for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j == i) { continue; } var result = await _collectingGameService.CollectTokenForPlayerAsync( players[i].Uid, tokens[j].Value); Assert.True(result.IsSuccessful); } } var playerScoreboard = await _collectingGameService.GetPlayerScoreboardEntriesAsync(5); var fursuitScoreboard = await _collectingGameService.GetFursuitScoreboardEntriesAsync(5); // 1 catches first, then 2, then 3 Assert.Equal(3, playerScoreboard.Value.Length); Assert.True(playerScoreboard.Value.All(a => a.CollectionCount == 2)); Assert.Equal(players[0].Username, playerScoreboard.Value[0].Name); Assert.Equal(players[1].Username, playerScoreboard.Value[1].Name); Assert.Equal(players[2].Username, playerScoreboard.Value[2].Name); // 3 gets the 2 catches first (by 1 + 2), then 1 (by 2 + 3), then 2 Assert.Equal(3, fursuitScoreboard.Value.Length); Assert.True(fursuitScoreboard.Value.All(a => a.CollectionCount == 2)); Assert.Equal(fursuitBadges[2].Id, fursuitScoreboard.Value[0].BadgeId); Assert.Equal(fursuitBadges[0].Id, fursuitScoreboard.Value[1].BadgeId); Assert.Equal(fursuitBadges[1].Id, fursuitScoreboard.Value[2].BadgeId); }
private async Task <FursuitBadgeRecord> CreateFursuitBadgeAsync(string ownerUid) { var record = new FursuitBadgeRecord() { Id = Guid.NewGuid(), OwnerUid = ownerUid, Name = $"Suit of attendee {ownerUid}" }; await _fursuitBadgeRepository.InsertOneAsync(record); return(record); }
public async Task <Guid> UpsertFursuitBadgeAsync(FursuitBadgeRegistration registration) { byte[] imageBytes = Convert.FromBase64String(registration.ImageContent); var hash = Hashing.ComputeHashSha1(imageBytes); await _sync.WaitAsync(); try { var record = await _fursuitBadgeRepository.FindOneAsync(a => a.ExternalReference == registration.BadgeNo.ToString()); if (record == null) { record = new FursuitBadgeRecord(); record.NewId(); await _fursuitBadgeRepository.InsertOneAsync(record); } record.ExternalReference = registration.BadgeNo.ToString(); record.OwnerUid = $"RegSys:{_conventionSettings.ConventionNumber}:{registration.RegNo}"; record.Gender = registration.Gender; record.Name = registration.Name; record.Species = registration.Species; record.IsPublic = (registration.DontPublish == 0); record.WornBy = registration.WornBy; record.Touch(); var imageRecord = await _fursuitBadgeImageRepository.FindOneAsync(record.Id); if (imageRecord == null) { imageRecord = new FursuitBadgeImageRecord { Id = record.Id, Width = 240, Height = 320, MimeType = "image/jpeg" }; imageRecord.Touch(); await _fursuitBadgeImageRepository.InsertOneAsync(imageRecord); } if (imageRecord.SourceContentHashSha1 != hash) { imageRecord.SourceContentHashSha1 = hash; var image = Image.Load(imageBytes); image.Resize(new ResizeOptions() { Mode = ResizeMode.Max, Size = new Size(240, 320), Sampler = new BicubicResampler() }); var ms = new MemoryStream(); image.SaveAsJpeg(ms, new JpegEncoderOptions() { IgnoreMetadata = true, Quality = 85 }); imageRecord.SizeInBytes = ms.Length; imageRecord.ImageBytes = ms.ToArray(); ms.Dispose(); imageRecord.Touch(); await _fursuitBadgeImageRepository.ReplaceOneAsync(imageRecord); } await _fursuitBadgeRepository.ReplaceOneAsync(record); return(record.Id); } finally { _sync.Release(); } }