Пример #1
0
        public Service1(ILogger <Service1> logger, IMessageHandlerService service)
        {
            _logger  = logger;
            _service = service;

            InitializeComponent();
        }
Пример #2
0
        protected BaseEntityActor(ILog logger, IMessageHandlerService <EntityActorMessage, EntityActorMessageContext> messageHandlerService)
        {
            Logger = logger ?? throw new ArgumentNullException(nameof(logger));
            MessageHandlerService = messageHandlerService ?? throw new ArgumentNullException(nameof(messageHandlerService));

            ReceiveAsync <EntityActorMessage>(OnReceiveMessageAsync);

            //This allows us to handle dispose attachment messages.
            Receive <AttachDisposableActorMessage>(message => AttachDisposable(message.Disposable));
        }
 // The socket is closed when this exceptions are thrown
 private async Task HandleErrorExceptions(WebSocket socket, IMessageHandlerService handlerService, Exception exc)
 {
     if (exc is PlayerNotFoundException || exc is RoomNotFoundException)
     {
         Console.WriteLine($"{exc.GetType()}: {exc.Message}");
         await handlerService.SendMessageAsync(socket, BuildResponse( exc.GetType().Name, exc.Message));
     }
     else
     {
         Console.WriteLine(exc);
     }
 }
Пример #4
0
        protected override void OnStart(string[] args)
        {
            Trace.CorrelationManager.ActivityId = typeof(Program).GUID;
            Trace.TraceInformation("Starting host context on Console Presentation System at {0}", DateTime.Now);

            // Detect platform
            if (System.Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                Trace.TraceWarning("Not running on WindowsNT, some features may not function correctly");
            }

            // Do this because loading stuff is tricky ;)
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Program.CurrentDomain_AssemblyResolve);

            try
            {
                // Initialize
                HostContext context = new HostContext();

                Trace.TraceInformation("Getting default message handler service.");
                m_messageHandlerService = context.GetService(typeof(IMessageHandlerService)) as IMessageHandlerService;

                if (m_messageHandlerService == null)
                {
                    Trace.TraceError("PANIC! Can't find a default message handler service: {0}", "No IMessageHandlerService classes are registered with this host context");
                }
                else
                {
                    Trace.TraceInformation("Starting message handler service {0}", m_messageHandlerService);
                    if (m_messageHandlerService.Start())
                    {
                        Trace.TraceInformation("Service Started Successfully");
                        ExitCode = 0;
                    }
                    else
                    {
                        Trace.TraceError("No message handler service started. Terminating program");
                        ExitCode = 1911;
                        Stop();
                    }
                }
            }
            catch (Exception e)
            {
                Trace.TraceError("Fatal exception occurred: {0}", e.ToString());
                ExitCode = 1064;
                Stop();
            }
            finally
            {
            }
        }
 // The socket should keep running when this exceptions are thrown
 private async Task HandleWarningExceptions(WebSocket socket, IMessageHandlerService handler, Exception exc)
 {
     if (exc is LobbyWarningException)
     {
         Console.WriteLine($"{exc.GetType()}: {exc.Message}");
         await handler.SendMessageAsync(socket, BuildResponse( exc.GetType().Name, exc.Message));
     }
     else if (exc is Newtonsoft.Json.JsonReaderException ||
              exc is Newtonsoft.Json.JsonSerializationException)
     {
         Console.WriteLine($"{exc.GetType()}: {exc.Message}");
         await handler.SendMessageAsync(socket, BuildResponse( exc.GetType().Name,
                                                               "Event Message is not a valid JSON with the correct structure: " +
                                                               "{ eventType: 'event-type', data: 'event-data'"));
     }
     else
     {
         Console.WriteLine($"{exc.GetType()}: {exc.Message}");
     }
 }
Пример #6
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="configService"></param>
 public WeixinController(IMessageHandlerService messageHandlerService)
 {
     _messageHandlerService = messageHandlerService;
 }
