Esempio n. 1
0
        public void Arrived(string location, int day)
        {
            var @event = new ArrivedAtLocation {
                Day = day, Location = location
            };

            _events.Add(@event);
        }
Esempio n. 2
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List <EventStream>();
            var logger  = new RecordingLogger();

            using (var session = theStore.LightweightSession())
            {
                session.Logger = logger;

                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(logger.LastCommit.GetStreams());
            }

            var types = new Type[]
            {
                typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation)
            };

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), types))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                    .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }
        }
Esempio n. 3
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List <EventStream>();

            using (var session = theStore.LightweightSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(session.LastCommit.GetStreams());
            }



            var events = theStore.Schema.Events.As <EventGraph>();

            theOptions.EventTypeNames = new[]
            {
                events.EventMappingFor <MembersJoined>().EventTypeName,
                events.EventMappingFor <MembersDeparted>().EventTypeName,
                events.EventMappingFor <ArrivedAtLocation>().EventTypeName
            };

            using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer()))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                    .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }
        }
Esempio n. 4
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var events = theStore.Schema.Events.As <EventGraph>();

            theOptions.EventTypeNames = new[]
            {
                events.EventMappingFor <MembersDeparted>().EventTypeName,
                events.EventMappingFor <ArrivedAtLocation>().EventTypeName
            };

            using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer()))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse();
                all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue();
                all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue();
            }
        }
Esempio n. 5
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), new Type[] { typeof(MembersDeparted), typeof(ArrivedAtLocation) }))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse();
                all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue();
                all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue();
            }
        }
Esempio n. 6
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day = i,
                        Location = Guid.NewGuid().ToString(),
                        Members = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } };

                    var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), new Type[] {typeof(MembersDeparted), typeof(ArrivedAtLocation)}))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType<Event<MembersJoined>>().Any().ShouldBeFalse();
                all.OfType<Event<MembersDeparted>>().Any().ShouldBeTrue();
                all.OfType<Event<ArrivedAtLocation>>().Any().ShouldBeTrue();
            }

        }
Esempio n. 7
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List<EventStream>();
            var logger = new RecordingLogger();

            using (var session = theStore.LightweightSession())
            {
                session.Logger = logger;

                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day = i,
                        Location = Guid.NewGuid().ToString(),
                        Members = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } };

                    var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(logger.LastCommit.GetStreams());
            }

            var types = new Type[]
            {
                typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation)
            };

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };
            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), types))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                        .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }

        }
Esempio n. 8
0
        public async Task capture_events()
        {
            #region sample_event-store-quickstart
            var store = DocumentStore.For(_ =>
            {
                _.Connection(ConnectionSource.ConnectionString);
                _.Projections.SelfAggregate <QuestParty>();
            });

            var questId = Guid.NewGuid();

            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream <Quest>(questId, started, joined1);

                // Append more events to the same stream
                var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen");
                var joined3 = new MembersJoined(10, "Bree", "Aragorn");
                var arrived = new ArrivedAtLocation {
                    Day = 15, Location = "Rivendell"
                };
                session.Events.Append(questId, joined2, joined3, arrived);

                // Save the pending changes to db
                await session.SaveChangesAsync();
            }
            #endregion


            #region sample_event-store-start-stream-with-explicit-type
            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream(typeof(Quest), questId, started, joined1);
                await session.SaveChangesAsync();
            }
            #endregion

            #region sample_event-store-start-stream-with-no-type
            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                // no stream type will be stored in database
                session.Events.StartStream(questId, started, joined1);
                await session.SaveChangesAsync();
            }
            #endregion

            #region sample_events-fetching-stream
            using (var session = store.OpenSession())
            {
                var events = await session.Events.FetchStreamAsync(questId);

                events.Each(evt =>
                {
                    Console.WriteLine($"{evt.Version}.) {evt.Data}");
                });
            }
            #endregion

            #region sample_events-aggregate-on-the-fly
            using (var session = store.OpenSession())
            {
                // questId is the id of the stream
                var party = session.Events.AggregateStream <QuestParty>(questId);
                Console.WriteLine(party);

                var party_at_version_3 = await session.Events
                                         .AggregateStreamAsync <QuestParty>(questId, 3);

                var party_yesterday = await session.Events
                                      .AggregateStreamAsync <QuestParty>(questId, timestamp : DateTime.UtcNow.AddDays(-1));
            }
            #endregion

            using (var session = store.OpenSession())
            {
                var party = session.Load <QuestParty>(questId);
                Console.WriteLine(party);
            }
        }
