Esempio n. 1
0
    async Task SocketSender()
    {
        //Console.WriteLine("Begin MessageSender");

        var buffer = new byte[BufferSize];
        var seg    = new ArraySegment <byte>(buffer);

        for (;;)
        {
            //Console.WriteLine("In Loop");
            if (this.socket.State != WebSocketState.Open)
            {
                break;
            }
            var inBuf = await this.socket.ReceiveAsync(seg, CancellationToken.None);

            if (this.socket.State != WebSocketState.Open)
            {
                break;
            }
            var jsonStr = System.Text.Encoding.ASCII.GetString(seg.Array.Take(inBuf.Count).ToArray());

            if (jsonStr.IndexOf("message") == 9)
            {
                //Console.WriteLine("roomHandler.rooms[0].sockets.Count={0}", roomHandler.rooms[0].sockets.Count);
                //Console.WriteLine("Server received a Message");
                var json       = JsonConvert.DeserializeObject <DataToReceiveMessage>(jsonStr);
                var dataToSend = new DataToSendMessage();
                dataToSend.type      = "message";
                dataToSend.username  = DBHandler.GetUsername(user_id);
                dataToSend.message   = json.message;
                dataToSend.timestamp = DateTime.Now.ToString("h:mm tt");
                dataToSend.color     = DBHandler.GetUserColor(user_id);

                DBHandler.InsertMessage(dataToSend, roomNumber);
                await roomHandler.SendMessageToRoom(dataToSend, roomNumber);
            }
            else if (jsonStr.IndexOf("connected") == 9)
            {
                var json       = JsonConvert.DeserializeObject <DataToReceiveConnected>(jsonStr);
                var userResult = DBHandler.VerifyAuthKey(json.authKey);
                if (userResult >= 0)
                {
                    user_id = userResult;
                    await PopulateRoomWithMessages();
                    await PopulateSidebarWithRooms();

                    roomHandler.AddSocket(socket, user_id, roomNumber);
                    var dataToSend = new DataToSendBot();
                    dataToSend.type    = "bot";
                    dataToSend.message = DBHandler.GetUsername(user_id) + " connected!";
                    await roomHandler.SendDataToRoom(dataToSend, roomNumber);
                }
                else
                {
                    var dataToSend = new DataToSendAuthKey();
                    dataToSend.type    = "authkey";
                    dataToSend.authKey = "";
                    await roomHandler.SendDataToSocket(dataToSend, socket);
                }
            }
            else if (jsonStr.IndexOf("changeroom") == 9)
            {
                var json = JsonConvert.DeserializeObject <DataToReceiveChangeRoom>(jsonStr);
                await ChangeRoom(json.roomNumber);
            }
            else if (jsonStr.IndexOf("createroom") == 9)
            {
                var json = JsonConvert.DeserializeObject <DataToReceiveCreateRoom>(jsonStr);
                if (DBHandler.RoomNameAvailable(json.roomName))
                {
                    roomHandler.AddRoom(json.roomName);
                    await ChangeRoom(DBHandler.GetRoomId(json.roomName));

                    var dataToSend = DBHandler.GetRoomsData();
                    await roomHandler.SendDataToAll(dataToSend);
                }
            }
            else if (jsonStr.IndexOf("login") == 9)
            {
                var json       = JsonConvert.DeserializeObject <DataToReceiveLoginOrCreate>(jsonStr);
                var dataToSend = new DataToSendAuthKey();
                dataToSend.type = "authkey";
                if (DBHandler.ValidLogin(json.username, json.password))
                {
                    var authKey = SocketHandler.GenerateAuthKey(16);
                    user_id = DBHandler.GetUserId(json.username);
                    DBHandler.InsertAuthKey(authKey, user_id);
                    dataToSend.authKey = authKey;
                }
                else
                {
                    dataToSend.authKey = "invalid login";
                }

                await roomHandler.SendDataToSocket(dataToSend, socket);
            }
            else if (jsonStr.IndexOf("createuser") == 9)
            {
                var json       = JsonConvert.DeserializeObject <DataToReceiveLoginOrCreate>(jsonStr);
                var dataToSend = new DataToSendAuthKey();
                dataToSend.type = "authkey";
                if (DBHandler.UsernameAvailable(json.username))
                {
                    var authKey = SocketHandler.GenerateAuthKey(16);
                    DBHandler.InsertUser(json.username, json.password);
                    user_id = DBHandler.GetUserId(json.username);
                    DBHandler.InsertAuthKey(authKey, user_id);
                    dataToSend.authKey = authKey;
                }
                else
                {
                    dataToSend.authKey = "taken username";
                }

                await roomHandler.SendDataToSocket(dataToSend, socket);
            }
            else
            {
                Console.WriteLine("Invalid Data Type");
            }
        }

        roomHandler.RemoveSocket(socket);
    }