Exemplo n.º 1
0
        private void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            using (var message = e.GetMessage())
            {
                // Check if message is meant for this plugin
                if (message.Tag >= TagsPerPlugin * (LoginTag + 1))
                {
                    return;
                }

                var client = e.Client;

                switch (message.Tag)
                {
                case LoginUser:
                {
                    // If user is already logged in (shouldn't happen though)
                    if (UsersLoggedIn[client] != null)
                    {
                        using (var msg = Message.CreateEmpty(LoginSuccess))
                        {
                            client.SendMessage(msg, SendMode.Reliable);
                        }

                        return;
                    }

                    string username;
                    string password;

                    using (var reader = message.GetReader())
                    {
                        try
                        {
                            username = reader.ReadString();
                            password = Encryption.Decrypt(reader.ReadBytes(), _privateKey);
                        }
                        catch (Exception ex)
                        {
                            // Return Error 0 for Invalid Data Packages Recieved
                            InvalidData(client, LoginFailed, ex, "Failed to log in!");
                            return;
                        }
                    }

                    if (UsersLoggedIn.ContainsValue(username))
                    {
                        // Username is already in use -> return Error 3
                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write((byte)3);

                            using (var msg = Message.Create(LoginFailed, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }
                        return;
                    }

                    try
                    {
                        var user = _dbConnector.Users.AsQueryable().FirstOrDefault(u => u.Username == username);

                        if (user != null && BCrypt.Net.BCrypt.Verify(password, user.Password))
                        {
                            UsersLoggedIn[client] = username;
                            Clients[username]     = client;

                            using (var msg = Message.CreateEmpty(LoginSuccess))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }

                            if (_debug)
                            {
                                WriteEvent("Successful login (" + client.ID + ").", LogType.Info);
                            }
                        }
                        else
                        {
                            if (_debug)
                            {
                                WriteEvent("User " + client.ID + " couldn't log in!", LogType.Info);
                            }

                            // Return Error 1 for "Wrong username/password combination"
                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write((byte)1);

                                using (var msg = Message.Create(LoginFailed, writer))
                                {
                                    client.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, LoginFailed, ex);
                    }
                    break;
                }

                case LogoutUser:
                {
                    var username = UsersLoggedIn[client];
                    UsersLoggedIn[client] = null;

                    if (username != null)
                    {
                        Clients.Remove(username);
                    }

                    if (_debug)
                    {
                        WriteEvent("User " + client.ID + " logged out!", LogType.Info);
                    }

                    using (var msg = Message.CreateEmpty(LogoutSuccess))
                    {
                        client.SendMessage(msg, SendMode.Reliable);
                    }

                    onLogout?.Invoke(username);
                    break;
                }

                case AddUser:
                {
                    if (!_allowAddUser)
                    {
                        return;
                    }

                    string username;
                    string password;

                    try
                    {
                        using (var reader = message.GetReader())
                        {
                            username = reader.ReadString();

                            password = BCrypt.Net.BCrypt.HashPassword(
                                Encryption.Decrypt(reader.ReadBytes(), _privateKey)
                                , 10);
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 0 for Invalid Data Packages Recieved
                        InvalidData(client, AddUserFailed, ex, "Failed to add user!");
                        return;
                    }

                    try
                    {
                        if (UsernameAvailable(username))
                        {
                            AddNewUser(username, password);

                            using (var msg = Message.CreateEmpty(AddUserSuccess))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }
                        else
                        {
                            if (_debug)
                            {
                                WriteEvent("User " + client.ID + " failed to sign up!", LogType.Info);
                            }

                            // Return Error 1 for "Wrong username/password combination"
                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write((byte)1);

                                using (var msg = Message.Create(AddUserFailed, writer))
                                {
                                    client.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, AddUserFailed, ex);
                    }
                    break;
                }
                }
            }
        }
Exemplo n.º 2
0
        private void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            using (var message = e.GetMessage())
            {
                // Check if message is meant for this plugin
                if (message.Tag < Login.TagsPerPlugin * FriendsTag || message.Tag >= Login.TagsPerPlugin * (FriendsTag + 1))
                {
                    return;
                }

                var client = e.Client;

                switch (message.Tag)
                {
                case FriendRequest:
                {
                    // If player isn't logged in -> return error 1
                    if (!_loginPlugin.PlayerLoggedIn(client, RequestFailed, "Friend request failed."))
                    {
                        return;
                    }

                    var    senderName = _loginPlugin.UsersLoggedIn[client];
                    string receiver;

                    try
                    {
                        using (var reader = message.GetReader())
                        {
                            receiver = reader.ReadString();
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 0 for Invalid Data Packages Recieved
                        _loginPlugin.InvalidData(client, RequestFailed, ex, "Friend Request Failed! ");
                        return;
                    }

                    try
                    {
                        var receiverUser = _dbConnector.Users.AsQueryable()
                                           .FirstOrDefault(u => u.Username == receiver);
                        if (receiverUser == null)
                        {
                            // No user with that name found -> return error 3
                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write((byte)3);

                                using (var msg = Message.Create(RequestFailed, writer))
                                {
                                    client.SendMessage(msg, SendMode.Reliable);
                                }
                            }

                            if (_debug)
                            {
                                WriteEvent("No user named " + receiver + " found!", LogType.Info);
                            }
                            return;
                        }

                        if (receiverUser.Friends.Contains(senderName) ||
                            receiverUser.OpenFriendRequests.Contains(senderName))
                        {
                            // Users are already friends or have an open request -> return error 4
                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write((byte)4);

                                using (var msg = Message.Create(RequestFailed, writer))
                                {
                                    client.SendMessage(msg, SendMode.Reliable);
                                }
                            }

                            if (_debug)
                            {
                                WriteEvent("Request failed, " + senderName + " and " + receiver +
                                           " were already friends or had an open friend request!", LogType.Info);
                            }
                            return;
                        }

                        // Save the request in the database to both users
                        AddRequests(senderName, receiver);

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(receiver);

                            using (var msg = Message.Create(RequestSuccess, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }

                        if (_debug)
                        {
                            WriteEvent(senderName + " wants to add " + receiver + " as a friend!", LogType.Info);
                        }

                        // If Receiver is currently logged in, let him know right away
                        if (_loginPlugin.Clients.ContainsKey(receiver))
                        {
                            var receivingClient = _loginPlugin.Clients[receiver];

                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write(senderName);

                                using (var msg = Message.Create(FriendRequest, writer))
                                {
                                    receivingClient.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, RequestFailed, ex);
                    }
                    break;
                }

                case DeclineRequest:
                {
                    // If player isn't logged in -> return error 1
                    if (!_loginPlugin.PlayerLoggedIn(client, DeclineRequestFailed, "DeclineFriendRequest failed."))
                    {
                        return;
                    }

                    var    senderName = _loginPlugin.UsersLoggedIn[client];
                    string receiver;

                    try
                    {
                        using (var reader = message.GetReader())
                        {
                            receiver = reader.ReadString();
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 0 for Invalid Data Packages Recieved
                        _loginPlugin.InvalidData(client, DeclineRequestFailed, ex, "Decline Request Failed!");
                        return;
                    }

                    try
                    {
                        // Delete the request from the database for both users
                        RemoveRequests(senderName, receiver);

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(receiver);
                            writer.Write(true);

                            using (var msg = Message.Create(DeclineRequestSuccess, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }

                        if (_debug)
                        {
                            WriteEvent(senderName + " declined " + receiver + "'s friend request.", LogType.Info);
                        }

                        // If Receiver is currently logged in, let him know right away
                        if (_loginPlugin.Clients.ContainsKey(receiver))
                        {
                            var receivingClient = _loginPlugin.Clients[receiver];

                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write(senderName);
                                writer.Write(false);

                                using (var msg = Message.Create(DeclineRequestSuccess, writer))
                                {
                                    receivingClient.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, DeclineRequestFailed, ex);
                    }
                    break;
                }

                case AcceptRequest:
                {
                    // If player isn't logged in -> return error 1
                    if (!_loginPlugin.PlayerLoggedIn(client, AcceptRequestFailed, "AcceptFriendRequest failed."))
                    {
                        return;
                    }

                    var    senderName = _loginPlugin.UsersLoggedIn[client];
                    string receiver;

                    try
                    {
                        using (var reader = message.GetReader())
                        {
                            receiver = reader.ReadString();
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 0 for Invalid Data Packages Recieved
                        _loginPlugin.InvalidData(client, AcceptRequestFailed, ex, "Accept Request Failed!");
                        return;
                    }

                    try
                    {
                        // Delete the request from the database for both users and add their names to their friend list
                        RemoveRequests(senderName, receiver);
                        AddFriends(senderName, receiver);

                        var receiverOnline = _loginPlugin.Clients.ContainsKey(receiver);

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(receiver);
                            writer.Write(receiverOnline);

                            using (var msg = Message.Create(AcceptRequestSuccess, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }

                        if (_debug)
                        {
                            WriteEvent(senderName + " accepted " + receiver + "'s friend request.", LogType.Info);
                        }

                        // If Receiver is currently logged in, let him know right away
                        if (receiverOnline)
                        {
                            var receivingClient = _loginPlugin.Clients[receiver];

                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write(senderName);
                                writer.Write(true);

                                using (var msg = Message.Create(AcceptRequestSuccess, writer))
                                {
                                    receivingClient.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, AcceptRequestFailed, ex);
                    }
                    break;
                }

                case RemoveFriend:
                {
                    // If player isn't logged in -> return error 1
                    if (!_loginPlugin.PlayerLoggedIn(client, RemoveFriendFailed, "RemoveFriend failed."))
                    {
                        return;
                    }

                    var    senderName = _loginPlugin.UsersLoggedIn[client];
                    string receiver;

                    try
                    {
                        using (var reader = message.GetReader())
                        {
                            receiver = reader.ReadString();
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 0 for Invalid Data Packages Recieved
                        _loginPlugin.InvalidData(client, RemoveFriendFailed, ex, "Remove Friend Failed!");
                        return;
                    }

                    try
                    {
                        // Delete the names from the friendlist in the database for both users
                        RemoveFriends(senderName, receiver);

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(receiver);
                            writer.Write(true);

                            using (var msg = Message.Create(RemoveFriendSuccess, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }

                        if (_debug)
                        {
                            WriteEvent(senderName + " removed " + receiver + " as a friend.", LogType.Info);
                        }

                        // If Receiver is currently logged in, let him know right away
                        if (_loginPlugin.Clients.ContainsKey(receiver))
                        {
                            var receivingClient = _loginPlugin.Clients[receiver];

                            using (var writer = DarkRiftWriter.Create())
                            {
                                writer.Write(senderName);
                                writer.Write(false);

                                using (var msg = Message.Create(RemoveFriendSuccess, writer))
                                {
                                    receivingClient.SendMessage(msg, SendMode.Reliable);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, RemoveFriendFailed, ex);
                    }
                    break;
                }

                case GetAllFriends:
                {
                    // If player isn't logged in -> return error 1
                    if (!_loginPlugin.PlayerLoggedIn(client, GetAllFriendsFailed, "GetAllFriends failed."))
                    {
                        return;
                    }

                    var senderName = _loginPlugin.UsersLoggedIn[client];

                    try
                    {
                        var user           = _dbConnector.Users.AsQueryable().First(u => u.Username == senderName);
                        var onlineFriends  = new List <string>();
                        var offlineFriends = new List <string>();

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(senderName);

                            foreach (var friend in user.Friends)
                            {
                                if (_loginPlugin.Clients.ContainsKey(friend))
                                {
                                    onlineFriends.Add(friend);

                                    // let online friends know he logged in
                                    var cl = _loginPlugin.Clients[friend];

                                    using (var msg = Message.Create(FriendLoggedIn, writer))
                                    {
                                        cl.SendMessage(msg, SendMode.Reliable);
                                    }
                                }
                                else
                                {
                                    offlineFriends.Add(friend);
                                }
                            }
                        }

                        using (var writer = DarkRiftWriter.Create())
                        {
                            writer.Write(onlineFriends.ToArray());
                            writer.Write(offlineFriends.ToArray());
                            writer.Write(user.OpenFriendRequests.ToArray());
                            writer.Write(user.UnansweredFriendRequests.ToArray());

                            using (var msg = Message.Create(GetAllFriends, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }

                        if (_debug)
                        {
                            WriteEvent("Got friends for " + senderName, LogType.Info);
                        }
                    }
                    catch (Exception ex)
                    {
                        // Return Error 2 for Database error
                        _dbConnector.DatabaseError(client, GetAllFriendsFailed, ex);
                    }
                    break;
                }
                }
            }
        }