Exemplo n.º 1
0
        /// <summary>
        /// Registers <see cref="JsonConnectionFactory"/> that relies on
        /// <see cref="IMessageTypeCache"/>. <see cref="Serialization.RegistrationExtensions.AddSerializationCore(IServiceCollection)"/>
        /// should be called first.
        /// </summary>
        public static MessageTypeCacheBuilder AddJson(this MessageTypeCacheBuilder builder)
        {
            builder.Services.AddTransient <IJsonConnectionFactory, JsonConnectionFactory>();
            builder.AddMessageType(typeof(JsonSerializedMessage));

            return(builder);
        }
    /// <summary>
    /// For self-hosted services without ASP.Net, like TCP real-time hosts
    /// based on messaging framework.
    /// </summary>
    public static MessageTypeCacheBuilder AddTyrServiceWithoutAspNetAuthentication(this MessageTypeCacheBuilder builder)
    {
        builder.Services.AddTyrCommonAuthentication();
        builder.AddMessagingServiceAuthentication();

        return(builder);
    }
        public void ShouldAssignServiceCollectionToProperty()
        {
            var services = new ServiceCollection();
            var sut      = new MessageTypeCacheBuilder(services);

            Assert.Equal(services, sut.Services);
        }
    public static MessageTypeCacheBuilder AddWorld(this MessageTypeCacheBuilder messageTypes)
    {
        var services = messageTypes.Services;

        // Should be transient or scoped since it needs IClientsService.
        services.AddTransient <ILocationRepository, LocationRepository>();
        services.AddSingleton <LocationStore>();

        services.AddTransient <IActivityStore>(x => (IActivityStore)x.GetRequiredService <ILocationRepository>());
        services.AddTransient <ICharacterActivityStore, CharacterActivityStore>();
        services.AddProfileApiClients();

        services
        .AddTransient <IConnectHook, ConnectHook>()
        .UseUpdateFactory <WorldUpdateFactory>()
        .RegisterHandler <MoveToLocation, MoveToLocationHandler>()
        .RegisterHandler <JoinRopeWarContest, JoinRopeWarContestHandler>()
        .RegisterHandler <LeaveJoinedRopeWarContest, LeaveJoinedRopeWarContestHandler>()
        .RegisterHandler <ProposeRopeWarContest, ProposeRopeWarContestHandler>()
        .RegisterHandler <SwitchSides, SwitchSidesHandler>()
        .RegisterHandler <VoteToStartRopeWar, VoteToStartRopeWarHandler>();

        services.RegisterClientMessagingForServer <SignalRClientConnectionFactoryFactory>();

        messageTypes.AddWorldMessages();
        return(messageTypes);
    }
    private static MessageTypeCacheBuilder AddTyrAuthenticationMessagesAndHandlers(this MessageTypeCacheBuilder builder)
    {
        builder.AddMessageTypesFromAssembly(typeof(Authenticate).Assembly);
        builder.Services.RegisterHandler <Authenticate, AuthenticateHandler>();

        return(builder);
    }
        public void ShouldHaveNoMessagesByDefault()
        {
            var services = new ServiceCollection();

            _ = new MessageTypeCacheBuilder(services);

            var cache = services.BuildServiceProvider().GetRequiredService <IMessageTypeCache>();

            Assert.Empty(cache.GetAllTypes());
        }
        public void ShouldRegisterMessageTypeCacheAsSingleton()
        {
            var services = new ServiceCollection();

            _ = new MessageTypeCacheBuilder(services);

            var provider = services.BuildServiceProvider();

            provider.AssertRegisteredSingleton <IMessageTypeCache, MessageTypeCache>();
        }
        public static MessageTypeCacheBuilder AddTypingRealmAuthentication(
            this MessageTypeCacheBuilder builder,
            AuthenticationInformation profileAuthentication,
            AuthenticationInformation?serviceAuthentication = null)
        {
            builder.AddTyrAuthenticationMessages();
            builder.Services.AddTypingRealmAuthentication(profileAuthentication, serviceAuthentication);

            return(builder);
        }
    /// <summary>
    /// Scans the assembly for types marked with <see cref="MessageAttribute"/>
    /// attribute and adds them to the cache builder.
    /// </summary>
    /// <param name="builder">Cache builder where to add message types.</param>
    /// <param name="assembly">Assembly to scan for message types.</param>
    public static MessageTypeCacheBuilder AddMessageTypesFromAssembly(
        this MessageTypeCacheBuilder builder, Assembly assembly)
    {
        foreach (var type in assembly.GetTypes().Where(t => t.GetCustomAttribute <MessageAttribute>() != null))
        {
            builder.AddMessageType(type);
        }

        return(builder);
    }
