public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                Console.WriteLine("WebSocket Connected");

                string ConnID = _manager.AddSocket(webSocket);
                await SendConnIDAsync(webSocket, ConnID);

                await ReceiveMessage(webSocket, async (result, buffer) => {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine("Message Received");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");
                        await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        string id = _manager.getAllSockets().FirstOrDefault(s => s.Value == webSocket).Key;
                        Console.WriteLine("Received close message!");
                        _manager.getAllSockets().TryRemove(id, out WebSocket sock);
                        await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                        return;
                    }
                });
            }
            else
            {
                Console.WriteLine("Hello from the 2rd request delegate.");
                await _next(context);
            }
        }
        public async Task InvokeAsync(HttpContext context)
        {
            WriteRequestParam(context);
            if (context.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await context.WebSockets.AcceptWebSocketAsync();

                Console.WriteLine("WebSocket Connected");

                await SendConnIdAsync(webSocket, _manager.AddSocket(webSocket));

                await ReceiveMessage(webSocket, async (result, bytes) =>
                {
                    switch (result.MessageType)
                    {
                    case WebSocketMessageType.Text:
                        var message = Encoding.UTF8.GetString(bytes, 0, result.Count);
                        Console.WriteLine($"Message received: {message}");
                        await RouteJsonMessageAsync(message);
                        break;

                    case WebSocketMessageType.Close:
                        Console.WriteLine("Received close message");

                        var connId = _manager.GetAllSockets().FirstOrDefault(pair => pair.Value == webSocket).Key;
                        _manager.GetAllSockets().TryRemove(connId, out var ws);
                        if (ws != null)
                        {
                            await ws.CloseAsync(
                                result.CloseStatus ?? WebSocketCloseStatus.Empty,
                                result.CloseStatusDescription,
                                CancellationToken.None);
                        }

                        break;

                    case WebSocketMessageType.Binary:
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                });
            }
            else
            {
                Console.WriteLine("Coming from the request");
                await _next(context);

                Console.WriteLine("Coming from the response");
                WriteResponseParam(context);
            }
        }
Ejemplo n.º 3
0
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                string ConnID = _manager.AddSocket(webSocket);
                await SendConnIDAsync(webSocket, ConnID); //Call to new method here

                Console.WriteLine("WebSocket Connected");
                var socketCount = this._manager.GetAllSockets();
                Console.WriteLine($"There are: {socketCount.Count()} sockets connection");
                await Receive(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine($"Receive->Text");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");
                        await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));

                        return;
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key;
                        Console.WriteLine($"Receive->Close");

                        _manager.GetAllSockets().TryRemove(id, out WebSocket sock);
                        Console.WriteLine("Managed Connections: " + _manager.GetAllSockets().Count.ToString());

                        await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

                        return;
                    }
                });
            }
            else
            {
                Console.WriteLine("Hello from 2nd Request Delegate - No WebSocket");
                await _next(context);
            }
        }
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();  // a WebSocket connection is built

                var connID = _manager.AddSocket(webSocket);

                await SendConnIDAsync(webSocket, connID);

                await ReceiveMessage(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine($"Receive -> Text");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");
                        await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));
                        return;
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        var id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key;
                        Console.WriteLine($"Receive -> Close");

                        _manager.GetAllSockets().TryRemove(id, out WebSocket sockt);  // pass "out" the WebSocket we want
                        Console.WriteLine("Managed Connections: " + _manager.GetAllSockets().Count.ToString());

                        await sockt.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

                        return;
                    }
                });
            }
            else
            {
                Console.WriteLine("Hello from 2nd request delegate - Not WebSocket");
                await _next(context);  // call the next Request Delegate
            }
        }