Пример #7
0
 public StockChannelHub(IMessageHandlerService messageHandlerService)
 {
     _messageHandlerService = messageHandlerService ?? throw new ArgumentNullException(nameof(messageHandlerService));
 }
        // # COMMUNICATION LOGIC for GAME CLIENT Socket Connections ...
        public async Task Invoke(HttpContext context, IMessageHandlerService handlerService, IHttpClientFactory httpFactory)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                context.Response.StatusCode  = StatusCodes.Status400BadRequest;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(
                    BuildResponse("" + context.Response.StatusCode, "Not a WebSocket HTTP Request"));

                return;
            }
            // The request must have an auth token and the player should be hosting or joining a room
            var    routeValues = context.GetRouteData().Values;
            string auth_cookie = context.Request.Cookies["auth-token"];

            if (!(routeValues["host_join"].Equals("host") || routeValues["host_join"].Equals("join") ||
                  routeValues["host_join"].Equals("findmatch")) || string.IsNullOrWhiteSpace(auth_cookie))
            {
                context.Response.StatusCode = StatusCodes.Status400BadRequest;
                return;
            }

            WebSocket socket = null;
            string    conn_playerID = null, conn_roomID = null;

            try // # HANDLE ERROR EXCEPTIONS, socket is closed
            {
                conn_playerID = await HandlePlayerAuthentication(httpFactory, auth_cookie);

                if (string.IsNullOrWhiteSpace(conn_playerID))
                {
                    context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                    return;
                }
                // Everything is set, accept the socket connection and execute de handshake
                socket = await context.WebSockets.AcceptWebSocketAsync();

                string check_ingame = handlerService.CheckIfPlayerInGame(conn_playerID);
                if (check_ingame != null)
                {
                    await handlerService.SendMessageAsync(socket, BuildResponse("PlayerInGame", check_ingame));

                    return; // socket is closed on the 'finally' block
                }

                if (context.Request.Path.ToString().Contains("host"))
                {
                    conn_roomID = await handlerService.OnConnectedHostLobby(
                        new RoomPlayer(conn_playerID, socket), false);
                }
                else if (context.Request.Path.ToString().Contains("findmatch"))
                {
                    conn_roomID = await handlerService.OnConnectedHostLobby(
                        new RoomPlayer(conn_playerID, socket), true);
                }
                else if (context.Request.Path.ToString().Contains("join"))
                {
                    conn_roomID = context.Request.Query["room-id"].ToString();

                    await handlerService.OnConnectedJoinLobby(conn_roomID,
                                                              new RoomPlayer(conn_playerID, socket));
                }

                await HandleReceivedMessage(socket, async(result, data) => {
                    try // # HANDLE WARNING EXCEPTIONS, socket keeps running
                    {
                        switch (result.MessageType)
                        {
                        case WebSocketMessageType.Text:
                            await handlerService.HandleLobbyAsync(conn_roomID, conn_playerID, socket, data);
                            break;

                        default:     // WebSocketMessageType.Close
                            await handlerService.CancelMatchmaking(conn_roomID);
                            await handlerService.OnPlayerLeft(conn_roomID, conn_playerID);
                            break;
                        }
                    }
                    catch (Exception exc)
                    {
                        await HandleWarningExceptions(socket, handlerService, exc);
                    }
                });
            }
            catch (Exception exc) // catch socket and thread exceptions so the service doesn't break
            {
                await HandleErrorExceptions(socket, handlerService, exc);
            }
            finally // Make sure socket is closed when connection terminates
            {
                await CloseSocketConn(socket);
            }
        }
        // # COMMUNICATION LOGIC for UNITY GAME Socket Connections ...
        public async Task Invoke(HttpContext context, IMessageHandlerService handlerService, IHttpClientFactory httpFactory)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                context.Response.StatusCode  = StatusCodes.Status400BadRequest;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(
                    BuildResponse("" + context.Response.StatusCode, "Not a WebSocket HTTP Request"));

                return;
            }

            string conn_playerID = null,
                   conn_roomID   = context.Request.Query["room-id"].ToString(),
                   auth_token    = context.Request.Query["player-auth"].ToString();
            WebSocket socket     = null;

            try // # HANDLE ERROR EXCEPTIONS, socket is closed
            {
                conn_playerID = await GetPlayerInformation(httpFactory, auth_token);

                if (string.IsNullOrWhiteSpace(conn_playerID))
                {
                    context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                    return;
                }
                // Everything is set, accept the socket connection and execute de handshake
                socket = await context.WebSockets.AcceptWebSocketAsync();

                if (handlerService.CheckIfPlayerInStartedGame(conn_roomID, conn_playerID))
                {
                    await handlerService.SendMessageAsync(socket, BuildResponse("PlayerGameStarted",
                                                                                "Game already started. Player should exit first before updating connection."));

                    return; // socket is closed on the 'finally' block
                }

                await handlerService.UpdateConnection(conn_roomID, conn_playerID, socket);

                await HandleReceivedMessage(socket, async(result, data) => {
                    try // # HANDLE WARNING EXCEPTIONS, socket keeps running
                    {
                        switch (result.MessageType)
                        {
                        case WebSocketMessageType.Text:
                            // DO SOMETHING when received message is text
                            await handlerService.HandleGameAsync(conn_roomID, conn_playerID, socket, data);
                            break;

                        case WebSocketMessageType.Binary:
                            // DO SOMETHING when received message is binary
                            break;

                        default:     // WebSocketMessageType.Close
                            // DO SOMETHING when connection closes
                            await handlerService.OnPlayerLeft(conn_roomID, conn_playerID);
                            break;
                        }
                    }
                    catch (Exception exc)
                    {
                        await HandleWarningExceptions(socket, handlerService, exc);
                    }
                });
            }
            catch (Exception exc) // catch socket and thread exceptions so the service doesn't break
            {
                await HandleErrorExceptions(socket, handlerService, exc);
            }
            finally // Make sure socket is closed when connection terminates
            {
                await CloseSocketConn(socket);
            }
        }