Exemplo n.º 10
0
    public static MessageTypeCacheBuilder AddTyrServiceAuthentication(this MessageTypeCacheBuilder builder)
    {
        var services         = builder.Services;
        var authInfoProvider = services.AddTyrCommonAuthentication();

        services.UseAspNetAuthentication(authInfoProvider);

        builder.AddMessagingServiceAuthentication();

        return(builder);
    }
Exemplo n.º 11
0
    public static MessageTypeCacheBuilder AddChat(this MessageTypeCacheBuilder messageTypes)
    {
        var services = messageTypes.Services;

        services
        .AddSingleton <MessageLog>()
        .UseUpdateFactory <StateFactory>()
        .RegisterHandler <Say, SayHandler>();

        messageTypes.AddChatMessages();
        return(messageTypes);
    }
Exemplo n.º 12
0
    public static MessageTypeCacheBuilder AddTypingDuelsDomain(this MessageTypeCacheBuilder builder)
    {
        builder.AddTypingDuelsMessages();

        builder.Services.AddSingleton <TypingDuelsState>();
        builder.Services.RegisterHandler <Typed, TypeMessageHandler>();

        builder.Services.AddSingleton <TypedDebouncer>();
        builder.Services.UseUpdateFactory <UpdateFactory>();
        builder.Services.AddTransient <IConnectionGroupProvider, ConnectionGroupProvider>();

        builder.Services.AddTransient <IConnectedClientInitializer, ConnectedClientInitializer>();

        return(builder);
    }
        public void ShouldAddMessages()
        {
            var services = new ServiceCollection();

            _ = new MessageTypeCacheBuilder(services)
                .AddMessageType(typeof(TestMessage))
                .AddMessageType(typeof(string))
                .AddMessageType(typeof(object));

            var cache = services.BuildServiceProvider().GetRequiredService <IMessageTypeCache>();

            Assert.Equal(3, cache.GetAllTypes().Count());
            Assert.Contains(typeof(TestMessage), cache.GetAllTypes().Select(x => x.Value));
            Assert.Contains(typeof(string), cache.GetAllTypes().Select(x => x.Value));
            Assert.Contains(typeof(object), cache.GetAllTypes().Select(x => x.Value));
        }