Ejemplo n.º 5
0
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)                                 //checks if it's a websocket, if so we create websocket object with await context.web.....
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); //async method, may take time, accepts requests

                Console.WriteLine("WebSocket Connected");

                string ConnID = _manager.AddSocket(webSocket);
                await SendConnIDAsync(webSocket, ConnID);

                await ReceiveMessage(webSocket, async(result, Buffer) =>    //message receiver
                {
                    if (result.MessageType == WebSocketMessageType.Text)    //chekcs if types are correct
                    {
                        Console.WriteLine("Message Recieved");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(Buffer, 0, result.Count)}");      //decoding a buffer using UTF8
                        await RounteJSONMessageAsync(Encoding.UTF8.GetString(Buffer, 0, result.Count));
                        return;
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)    //closes if requested
                    {
                        string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value ==
                                                                            webSocket).Key;

                        Console.WriteLine("Recieved Close message");
                        _manager.GetAllSockets().TryRemove(id, out WebSocket sock);     //takes id, finds it, and passes out a socket that we can close
                        await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                        return;
                    }
                });
            }
            else
            {
                Console.WriteLine("Hello from the 2rd request delegate."); //runs when i go to http://localhost5000
                await _next(context);                                      //creates next request delegate in the pipeline
            }
        }
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                Console.WriteLine("Connected");

                string connId = _manager.AddSocket(webSocket);
                await SendConnectionIdAsync(webSocket, connId);

                await ReceiveMessage(webSocket, async (result, buffer) =>
                {
                    //also have byte[]
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");
                        await RouteJsonMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));
                        return;
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        string id = _manager.GetAllSockets().FirstOrDefault(x => x.Value == webSocket).Key;
                        _manager.GetAllSockets().TryRemove(id, out WebSocket sock);
                        await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                        Console.WriteLine("Rx close message");
                        return;
                    }
                });
            }
            else
            {
                Console.WriteLine("Hello from 2nd request delegate");
                await _next(context);
            }
        }
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                bool clientEstablished = false;

                await Receive(webSocket, async (result, buffer) =>
                {
                    if (clientEstablished == false && result.MessageType == WebSocketMessageType.Text)
                    {
                        _manager.AddSocket(Encoding.UTF8.GetString(buffer, 0, result.Count), webSocket);
                        clientEstablished = true;
                        string username   = Encoding.UTF8.GetString(buffer, 0, result.Count);
                        await webSocket.SendAsync(Encoding.UTF8.GetBytes("{\"eventV\": \"setProfilePhoto\", \"user\": \"" + username + "\", \"photoBytes\": \"" + ProfilePhoto.GetImage(username) + "\"}"), WebSocketMessageType.Text, true, CancellationToken.None);
                        FriendsList.SetOnline(username, "true");
                        List <string> obj = new List <string>()
                        {
                            username, FriendsList.GetStatus(username)
                        };
                        List <string> friends = FriendsList.GetFriends(username).Split(GlobalVar.delimiterChars, System.StringSplitOptions.RemoveEmptyEntries).OfType <string>().ToList();
                        foreach (string friend in friends)
                        {
                            await RouteJSONMessageAsync("setStatus", obj, friend);
                            try
                            {
                                await webSocket.SendAsync(Encoding.UTF8.GetBytes("{\"eventV\": \"setProfilePhoto\", \"user\": \"" + friend + "\", \"photoBytes\": \"" + ProfilePhoto.GetImage(friend) + "\"}"), WebSocketMessageType.Text, true, CancellationToken.None);
                            }
                            catch
                            {
                                Console.WriteLine("Error Loading {0}'s Profile Photo!", friend);
                            }
                        }

                        Console.WriteLine($"WebSocket Operation: Client->EstablishedConnection");
                        Console.WriteLine("\nSet the status of: {0}\tChanged to: online", obj[0]);
                    }
                    else
                    {
                        if (result.MessageType == WebSocketMessageType.Text)
                        {
                            List <string> obj = new List <string>();
                            dynamic jsonObj   = JObject.Parse(Encoding.UTF8.GetString(buffer, 0, result.Count));
                            string job        = jsonObj.job;
                            switch (job)
                            {
                            case ("sendMessage"):
                                obj.Add((jsonObj.message).ToString());
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                obj.Add(GlobalVar.currentDateMsg());
                                obj.Add((jsonObj.ghostMode).ToString());
                                Console.WriteLine(obj[4].ToString());
                                Console.WriteLine("Operation:\tsendMessage\n");
                                await RouteJSONMessageAsync(job, obj, obj[2]);
                                break;

                            case ("setStatus"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.status).ToString());
                                Console.WriteLine("Operation:\tsetStatus\n");
                                List <string> friends = FriendsList.GetFriends(obj[0]).Split(GlobalVar.delimiterChars, System.StringSplitOptions.RemoveEmptyEntries).OfType <string>().ToList();
                                foreach (string friend in friends)
                                {
                                    await RouteJSONMessageAsync(job, obj, friend);
                                }
                                break;

                            case ("addFriendReq"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                Console.WriteLine("Operation:\taddFriendReq\n");
                                if (KeyTagID.GetUserExists(obj[1]))
                                {
                                    FriendsList flAFR = new FriendsList("ADDFR", obj[0], obj[1], KeyTagID.GrabUserKeyTag(obj[0]));
                                    await webSocket.SendAsync(Encoding.UTF8.GetBytes("{\"eventV\": \"userExists\", \"existsV\": true, \"user\": \"" + obj[1].ToString() + "\"}"), WebSocketMessageType.Text, true, CancellationToken.None);
                                    await RouteJSONMessageAsync(job, obj, obj[1]);
                                }
                                else
                                {
                                    await webSocket.SendAsync(Encoding.UTF8.GetBytes("{\"eventV\": \"userExists\", \"existsV\": false}"), WebSocketMessageType.Text, true, CancellationToken.None);
                                }
                                break;

                            case ("cancelFriendReq"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                Console.WriteLine("Operation:\tcancelFriendReq\n");
                                FriendsList flRFR = new FriendsList("REMOVEFR", obj[0], obj[1], KeyTagID.GrabUserKeyTag(obj[0]));
                                await RouteJSONMessageAsync(job, obj, obj[1]);
                                break;

                            case ("acceptFriendReq"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                obj.Add(ProfilePhoto.GetImage(obj[0]));
                                Console.WriteLine("Operation:\tacceptFriendReq\n");
                                FriendsList flACFR = new FriendsList("ACCEPTFR", obj[0], obj[1], KeyTagID.GrabUserKeyTag(obj[0]));
                                await RouteJSONMessageAsync(job, obj, obj[1]);
                                await webSocket.SendAsync(Encoding.UTF8.GetBytes("{\"eventV\": \"setProfilePhoto\", \"user\": \"" + obj[0] + "\", \"photoBytes\": \"" + ProfilePhoto.GetImage(obj[1]) + "\"}"), WebSocketMessageType.Text, true, CancellationToken.None);
                                break;

                            case ("declineFriendReq"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                Console.WriteLine("Operation:\tdeclineFriendReq\n");
                                FriendsList flDFR = new FriendsList("DECLINEFR", obj[0], obj[1], 0);
                                await RouteJSONMessageAsync(job, obj, obj[1]);
                                break;

                            case ("removeFriend"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.receiver).ToString());
                                Console.WriteLine("Operation:\removeFriend\n");
                                FriendsList flRF = new FriendsList("REMOVE", obj[0], obj[1], 0);
                                await RouteJSONMessageAsync(job, obj, obj[1]);
                                break;

                            case ("setProfilePhoto"):
                                obj.Add((jsonObj.sender).ToString());
                                obj.Add((jsonObj.photoBytes).ToString());
                                Console.WriteLine("Operation:\tsetProfilePhoto\n");
                                ProfilePhoto.SaveImage(obj[0], obj[1]);
                                List <string> friendsPP = FriendsList.GetFriends(obj[0]).Split(GlobalVar.delimiterChars, System.StringSplitOptions.RemoveEmptyEntries).OfType <string>().ToList();
                                foreach (string friend in friendsPP)
                                {
                                    await RouteJSONMessageAsync(job, obj, friend);
                                }
                                break;
                            }
                            obj.Clear();
                        }
                        else if (result.MessageType == WebSocketMessageType.Close)
                        {
                            string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key;

                            _manager.GetAllSockets().TryRemove(id, out WebSocket sock);

                            await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

                            List <string> obj = new List <string>();
                            obj.Add(id);
                            obj.Add("offline");
                            List <string> friends = FriendsList.GetFriends(obj[0]).Split(GlobalVar.delimiterChars, System.StringSplitOptions.RemoveEmptyEntries).OfType <string>().ToList();
                            foreach (string friend in friends)
                            {
                                await RouteJSONMessageAsync("setStatusOffline", obj, friend);
                            }
                            FriendsList.SetOnline(id, "false");
                            Console.WriteLine("\nSet the status of: {0}\tChanged to: {1}", obj[0], obj[1]);
                            Console.WriteLine($"WebSocket Operation: Receive->Close");
                        }
                    }
                    requestCount++;
                    Console.WriteLine("\nRequest #: " + requestCount + "\nManaged Connections: " + _manager.GetAllSockets().Count.ToString());
                    Console.WriteLine("\n\n" + GlobalVar.border + "\n");
                    return;
                });
            }
            else
            {
                await _next(context);
            }
        }