Пример #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="IndexController"/> class.
 /// </summary>
 /// <param name="messageHandlerService"></param>
 /// <param name="logger"></param>
 public IndexController(IMessageHandlerService messageHandlerService, ILogger <IndexController> logger)
 {
     _messageHandlerService = messageHandlerService;
     _logger = logger;
 }
Пример #11
0
        static void Console()
        {
            ShowCopyright();
            Trace.CorrelationManager.ActivityId = typeof(Program).GUID;
            Trace.TraceInformation("Starting host context on Console Presentation System at {0}", DateTime.Now);

            // Detect platform
            if (System.Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                Trace.TraceWarning("Not running on WindowsNT, some features may not function correctly");
            }

            // Do this because loading stuff is tricky ;)
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

            console.Write("Starting MARC-HI Service Framework...");

            // Start the message handler service
            IMessageHandlerService messageHandlerService = null;

            try
            {
                // Initialize
                HostContext context = new HostContext();

                Trace.TraceInformation("Getting default message handler service.");
                messageHandlerService = context.GetService(typeof(IMessageHandlerService)) as IMessageHandlerService;

                console.WriteLine("ok");
                console.Write("Starting default MessageHandler...");

                if (messageHandlerService == null)
                {
                    Trace.TraceError("PANIC! Can't find a default message handler service: {0}", "No IMessageHandlerService classes are registered with this host context");
                }
                else
                {
                    Trace.TraceInformation("Starting message handler service {0}", messageHandlerService);
                    if (messageHandlerService.Start())
                    {
                        console.WriteLine("ok\r\nService host console started succesfully, press any key to terminate...");
                        console.ReadKey();
                    }
                    else
                    {
                        console.WriteLine("fail");
                        Trace.TraceError("No message handler service started. Terminating program");
                    }
                }
            }
            catch (Exception e)
            {
                Trace.TraceError("Fatal exception occurred: {0}", e.ToString());
            }
            finally
            {
                if (messageHandlerService != null)
                {
                    console.Write("Stopping listeners...");
                    Trace.TraceInformation("Stopping message handler service {0}", messageHandlerService);
                    messageHandlerService.Stop();
                    console.WriteLine("ok");
                }
            }


            console.WriteLine("Service Terminated, press any key to close...");
            console.ReadKey();
        }
 public MessageReceiverService(ILogger <MessageReceiverService> logger, IMessageHandlerService service)
 {
     _logger  = logger;
     _service = service;
 }