예제 #1
0
        public CreateGuildStateMachine()
        {
            InstanceState(x => x.State, Started, CreatedFirstRole, CreatedSecondRole, AddedUser, AddedUserToFirstRole, Done);

            Event(() => GuildCreatedEvent, e => e.CorrelateById(c => c.Message.GuildId));
            Event(() => GuildRoleCreatedEvent, e => e.CorrelateById(c => c.Message.GuildId));
            Event(() => GuildUserAddedEvent, e => e.CorrelateById(c => c.Message.GuildId));
            Event(() => GuildRoleUserAddedEvent, e => e.CorrelateById(c => c.Message.GuildId));

            Initially(
                When(GuildCreatedEvent)
                .TransitionTo(Started)
                .Then(x => x.Instance.InitiatedBy = x.Data.InitiatedBy)
                .SendAsync(RoleAddresses.CreateRoleConsumer, context => context.Init <ICreateRole>(new
            {
                GuildId      = context.Instance.CorrelationId,
                Name         = "everyone",
                AccessLevel  = 1,
                InternalRole = false,
                context.Instance.InitiatedBy
            }))
                .SendAsync(RoleAddresses.CreateRoleConsumer, context => context.Init <ICreateRole>(new
            {
                GuildId      = context.Instance.CorrelationId,
                Name         = "__owner",
                AccessLevel  = 0,
                InternalRole = true,
                context.Instance.InitiatedBy
            }))
                .SendAsync(GuildAddresses.AddGuildUserConsumer, context => context.Init <IAddGuildUser>(new
            {
                GuildId = context.Instance.CorrelationId, context.Instance.InitiatedBy
            }))
                );

            During(Started,
                   When(GuildRoleCreatedEvent)
                   .TransitionTo(CreatedFirstRole));
            During(Started,
                   Ignore(GuildUserAddedEvent));

            During(CreatedFirstRole,
                   When(GuildRoleCreatedEvent)
                   .TransitionTo(CreatedSecondRole)
                   .SendAsync(PermissionAddresses.CreatePermissionsConsumer, context =>
                              context.Init <ICreatePermissions>(new
            {
                GuildId           = context.Instance.CorrelationId,
                RoleName          = "__owner",
                PermissionStrings = Permission.AllowAll(context.Instance.CorrelationId),
                context.Instance.InitiatedBy,
            }))
                   .SendAsync(PermissionAddresses.CreatePermissionsConsumer, context =>
                              context.Init <ICreatePermissions>(new
            {
                GuildId           = context.Instance.CorrelationId,
                RoleName          = "everyone",
                PermissionStrings = Permission.AllowAll(context.Instance.CorrelationId),
                context.Instance.InitiatedBy,
            })));
            During(CreatedFirstRole,
                   Ignore(GuildUserAddedEvent));

            During(CreatedSecondRole,
                   When(GuildUserAddedEvent)
                   .TransitionTo(AddedUser)
                   .SendAsync(RoleAddresses.AddRoleUserConsumer, context => context.Init <IAddRoleUser>(new
            {
                RoleName = "everyone",
                GuildId  = context.Instance.CorrelationId,
                context.Instance.InitiatedBy
            }))
                   .SendAsync(RoleAddresses.AddRoleUserConsumer, context => context.Init <IAddRoleUser>(new
            {
                RoleName = "__owner",
                GuildId  = context.Instance.CorrelationId,
                context.Instance.InitiatedBy
            })));

            During(AddedUser,
                   When(GuildRoleUserAddedEvent)
                   .TransitionTo(AddedUserToFirstRole));

            During(AddedUserToFirstRole,
                   When(GuildRoleUserAddedEvent)
                   .TransitionTo(Done));
        }