Messaging-App / src / User.java
User.java
Raw
import java.io.*;
import java.util.ArrayList;

/**
 * Purdue CS180 - Summer 22 - Project 5 - User Class
 * <p>
 * This file contains all the methods that any user of this program will use,
 * excluding methods for specific roles. It is the parent class of
 * Customer and Seller
 *
 * @author Ivan Yang, Jun Shern Lim, Shaofeng Yuan
 * @version 31st July 2022
 */

public class User {
    private String fullName;    //user's full name
    private String email;       //user's email
    private String password;    //user's password
    private String userType;    //type of user: seller or customer

    public User(String fullName, String email, String password, String userType) {
        this.fullName = fullName;
        this.email = email;
        this.password = password;
        this.userType = userType;

    }

    //just to initialize a User object to access its methods
    public User() {

    }

    //generates a unique ID (an int >= 0) for a User
    public int generateUniqueID(ArrayList<Integer> takenIDs) {

        int uniqueID = 0;
        while (takenIDs.contains(uniqueID)) {
            uniqueID++;
        }

        return uniqueID;
    }

    //verify that the user's sign up email is unique, can also use to check if account exists
    public static boolean isEmailUnique(String email) throws IOException {
        synchronized (MessagingServer.USER_DETAILS_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("loginDetails.txt"))) {
                String line;
                do {
                    line = br.readLine();

                    if (line == null) {
                        break;
                    }

                    if (line.contains(email)) {
                        return false;
                    }
                } while (true);

            } catch (FileNotFoundException e) { //file not found means it's the first user -> return true
                return true;
            }
        }

        return true;
    }

    public static boolean isEmailValid(String email) {
        if (email.indexOf('@') == -1) {
            return false;
        }
        int indexAt = email.indexOf('@');
        String domain = email.substring(indexAt + 1);

        if (!(email.contains("@") && domain.contains("."))) {
            return false;
        }

        return !email.contains(",");
    }

    public static int isNameValid(String name) {
        if (name.equals("")) {
            return 1;
        }

        if (name.contains(",") || name.contains("@") || name.contains("\\")) {
            return 2;
        }
        return 0;
    }

    public static boolean isPasswordValid(String passwordToCheck) {
        if (passwordToCheck.length() < 3) {
            return false;
        }
        return !passwordToCheck.contains(",");
    }

    //check credentials of a user by comparing data to a file. will also initialize the fields of a user object
    //returns:
    //0 - if email is not found
    //1 - if password is incorrect
    //2 - if everything is correct
    public int checkCredentials(String emailToCheck, String passwordToCheck) throws IOException {

        String line;
        synchronized (MessagingServer.USER_DETAILS_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("loginDetails.txt"))) {
                do {
                    line = br.readLine();
                    if (line == null) {
                        //if email is not found, then return false
                        br.close();
                        return 0;
                    }
                    if (line.split(",")[1].equals(emailToCheck)) {
                        //ensures the next line is not read, will be easy to check password
                        br.close();
                        break;
                    }
                } while (true);
            } catch (FileNotFoundException e) {
                //email not found since file does not exist
                return 0;
            }


        }


        boolean passwordCheck;
        String[] splitLine = line.split(",");
        passwordCheck = splitLine[2].equals(passwordToCheck);

        if (!passwordCheck) {
            return 1;
        }

        //initializes the user's name and user type
        fullName = splitLine[0];
        userType = splitLine[3];

        return 2;
    }

    public String getEmail() {
        return email;
    }

    public String getPassword() {
        return password;
    }

    public String getFullName() {
        return fullName;
    }

    public String getUserType() {
        return userType;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }


    //returns number of new messages for a particular user
    //myID is either customerID or sellerID (don't need storeID cuz it's just sellerID + storeName, so it's enough
    //to check sellerID)
    public static int getNewMsgCountTotal(String myID) throws IOException {
        String line;
        int newMsgCount = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.indexOf(myID) == 0) {
                    newMsgCount += Integer.parseInt(line.split(",")[1]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }
        return newMsgCount;
    }

    //returns the number of new messages a store receives
    public static int getNewMsgCountPerStore(String myID, String theirID) throws IOException {
        String line;
        int newMsgCount = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.split(",")[0].equals(myID + "_" + theirID + ".txt")) {
                    newMsgCount += Integer.parseInt(line.split(",")[1]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }
        return newMsgCount;
    }

    //returns the number of new messages a user receives
    public static int getNewMsgCountPerUser(String myID, String theirID) throws IOException {
        String line;
        int newMsgCount = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.indexOf(myID) == 0 && line.contains(myID) && line.contains(theirID)) {
                    newMsgCount += Integer.parseInt(line.split(",")[1]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }
        return newMsgCount;
    }

    //returns the number of new disappearing messages in total
    public static int getDisapMsgCountTotal(String myID) throws IOException {
        String line;
        int disappearingMsgCount = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.indexOf(myID) == 0) {
                    disappearingMsgCount += Integer.parseInt(line.split(",")[2]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }
        return disappearingMsgCount;
    }

    //returns the number of new disappearing messages a store receives
    public static int getDisapMsgCountPerStore(String myID, String theirID) throws IOException {
        String line;
        int disappearingMsgCount = 0;

        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.indexOf(myID + "_" + theirID) == 0) {
                    disappearingMsgCount += Integer.parseInt(line.split(",")[2]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }

        return disappearingMsgCount;
    }

    //returns the number of new disappearing messages a user receives
    public static int getDisapMsgCountPerUser(String myID, String theirID) throws IOException {
        String line;
        int disappearingMsgCount = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.indexOf(myID) == 0 && line.contains(myID) && line.contains(theirID)) {
                    disappearingMsgCount += Integer.parseInt(line.split(",")[2]);
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file is not found, there will be 0 new messages
            return 0;
        }
        return disappearingMsgCount;
    }


    //removes number of new messages, ie sets it to 0
    //myID is either customerID or storeID
    //storeID is either customerID or storeID
    public static void removeNewMsgCount(String myID, String theirID) throws IOException {
        String line;    //line to read in
        String file = "";    //updated contents of file
        String fileName = String.format("%s_%s.txt", myID, theirID);    //file name with potential new messages
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.split(",")[0].indexOf(fileName) == 0) {
                    //replace new message count with disappearing message count
                    line = line.split(",")[0] + "," + 0 + "," + line.split(",")[2];
                }
                file += line + "\n";
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file not found, that means there are no new messages to remove
            return;
        }
        try (PrintWriter pw = new PrintWriter(new FileOutputStream("newMsgCount.txt"))) {
            pw.print(file);
        }
    }

    //removes number of new disappearing messages, ie sets it to 0
    public static void removeDisMsgCount(String myID, String theirID) throws IOException {
        String line;    //line to read in
        String file = "";    //updated contents of file
        String fileName = String.format("%s_%s.txt", myID, theirID);    //file name with potential new messages
        try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            line = br.readLine();
            while (line != null) {
                if (line.split(",")[0].indexOf(fileName) == 0) {

                    //replace old count with new one, dis count = 0
                    line = line.split(",")[0] + "," + line.split(",")[1] + "," + 0;
                }
                file += line + "\n";
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if file not found, that means there are no new messages to remove
            return;
        }
        try (PrintWriter pw = new PrintWriter(new FileOutputStream("newMsgCount.txt"))) {
            pw.print(file);
        }
    }


    public static ArrayList<Message> getMsg(String myID, String theirID) throws IOException {
        ArrayList<Message> messages = new ArrayList<>();
        synchronized (MessagingServer.NEW_MSG_GATEKEEPER) {
            removeNewMsgCount(myID, theirID);
            removeDisMsgCount(myID, theirID);
        }
        String type = "customer";
        if (!(myID.split("_")[myID.split("_").length - 1].equals("_C"))) type = "store";
        try (var br = new BufferedReader(new FileReader(String.format("%s_%s.txt", myID, theirID)))) {

            String line1 = br.readLine();
            String line2 = br.readLine();
            while (line2 != null) {
                messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                        line1.split(",")[2], false, false));
                //lineNumber++;
                line1 = br.readLine();
                line2 = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //don't need to do anything
        }

        try (var br = new BufferedReader(new FileReader(String.format("%s_%s_new.txt", myID, theirID)))) {

            String line1 = br.readLine();
            String line2 = br.readLine();
            while (line2 != null) {
                if (line1.split(",")[3].equals("D")) {
                    messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                            line1.split(",")[2], true, true));
                    //lineNumber++;

                } else {
                    messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                            line1.split(",")[2], false, true));
                }
                line1 = br.readLine();
                line2 = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //don't need to do anything
        }

        return (messages);
    }

    public static ArrayList<Message> getMsg(String fileName) throws IOException {
        ArrayList<Message> messages = new ArrayList<>();
        if (fileName.substring(fileName.length() - 7, fileName.length()).equals("new.txt")) {
            try (var br = new BufferedReader(new FileReader(fileName))) {

                String line1 = br.readLine();
                String line2 = br.readLine();
                while (line2 != null) {
                    if (line1.split(",")[3].equals("D")) {
                        messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                                line1.split(",")[2], true, true));
                        //lineNumber++;

                    } else {
                        messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                                line1.split(",")[2], false, true));
                    }
                    line1 = br.readLine();
                    line2 = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't do anything
            }

        } else {
            try (var br = new BufferedReader(new FileReader(fileName))) {

                String line1 = br.readLine();
                String line2 = br.readLine();
                while (line2 != null) {
                    messages.add(new Message(line1.split(",")[0], line1.split(",")[1], line2,
                            line1.split(",")[2], false, false));
                    //lineNumber++;
                    line1 = br.readLine();
                    line2 = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't do anything
            }
        }

        return messages;
    }

    //sends the message to a store/customer, the contents are written to a file
    public static void sendMsg(Message toSend, String receiverID) throws IOException {
        // Getting new message

        String senderName = toSend.getSenderName();
        String senderID = toSend.getSenderID();

        // Printing message in both files
        try (var pw = new PrintWriter(new FileOutputStream(String.format("%s_%s_new.txt", senderID, receiverID),
                true))) {
            if (toSend.isDisappearing()) {
                pw.printf("%s,%s,%s,D\n", senderName, senderID, toSend.getDateTime());
            } else {
                pw.printf("%s,%s,%s,N\n", senderName, senderID, toSend.getDateTime());
            }
            pw.printf("%s\n", toSend.getMessageContents());
        }
        try (var pw = new PrintWriter(new FileOutputStream(String.format("%s_%s_new.txt", receiverID, senderID),
                true))) {
            if (toSend.isDisappearing()) {
                pw.printf("%s,%s,%s,D\n", senderName, senderID, toSend.getDateTime());
            } else {
                pw.printf("%s,%s,%s,N\n", senderName, senderID, toSend.getDateTime());
            }
            pw.printf("%s\n", toSend.getMessageContents());
        }


        trackNewMsg(1, 0, senderID, receiverID);
    }

    //flushes messages from new message file to actual message storage
    public static void flushMsg(String senderID, String receiverID) throws IOException {
        int numLines = 0;   //total number of lines read from files

        String line;
        String nextLine;
        try (BufferedReader br = new BufferedReader(new FileReader(String.format(
                "%s_%s_new.txt", senderID, receiverID)))) {
            line = br.readLine();
            nextLine = br.readLine();

            while (nextLine != null) {
                numLines++;

                if (line.split(",")[3].equals("N")) {
                    // Printing message in both files
                    try (var pw = new PrintWriter(new FileOutputStream(
                            String.format("%s_%s.txt", senderID, receiverID),
                            true))) {
                        //pw.printf("%s,%s,%s\n", senderName, senderID, MessagingApp.getCurrentDateTime());
                        pw.printf("%s\n%s\n", line, nextLine);
                    }
//                    try (var pw = new PrintWriter(new FileOutputStream(
//                            String.format("%s_%s.txt", receiverID, senderID),
//                            true))) {
//                        //pw.printf("%s,%s,%s\n", senderName, senderID, MessagingApp.getCurrentDateTime());
//                        pw.printf("%s\n%s\n", line, nextLine);
//                    }
                }
                line = br.readLine();
                nextLine = br.readLine();
            }

        } catch (FileNotFoundException e) {
            System.out.println("File to be flushed does not exist!");
            //continue;
        }

        try (PrintWriter pw = new PrintWriter(
                new FileOutputStream(String.format("%s_%s_new.txt", senderID, receiverID)))) {
            pw.print("");
        }
    }

    //tracks the number of new messages a store/customer receives
    private static void trackNewMsg(int newCount, int disapCount, String senderID, String receiverID)
            throws IOException {
        // Read file
        String file = "";
        int getNewCount;
        int getDisapCount;
        boolean neww = false;
        String toAdd = String.format("%s_%s.txt,%d,%d\n", receiverID, senderID, newCount, disapCount);
        try (var br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
            String line = br.readLine();
            while (line != null) {
                if (line.split(",")[0].equals(String.format("%s_%s.txt", receiverID, senderID))) {
                    getNewCount = Integer.parseInt(line.split(",")[1]);
                    getNewCount += newCount;
                    getDisapCount = Integer.parseInt(line.split(",")[2]);
                    getDisapCount += disapCount;
                    line = line.split(",")[0] + "," + getNewCount + "," + getDisapCount;
                    neww = true;
                }
                file += line + "\n";
                line = br.readLine();
            }
            //if we could not find a line to add new messages to, append it to the end of file
            if (!neww) file += toAdd;
        } catch (FileNotFoundException e) {
            //if no file is found, just append new file contents with toAdd
            file += toAdd;
        }

        // Write file
        try (var pw = new PrintWriter((new FileOutputStream("newMsgCount.txt")))) {
            pw.printf(file);
        }
    }

    public static Message[] messagesToModify(String myID, String theirID) throws IOException {
        ArrayList<Message> messages = getMsg(String.format("%s_%s.txt", myID, theirID));
        ArrayList<Message> toReturn = new ArrayList<>();
        for (Message message : messages) {
            if (message.getSenderID().equals(myID)) {
                toReturn.add(message);
            }
        }
        Message[] messagesToReturn = new Message[toReturn.size()];
        toReturn.toArray(messagesToReturn);
        return messagesToReturn;
    }

    public static void editMsg(String editedMsg, Message messageToEdit, String myID, String theirID)
            throws IOException {
        int count = 0;
        ArrayList<Message> messages = getMsg(String.format("%s_%s.txt", myID, theirID));
        for (Message message : messages) {
            if (message.isEquals(messageToEdit)) {
                message.setMessageContents(editedMsg + " (edited)");
            }
        }
        try (PrintWriter pw = new PrintWriter(new FileOutputStream(String.format("%s_%s.txt", myID, theirID)))) {
            for (Message message : messages) {
                pw.printf("%s,%s,%s,%s\n%s\n", message.getSenderName(), message.getSenderID(),
                        message.getDateTime(), message.isDisappearing() ? "D" : "N", message.getMessageContents());
            }
        }
        ArrayList<Message> messagesTheir1 = getMsg(String.format("%s_%s_new.txt", theirID, myID));
        for (Message message : messagesTheir1) {
            if (message.isEquals(messageToEdit)) {
                message.setMessageContents(editedMsg + " (edited)");
                count++;
            }
        }
        if (count == 1) {
            try (PrintWriter pw = new PrintWriter(
                    new FileOutputStream(String.format("%s_%s_new.txt", theirID, myID)))) {
                for (Message message : messagesTheir1) {
                    pw.printf("%s,%s,%s,%s\n%s\n", message.getSenderName(), message.getSenderID(),
                            message.getDateTime(), message.isDisappearing() ? "D" : "N", message.getMessageContents());
                }
            }
            return;
        }
        ArrayList<Message> messagesTheir2 = getMsg(String.format("%s_%s.txt", theirID, myID));
        for (Message message : messagesTheir2) {
            if (message.isEquals(messageToEdit)) {
                message.setMessageContents(editedMsg + " (edited)");
            }
        }
        try (PrintWriter pw = new PrintWriter(
                new FileOutputStream(String.format("%s_%s.txt", theirID, myID)))) {
            for (Message message : messagesTheir2) {
                pw.printf("%s,%s,%s,%s\n%s\n", message.getSenderName(), message.getSenderID(),
                        message.getDateTime(), message.isDisappearing() ? "D" : "N", message.getMessageContents());
            }
        }
    }

    //delete message
    public static void deleteMsg(Message messageToEdit, String myID, String theirID)
            throws IOException {
        ArrayList<Message> messages = getMsg(String.format("%s_%s.txt", myID, theirID));
        for (Message message : messages) {
            if (message.isEquals(messageToEdit)) {
                messages.remove(message);
                break;
            }
        }
        try (PrintWriter pw = new PrintWriter(new FileOutputStream(String.format("%s_%s.txt", myID, theirID)))) {
            for (Message message : messages) {
                pw.printf("%s,%s,%s,%s\n%s\n", message.getSenderName(), message.getSenderID(),
                        message.getDateTime(), message.isDisappearing() ? "D" : "N", message.getMessageContents());
            }
        }
    }


    //blocks a user by adding their details to a file called blocked.txt
    public static void blockUser(String myID, String theirID) throws FileNotFoundException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }

        synchronized (MessagingServer.BLOCK_GATEKEEPER) {
            try (PrintWriter pw = new PrintWriter(new FileOutputStream("blocked.txt", true))) {
                //format is blocker,blockee -> ie, I block them
                pw.printf("%s,%s\n", myID, theirID);
            }
        }

    }

    //unblocks a user by removing their details from blocked.txt
    public static void unblockUser(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }
        //basically deleting blocking line from file
        String file = "";   //new file contents
        String toDelete = String.format("%s,%s", myID, theirID);   //line in file to delete
        synchronized (MessagingServer.BLOCK_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("blocked.txt"))) {
                String line = br.readLine();
                while (line != null) {
                    //format is blocker,blockee -> ie, I block them, so its always gonna be line.split("_")[1]
                    if (line.equals(toDelete)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            }
            try (PrintWriter pw = new PrintWriter(new FileOutputStream("blocked.txt"))) {
                pw.print(file);
            }
        }

    }

    //checks whether I am blocked
    public static boolean isBlocked(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }
        //get the string to check whether I blocked them
        String isBlocked = String.format("%s,%s", theirID, myID);
        synchronized (MessagingServer.BLOCK_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("blocked.txt"))) {
                String line = br.readLine();
                while (line != null) {
                    if (line.equals(isBlocked)) {
                        return true;
                    }
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //if there's no blocked file, no users are blocked
                return false;
            }
        }
        //if couldn't find isBlocked string in file, then return false
        return false;
    }

    //checks whether they are blocked
    public static boolean areTheyBlocked(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }
        //get the string to check whether I blocked them
        synchronized (MessagingServer.BLOCK_GATEKEEPER) {
            String isBlocked = String.format("%s,%s", myID, theirID);
            try (BufferedReader br = new BufferedReader(new FileReader("blocked.txt"))) {
                String line = br.readLine();
                while (line != null) {
                    if (line.equals(isBlocked)) {
                        return true;
                    }
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //if there's no blocked file, no users are blocked
                return false;
            }
        }

        //if couldn't find isBlocked string in file, then return false
        return false;
    }

    //blocks a user by adding their details to a file called blocked.txt
    public static void becomeInvisible(String myID, String theirID) throws FileNotFoundException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }

        try (PrintWriter pw = new PrintWriter(new FileOutputStream("invisible.txt", true))) {
            //format is enabler,enablee -> ie, I block them
            pw.printf("%s,%s\n", myID, theirID);
        }


    }

    //become visible to a user by removing their details from invisible.txt
    public static void becomeVisible(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }
        //basically deleting blocking line from file
        String file = "";   //new file contents
        String toDelete = String.format("%s,%s", myID, theirID);

        try (BufferedReader br = new BufferedReader(new FileReader("invisible.txt"))) {
            String line = br.readLine();
            while (line != null) {
                //format is enabler,enablee -> ie, I block them, so its always gonna be line.split("_")[1]
                if (line.equals(toDelete)) {
                    line = br.readLine();
                    continue;
                }
                file += line + "\n";
                line = br.readLine();
            }
        }
        try (PrintWriter pw = new PrintWriter(new FileOutputStream("invisible.txt"))) {
            pw.print(file);
        }

    }

    //checks whether I am invisible to another user
    public static boolean isInvisible(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("CUSTOMER") == 0) {
            theirID = theirID.split("_")[0];
        } else {
            myID = myID.split("_")[0];
        }
        //get the string to check whether they are invisible to me
        String amInvisible = String.format("%s,%s", myID, theirID);

        try (BufferedReader br = new BufferedReader(new FileReader("invisible.txt"))) {
            String line = br.readLine();
            while (line != null) {
                if (line.equals(amInvisible)) {
                    return true;
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if there's no invisible file, no users are invisible
            return false;
        }


        //if couldn't find amInvisible string in file, then return false
        return false;
    }

    //checks whether another user is invisible to me
    public static boolean areTheyInvisible(String myID, String theirID) throws IOException {
        //first get sellerID from storeID, need to check who is customer and who is store/seller
        if (myID.indexOf("SELLER") == 0) {
            myID = myID.split("_")[0];
        }
        //get the string to check whether they are invisible to me
        String areTheyInvisible = String.format("%s,%s", theirID, myID);

        try (BufferedReader br = new BufferedReader(new FileReader("invisible.txt"))) {
            String line = br.readLine();
            while (line != null) {
                if (line.equals(areTheyInvisible)) {
                    return true;
                }
                line = br.readLine();
            }
        } catch (FileNotFoundException e) {
            //if there's no invisible file, no users are invisible
            return false;
        }


        //if couldn't find amInvisible string in file, then return false
        return false;
    }

    //deletes user account and remove all text message files, store details, and login details associated with
    //the account
    public static boolean deleteUserAccount(String userID) throws IOException {
        String file = "";   //new contents to be written to a file

        synchronized (MessagingServer.USER_DETAILS_GATEKEEPER) {
            //removes content in loginDetails
            try (BufferedReader br = new BufferedReader(new FileReader("loginDetails.txt"))) {
                String line;
                line = br.readLine();
                while (line != null) {
                    if (line.split(",")[4].equals(userID)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't need to do anything if file is not found
            }

            try (PrintWriter pw = new PrintWriter(new FileOutputStream("loginDetails.txt"))) {
                pw.print(file);
            }
        }

        //reset file contents
        file = "";

        synchronized (MessagingServer.STORES_GATEKEEPER) {
            //removes store contents
            try (BufferedReader br = new BufferedReader(new FileReader("stores.txt"))) {
                String line;
                line = br.readLine();
                while (line != null) {
                    if (line.split(",")[line.split(",").length - 3].equals(userID)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't need to do anything if file is not found
            }

            try (PrintWriter pw = new PrintWriter(new FileOutputStream("stores.txt"))) {
                pw.print(file);
            }
        }

        synchronized (MessagingServer.NEW_MSG_GATEKEEPER) {
            file = ""; //reset file contents
            //removes new message contents
            try (BufferedReader br = new BufferedReader(new FileReader("newMsgCount.txt"))) {
                String line;
                line = br.readLine();
                while (line != null) {
                    if (line.contains(userID)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't need to do anything if file is not found
            }
            try (PrintWriter pw = new PrintWriter(new FileOutputStream("newMsgCount.txt"))) {
                pw.print(file);
            }
        }


        //removes blocked file contents
        file = ""; //reset file contents
        synchronized (MessagingServer.BLOCK_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("blocked.txt"))) {
                String line;
                line = br.readLine();
                while (line != null) {
                    if (line.contains(userID)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't need to do anything if file is not found
            }

            try (PrintWriter pw = new PrintWriter(new FileOutputStream("blocked.txt"))) {
                pw.print(file);
            }
        }

        //removes invisible file contents
        file = ""; //reset file contents
        synchronized (MessagingServer.INVISIBLE_GATEKEEPER) {
            try (BufferedReader br = new BufferedReader(new FileReader("invisible.txt"))) {
                String line;
                line = br.readLine();
                while (line != null) {
                    if (line.contains(userID)) {
                        line = br.readLine();
                        continue;
                    }
                    file += line + "\n";
                    line = br.readLine();
                }
            } catch (FileNotFoundException e) {
                //don't need to do anything if file is not found
            }

            try (PrintWriter pw = new PrintWriter(new FileOutputStream("invisible.txt"))) {
                pw.print(file);
            }
        }


        //deletes all message files involving the account to be deleted
        String workingDirectory = System.getProperty("user.dir"); //get the current working directory
        File files = new File(workingDirectory);
        String[] filesInDirectory = files.list();

        if (filesInDirectory != null) {
            for (String fileName : filesInDirectory) {
                if (fileName.contains(userID)) {
                    File toDelete = new File(fileName);
                    //if can't delete file, return false
                    if (!toDelete.delete()) {
                        System.out.printf("Could not delete message file: %s\n", fileName);
                        return false;
                    }
                }
            }
        }
        //remove ID number from array
        int idToRemove = Integer.parseInt(userID.substring(userID.length() - 1));
        if (userID.contains("SELLER")) {
            MessagingServer.getUsedSellerIDs().remove((Integer) idToRemove);
        } else if (userID.contains("CUSTOMER")) {
            MessagingServer.getUsedCustomerIDs().remove((Integer) idToRemove);
            //remove the customer gatekeeper
            int index = 0;
            for (int i = 0; i < MessagingServer.CUSTOMER_GATEKEEPERS.size(); i++) {
                if (MessagingServer.CUSTOMER_GATEKEEPERS.get(i).getID() == idToRemove) {
                    index = i;
                    break;
                }
            }
            MessagingServer.CUSTOMER_GATEKEEPERS.remove(index);
        } else {
            return false;
        }

        return true;

    }


}