Exemplo n.º 14
0
    public static MessageTypeCacheBuilder AddRopeWar(this MessageTypeCacheBuilder messageTypes)
    {
        var services = messageTypes.Services;

        services.AddSingleton <IContestStore, InMemoryContestStore>();
        services.AddTransient <ICharacterStateService, CharacterStateServiceAdapter>();
        services.AddProfileApiClients();

        services
        .AddTransient <IConnectHook, ConnectHook>()
        .UseUpdateFactory <ContestUpdateFactory>()
        .RegisterHandler <JoinContest, JoinContestHandler>()
        .RegisterHandler <StartContest, StartContestHandler>()
        .RegisterHandler <PullRope, PullRopeHandler>();

        messageTypes.AddRopeWarMessages();
        return(messageTypes);
    }
        public static MessageTypeCacheBuilder AddTyrWebServiceAuthentication(this MessageTypeCacheBuilder builder)
        {
            var profileAuthentication = new AuthenticationInformationBuilder()
                                        .UseAuth0Provider()
                                        .Build();

            var serviceAuthentication = new AuthenticationInformationBuilder()
                                        .UseIdentityServerProvider()
                                        .Build();

            builder.AddTypingRealmAuthentication(profileAuthentication, serviceAuthentication)
            .Services
            .UseAspNetAuthentication(profileAuthentication, serviceAuthentication)
            .UseConnectedClientContextAuthentication()
            .UseCharacterAuthorizationOnConnect();

            return(builder);
        }
        public static MessageTypeCacheBuilder AddWorld(this MessageTypeCacheBuilder messageTypes)
        {
            var services = messageTypes.Services;

            services.AddSingleton <ILocationStore, LocationStore>();
            services.AddProfileApiClients();

            services
            .AddTransient <IConnectHook, ConnectHook>()
            .UseUpdateFactory <LocationUpdateFactory>()
            .RegisterHandler <JoinRopeWarContest, JoinRopeWarContestHandler>()
            .RegisterHandler <LeaveJoinedRopeWarContest, LeaveJoinedRopeWarContestHandler>()
            .RegisterHandler <MoveToLocation, MoveToLocationHandler>()
            .RegisterHandler <ProposeRopeWarContest, ProposeRopeWarContestHandler>()
            .RegisterHandler <VoteToStartRopeWar, VoteToStartRopeWarHandler>();

            messageTypes.AddWorldMessages();
            return(messageTypes);
        }
    public void ShouldAddAllMessageTypesFromAssembly()
    {
        var services = new ServiceCollection();
        var sut      = new MessageTypeCacheBuilder(services);

        sut.AddMessageTypesFromAssembly(typeof(AMessage).Assembly);
        var cache = services.BuildServiceProvider()
                    .GetRequiredService <IMessageTypeCache>();

        var messages = cache.GetAllTypes().Select(x => x.Value).ToList();

        Assert.True(messages.Count >= 2);
        Assert.Contains(typeof(AMessage), messages);
        Assert.Contains(typeof(BMessage), messages);

        foreach (var message in messages)
        {
            Assert.Equal(typeof(AMessage).Assembly, message.Assembly);
            Assert.NotNull(message.GetCustomAttribute <MessageAttribute>());
        }
    }
    public void AddDomainCore_ShouldAddAllMessagesFromDomainAssemblyAndOnlyThem()
    {
        var services = new ServiceCollection();

        _ = new MessageTypeCacheBuilder(services)
            .AddDomainCore();

        var messages = services.BuildServiceProvider()
                       .GetRequiredService <IMessageTypeCache>()
                       .GetAllTypes()
                       .Select(x => x.Value)
                       .ToList();

        var asmMessages = typeof(Join).Assembly
                          .GetTypes()
                          .Where(x => x.GetCustomAttribute <MessageAttribute>() != null)
                          .OrderBy(x => x.FullName)
                          .ToList();

        Assert.Equal(asmMessages, messages);
    }
Exemplo n.º 19
0
    internal static MessageTypeCacheBuilder AddMessagingServiceAuthentication(this MessageTypeCacheBuilder builder)
    {
        var services = builder.Services;

        builder.AddTyrAuthenticationMessagesAndHandlers();

        // Adding ConnectedClient (realtime) token service for realtime servers
        // that takes data from IConnectedClientContext.
        // Scope is created per user connection, managed by Messaging project.
        // It's very important to register it as scoped here.
        services.AddScoped <IConnectedClientContext, ConnectedClientContext>();
        services.AddTransient <IProfileTokenService, ConnectedClientProfileTokenService>();

        // TODO: Make a possibility to switch to CharacterAuthentication (Connect message) here before AuthenticateConnectionInitializer decorator.
        // Wait for Authenticate message with valid token as the first message.
        services.AddTransient <IConnectionInitializer, UserProfileConnectionInitializer>();
        services.Decorate <IConnectionInitializer, AuthenticateConnectionInitializer>();

        // To query Characters API.
        services.AddProfileApiClients();

        return(builder);
    }
Exemplo n.º 20
0
 public static MessageTypeCacheBuilder AddWorldMessages(this MessageTypeCacheBuilder builder)
 {
     return(builder.AddMessageTypesFromAssembly(typeof(JoinRopeWarContest).Assembly));
 }
Exemplo n.º 21
0
 public static MessageTypeCacheBuilder AddChatMessages(this MessageTypeCacheBuilder builder)
 {
     return(builder.AddMessageTypesFromAssembly(typeof(Say).Assembly));
 }
Exemplo n.º 22
0
 public static MessageTypeCacheBuilder AddTypingDuelsMessages(this MessageTypeCacheBuilder builder)
 {
     builder.AddMessageTypesFromAssembly(typeof(Typed).Assembly);
     return(builder);
 }
 public static MessageTypeCacheBuilder AddTyrAuthenticationMessages(this MessageTypeCacheBuilder builder)
 {
     return(builder.AddMessageTypesFromAssembly(typeof(Authenticate).Assembly));
 }
Exemplo n.º 24
0
 /// <summary>
 /// Adds all domain messages to <see cref="MessageTypeCacheBuilder"/>.
 /// </summary>
 public static MessageTypeCacheBuilder AddDomainCore(this MessageTypeCacheBuilder builder)
 => builder.AddMessageTypesFromAssembly(typeof(Join).Assembly);