Esempio n. 9
0
        public void capture_events()
        {
// SAMPLE: event-store-quickstart
            var store = DocumentStore.For(_ =>
            {
                _.Connection(ConnectionSource.ConnectionString);
                _.Events.InlineProjections.AggregateStreamsWith <QuestParty>();
            });

            var questId = Guid.NewGuid();

            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream <Quest>(questId, started, joined1);
                session.SaveChanges();

                // Append more events to the same stream
                var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen");
                var joined3 = new MembersJoined(10, "Bree", "Aragorn");
                var arrived = new ArrivedAtLocation {
                    Day = 15, Location = "Rivendell"
                };
                session.Events.Append(questId, joined2, joined3, arrived);
                session.SaveChanges();
            }
// ENDSAMPLE

// SAMPLE: events-fetching-stream
            using (var session = store.OpenSession())
            {
                var events = session.Events.FetchStream(questId);
                events.Each(evt =>
                {
                    Console.WriteLine($"{evt.Version}.) {evt.Data}");
                });
            }
// ENDSAMPLE

// SAMPLE: events-aggregate-on-the-fly
            using (var session = store.OpenSession())
            {
                // questId is the id of the stream
                var party = session.Events.AggregateStream <QuestParty>(questId);
                Console.WriteLine(party);

                var party_at_version_3 = session.Events
                                         .AggregateStream <QuestParty>(questId, 3);


                var party_yesterday = session.Events
                                      .AggregateStream <QuestParty>(questId, timestamp: DateTime.UtcNow.AddDays(-1));
            }
// ENDSAMPLE


            using (var session = store.OpenSession())
            {
                var party = session.Load <QuestParty>(questId);
                Console.WriteLine(party);
            }
        }
Esempio n. 10
0
        internal void Attack()
        {
            if (Player.Health <= 0)
            {
                throw new DefeatedException();
            }

            if (CurrentMonster == null)
            {
                throw new NotInBattleModeException();
            }

            var attackRollPlayer = dice.Roll();
            var weapon           = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)) : null;
            var elementAttack    = weapon == null ? 0 : GetElementAttack(weapon.ElementAttacks, CurrentMonster.ElementDefenses);
            var weaponAttack     = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)).Attack : 0;
            var attackPlayer     = Player.Attack + attackRollPlayer + weaponAttack + elementAttack - CurrentMonster.Defense;

            attackPlayer = Math.Max(0, attackPlayer);
            if (attackPlayer > CurrentMonster.Health)
            {
                CurrentMonster.Health = 0;
            }
            else
            {
                CurrentMonster.Health -= attackPlayer;
            }

            if (CurrentMonster.Health == 0)
            {
                var loot = GetLoot();
                foreach (var item in loot)
                {
                    Player.Inventory.Add(item.Id);
                }

                MonsterDefeated?.Invoke(this, new MonsterDefeatedEventArgs(CurrentMonster, loot));

                CurrentMonster = encounters.Next();
                if (CurrentMonster == null)
                {
                    encounters = null;
                    ArrivedAtLocation?.Invoke(this, new ArrivedAtLocationEventArgs(CurrentTown));
                }
                else
                {
                    MonsterEncountered?.Invoke(this, new MonsterEncounteredEventArgs(CurrentMonster));
                }

                return;
            }
            else
            {
                MonsterHealthChanged?.Invoke(this, new MonsterHealthChangedEventArgs(CurrentMonster.Health));
            }

            var attackRollMonster = dice.Roll();
            var legDefencePlayer  = Player.LegArmorId.HasValue ? ((LegArmor)unitOfWork.Items.Get(Player.LegArmorId.Value)).Defence : 0;
            var bodyDefencePlayer = Player.BodyArmorId.HasValue ? ((BodyArmor)unitOfWork.Items.Get(Player.BodyArmorId.Value)).Defence : 0;
            var attackMonster     = CurrentMonster.Attack + attackRollMonster - Player.Defense - legDefencePlayer - bodyDefencePlayer;

            attackMonster = Math.Max(0, attackMonster);
            if (attackMonster > Player.Health)
            {
                Player.Health = 0;
            }
            else
            {
                Player.Health -= attackMonster;
            }

            if (Player.Health <= 0)
            {
                PlayerDefeated.Invoke(this, EventArgs.Empty);
            }
            else if (attackMonster != 0)
            {
                PlayerHealthChanged?.Invoke(this, new PlayerHealthChangedEventArgs(Player.Health));
            }
        }