From c5b2f773411a52a0922252b54af4df0bf2521b1d Mon Sep 17 00:00:00 2001 From: calebcjl Date: Thu, 19 Jan 2023 18:57:53 +0800 Subject: [PATCH 01/20] Rename chatbot to Nano and add greeting and exit message --- src/main/java/Duke.java | 10 ---------- src/main/java/Nano.java | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/Duke.java create mode 100644 src/main/java/Nano.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java new file mode 100644 index 000000000..f99b3075e --- /dev/null +++ b/src/main/java/Nano.java @@ -0,0 +1,27 @@ +public class Nano { + //print horizontal line of length = len * 10 + public static void print_hor_ln() { + int len = 10; + for (int i = 0; i < len; i += 1) { + System.out.print("__________"); + } + System.out.println(); + } + public static void main(String[] args) { + //chatbot startup + print_hor_ln(); + String logo = "| \\ || / \\ | \\ ||| __ |\n" + + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" + + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" + + "|| \\_|// \\\\|| \\_||______|\n"; + System.out.println(logo); + System.out.println("Serial number: 034-4532-5893....."); + System.out.println("Activating the 7th generation Nano Machine of the Chan Corporation....."); + print_hor_ln(); + System.out.println("How may I assist you?"); + print_hor_ln(); + + //chatbot exit message + System.out.println("Sleep mode activated."); + } +} From 8cb1426443436af7fbe0f33d5ea48fe8e4143610 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Wed, 25 Jan 2023 19:07:24 +0800 Subject: [PATCH 02/20] Add echo user input feature and exit condition --- src/main/java/Nano.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index f99b3075e..9e89abf4f 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -1,3 +1,4 @@ +import java.util.Scanner; public class Nano { //print horizontal line of length = len * 10 public static void print_hor_ln() { @@ -21,6 +22,15 @@ public static void main(String[] args) { System.out.println("How may I assist you?"); print_hor_ln(); + //receive commands + String command; + do { + Scanner in = new Scanner(System.in); + command = in.nextLine(); + System.out.println(command + "!"); + //exit when user types "bye" + } while(!command.equals("bye")); + //chatbot exit message System.out.println("Sleep mode activated."); } From 5690fae02564233ce4e026e2421e5f28a954aeea Mon Sep 17 00:00:00 2001 From: calebcjl Date: Thu, 26 Jan 2023 12:22:32 +0800 Subject: [PATCH 03/20] Change echo feature to store user input in a list --- src/main/java/Nano.java | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index 9e89abf4f..f304e8811 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -22,14 +22,33 @@ public static void main(String[] args) { System.out.println("How may I assist you?"); print_hor_ln(); + // initialise list of 100 items + String[] list = new String[100]; + int listCount = 0; + //receive commands - String command; - do { + String text; + boolean exit = false; + while (!exit) { Scanner in = new Scanner(System.in); - command = in.nextLine(); - System.out.println(command + "!"); - //exit when user types "bye" - } while(!command.equals("bye")); + text = in.nextLine(); + if (text.equals("bye")) { + //chatbot exit when user types "bye" + exit = true; + } + else if (text.equals("list")) { + // display list + for (int i = 0; i < listCount; i += 1) { + System.out.println((i + 1) + ". " + list[i]); + } + } + else { + // add text to list + list[listCount] = text; + listCount += 1; + System.out.println("Added " + text + " to list."); + } + } //chatbot exit message System.out.println("Sleep mode activated."); From daafab5f16c71a0112439e64eacfb9ffea89408f Mon Sep 17 00:00:00 2001 From: calebcjl Date: Tue, 31 Jan 2023 14:24:55 +0800 Subject: [PATCH 04/20] Add task class and feature to mark tasks --- src/main/java/Nano.java | 91 +++++++++++++++++++++++++++++------------ src/main/java/Task.java | 32 +++++++++++++++ 2 files changed, 97 insertions(+), 26 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index f304e8811..de7ac7b58 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -1,30 +1,31 @@ import java.util.Scanner; + public class Nano { - //print horizontal line of length = len * 10 - public static void print_hor_ln() { - int len = 10; - for (int i = 0; i < len; i += 1) { + //print horizontal line of length = length * 10 + public static void printHorizontalLine() { + final int LENGTH = 10; + for (int i = 0; i < LENGTH; i += 1) { System.out.print("__________"); } System.out.println(); } + public static void main(String[] args) { //chatbot startup - print_hor_ln(); - String logo = "| \\ || / \\ | \\ ||| __ |\n" - + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" - + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" - + "|| \\_|// \\\\|| \\_||______|\n"; - System.out.println(logo); + printHorizontalLine(); + final String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" + + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" + + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" + + "|| \\_|// \\\\|| \\_||______|\n"; + System.out.println(NANO_LOGO); System.out.println("Serial number: 034-4532-5893....."); System.out.println("Activating the 7th generation Nano Machine of the Chan Corporation....."); - print_hor_ln(); + printHorizontalLine(); System.out.println("How may I assist you?"); - print_hor_ln(); + printHorizontalLine(); - // initialise list of 100 items - String[] list = new String[100]; - int listCount = 0; + // initialise list of 100 tasks 1-index + Task[] tasks = new Task[101]; //receive commands String text; @@ -32,21 +33,59 @@ public static void main(String[] args) { while (!exit) { Scanner in = new Scanner(System.in); text = in.nextLine(); + if (text.equals("bye")) { //chatbot exit when user types "bye" exit = true; - } - else if (text.equals("list")) { - // display list - for (int i = 0; i < listCount; i += 1) { - System.out.println((i + 1) + ". " + list[i]); + } else if (text.startsWith("/")) { + // input is a command + text = text.replace("/", "").trim(); + int dividerIndex = text.indexOf(" "); + if (dividerIndex == -1 && text.equals("list")) { + // display list + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + System.out.print(i + ". "); + if (tasks[i].getTaskStatus()) { + System.out.print("[x] "); + } else { + System.out.print("[] "); + } + System.out.println(tasks[i].getTaskName()); + } + } else { + // split command and taskName into 2 strings + String command = text.substring(0, dividerIndex); + String taskName = text.substring(dividerIndex + 1); + System.out.println(taskName); + + switch (command) { + case "mark": + // mark task as completed + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + if (tasks[i].getTaskName().equals(taskName) && !tasks[i].getTaskStatus()) { + tasks[i].markTask(); + System.out.println("Marked " + tasks[i].getTaskName()); + break; + } + } + break; + case "unmark": + // unmark task completed status + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + if (tasks[i].getTaskName().equals(taskName) && tasks[i].getTaskStatus()) { + tasks[i].unmarkTask(); + System.out.println("Unmarked " + tasks[i].getTaskName()); + break; + } + } + break; + } } - } - else { - // add text to list - list[listCount] = text; - listCount += 1; - System.out.println("Added " + text + " to list."); + } else { + // add task to list + Task newTask = new Task(text); + tasks[Task.getTaskCount()] = newTask; + System.out.println("Added " + newTask.getTaskName() + " to list."); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..995b98bf2 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,32 @@ +public class Task { + private String name; + private boolean isCompleted; + private static int taskCount = 0; + private static int completedTaskCount = 0; + + public Task(String name) { + this.name = name; + this.isCompleted = false; + taskCount += 1; + } + + // mark task as completed + public void markTask() { + this.isCompleted = true; + completedTaskCount += 1; + } + // unmark task to become uncompleted + public void unmarkTask() { + this.isCompleted = false; + } + + public String getTaskName() { + return this.name; + } + public boolean getTaskStatus() { + return this.isCompleted; + } + public static int getTaskCount() { + return taskCount; + } +} From d9c167a2641aec97c749dc54d45b7de0abc899da Mon Sep 17 00:00:00 2001 From: calebcjl Date: Tue, 31 Jan 2023 14:53:06 +0800 Subject: [PATCH 05/20] Tweak to coding standard and display number of completed tasks in list --- src/main/java/Nano.java | 15 +++++++++------ src/main/java/Task.java | 6 ++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index de7ac7b58..17f009ff5 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -1,10 +1,13 @@ import java.util.Scanner; public class Nano { - //print horizontal line of length = length * 10 + + final static int HORIZONTAL_LINE_LENGTH = 100; + final static int MAX_TASK_COUNT = 100; + + //print horizontal line public static void printHorizontalLine() { - final int LENGTH = 10; - for (int i = 0; i < LENGTH; i += 1) { + for (int i = 0; i < HORIZONTAL_LINE_LENGTH / 10; i += 1) { System.out.print("__________"); } System.out.println(); @@ -24,8 +27,8 @@ public static void main(String[] args) { System.out.println("How may I assist you?"); printHorizontalLine(); - // initialise list of 100 tasks 1-index - Task[] tasks = new Task[101]; + // initialise list of tasks 1-index + Task[] tasks = new Task[MAX_TASK_COUNT + 1]; //receive commands String text; @@ -43,6 +46,7 @@ public static void main(String[] args) { int dividerIndex = text.indexOf(" "); if (dividerIndex == -1 && text.equals("list")) { // display list + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + (Task.getTaskCount() - Task.getCompletedTaskCount()) + " more to go!"); for (int i = 1; i <= Task.getTaskCount(); i += 1) { System.out.print(i + ". "); if (tasks[i].getTaskStatus()) { @@ -56,7 +60,6 @@ public static void main(String[] args) { // split command and taskName into 2 strings String command = text.substring(0, dividerIndex); String taskName = text.substring(dividerIndex + 1); - System.out.println(taskName); switch (command) { case "mark": diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 995b98bf2..33ba8eccd 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -15,6 +15,7 @@ public void markTask() { this.isCompleted = true; completedTaskCount += 1; } + // unmark task to become uncompleted public void unmarkTask() { this.isCompleted = false; @@ -23,10 +24,15 @@ public void unmarkTask() { public String getTaskName() { return this.name; } + public boolean getTaskStatus() { return this.isCompleted; } + public static int getTaskCount() { return taskCount; } + public static int getCompletedTaskCount() { + return completedTaskCount; + } } From b3d9e39e0f078f190a9de50244d6c13f5fe08baa Mon Sep 17 00:00:00 2001 From: calebcjl Date: Thu, 2 Feb 2023 02:43:14 +0800 Subject: [PATCH 06/20] Refactor code to improve quality --- src/main/java/Nano.java | 238 +++++++++++++++++++++++++++------------- src/main/java/Task.java | 14 ++- 2 files changed, 168 insertions(+), 84 deletions(-) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index 17f009ff5..2d709892a 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -2,97 +2,177 @@ public class Nano { - final static int HORIZONTAL_LINE_LENGTH = 100; - final static int MAX_TASK_COUNT = 100; + private final static int HORIZONTAL_LINE_LENGTH = 100; + private final static int MAX_TASK_COUNT = 100; + private final static String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" + + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" + + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" + + "|| \\_|// \\\\|| \\_||______|\n"; + private final static int COMMAND_INDEX = 0; + private final static int TASK_NAME_INDEX = 1; + public static final String TASK_COMPLETED_MARK = "[x] "; + public static final String TASK_UNCOMPLETED_MARK = "[] "; + public static final String MESSAGE_TASK_NOT_FOUND = "Task not found."; + public static final String MESSAGE_TASK_MARKED = "Great job completing "; + public static final String MESSAGE_TASK_ALREADY_DONE = " is already done"; + public static final String MESSAGE_TASK_UNMARKED = " is marked as undone"; + private static Task[] tasks; + public static void main(String[] args) { + //chatbot startup + displayWelcomeMessage(); + initialiseTaskList(); - //print horizontal line - public static void printHorizontalLine() { - for (int i = 0; i < HORIZONTAL_LINE_LENGTH / 10; i += 1) { - System.out.print("__________"); + //receive commands + while (true) { + String userInput = getUserInput(); + executeCommand(userInput); } - System.out.println(); } - public static void main(String[] args) { - //chatbot startup + private static void executeCommand(String userInput) { + String[] userInputs = processInput(userInput); + + switch (userInputs[COMMAND_INDEX]) { + case "list": + displayTaskList(); + break; + case "add": + addTask(userInputs[TASK_NAME_INDEX]); + break; + case "mark": + markTask(userInputs[TASK_NAME_INDEX]); + break; + case "unmark": + unmarkTask(userInputs[TASK_NAME_INDEX]); + break; + case "exit": + displayExitMessage(); + System.exit(0); + default: + displayHelpMessage(); + break; + } + } + + private static void unmarkTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == -1) { + System.out.println(MESSAGE_TASK_NOT_FOUND); + } else { + if (tasks[taskIndex].getTaskCompletionStatus()) { + tasks[taskIndex].incompleteTask(); + System.out.println(taskName + MESSAGE_TASK_UNMARKED); + } else { + System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); + } + } + } + private static void markTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == -1) { + System.out.println(MESSAGE_TASK_NOT_FOUND); + } else { + if (!tasks[taskIndex].getTaskCompletionStatus()) { + tasks[taskIndex].completeTask(); + System.out.println(MESSAGE_TASK_MARKED + taskName); + } else { + System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); + } + } + } + private static int getTaskIndex(String taskName) { + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + if (tasks[i].getTaskName().equals(taskName)) { + return i; + } + } + return -1; + } + private static void addTask(String taskName) { + if (isInList(taskName)) { + System.out.println(taskName + " is already in the list!"); + } else { + Task newTask = new Task(taskName); + tasks[Task.getTaskCount()] = newTask; + System.out.println("Added " + taskName); + } + } + + private static boolean isInList(String taskName) { + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + if (tasks[i].getTaskName().equals(taskName)) { + return true; + } + } + return false; + } + + private static void displayHelpMessage() { + //TODO to be improved + System.out.println("Invalid input!"); + } + + private static String[] processInput(String userInput) { + userInput = userInput.replace("/", "").trim(); + String[] userInputs = new String[2]; + userInputs = userInput.split("\\s+", 2); + return userInputs; + } + + private static void displayTaskList() { + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + System.out.print(i + "."); + printTodoMark(i); + System.out.println(tasks[i].getTaskName()); + } + } + + private static void printTodoMark(int i) { + if (tasks[i].getTaskCompletionStatus()) { + System.out.print(TASK_COMPLETED_MARK); + } else { + System.out.print(TASK_UNCOMPLETED_MARK); + } + } + + private static boolean isValidCommand(String command) { + return command.startsWith("/"); + } + + private static void displayExitMessage() { + System.out.println("Sleep mode activated."); + } + + //creates a list of task (1-index) + private static void initialiseTaskList() { + tasks = new Task[MAX_TASK_COUNT + 1]; + } + + private static String getUserInput() { + String userInput; + Scanner in = new Scanner(System.in); + userInput = in.nextLine(); + return userInput; + } + + private static void displayWelcomeMessage() { printHorizontalLine(); - final String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" - + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" - + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" - + "|| \\_|// \\\\|| \\_||______|\n"; System.out.println(NANO_LOGO); System.out.println("Serial number: 034-4532-5893....."); System.out.println("Activating the 7th generation Nano Machine of the Chan Corporation....."); printHorizontalLine(); System.out.println("How may I assist you?"); printHorizontalLine(); + } - // initialise list of tasks 1-index - Task[] tasks = new Task[MAX_TASK_COUNT + 1]; - - //receive commands - String text; - boolean exit = false; - while (!exit) { - Scanner in = new Scanner(System.in); - text = in.nextLine(); - - if (text.equals("bye")) { - //chatbot exit when user types "bye" - exit = true; - } else if (text.startsWith("/")) { - // input is a command - text = text.replace("/", "").trim(); - int dividerIndex = text.indexOf(" "); - if (dividerIndex == -1 && text.equals("list")) { - // display list - System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + (Task.getTaskCount() - Task.getCompletedTaskCount()) + " more to go!"); - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - System.out.print(i + ". "); - if (tasks[i].getTaskStatus()) { - System.out.print("[x] "); - } else { - System.out.print("[] "); - } - System.out.println(tasks[i].getTaskName()); - } - } else { - // split command and taskName into 2 strings - String command = text.substring(0, dividerIndex); - String taskName = text.substring(dividerIndex + 1); - - switch (command) { - case "mark": - // mark task as completed - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - if (tasks[i].getTaskName().equals(taskName) && !tasks[i].getTaskStatus()) { - tasks[i].markTask(); - System.out.println("Marked " + tasks[i].getTaskName()); - break; - } - } - break; - case "unmark": - // unmark task completed status - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - if (tasks[i].getTaskName().equals(taskName) && tasks[i].getTaskStatus()) { - tasks[i].unmarkTask(); - System.out.println("Unmarked " + tasks[i].getTaskName()); - break; - } - } - break; - } - } - } else { - // add task to list - Task newTask = new Task(text); - tasks[Task.getTaskCount()] = newTask; - System.out.println("Added " + newTask.getTaskName() + " to list."); - } + //print horizontal line + public static void printHorizontalLine() { + for (int i = 0; i < HORIZONTAL_LINE_LENGTH / 10; i += 1) { + System.out.print("__________"); } - - //chatbot exit message - System.out.println("Sleep mode activated."); + System.out.println(); } } + + diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 33ba8eccd..552d4763c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -10,29 +10,33 @@ public Task(String name) { taskCount += 1; } - // mark task as completed - public void markTask() { + public void completeTask() { this.isCompleted = true; completedTaskCount += 1; } - // unmark task to become uncompleted - public void unmarkTask() { + public void incompleteTask() { this.isCompleted = false; + completedTaskCount -= 1; } public String getTaskName() { return this.name; } - public boolean getTaskStatus() { + public boolean getTaskCompletionStatus() { return this.isCompleted; } public static int getTaskCount() { return taskCount; } + public static int getCompletedTaskCount() { return completedTaskCount; } + + public static int getUncompletedTaskCount() { + return taskCount - completedTaskCount; + } } From 57b1f393bc34815e10489c7cbe43902d094b0e1f Mon Sep 17 00:00:00 2001 From: calebcjl Date: Sat, 4 Feb 2023 15:53:35 +0800 Subject: [PATCH 07/20] Improve code based on peer reviews --- src/main/java/Nano.java | 34 ++++++++++++++++++---------------- src/main/java/Task.java | 7 ++++--- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index 2d709892a..b33acd8fd 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -16,6 +16,7 @@ public class Nano { public static final String MESSAGE_TASK_MARKED = "Great job completing "; public static final String MESSAGE_TASK_ALREADY_DONE = " is already done"; public static final String MESSAGE_TASK_UNMARKED = " is marked as undone"; + public static final int TASK_INDEX_ERROR = -1; private static Task[] tasks; public static void main(String[] args) { //chatbot startup @@ -56,28 +57,29 @@ private static void executeCommand(String userInput) { private static void unmarkTask(String taskName) { int taskIndex = getTaskIndex(taskName); - if (taskIndex == -1) { + if (taskIndex == TASK_INDEX_ERROR) { System.out.println(MESSAGE_TASK_NOT_FOUND); + return; + } + + if (tasks[taskIndex].isCompleted()) { + tasks[taskIndex].setIncomplete(); + System.out.println(taskName + MESSAGE_TASK_UNMARKED); } else { - if (tasks[taskIndex].getTaskCompletionStatus()) { - tasks[taskIndex].incompleteTask(); - System.out.println(taskName + MESSAGE_TASK_UNMARKED); - } else { - System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); - } + System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); } } private static void markTask(String taskName) { int taskIndex = getTaskIndex(taskName); - if (taskIndex == -1) { + if (taskIndex == TASK_INDEX_ERROR) { System.out.println(MESSAGE_TASK_NOT_FOUND); + } + + if (!tasks[taskIndex].isCompleted()) { + tasks[taskIndex].setCompleted(); + System.out.println(MESSAGE_TASK_MARKED + taskName); } else { - if (!tasks[taskIndex].getTaskCompletionStatus()) { - tasks[taskIndex].completeTask(); - System.out.println(MESSAGE_TASK_MARKED + taskName); - } else { - System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); - } + System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); } } private static int getTaskIndex(String taskName) { @@ -86,7 +88,7 @@ private static int getTaskIndex(String taskName) { return i; } } - return -1; + return TASK_INDEX_ERROR; } private static void addTask(String taskName) { if (isInList(taskName)) { @@ -129,7 +131,7 @@ private static void displayTaskList() { } private static void printTodoMark(int i) { - if (tasks[i].getTaskCompletionStatus()) { + if (tasks[i].isCompleted()) { System.out.print(TASK_COMPLETED_MARK); } else { System.out.print(TASK_UNCOMPLETED_MARK); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 552d4763c..e83434204 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -10,12 +10,12 @@ public Task(String name) { taskCount += 1; } - public void completeTask() { + public void setCompleted() { this.isCompleted = true; completedTaskCount += 1; } - public void incompleteTask() { + public void setIncomplete() { this.isCompleted = false; completedTaskCount -= 1; } @@ -24,7 +24,7 @@ public String getTaskName() { return this.name; } - public boolean getTaskCompletionStatus() { + public boolean isCompleted() { return this.isCompleted; } @@ -33,6 +33,7 @@ public static int getTaskCount() { } public static int getCompletedTaskCount() { + return completedTaskCount; } From a8bd85dc122437fe974656c2c5c7283cb319d759 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Sat, 4 Feb 2023 19:06:36 +0800 Subject: [PATCH 08/20] Add new classes to represent different types of Task New classes are: 1. Deadline - Task with due date 2. Event - Task with start and end date 3. Todo - regular Task --- src/main/java/Deadline.java | 13 +++++ src/main/java/Event.java | 15 +++++ src/main/java/Nano.java | 112 ++++++++++++++++++++++++------------ src/main/java/Task.java | 18 +++++- src/main/java/Todo.java | 12 ++++ 5 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..123133175 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task{ + private static final String TASK_TYPE_TAG = "[D]"; + private String dueDate; + public Deadline(String name, String dueDate) { + super(name); + this.dueDate = dueDate; + } + + + public String toString() { + return TASK_TYPE_TAG + super.toString() + " (" + dueDate + ")"; + } +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..05651bcc7 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,15 @@ +public class Event extends Task { + private static final String TASK_TYPE_TAG = "[E]"; + private String startDate; + private String endDate; + + public Event(String name, String startDate, String endDate) { + super(name); + this.startDate = startDate; + this.endDate = endDate; + } + + public String toString() { + return TASK_TYPE_TAG + super.toString() + " (" + startDate + " " + endDate + ")"; + } +} diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index b33acd8fd..4b51020a2 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -1,23 +1,28 @@ import java.util.Scanner; public class Nano { - - private final static int HORIZONTAL_LINE_LENGTH = 100; - private final static int MAX_TASK_COUNT = 100; - private final static String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" + private static final int HORIZONTAL_LINE_LENGTH = 100; + private static final int MAX_TASK_COUNT = 100; + private static final int COMMAND_INDEX = 0; + private static final int TASK_NAME_INDEX = 1; + private static final int TASK_TYPE_INDEX = 2; + private static final int TASK_START_DATE_INDEX = 3; + private static final int TASK_DUE_DATE_INDEX = 3; + private static final int TASK_END_DATE_INDEX = 4; + public static final int TASK_INDEX_ERROR = -1; + public static final int USER_INPUT_MAX_ARG_COUNT = 4; + private static final String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" + "|| \\_|// \\\\|| \\_||______|\n"; - private final static int COMMAND_INDEX = 0; - private final static int TASK_NAME_INDEX = 1; - public static final String TASK_COMPLETED_MARK = "[x] "; - public static final String TASK_UNCOMPLETED_MARK = "[] "; public static final String MESSAGE_TASK_NOT_FOUND = "Task not found."; public static final String MESSAGE_TASK_MARKED = "Great job completing "; public static final String MESSAGE_TASK_ALREADY_DONE = " is already done"; - public static final String MESSAGE_TASK_UNMARKED = " is marked as undone"; - public static final int TASK_INDEX_ERROR = -1; + public static final String MESSAGE_TASK_ALREADY_UNDONE = " is already not done"; + public static final String MESSAGE_TASK_UNMARKED = " set to undone"; + private static Task[] tasks; + public static void main(String[] args) { //chatbot startup displayWelcomeMessage(); @@ -38,7 +43,7 @@ private static void executeCommand(String userInput) { displayTaskList(); break; case "add": - addTask(userInputs[TASK_NAME_INDEX]); + addTask(userInputs); break; case "mark": markTask(userInputs[TASK_NAME_INDEX]); @@ -53,6 +58,7 @@ private static void executeCommand(String userInput) { displayHelpMessage(); break; } + printHorizontalLine(); } private static void unmarkTask(String taskName) { @@ -63,25 +69,28 @@ private static void unmarkTask(String taskName) { } if (tasks[taskIndex].isCompleted()) { - tasks[taskIndex].setIncomplete(); + tasks[taskIndex].setUndone(); System.out.println(taskName + MESSAGE_TASK_UNMARKED); } else { - System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); + System.out.println(taskName + MESSAGE_TASK_ALREADY_UNDONE); } } + private static void markTask(String taskName) { int taskIndex = getTaskIndex(taskName); if (taskIndex == TASK_INDEX_ERROR) { System.out.println(MESSAGE_TASK_NOT_FOUND); + return; } if (!tasks[taskIndex].isCompleted()) { - tasks[taskIndex].setCompleted(); - System.out.println(MESSAGE_TASK_MARKED + taskName); + tasks[taskIndex].setDone(); + System.out.println(taskName + MESSAGE_TASK_MARKED); } else { System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); } } + private static int getTaskIndex(String taskName) { for (int i = 1; i <= Task.getTaskCount(); i += 1) { if (tasks[i].getTaskName().equals(taskName)) { @@ -90,14 +99,27 @@ private static int getTaskIndex(String taskName) { } return TASK_INDEX_ERROR; } - private static void addTask(String taskName) { - if (isInList(taskName)) { - System.out.println(taskName + " is already in the list!"); - } else { - Task newTask = new Task(taskName); - tasks[Task.getTaskCount()] = newTask; - System.out.println("Added " + taskName); + + private static void addTask(String[] taskDetails) { + if (isInList(taskDetails[TASK_NAME_INDEX])) { + System.out.println(taskDetails[TASK_NAME_INDEX] + " is already in the list!"); + return; } + + Task newTask; + switch (taskDetails[TASK_TYPE_INDEX]) { + case "deadline": + newTask = new Deadline(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_DUE_DATE_INDEX]); + break; + case "event": + newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], taskDetails[TASK_END_DATE_INDEX]); + break; + default: + newTask = new Todo(taskDetails[TASK_NAME_INDEX]); + break; + } + tasks[Task.getTaskCount()] = newTask; + System.out.println("Added " + taskDetails[TASK_NAME_INDEX]); } private static boolean isInList(String taskName) { @@ -116,30 +138,44 @@ private static void displayHelpMessage() { private static String[] processInput(String userInput) { userInput = userInput.replace("/", "").trim(); - String[] userInputs = new String[2]; - userInputs = userInput.split("\\s+", 2); - return userInputs; - } + String[] userInputs = new String[USER_INPUT_MAX_ARG_COUNT + 1]; + String[] commandAndName = userInput.split("\\s+", 2); + System.arraycopy(commandAndName, 0, userInputs, 0, commandAndName.length); - private static void displayTaskList() { - System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - System.out.print(i + "."); - printTodoMark(i); - System.out.println(tasks[i].getTaskName()); + if (commandAndName.length == 2) { + processTaskDetails(userInput, userInputs); } + return userInputs; } - private static void printTodoMark(int i) { - if (tasks[i].isCompleted()) { - System.out.print(TASK_COMPLETED_MARK); + private static void processTaskDetails(String userInput, String[] userInputs) { + if (isDeadline(userInput)) { + userInputs[TASK_TYPE_INDEX] = "deadline"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by:")).trim(); + userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by:")).trim(); + } else if (isEvent(userInput)) { + userInputs[TASK_TYPE_INDEX] = "event"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from:")).trim(); + userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from:"), userInput.indexOf("to:")).trim(); + userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to")).trim(); } else { - System.out.print(TASK_UNCOMPLETED_MARK); + userInputs[TASK_TYPE_INDEX] = "todo"; } } - private static boolean isValidCommand(String command) { - return command.startsWith("/"); + private static boolean isDeadline(String task) { + return task.contains("by:"); + } + + private static boolean isEvent(String task) { + return task.contains("from:"); + } + + private static void displayTaskList() { + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + System.out.println(tasks[i].toString()); + } } private static void displayExitMessage() { diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e83434204..8d1f13179 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,4 +1,6 @@ public class Task { + public static final String TASK_COMPLETED_MARK = "[x] "; + public static final String TASK_UNCOMPLETED_MARK = "[] "; private String name; private boolean isCompleted; private static int taskCount = 0; @@ -10,12 +12,12 @@ public Task(String name) { taskCount += 1; } - public void setCompleted() { + public void setDone() { this.isCompleted = true; completedTaskCount += 1; } - public void setIncomplete() { + public void setUndone() { this.isCompleted = false; completedTaskCount -= 1; } @@ -40,4 +42,16 @@ public static int getCompletedTaskCount() { public static int getUncompletedTaskCount() { return taskCount - completedTaskCount; } + + private String todoMark() { + if (isCompleted()) { + return TASK_COMPLETED_MARK; + } else { + return TASK_UNCOMPLETED_MARK; + } + } + + public String toString() { + return todoMark() + getTaskName(); + } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..98a8aae97 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,12 @@ +public class Todo extends Task{ + private static final String TASK_TYPE_TAG = "[T]"; + + public Todo(String name) { + super(name); + } + + @Override + public String toString() { + return TASK_TYPE_TAG + super.toString(); + } +} From 4c0bc003089c52133249d72131766bb1802132ce Mon Sep 17 00:00:00 2001 From: calebcjl Date: Wed, 8 Feb 2023 11:49:39 +0800 Subject: [PATCH 09/20] Add exceptions to detect incorrect input Exceptions added: 1. DukeCommandExeception: user entered invalid command 2. DukeInputFormatException: user input has wrong format --- src/main/java/DukeCommandException.java | 2 + src/main/java/DukeInputFormatException.java | 2 + src/main/java/Nano.java | 78 ++++++++++++++------- src/main/java/Task.java | 2 +- 4 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 src/main/java/DukeCommandException.java create mode 100644 src/main/java/DukeInputFormatException.java diff --git a/src/main/java/DukeCommandException.java b/src/main/java/DukeCommandException.java new file mode 100644 index 000000000..ba8e0509f --- /dev/null +++ b/src/main/java/DukeCommandException.java @@ -0,0 +1,2 @@ +public class DukeCommandException extends Exception { +} diff --git a/src/main/java/DukeInputFormatException.java b/src/main/java/DukeInputFormatException.java new file mode 100644 index 000000000..6106989bc --- /dev/null +++ b/src/main/java/DukeInputFormatException.java @@ -0,0 +1,2 @@ +public class DukeInputFormatException extends Exception{ +} diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index 4b51020a2..b130889bd 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -31,12 +31,24 @@ public static void main(String[] args) { //receive commands while (true) { String userInput = getUserInput(); - executeCommand(userInput); + try { + executeCommand(userInput); + } catch (DukeCommandException commandException) { + System.out.println("unknown command"); + displayHelpMessage(); + } } } - private static void executeCommand(String userInput) { - String[] userInputs = processInput(userInput); + private static void executeCommand(String userInput) throws DukeCommandException { + String[] userInputs; + try { + userInputs = processInput(userInput); + } catch (DukeInputFormatException inputException) { + System.out.println("input error"); + displayHelpMessage(); + return; + } switch (userInputs[COMMAND_INDEX]) { case "list": @@ -55,8 +67,7 @@ private static void executeCommand(String userInput) { displayExitMessage(); System.exit(0); default: - displayHelpMessage(); - break; + throw new DukeCommandException(); } printHorizontalLine(); } @@ -85,7 +96,7 @@ private static void markTask(String taskName) { if (!tasks[taskIndex].isCompleted()) { tasks[taskIndex].setDone(); - System.out.println(taskName + MESSAGE_TASK_MARKED); + System.out.println(MESSAGE_TASK_MARKED + taskName); } else { System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); } @@ -112,7 +123,8 @@ private static void addTask(String[] taskDetails) { newTask = new Deadline(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_DUE_DATE_INDEX]); break; case "event": - newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], taskDetails[TASK_END_DATE_INDEX]); + newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], + taskDetails[TASK_END_DATE_INDEX]); break; default: newTask = new Todo(taskDetails[TASK_NAME_INDEX]); @@ -136,8 +148,12 @@ private static void displayHelpMessage() { System.out.println("Invalid input!"); } - private static String[] processInput(String userInput) { - userInput = userInput.replace("/", "").trim(); + private static String[] processInput(String userInput) throws DukeInputFormatException{ + userInput = userInput.trim(); + if (!userInput.startsWith("/")) { + throw new DukeInputFormatException(); + } + userInput = userInput.replaceFirst("/", ""); String[] userInputs = new String[USER_INPUT_MAX_ARG_COUNT + 1]; String[] commandAndName = userInput.split("\\s+", 2); System.arraycopy(commandAndName, 0, userInputs, 0, commandAndName.length); @@ -148,31 +164,47 @@ private static String[] processInput(String userInput) { return userInputs; } - private static void processTaskDetails(String userInput, String[] userInputs) { + private static void processTaskDetails(String userInput, String[] userInputs) throws DukeInputFormatException { if (isDeadline(userInput)) { - userInputs[TASK_TYPE_INDEX] = "deadline"; - userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by:")).trim(); - userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by:")).trim(); + getDeadline(userInput, userInputs); } else if (isEvent(userInput)) { - userInputs[TASK_TYPE_INDEX] = "event"; - userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from:")).trim(); - userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from:"), userInput.indexOf("to:")).trim(); - userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to")).trim(); + getEvent(userInput, userInputs); + } else if (userInput.contains("/")) { + throw new DukeInputFormatException(); } else { - userInputs[TASK_TYPE_INDEX] = "todo"; + getTodo(userInputs); } } + private static void getTodo(String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "todo"; + } + + private static void getEvent(String userInput, String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "event"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from/")).trim(); + userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from/"), + userInput.indexOf("to/")).replaceFirst("/", "").trim(); + userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to/")).replaceFirst("/", ""); + } + + private static void getDeadline(String userInput, String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "deadline"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by/")).trim(); + userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by/")); + } + private static boolean isDeadline(String task) { - return task.contains("by:"); + return task.contains("by/"); } private static boolean isEvent(String task) { - return task.contains("from:"); + return task.contains("from/") && task.contains("to/"); } private static void displayTaskList() { - System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + + Task.getUncompletedTaskCount() + " more to go!"); for (int i = 1; i <= Task.getTaskCount(); i += 1) { System.out.println(tasks[i].toString()); } @@ -211,6 +243,4 @@ public static void printHorizontalLine() { } System.out.println(); } -} - - +} \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 8d1f13179..057f1ad56 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -54,4 +54,4 @@ private String todoMark() { public String toString() { return todoMark() + getTaskName(); } -} +} \ No newline at end of file From 0dd2ccbeb2f8403cf35e65af8c7760f792ad8880 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Wed, 8 Feb 2023 11:55:07 +0800 Subject: [PATCH 10/20] Organise classes into packages --- src/main/java/{ => nano}/Nano.java | 7 +++++++ src/main/java/{ => nano/task}/Deadline.java | 2 ++ src/main/java/{ => nano/task}/Event.java | 2 ++ src/main/java/{ => nano/task}/Task.java | 2 ++ src/main/java/{ => nano/task}/Todo.java | 2 ++ 5 files changed, 15 insertions(+) rename src/main/java/{ => nano}/Nano.java (98%) rename src/main/java/{ => nano/task}/Deadline.java (94%) rename src/main/java/{ => nano/task}/Event.java (95%) rename src/main/java/{ => nano/task}/Task.java (98%) rename src/main/java/{ => nano/task}/Todo.java (92%) diff --git a/src/main/java/Nano.java b/src/main/java/nano/Nano.java similarity index 98% rename from src/main/java/Nano.java rename to src/main/java/nano/Nano.java index 4b51020a2..3d70feb46 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/nano/Nano.java @@ -1,3 +1,10 @@ +package nano; + +import nano.task.Deadline; +import nano.task.Event; +import nano.task.Task; +import nano.task.Todo; + import java.util.Scanner; public class Nano { diff --git a/src/main/java/Deadline.java b/src/main/java/nano/task/Deadline.java similarity index 94% rename from src/main/java/Deadline.java rename to src/main/java/nano/task/Deadline.java index 123133175..2fb2b8427 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/nano/task/Deadline.java @@ -1,3 +1,5 @@ +package nano.task; + public class Deadline extends Task{ private static final String TASK_TYPE_TAG = "[D]"; private String dueDate; diff --git a/src/main/java/Event.java b/src/main/java/nano/task/Event.java similarity index 95% rename from src/main/java/Event.java rename to src/main/java/nano/task/Event.java index 05651bcc7..d6d598064 100644 --- a/src/main/java/Event.java +++ b/src/main/java/nano/task/Event.java @@ -1,3 +1,5 @@ +package nano.task; + public class Event extends Task { private static final String TASK_TYPE_TAG = "[E]"; private String startDate; diff --git a/src/main/java/Task.java b/src/main/java/nano/task/Task.java similarity index 98% rename from src/main/java/Task.java rename to src/main/java/nano/task/Task.java index 8d1f13179..5095729d7 100644 --- a/src/main/java/Task.java +++ b/src/main/java/nano/task/Task.java @@ -1,3 +1,5 @@ +package nano.task; + public class Task { public static final String TASK_COMPLETED_MARK = "[x] "; public static final String TASK_UNCOMPLETED_MARK = "[] "; diff --git a/src/main/java/Todo.java b/src/main/java/nano/task/Todo.java similarity index 92% rename from src/main/java/Todo.java rename to src/main/java/nano/task/Todo.java index 98a8aae97..88757e2cd 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/nano/task/Todo.java @@ -1,3 +1,5 @@ +package nano.task; + public class Todo extends Task{ private static final String TASK_TYPE_TAG = "[T]"; From 0072420b2f3931fe4ac47cf0919d083e398e3287 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Wed, 8 Feb 2023 19:29:11 +0800 Subject: [PATCH 11/20] Add /help command to list out all possible commands --- src/main/java/Nano.java | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/Nano.java b/src/main/java/Nano.java index 4b51020a2..139cd0b27 100644 --- a/src/main/java/Nano.java +++ b/src/main/java/Nano.java @@ -20,6 +20,16 @@ public class Nano { public static final String MESSAGE_TASK_ALREADY_DONE = " is already done"; public static final String MESSAGE_TASK_ALREADY_UNDONE = " is already not done"; public static final String MESSAGE_TASK_UNMARKED = " set to undone"; + public static final String MESSAGE_HELP_COMMAND = "Enter \"/help\" for full command list"; + public static final String MESSAGE_EXIT = "Sleep mode activated."; + public static final String MESSAGE_HELP_LIST_COMMAND = "/list : Displays list of tasks"; + public static final String MESSAGE_HELP_ADD_EVENT = "/add from/ to/ : Add new event"; + public static final String MESSAGE_HELP_ADD_DEADLINE = "/add by/ : Add new deadline"; + public static final String MESSAGE_HELP_ADD_TODO = "/add : Add new Todo"; + public static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; + public static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; + public static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; + public static final String MEESAGE_HELP_EXIT = "/exit : Exit chatbot"; private static Task[] tasks; @@ -51,6 +61,9 @@ private static void executeCommand(String userInput) { case "unmark": unmarkTask(userInputs[TASK_NAME_INDEX]); break; + case "help": + displayCommandList(); + break; case "exit": displayExitMessage(); System.exit(0); @@ -112,7 +125,8 @@ private static void addTask(String[] taskDetails) { newTask = new Deadline(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_DUE_DATE_INDEX]); break; case "event": - newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], taskDetails[TASK_END_DATE_INDEX]); + newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], + taskDetails[TASK_END_DATE_INDEX]); break; default: newTask = new Todo(taskDetails[TASK_NAME_INDEX]); @@ -131,9 +145,20 @@ private static boolean isInList(String taskName) { return false; } + private static void displayCommandList() { + // list,add,mark,unmark,help,exit + printHorizontalLine(); + System.out.println(MESSAGE_HELP_LIST_COMMAND); + System.out.println(MESSAGE_HELP_ADD_EVENT); + System.out.println(MESSAGE_HELP_ADD_DEADLINE); + System.out.println(MESSAGE_HELP_ADD_TODO); + System.out.println(MESSAGE_HELP_MARK_TASK); + System.out.println(MESSAGE_HELP_UNMARK_TASK); + System.out.println(MESSAGE_HELP_HELP); + System.out.println(MEESAGE_HELP_EXIT); + } private static void displayHelpMessage() { - //TODO to be improved - System.out.println("Invalid input!"); + System.out.println(MESSAGE_HELP_COMMAND); } private static String[] processInput(String userInput) { @@ -179,7 +204,7 @@ private static void displayTaskList() { } private static void displayExitMessage() { - System.out.println("Sleep mode activated."); + System.out.println(MESSAGE_EXIT); } //creates a list of task (1-index) From 2db7774a4286f475444cc56d20639a2c0e3a54f3 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Wed, 8 Feb 2023 23:06:38 +0800 Subject: [PATCH 12/20] Create new package for Nano exceptions --- src/main/java/DukeCommandException.java | 2 -- src/main/java/DukeInputFormatException.java | 2 -- src/main/java/nano/Nano.java | 18 ++++++++++-------- .../nano/exception/NanoCommandException.java | 4 ++++ .../exception/NanoInputFormatException.java | 4 ++++ 5 files changed, 18 insertions(+), 12 deletions(-) delete mode 100644 src/main/java/DukeCommandException.java delete mode 100644 src/main/java/DukeInputFormatException.java create mode 100644 src/main/java/nano/exception/NanoCommandException.java create mode 100644 src/main/java/nano/exception/NanoInputFormatException.java diff --git a/src/main/java/DukeCommandException.java b/src/main/java/DukeCommandException.java deleted file mode 100644 index ba8e0509f..000000000 --- a/src/main/java/DukeCommandException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class DukeCommandException extends Exception { -} diff --git a/src/main/java/DukeInputFormatException.java b/src/main/java/DukeInputFormatException.java deleted file mode 100644 index 6106989bc..000000000 --- a/src/main/java/DukeInputFormatException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class DukeInputFormatException extends Exception{ -} diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index 8de28deb6..8ed19773c 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -1,5 +1,7 @@ package nano; +import nano.exception.NanoCommandException; +import nano.exception.NanoInputFormatException; import nano.task.Deadline; import nano.task.Event; import nano.task.Task; @@ -50,18 +52,18 @@ public static void main(String[] args) { String userInput = getUserInput(); try { executeCommand(userInput); - } catch (DukeCommandException commandException) { + } catch (NanoCommandException commandException) { System.out.println("unknown command"); displayHelpMessage(); } } } - private static void executeCommand(String userInput) throws DukeCommandException { + private static void executeCommand(String userInput) throws NanoCommandException { String[] userInputs; try { userInputs = processInput(userInput); - } catch (DukeInputFormatException inputException) { + } catch (NanoInputFormatException inputException) { System.out.println("input error"); displayHelpMessage(); return; @@ -87,7 +89,7 @@ private static void executeCommand(String userInput) throws DukeCommandException displayExitMessage(); System.exit(0); default: - throw new DukeCommandException(); + throw new NanoCommandException(); } printHorizontalLine(); } @@ -179,10 +181,10 @@ private static void displayHelpMessage() { System.out.println(MESSAGE_HELP_COMMAND); } - private static String[] processInput(String userInput) throws DukeInputFormatException{ + private static String[] processInput(String userInput) throws NanoInputFormatException { userInput = userInput.trim(); if (!userInput.startsWith("/")) { - throw new DukeInputFormatException(); + throw new NanoInputFormatException(); } userInput = userInput.replaceFirst("/", ""); String[] userInputs = new String[USER_INPUT_MAX_ARG_COUNT + 1]; @@ -195,13 +197,13 @@ private static String[] processInput(String userInput) throws DukeInputFormatExc return userInputs; } - private static void processTaskDetails(String userInput, String[] userInputs) throws DukeInputFormatException { + private static void processTaskDetails(String userInput, String[] userInputs) throws NanoInputFormatException { if (isDeadline(userInput)) { getDeadline(userInput, userInputs); } else if (isEvent(userInput)) { getEvent(userInput, userInputs); } else if (userInput.contains("/")) { - throw new DukeInputFormatException(); + throw new NanoInputFormatException(); } else { getTodo(userInputs); } diff --git a/src/main/java/nano/exception/NanoCommandException.java b/src/main/java/nano/exception/NanoCommandException.java new file mode 100644 index 000000000..33c9b4be9 --- /dev/null +++ b/src/main/java/nano/exception/NanoCommandException.java @@ -0,0 +1,4 @@ +package nano.exception; + +public class NanoCommandException extends Exception { +} diff --git a/src/main/java/nano/exception/NanoInputFormatException.java b/src/main/java/nano/exception/NanoInputFormatException.java new file mode 100644 index 000000000..5448934f3 --- /dev/null +++ b/src/main/java/nano/exception/NanoInputFormatException.java @@ -0,0 +1,4 @@ +package nano.exception; + +public class NanoInputFormatException extends Exception{ +} From d7f2d9e8467d95bfaf4244c09f7985d661a0c934 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Thu, 16 Feb 2023 11:58:47 +0800 Subject: [PATCH 13/20] Use ArrayList to store tasks instead of fixed array --- src/main/java/nano/Nano.java | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index 8ed19773c..dae71ca24 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -8,10 +8,9 @@ import nano.task.Todo; import java.util.Scanner; - +import java.util.ArrayList; public class Nano { private static final int HORIZONTAL_LINE_LENGTH = 100; - private static final int MAX_TASK_COUNT = 100; private static final int COMMAND_INDEX = 0; private static final int TASK_NAME_INDEX = 1; private static final int TASK_TYPE_INDEX = 2; @@ -38,9 +37,8 @@ public class Nano { public static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; public static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; public static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; - public static final String MEESAGE_HELP_EXIT = "/exit : Exit chatbot"; - - private static Task[] tasks; + public static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; + private static ArrayList tasks; public static void main(String[] args) { //chatbot startup @@ -101,8 +99,8 @@ private static void unmarkTask(String taskName) { return; } - if (tasks[taskIndex].isCompleted()) { - tasks[taskIndex].setUndone(); + if (tasks.get(taskIndex).isCompleted()) { + tasks.get(taskIndex).setUndone(); System.out.println(taskName + MESSAGE_TASK_UNMARKED); } else { System.out.println(taskName + MESSAGE_TASK_ALREADY_UNDONE); @@ -116,8 +114,8 @@ private static void markTask(String taskName) { return; } - if (!tasks[taskIndex].isCompleted()) { - tasks[taskIndex].setDone(); + if (!tasks.get(taskIndex).isCompleted()) { + tasks.get(taskIndex).setDone(); System.out.println(MESSAGE_TASK_MARKED + taskName); } else { System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); @@ -125,9 +123,9 @@ private static void markTask(String taskName) { } private static int getTaskIndex(String taskName) { - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - if (tasks[i].getTaskName().equals(taskName)) { - return i; + for (Task t : tasks) { + if (t.getTaskName().equals(taskName)) { + return tasks.indexOf(t); } } return TASK_INDEX_ERROR; @@ -152,13 +150,13 @@ private static void addTask(String[] taskDetails) { newTask = new Todo(taskDetails[TASK_NAME_INDEX]); break; } - tasks[Task.getTaskCount()] = newTask; + tasks.add(newTask); System.out.println("Added " + taskDetails[TASK_NAME_INDEX]); } private static boolean isInList(String taskName) { - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - if (tasks[i].getTaskName().equals(taskName)) { + for (Task t : tasks) { + if (t.getTaskName().equals(taskName)) { return true; } } @@ -175,7 +173,7 @@ private static void displayCommandList() { System.out.println(MESSAGE_HELP_MARK_TASK); System.out.println(MESSAGE_HELP_UNMARK_TASK); System.out.println(MESSAGE_HELP_HELP); - System.out.println(MEESAGE_HELP_EXIT); + System.out.println(MESSAGE_HELP_EXIT); } private static void displayHelpMessage() { System.out.println(MESSAGE_HELP_COMMAND); @@ -239,7 +237,7 @@ private static void displayTaskList() { System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); for (int i = 1; i <= Task.getTaskCount(); i += 1) { - System.out.println(tasks[i].toString()); + System.out.println(tasks.get(i).toString()); } } @@ -249,7 +247,7 @@ private static void displayExitMessage() { //creates a list of task (1-index) private static void initialiseTaskList() { - tasks = new Task[MAX_TASK_COUNT + 1]; + tasks = new ArrayList<>(); } private static String getUserInput() { From 8d667e96209a90890ee8c9a2a27074274966dbdc Mon Sep 17 00:00:00 2001 From: calebcjl Date: Thu, 16 Feb 2023 12:23:43 +0800 Subject: [PATCH 14/20] Add delete feature --- src/main/java/nano/Nano.java | 18 ++++++++++++++++-- src/main/java/nano/task/Task.java | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index dae71ca24..bf7c6ce0e 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -74,6 +74,9 @@ private static void executeCommand(String userInput) throws NanoCommandException case "add": addTask(userInputs); break; + case "delete": + deleteTask(userInputs[TASK_NAME_INDEX]); + break; case "mark": markTask(userInputs[TASK_NAME_INDEX]); break; @@ -92,6 +95,17 @@ private static void executeCommand(String userInput) throws NanoCommandException printHorizontalLine(); } + private static void deleteTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == TASK_INDEX_ERROR) { + System.out.println(MESSAGE_TASK_NOT_FOUND); + return; + } + + tasks.remove(taskIndex); + Task.deleteTask(); + System.out.println("Deleted " + taskName); + } private static void unmarkTask(String taskName) { int taskIndex = getTaskIndex(taskName); if (taskIndex == TASK_INDEX_ERROR) { @@ -236,8 +250,8 @@ private static boolean isEvent(String task) { private static void displayTaskList() { System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); - for (int i = 1; i <= Task.getTaskCount(); i += 1) { - System.out.println(tasks.get(i).toString()); + for (Task t : tasks) { + System.out.println(t.toString()); } } diff --git a/src/main/java/nano/task/Task.java b/src/main/java/nano/task/Task.java index 9a75a7690..187be236c 100644 --- a/src/main/java/nano/task/Task.java +++ b/src/main/java/nano/task/Task.java @@ -56,4 +56,8 @@ private String todoMark() { public String toString() { return todoMark() + getTaskName(); } + + public static void deleteTask() { + taskCount -= 1; + } } \ No newline at end of file From 8cf3a5db164dc94aa5ddcb4b40904872eccdc3d0 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Fri, 3 Mar 2023 14:23:07 +0800 Subject: [PATCH 15/20] Add feature to save and retrieve user task list data --- src/main/java/nano/Nano.java | 97 +++++++++++++++++++++++++-- src/main/java/nano/task/Deadline.java | 2 +- src/main/java/nano/task/Event.java | 2 +- 3 files changed, 92 insertions(+), 9 deletions(-) diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index 8ed19773c..03cbe03f6 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -9,6 +9,11 @@ import java.util.Scanner; +import java.io.IOException; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; + public class Nano { private static final int HORIZONTAL_LINE_LENGTH = 100; private static final int MAX_TASK_COUNT = 100; @@ -38,10 +43,12 @@ public class Nano { public static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; public static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; public static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; - public static final String MEESAGE_HELP_EXIT = "/exit : Exit chatbot"; + public static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; private static Task[] tasks; + private static final File taskFile = new File("data/tasks.txt"); + public static void main(String[] args) { //chatbot startup displayWelcomeMessage(); @@ -52,13 +59,23 @@ public static void main(String[] args) { String userInput = getUserInput(); try { executeCommand(userInput); + saveTaskFile(); } catch (NanoCommandException commandException) { - System.out.println("unknown command"); + System.out.println("Unknown command!"); displayHelpMessage(); + } catch (IOException e) { + System.out.println("Error saving file."); } } } + private static void saveTaskFile() throws IOException { + FileWriter fileWriter = new FileWriter(taskFile); + for (int i = 1; i <= Task.getTaskCount(); i += 1) { + fileWriter.write(tasks[i].toString() + System.lineSeparator()); + } + fileWriter.close(); + } private static void executeCommand(String userInput) throws NanoCommandException { String[] userInputs; try { @@ -175,7 +192,7 @@ private static void displayCommandList() { System.out.println(MESSAGE_HELP_MARK_TASK); System.out.println(MESSAGE_HELP_UNMARK_TASK); System.out.println(MESSAGE_HELP_HELP); - System.out.println(MEESAGE_HELP_EXIT); + System.out.println(MESSAGE_HELP_EXIT); } private static void displayHelpMessage() { System.out.println(MESSAGE_HELP_COMMAND); @@ -216,15 +233,15 @@ private static void getTodo(String[] userInputs) { private static void getEvent(String userInput, String[] userInputs) { userInputs[TASK_TYPE_INDEX] = "event"; userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from/")).trim(); - userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from/"), - userInput.indexOf("to/")).replaceFirst("/", "").trim(); - userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to/")).replaceFirst("/", ""); + userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from/") + 5, + userInput.indexOf("to/")).trim(); + userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to/") + 3).trim(); } private static void getDeadline(String userInput, String[] userInputs) { userInputs[TASK_TYPE_INDEX] = "deadline"; userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by/")).trim(); - userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by/")); + userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by/") + 3).trim(); } private static boolean isDeadline(String task) { @@ -250,6 +267,72 @@ private static void displayExitMessage() { //creates a list of task (1-index) private static void initialiseTaskList() { tasks = new Task[MAX_TASK_COUNT + 1]; + getUserData(); + } + + private static void getUserData(){ + if (taskFile.exists()) { + try { + Scanner s = new Scanner(taskFile); + while (s.hasNext()) { + readTaskFile(s.nextLine()); + } + } catch (FileNotFoundException e) { + System.out.println("Error reading task file."); + } + } else { + System.out.println("User task file not detected. Creating new task file....."); + createTaskFile(); + } + } + + private static void readTaskFile(String taskDetails) { + Task newTask; + String taskName; + if (taskDetails.charAt(taskDetails.length() - 1) == ')') { + taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1, taskDetails.lastIndexOf(" (")); + } else { + taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1); + } + + switch (taskDetails.substring(1, 2)) { + case "D": + newTask = new Deadline(taskName, taskDetails.substring(taskDetails.indexOf("by:") + 4, + taskDetails.lastIndexOf(')'))); + break; + case "E": + newTask = new Event(taskName, taskDetails.substring(taskDetails.indexOf("from:") + 5, + taskDetails.indexOf(", to:")).trim(), + taskDetails.substring(taskDetails.indexOf("to:") + 4, taskDetails.lastIndexOf(')')).trim()); + break; + default: + newTask = new Todo(taskName); + break; + } + tasks[Task.getTaskCount()] = newTask; + + if (taskDetails.contains("[x]")) { + tasks[Task.getTaskCount()].setDone(); + } + } + private static void createTaskFile() { + try { + if (taskFile.getParentFile().mkdirs()) { + System.out.println("Creating directories....."); + } else { + System.out.println("Unable to create directories. User data may not be saved."); + } + + if (taskFile.createNewFile()) { + System.out.println("Task file created!"); + } else { + System.out.println("Unable to create task file. User data may not be saved."); + } + + } catch (IOException e) { + System.out.println("Error detected while creating user task file. User data may not be saved."); + } + printHorizontalLine(); } private static String getUserInput() { diff --git a/src/main/java/nano/task/Deadline.java b/src/main/java/nano/task/Deadline.java index 2fb2b8427..bc36da781 100644 --- a/src/main/java/nano/task/Deadline.java +++ b/src/main/java/nano/task/Deadline.java @@ -10,6 +10,6 @@ public Deadline(String name, String dueDate) { public String toString() { - return TASK_TYPE_TAG + super.toString() + " (" + dueDate + ")"; + return TASK_TYPE_TAG + super.toString() + " (by: " + dueDate + ")"; } } diff --git a/src/main/java/nano/task/Event.java b/src/main/java/nano/task/Event.java index d6d598064..8c4f0843f 100644 --- a/src/main/java/nano/task/Event.java +++ b/src/main/java/nano/task/Event.java @@ -12,6 +12,6 @@ public Event(String name, String startDate, String endDate) { } public String toString() { - return TASK_TYPE_TAG + super.toString() + " (" + startDate + " " + endDate + ")"; + return TASK_TYPE_TAG + super.toString() + " (from: " + startDate + ", to: " + endDate + ")"; } } From b3afe1399ee71d0f8db65b9a7de2ccaa713dd9fd Mon Sep 17 00:00:00 2001 From: calebcjl Date: Fri, 3 Mar 2023 18:50:56 +0800 Subject: [PATCH 16/20] Refactor code to include new classes and packages for more OOP --- src/main/java/nano/Nano.java | 375 +----------------- src/main/java/nano/data/TaskList.java | 117 ++++++ .../exception/NanoCommandException.java | 2 +- .../exception/NanoInputFormatException.java | 2 +- .../java/nano/{ => data}/task/Deadline.java | 2 +- src/main/java/nano/{ => data}/task/Event.java | 2 +- src/main/java/nano/{ => data}/task/Task.java | 2 +- src/main/java/nano/{ => data}/task/Todo.java | 2 +- src/main/java/nano/parser/Parser.java | 110 +++++ src/main/java/nano/storage/Storage.java | 103 +++++ src/main/java/nano/ui/Ui.java | 114 ++++++ 11 files changed, 471 insertions(+), 360 deletions(-) create mode 100644 src/main/java/nano/data/TaskList.java rename src/main/java/nano/{ => data}/exception/NanoCommandException.java (66%) rename src/main/java/nano/{ => data}/exception/NanoInputFormatException.java (67%) rename src/main/java/nano/{ => data}/task/Deadline.java (93%) rename src/main/java/nano/{ => data}/task/Event.java (94%) rename src/main/java/nano/{ => data}/task/Task.java (98%) rename src/main/java/nano/{ => data}/task/Todo.java (91%) create mode 100644 src/main/java/nano/parser/Parser.java create mode 100644 src/main/java/nano/storage/Storage.java create mode 100644 src/main/java/nano/ui/Ui.java diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index b53981418..c9456dba5 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -1,374 +1,41 @@ package nano; -import nano.exception.NanoCommandException; -import nano.exception.NanoInputFormatException; -import nano.task.Deadline; -import nano.task.Event; -import nano.task.Task; -import nano.task.Todo; +import nano.data.TaskList; +import nano.data.exception.NanoCommandException; +import nano.parser.Parser; +import nano.storage.Storage; +import nano.ui.Ui; -import java.util.ArrayList; -import java.util.Scanner; - -import java.io.File; -import java.io.FileWriter; -import java.io.FileNotFoundException; import java.io.IOException; public class Nano { - private static final int HORIZONTAL_LINE_LENGTH = 100; - private static final int COMMAND_INDEX = 0; - private static final int TASK_NAME_INDEX = 1; - private static final int TASK_TYPE_INDEX = 2; - private static final int TASK_START_DATE_INDEX = 3; - private static final int TASK_DUE_DATE_INDEX = 3; - private static final int TASK_END_DATE_INDEX = 4; - public static final int TASK_INDEX_ERROR = -1; - public static final int USER_INPUT_MAX_ARG_COUNT = 4; - private static final String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" - + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" - + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" - + "|| \\_|// \\\\|| \\_||______|\n"; - public static final String MESSAGE_TASK_NOT_FOUND = "Task not found."; - public static final String MESSAGE_TASK_MARKED = "Great job completing "; - public static final String MESSAGE_TASK_ALREADY_DONE = " is already done"; - public static final String MESSAGE_TASK_ALREADY_UNDONE = " is already not done"; - public static final String MESSAGE_TASK_UNMARKED = " set to undone"; - public static final String MESSAGE_HELP_COMMAND = "Enter \"/help\" for full command list"; - public static final String MESSAGE_EXIT = "Sleep mode activated."; - public static final String MESSAGE_HELP_LIST_COMMAND = "/list : Displays list of tasks"; - public static final String MESSAGE_HELP_ADD_EVENT = "/add from/ to/ : Add new event"; - public static final String MESSAGE_HELP_ADD_DEADLINE = "/add by/ : Add new deadline"; - public static final String MESSAGE_HELP_ADD_TODO = "/add : Add new Todo"; - public static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; - public static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; - public static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; - public static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; - private static ArrayList tasks; - private static final File taskFile = new File("data/tasks.txt"); - public static void main(String[] args) { + private static Storage storage; + private static Ui ui; + private static TaskList tasks; + + public Nano(String filePath) { //chatbot startup - displayWelcomeMessage(); - initialiseTaskList(); + ui = new Ui(); + storage = new Storage(filePath); + tasks = new TaskList(storage); + } - //receive commands + public void run() { while (true) { - String userInput = getUserInput(); + String userInput = ui.getUserInput(); try { - executeCommand(userInput); - saveTaskFile(); + Parser.executeCommand(userInput, tasks); + storage.saveTaskFile(tasks.getTaskList()); } catch (NanoCommandException commandException) { - System.out.println("Unknown command!"); - displayHelpMessage(); + Ui.displayUnknownCommandMessage(); } catch (IOException e) { System.out.println("Error saving file."); } } } - private static void saveTaskFile() throws IOException { - FileWriter fileWriter = new FileWriter(taskFile); - for (Task task : tasks) { - fileWriter.write(task.toString() + System.lineSeparator()); - } - fileWriter.close(); - } - private static void executeCommand(String userInput) throws NanoCommandException { - String[] userInputs; - try { - userInputs = processInput(userInput); - } catch (NanoInputFormatException inputException) { - System.out.println("input error"); - displayHelpMessage(); - return; - } - - switch (userInputs[COMMAND_INDEX]) { - case "list": - displayTaskList(); - break; - case "add": - addTask(userInputs); - break; - case "delete": - deleteTask(userInputs[TASK_NAME_INDEX]); - break; - case "mark": - markTask(userInputs[TASK_NAME_INDEX]); - break; - case "unmark": - unmarkTask(userInputs[TASK_NAME_INDEX]); - break; - case "help": - displayCommandList(); - break; - case "exit": - displayExitMessage(); - System.exit(0); - default: - throw new NanoCommandException(); - } - printHorizontalLine(); - } - - private static void deleteTask(String taskName) { - int taskIndex = getTaskIndex(taskName); - if (taskIndex == TASK_INDEX_ERROR) { - System.out.println(MESSAGE_TASK_NOT_FOUND); - return; - } - - tasks.remove(taskIndex); - Task.deleteTask(); - System.out.println("Deleted " + taskName); - } - private static void unmarkTask(String taskName) { - int taskIndex = getTaskIndex(taskName); - if (taskIndex == TASK_INDEX_ERROR) { - System.out.println(MESSAGE_TASK_NOT_FOUND); - return; - } - - if (tasks.get(taskIndex).isCompleted()) { - tasks.get(taskIndex).setUndone(); - System.out.println(taskName + MESSAGE_TASK_UNMARKED); - } else { - System.out.println(taskName + MESSAGE_TASK_ALREADY_UNDONE); - } - } - - private static void markTask(String taskName) { - int taskIndex = getTaskIndex(taskName); - if (taskIndex == TASK_INDEX_ERROR) { - System.out.println(MESSAGE_TASK_NOT_FOUND); - return; - } - - if (!tasks.get(taskIndex).isCompleted()) { - tasks.get(taskIndex).setDone(); - System.out.println(MESSAGE_TASK_MARKED + taskName); - } else { - System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); - } - } - - private static int getTaskIndex(String taskName) { - for (Task task : tasks) { - if (task.getTaskName().equals(taskName)) { - return tasks.indexOf(task); - } - } - return TASK_INDEX_ERROR; - } - - private static void addTask(String[] taskDetails) { - if (isInList(taskDetails[TASK_NAME_INDEX])) { - System.out.println(taskDetails[TASK_NAME_INDEX] + " is already in the list!"); - return; - } - - Task newTask; - switch (taskDetails[TASK_TYPE_INDEX]) { - case "deadline": - newTask = new Deadline(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_DUE_DATE_INDEX]); - break; - case "event": - newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], - taskDetails[TASK_END_DATE_INDEX]); - break; - default: - newTask = new Todo(taskDetails[TASK_NAME_INDEX]); - break; - } - tasks.add(newTask); - System.out.println("Added " + taskDetails[TASK_NAME_INDEX]); - } - - private static boolean isInList(String taskName) { - for (Task task : tasks) { - if (task.getTaskName().equals(taskName)) { - return true; - } - } - return false; - } - - private static void displayCommandList() { - // list,add,mark,unmark,help,exit - printHorizontalLine(); - System.out.println(MESSAGE_HELP_LIST_COMMAND); - System.out.println(MESSAGE_HELP_ADD_EVENT); - System.out.println(MESSAGE_HELP_ADD_DEADLINE); - System.out.println(MESSAGE_HELP_ADD_TODO); - System.out.println(MESSAGE_HELP_MARK_TASK); - System.out.println(MESSAGE_HELP_UNMARK_TASK); - System.out.println(MESSAGE_HELP_HELP); - System.out.println(MESSAGE_HELP_EXIT); - } - private static void displayHelpMessage() { - System.out.println(MESSAGE_HELP_COMMAND); - } - - private static String[] processInput(String userInput) throws NanoInputFormatException { - userInput = userInput.trim(); - if (!userInput.startsWith("/")) { - throw new NanoInputFormatException(); - } - userInput = userInput.replaceFirst("/", ""); - String[] userInputs = new String[USER_INPUT_MAX_ARG_COUNT + 1]; - String[] commandAndName = userInput.split("\\s+", 2); - System.arraycopy(commandAndName, 0, userInputs, 0, commandAndName.length); - - if (commandAndName.length == 2) { - processTaskDetails(userInput, userInputs); - } - return userInputs; - } - - private static void processTaskDetails(String userInput, String[] userInputs) throws NanoInputFormatException { - if (isDeadline(userInput)) { - getDeadline(userInput, userInputs); - } else if (isEvent(userInput)) { - getEvent(userInput, userInputs); - } else if (userInput.contains("/")) { - throw new NanoInputFormatException(); - } else { - getTodo(userInputs); - } - } - - private static void getTodo(String[] userInputs) { - userInputs[TASK_TYPE_INDEX] = "todo"; - } - - private static void getEvent(String userInput, String[] userInputs) { - userInputs[TASK_TYPE_INDEX] = "event"; - userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from/")).trim(); - userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from/") + 5, - userInput.indexOf("to/")).trim(); - userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to/") + 3).trim(); - } - - private static void getDeadline(String userInput, String[] userInputs) { - userInputs[TASK_TYPE_INDEX] = "deadline"; - userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by/")).trim(); - userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by/") + 3).trim(); - } - - private static boolean isDeadline(String task) { - return task.contains("by/"); - } - - private static boolean isEvent(String task) { - return task.contains("from/") && task.contains("to/"); - } - - private static void displayTaskList() { - System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + - Task.getUncompletedTaskCount() + " more to go!"); - for (Task task : tasks) { - System.out.println(task.toString()); - } - } - - private static void displayExitMessage() { - System.out.println(MESSAGE_EXIT); - } - - //creates a list of task (1-index) - private static void initialiseTaskList() { - tasks = new ArrayList<>(); - getUserData(); - } - - private static void getUserData(){ - if (taskFile.exists()) { - try { - Scanner s = new Scanner(taskFile); - while (s.hasNext()) { - readTaskFile(s.nextLine()); - } - } catch (FileNotFoundException e) { - System.out.println("Error reading task file."); - } - } else { - System.out.println("User task file not detected. Creating new task file....."); - createTaskFile(); - } - } - - private static void readTaskFile(String taskDetails) { - Task newTask; - String taskName; - if (taskDetails.charAt(taskDetails.length() - 1) == ')') { - taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1, taskDetails.lastIndexOf(" (")); - } else { - taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1); - } - - switch (taskDetails.substring(1, 2)) { - case "D": - newTask = new Deadline(taskName, taskDetails.substring(taskDetails.indexOf("by:") + 4, - taskDetails.lastIndexOf(')'))); - break; - case "E": - newTask = new Event(taskName, taskDetails.substring(taskDetails.indexOf("from:") + 5, - taskDetails.indexOf(", to:")).trim(), - taskDetails.substring(taskDetails.indexOf("to:") + 4, taskDetails.lastIndexOf(')')).trim()); - break; - default: - newTask = new Todo(taskName); - break; - } - tasks.add(newTask); - - if (taskDetails.contains("[x]")) { - tasks.get(tasks.size() - 1).setDone(); - } - } - private static void createTaskFile() { - try { - if (taskFile.getParentFile().mkdirs()) { - System.out.println("Creating directories....."); - } else { - System.out.println("Unable to create directories. User data may not be saved."); - } - - if (taskFile.createNewFile()) { - System.out.println("Task file created!"); - } else { - System.out.println("Unable to create task file. User data may not be saved."); - } - - } catch (IOException e) { - System.out.println("Error detected while creating user task file. User data may not be saved."); - } - printHorizontalLine(); - } - - private static String getUserInput() { - String userInput; - Scanner in = new Scanner(System.in); - userInput = in.nextLine(); - return userInput; - } - - private static void displayWelcomeMessage() { - printHorizontalLine(); - System.out.println(NANO_LOGO); - System.out.println("Serial number: 034-4532-5893....."); - System.out.println("Activating the 7th generation Nano Machine of the Chan Corporation....."); - printHorizontalLine(); - System.out.println("How may I assist you?"); - printHorizontalLine(); - } - - //print horizontal line - public static void printHorizontalLine() { - for (int i = 0; i < HORIZONTAL_LINE_LENGTH / 10; i += 1) { - System.out.print("__________"); - } - System.out.println(); + public static void main(String[] args) { + new Nano("data/tasks.txt").run(); } } \ No newline at end of file diff --git a/src/main/java/nano/data/TaskList.java b/src/main/java/nano/data/TaskList.java new file mode 100644 index 000000000..dbfd8cc55 --- /dev/null +++ b/src/main/java/nano/data/TaskList.java @@ -0,0 +1,117 @@ +package nano.data; + +import nano.ui.Ui; +import nano.storage.Storage; +import nano.data.task.Deadline; +import nano.data.task.Event; +import nano.data.task.Task; +import nano.data.task.Todo; + +import java.util.ArrayList; + +public class TaskList { + private static final int TASK_NAME_INDEX = 0; + private static final int TASK_TYPE_INDEX = 1; + private static final int TASK_START_DATE_INDEX = 2; + private static final int TASK_DUE_DATE_INDEX = 2; + private static final int TASK_END_DATE_INDEX = 3; + private static final int TASK_INDEX_ERROR = -1; + private final ArrayList tasks; + + public TaskList() { + tasks = new ArrayList<>(); + } + + public TaskList(Storage storage) { + tasks = new ArrayList<>(); + storage.getUserData(tasks); + + } + + public void deleteTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == TASK_INDEX_ERROR) { + Ui.displayTaskNotFoundMessage(); + return; + } + + tasks.remove(taskIndex); + Task.deleteTask(); + System.out.println("Deleted " + taskName); + } + + public void unmarkTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == TASK_INDEX_ERROR) { + Ui.displayTaskNotFoundMessage(); + return; + } + + if (tasks.get(taskIndex).isCompleted()) { + tasks.get(taskIndex).setUndone(); + Ui.displayUnmarkTaskMessage(taskName); + } else { + Ui.displayTaskAlreadyUndoneMessage(taskName); + } + } + + public void markTask(String taskName) { + int taskIndex = getTaskIndex(taskName); + if (taskIndex == TASK_INDEX_ERROR) { + Ui.displayTaskNotFoundMessage(); + return; + } + + if (!tasks.get(taskIndex).isCompleted()) { + tasks.get(taskIndex).setDone(); + Ui.displayMarkTaskMessage(taskName); + } else { + Ui.displayTaskAlreadyDoneMessage(taskName); + } + } + + private int getTaskIndex(String taskName) { + for (Task task : tasks) { + if (task.getTaskName().equals(taskName)) { + return tasks.indexOf(task); + } + } + return TASK_INDEX_ERROR; + } + + public void addTask(String[] taskDetails) { + if (isInList(taskDetails[TASK_NAME_INDEX])) { + System.out.println(taskDetails[TASK_NAME_INDEX] + " is already in the list!"); + return; + } + + Task newTask; + switch (taskDetails[TASK_TYPE_INDEX]) { + case "deadline": + newTask = new Deadline(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_DUE_DATE_INDEX]); + break; + case "event": + newTask = new Event(taskDetails[TASK_NAME_INDEX], taskDetails[TASK_START_DATE_INDEX], + taskDetails[TASK_END_DATE_INDEX]); + break; + default: + newTask = new Todo(taskDetails[TASK_NAME_INDEX]); + break; + } + tasks.add(newTask); + System.out.println("Added " + taskDetails[TASK_NAME_INDEX]); + } + + public boolean isInList(String taskName) { + for (Task task : tasks) { + if (task.getTaskName().equals(taskName)) { + return true; + } + } + return false; + } + + public ArrayList getTaskList() { + return tasks; + } +} \ No newline at end of file diff --git a/src/main/java/nano/exception/NanoCommandException.java b/src/main/java/nano/data/exception/NanoCommandException.java similarity index 66% rename from src/main/java/nano/exception/NanoCommandException.java rename to src/main/java/nano/data/exception/NanoCommandException.java index 33c9b4be9..64e4f873d 100644 --- a/src/main/java/nano/exception/NanoCommandException.java +++ b/src/main/java/nano/data/exception/NanoCommandException.java @@ -1,4 +1,4 @@ -package nano.exception; +package nano.data.exception; public class NanoCommandException extends Exception { } diff --git a/src/main/java/nano/exception/NanoInputFormatException.java b/src/main/java/nano/data/exception/NanoInputFormatException.java similarity index 67% rename from src/main/java/nano/exception/NanoInputFormatException.java rename to src/main/java/nano/data/exception/NanoInputFormatException.java index 5448934f3..c77c98b71 100644 --- a/src/main/java/nano/exception/NanoInputFormatException.java +++ b/src/main/java/nano/data/exception/NanoInputFormatException.java @@ -1,4 +1,4 @@ -package nano.exception; +package nano.data.exception; public class NanoInputFormatException extends Exception{ } diff --git a/src/main/java/nano/task/Deadline.java b/src/main/java/nano/data/task/Deadline.java similarity index 93% rename from src/main/java/nano/task/Deadline.java rename to src/main/java/nano/data/task/Deadline.java index bc36da781..953102305 100644 --- a/src/main/java/nano/task/Deadline.java +++ b/src/main/java/nano/data/task/Deadline.java @@ -1,4 +1,4 @@ -package nano.task; +package nano.data.task; public class Deadline extends Task{ private static final String TASK_TYPE_TAG = "[D]"; diff --git a/src/main/java/nano/task/Event.java b/src/main/java/nano/data/task/Event.java similarity index 94% rename from src/main/java/nano/task/Event.java rename to src/main/java/nano/data/task/Event.java index 8c4f0843f..78a56aeea 100644 --- a/src/main/java/nano/task/Event.java +++ b/src/main/java/nano/data/task/Event.java @@ -1,4 +1,4 @@ -package nano.task; +package nano.data.task; public class Event extends Task { private static final String TASK_TYPE_TAG = "[E]"; diff --git a/src/main/java/nano/task/Task.java b/src/main/java/nano/data/task/Task.java similarity index 98% rename from src/main/java/nano/task/Task.java rename to src/main/java/nano/data/task/Task.java index 187be236c..9741cdc3c 100644 --- a/src/main/java/nano/task/Task.java +++ b/src/main/java/nano/data/task/Task.java @@ -1,4 +1,4 @@ -package nano.task; +package nano.data.task; public class Task { public static final String TASK_COMPLETED_MARK = "[x] "; diff --git a/src/main/java/nano/task/Todo.java b/src/main/java/nano/data/task/Todo.java similarity index 91% rename from src/main/java/nano/task/Todo.java rename to src/main/java/nano/data/task/Todo.java index 88757e2cd..be87de3d4 100644 --- a/src/main/java/nano/task/Todo.java +++ b/src/main/java/nano/data/task/Todo.java @@ -1,4 +1,4 @@ -package nano.task; +package nano.data.task; public class Todo extends Task{ private static final String TASK_TYPE_TAG = "[T]"; diff --git a/src/main/java/nano/parser/Parser.java b/src/main/java/nano/parser/Parser.java new file mode 100644 index 000000000..2c2e0381f --- /dev/null +++ b/src/main/java/nano/parser/Parser.java @@ -0,0 +1,110 @@ +package nano.parser; + +import nano.data.TaskList; +import nano.ui.Ui; +import nano.data.exception.NanoCommandException; +import nano.data.exception.NanoInputFormatException; + +import java.util.Arrays; + +public class Parser { + private static final int COMMAND_INDEX = 0; + private static final int TASK_NAME_INDEX = 1; + + private static final int TASK_TYPE_INDEX = 2; + private static final int TASK_START_DATE_INDEX = 3; + private static final int TASK_DUE_DATE_INDEX = 3; + private static final int TASK_END_DATE_INDEX = 4; + private static final int USER_INPUT_MAX_ARG_COUNT = 4; + + public static void executeCommand(String userInput, TaskList tasks) throws NanoCommandException { + String[] userInputs; + try { + userInputs = processInput(userInput); + } catch (NanoInputFormatException inputException) { + Ui.displayInputErrorMessage(); + return; + } + + switch (userInputs[COMMAND_INDEX]) { + case "list": + Ui.displayTaskList(tasks.getTaskList()); + break; + case "add": + tasks.addTask(Arrays.copyOfRange(userInputs, 1, USER_INPUT_MAX_ARG_COUNT + 1)); + break; + case "delete": + tasks.deleteTask(userInputs[TASK_NAME_INDEX]); + break; + case "mark": + tasks.markTask(userInputs[TASK_NAME_INDEX]); + break; + case "unmark": + tasks.unmarkTask(userInputs[TASK_NAME_INDEX]); + break; + case "help": + Ui.displayCommandList(); + break; + case "exit": + Ui.displayExitMessage(); + System.exit(0); + default: + throw new NanoCommandException(); + } + Ui.printHorizontalLine(); + } + + private static String[] processInput(String userInput) throws NanoInputFormatException { + userInput = userInput.trim(); + if (!userInput.startsWith("/")) { + throw new NanoInputFormatException(); + } + userInput = userInput.replaceFirst("/", ""); + String[] userInputs = new String[USER_INPUT_MAX_ARG_COUNT + 1]; + String[] commandAndName = userInput.split("\\s+", 2); + System.arraycopy(commandAndName, 0, userInputs, 0, commandAndName.length); + + if (commandAndName.length == 2) { + processTaskDetails(userInput, userInputs); + } + return userInputs; + } + + private static void processTaskDetails(String userInput, String[] userInputs) throws NanoInputFormatException { + if (isDeadline(userInput)) { + getDeadline(userInput, userInputs); + } else if (isEvent(userInput)) { + getEvent(userInput, userInputs); + } else if (userInput.contains("/")) { + throw new NanoInputFormatException(); + } else { + getTodo(userInputs); + } + } + + private static void getTodo(String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "todo"; + } + + private static void getEvent(String userInput, String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "event"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("from/")).trim(); + userInputs[TASK_START_DATE_INDEX] = userInput.substring(userInput.indexOf("from/") + 5, + userInput.indexOf("to/")).trim(); + userInputs[TASK_END_DATE_INDEX] = userInput.substring(userInput.indexOf("to/") + 3).trim(); + } + + private static void getDeadline(String userInput, String[] userInputs) { + userInputs[TASK_TYPE_INDEX] = "deadline"; + userInputs[TASK_NAME_INDEX] = userInput.substring(userInput.indexOf(" "), userInput.indexOf("by/")).trim(); + userInputs[TASK_DUE_DATE_INDEX] = userInput.substring(userInput.indexOf("by/") + 3).trim(); + } + + private static boolean isDeadline(String task) { + return task.contains("by/"); + } + + private static boolean isEvent(String task) { + return task.contains("from/") && task.contains("to/"); + } +} \ No newline at end of file diff --git a/src/main/java/nano/storage/Storage.java b/src/main/java/nano/storage/Storage.java new file mode 100644 index 000000000..9dfb0ad8a --- /dev/null +++ b/src/main/java/nano/storage/Storage.java @@ -0,0 +1,103 @@ +package nano.storage; + +import nano.ui.Ui; +import nano.data.task.Deadline; +import nano.data.task.Event; +import nano.data.task.Task; +import nano.data.task.Todo; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Scanner; + +public class Storage { + + private static final File defaultFile = new File("data/tasks.txt"); + private final File taskFile; + + public Storage() { + taskFile = defaultFile; + } + + public Storage(String taskFile) { + this.taskFile = new File(taskFile); + } + + public void getUserData(ArrayList tasks){ + if (taskFile.exists()) { + try { + Scanner s = new Scanner(taskFile); + while (s.hasNext()) { + readTaskFile(s.nextLine(),tasks); + } + } catch (FileNotFoundException e) { + System.out.println("Error reading task file."); + } + } else { + System.out.println("User task file not detected. Creating new task file....."); + createTaskFile(); + } + } + + private static void readTaskFile(String taskDetails, ArrayList tasks) { + Task newTask; + String taskName; + if (taskDetails.charAt(taskDetails.length() - 1) == ')') { + taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1, taskDetails.lastIndexOf(" (")); + } else { + taskName = taskDetails.substring(taskDetails.indexOf(" ") + 1); + } + + switch (taskDetails.substring(1, 2)) { + case "D": + newTask = new Deadline(taskName, taskDetails.substring(taskDetails.indexOf("by:") + 4, + taskDetails.lastIndexOf(')'))); + break; + case "E": + newTask = new Event(taskName, taskDetails.substring(taskDetails.indexOf("from:") + 5, + taskDetails.indexOf(", to:")).trim(), + taskDetails.substring(taskDetails.indexOf("to:") + 4, taskDetails.lastIndexOf(')')).trim()); + break; + default: + newTask = new Todo(taskName); + break; + } + tasks.add(newTask); + + if (taskDetails.contains("[x]")) { + tasks.get(tasks.size() - 1).setDone(); + } + } + + private void createTaskFile() { + try { + if (taskFile.getParentFile().mkdirs()) { + System.out.println("Creating directories....."); + } else { + System.out.println("Unable to create directories. User data may not be saved."); + } + + if (taskFile.createNewFile()) { + System.out.println("Task file created!"); + } else { + System.out.println("Unable to create task file. User data may not be saved."); + } + + } catch (IOException e) { + System.out.println("Error detected while creating user task file. User data may not be saved."); + } + Ui.printHorizontalLine(); + } + + public void saveTaskFile(ArrayList tasks) throws IOException { + FileWriter fileWriter = new FileWriter(taskFile); + for (Task task : tasks) { + fileWriter.write(task.toString() + System.lineSeparator()); + } + fileWriter.close(); + } +} \ No newline at end of file diff --git a/src/main/java/nano/ui/Ui.java b/src/main/java/nano/ui/Ui.java new file mode 100644 index 000000000..ade640d03 --- /dev/null +++ b/src/main/java/nano/ui/Ui.java @@ -0,0 +1,114 @@ +package nano.ui; + +import nano.data.task.Task; + +import java.util.ArrayList; +import java.util.Scanner; + +public class Ui { + + private static final String HORIZONTAL_LINE = "_______________________________________________________________________"; + private static final String NANO_LOGO = "| \\ || / \\ | \\ ||| __ |\n" + + "||\\\\ || / _ \\ ||\\\\ ||| | | |\n" + + "|| \\\\|| // \\\\ || \\\\||| |__| |\n" + + "|| \\_|// \\\\|| \\_||______|\n"; + private static final String MESSAGE_TASK_NOT_FOUND = "Task not found!"; + private static final String MESSAGE_TASK_MARKED = "Great job completing "; + private static final String MESSAGE_TASK_ALREADY_DONE = " is already done."; + private static final String MESSAGE_TASK_ALREADY_UNDONE = " is already not done."; + private static final String MESSAGE_TASK_UNMARKED = " set to undone!"; + private static final String MESSAGE_HELP_COMMAND = "Enter \"/help\" for full command list"; + private static final String MESSAGE_EXIT = "Sleep mode activated."; + private static final String MESSAGE_HELP_LIST_COMMAND = "/list : Displays list of tasks"; + private static final String MESSAGE_HELP_ADD_EVENT = "/add from/ to/ : Add new event"; + private static final String MESSAGE_HELP_ADD_DEADLINE = "/add by/ : Add new deadline"; + private static final String MESSAGE_HELP_ADD_TODO = "/add : Add new Todo"; + private static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; + private static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; + private static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; + private static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; + + private final Scanner in; + public Ui() { + this.in = new Scanner(System.in); + displayWelcomeMessage(); + } + + public String getUserInput() { + return in.nextLine(); + } + + public static void displayWelcomeMessage() { + printHorizontalLine(); + System.out.println(NANO_LOGO); + System.out.println("Serial number: 034-4532-5893....."); + System.out.println("Activating the 7th generation Nano Machine of the Chan Corporation....."); + printHorizontalLine(); + System.out.println("How may I assist you?"); + printHorizontalLine(); + } + + //print horizontal line + public static void printHorizontalLine() { + System.out.println(HORIZONTAL_LINE); + } + + public static void displayTaskList(ArrayList tasks) { + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + + Task.getUncompletedTaskCount() + " more to go!"); + for (Task task : tasks) { + System.out.println(task.toString()); + } + } + + public static void displayExitMessage() { + System.out.println(MESSAGE_EXIT); + } + + public static void displayCommandList() { + // list,add,mark,unmark,help,exit + printHorizontalLine(); + System.out.println(MESSAGE_HELP_LIST_COMMAND); + System.out.println(MESSAGE_HELP_ADD_EVENT); + System.out.println(MESSAGE_HELP_ADD_DEADLINE); + System.out.println(MESSAGE_HELP_ADD_TODO); + System.out.println(MESSAGE_HELP_MARK_TASK); + System.out.println(MESSAGE_HELP_UNMARK_TASK); + System.out.println(MESSAGE_HELP_HELP); + System.out.println(MESSAGE_HELP_EXIT); + } + + public static void displayHelpMessage() { + System.out.println(MESSAGE_HELP_COMMAND); + } + + public static void displayTaskNotFoundMessage() { + System.out.println(MESSAGE_TASK_NOT_FOUND); + } + + public static void displayUnmarkTaskMessage(String taskName) { + System.out.println(taskName + MESSAGE_TASK_UNMARKED); + } + + public static void displayTaskAlreadyUndoneMessage(String taskName) { + System.out.println(taskName + MESSAGE_TASK_ALREADY_UNDONE); + } + + public static void displayMarkTaskMessage(String taskName) { + System.out.println(MESSAGE_TASK_MARKED + taskName + '!'); + } + + public static void displayTaskAlreadyDoneMessage(String taskName) { + System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); + } + + public static void displayInputErrorMessage() { + System.out.println("Input error!"); + displayHelpMessage(); + } + + public static void displayUnknownCommandMessage() { + System.out.println("Unknown command!"); + displayHelpMessage(); + } +} \ No newline at end of file From f44d88a484c15aa213663facbaacedaf24c127fc Mon Sep 17 00:00:00 2001 From: calebcjl Date: Fri, 3 Mar 2023 19:25:06 +0800 Subject: [PATCH 17/20] Add feature to find and list tasks containing a keyword --- src/main/java/nano/data/TaskList.java | 27 +++++++++++++++++++++++++++ src/main/java/nano/parser/Parser.java | 5 ++++- src/main/java/nano/ui/Ui.java | 21 ++++++++++++++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/java/nano/data/TaskList.java b/src/main/java/nano/data/TaskList.java index dbfd8cc55..21e1f955e 100644 --- a/src/main/java/nano/data/TaskList.java +++ b/src/main/java/nano/data/TaskList.java @@ -114,4 +114,31 @@ public boolean isInList(String taskName) { public ArrayList getTaskList() { return tasks; } + + public void findTasks(String keyword) { + + if (isInvalidKeyword(keyword)) { + Ui.displayKeywordError(); + return; + } + + keyword = keyword.trim(); + ArrayList searchList = new ArrayList<>(); + for (Task task : tasks) { + if (task.getTaskName().contains(keyword)) { + searchList.add(task); + } + } + + Ui.displayFindTaskMessage(searchList.size(), keyword); + Ui.displayTaskList(searchList); + } + + private static boolean isInvalidKeyword(String keyword) { + if (keyword == null) { + return true; + } + + return keyword.trim().length() == 0; + } } \ No newline at end of file diff --git a/src/main/java/nano/parser/Parser.java b/src/main/java/nano/parser/Parser.java index 2c2e0381f..47e025abf 100644 --- a/src/main/java/nano/parser/Parser.java +++ b/src/main/java/nano/parser/Parser.java @@ -28,7 +28,7 @@ public static void executeCommand(String userInput, TaskList tasks) throws NanoC switch (userInputs[COMMAND_INDEX]) { case "list": - Ui.displayTaskList(tasks.getTaskList()); + Ui.displayTaskListMessage(tasks.getTaskList()); break; case "add": tasks.addTask(Arrays.copyOfRange(userInputs, 1, USER_INPUT_MAX_ARG_COUNT + 1)); @@ -42,6 +42,9 @@ public static void executeCommand(String userInput, TaskList tasks) throws NanoC case "unmark": tasks.unmarkTask(userInputs[TASK_NAME_INDEX]); break; + case "find": + tasks.findTasks(userInputs[TASK_NAME_INDEX]); + break; case "help": Ui.displayCommandList(); break; diff --git a/src/main/java/nano/ui/Ui.java b/src/main/java/nano/ui/Ui.java index ade640d03..faff48606 100644 --- a/src/main/java/nano/ui/Ui.java +++ b/src/main/java/nano/ui/Ui.java @@ -27,6 +27,7 @@ public class Ui { private static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; private static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; private static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; + public static final String MESSAGE_INVALID_KEYWORD = "Invalid keyword entered!"; private final Scanner in; public Ui() { @@ -34,6 +35,14 @@ public Ui() { displayWelcomeMessage(); } + public static void displayFindTaskMessage(int numOfTask, String keyword) { + System.out.println("There are " + numOfTask + " tasks with \"" + keyword +"\":"); + } + + public static void displayKeywordError() { + System.out.println(MESSAGE_INVALID_KEYWORD); + } + public String getUserInput() { return in.nextLine(); } @@ -54,13 +63,19 @@ public static void printHorizontalLine() { } public static void displayTaskList(ArrayList tasks) { - System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + - Task.getUncompletedTaskCount() + " more to go!"); + int counter = 1; for (Task task : tasks) { - System.out.println(task.toString()); + System.out.println(counter + ". " +task.toString()); + counter += 1; } } + public static void displayTaskListMessage(ArrayList tasks) { + System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + + Task.getUncompletedTaskCount() + " more to go!"); + displayTaskList(tasks); + } + public static void displayExitMessage() { System.out.println(MESSAGE_EXIT); } From d7094b0e013a3064cb143e18c6479c522bec95c1 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Fri, 3 Mar 2023 21:55:30 +0800 Subject: [PATCH 18/20] Add JavaDoc comments to code --- src/main/java/nano/Nano.java | 3 + src/main/java/nano/data/TaskList.java | 42 +++++++++++++ src/main/java/nano/parser/Parser.java | 21 +++++++ src/main/java/nano/storage/Storage.java | 21 +++++++ src/main/java/nano/ui/Ui.java | 84 +++++++++++++++++++++++-- 5 files changed, 167 insertions(+), 4 deletions(-) diff --git a/src/main/java/nano/Nano.java b/src/main/java/nano/Nano.java index c9456dba5..6c820a812 100644 --- a/src/main/java/nano/Nano.java +++ b/src/main/java/nano/Nano.java @@ -21,6 +21,9 @@ public Nano(String filePath) { tasks = new TaskList(storage); } + /** + * + */ public void run() { while (true) { String userInput = ui.getUserInput(); diff --git a/src/main/java/nano/data/TaskList.java b/src/main/java/nano/data/TaskList.java index 21e1f955e..7ee41b600 100644 --- a/src/main/java/nano/data/TaskList.java +++ b/src/main/java/nano/data/TaskList.java @@ -28,6 +28,11 @@ public TaskList(Storage storage) { } + /** + * Delete task from task list. + * + * @param taskName Name of task to delete. + */ public void deleteTask(String taskName) { int taskIndex = getTaskIndex(taskName); if (taskIndex == TASK_INDEX_ERROR) { @@ -40,6 +45,11 @@ public void deleteTask(String taskName) { System.out.println("Deleted " + taskName); } + /** + * Set task as uncompleted. + * + * @param taskName Name of task to unmark. + */ public void unmarkTask(String taskName) { int taskIndex = getTaskIndex(taskName); if (taskIndex == TASK_INDEX_ERROR) { @@ -55,6 +65,11 @@ public void unmarkTask(String taskName) { } } + /** + * Set task as completed. + * + * @param taskName Name of task to mark. + */ public void markTask(String taskName) { int taskIndex = getTaskIndex(taskName); if (taskIndex == TASK_INDEX_ERROR) { @@ -70,6 +85,12 @@ public void markTask(String taskName) { } } + /** + * Returns index of task in task list. + * + * @param taskName Name of task. + * @return Index of task. + */ private int getTaskIndex(String taskName) { for (Task task : tasks) { if (task.getTaskName().equals(taskName)) { @@ -79,6 +100,11 @@ private int getTaskIndex(String taskName) { return TASK_INDEX_ERROR; } + /** + * Adds task to task list. + * + * @param taskDetails Details of task added + */ public void addTask(String[] taskDetails) { if (isInList(taskDetails[TASK_NAME_INDEX])) { System.out.println(taskDetails[TASK_NAME_INDEX] + " is already in the list!"); @@ -102,6 +128,12 @@ public void addTask(String[] taskDetails) { System.out.println("Added " + taskDetails[TASK_NAME_INDEX]); } + /** + * Check if task is found in task list. + * + * @param taskName Name of task. + * @return true if task is in task list. Returns false otherwise. + */ public boolean isInList(String taskName) { for (Task task : tasks) { if (task.getTaskName().equals(taskName)) { @@ -111,10 +143,20 @@ public boolean isInList(String taskName) { return false; } + /** + * Get lists of task + * + * @return Task list. + */ public ArrayList getTaskList() { return tasks; } + /** + * Finds and displays all tasks containing a keyword. + * + * @param keyword Keyword used in search. + */ public void findTasks(String keyword) { if (isInvalidKeyword(keyword)) { diff --git a/src/main/java/nano/parser/Parser.java b/src/main/java/nano/parser/Parser.java index 47e025abf..56ae06b9c 100644 --- a/src/main/java/nano/parser/Parser.java +++ b/src/main/java/nano/parser/Parser.java @@ -17,6 +17,13 @@ public class Parser { private static final int TASK_END_DATE_INDEX = 4; private static final int USER_INPUT_MAX_ARG_COUNT = 4; + /** + * Executes command entered by user. + * + * @param userInput Input entered by user. + * @param tasks Task list + * @throws NanoCommandException If unknown command is given. + */ public static void executeCommand(String userInput, TaskList tasks) throws NanoCommandException { String[] userInputs; try { @@ -57,6 +64,13 @@ public static void executeCommand(String userInput, TaskList tasks) throws NanoC Ui.printHorizontalLine(); } + /** + * Returns processed input entered by user to separate command and the details. + * + * @param userInput Input entered by user. + * @return Processed input. + * @throws NanoInputFormatException If user input does not follow the correct format. + */ private static String[] processInput(String userInput) throws NanoInputFormatException { userInput = userInput.trim(); if (!userInput.startsWith("/")) { @@ -73,6 +87,13 @@ private static String[] processInput(String userInput) throws NanoInputFormatExc return userInputs; } + /** + * Process tasks into its details based on its task type. + * + * @param userInput Input entered by user. + * @param userInputs Array of Strings to store processed input. + * @throws NanoInputFormatException If tasks details are in an invalid format. + */ private static void processTaskDetails(String userInput, String[] userInputs) throws NanoInputFormatException { if (isDeadline(userInput)) { getDeadline(userInput, userInputs); diff --git a/src/main/java/nano/storage/Storage.java b/src/main/java/nano/storage/Storage.java index 9dfb0ad8a..5e2bfa338 100644 --- a/src/main/java/nano/storage/Storage.java +++ b/src/main/java/nano/storage/Storage.java @@ -27,6 +27,11 @@ public Storage(String taskFile) { this.taskFile = new File(taskFile); } + /** + * Reads froms task text datafile and adds tasks into a list. + * + * @param tasks List of tasks. + */ public void getUserData(ArrayList tasks){ if (taskFile.exists()) { try { @@ -43,6 +48,12 @@ public void getUserData(ArrayList tasks){ } } + /** + * Processes task details from task text datafile and add task to a list. + * + * @param taskDetails Details of task to add. + * @param tasks List of tasks. + */ private static void readTaskFile(String taskDetails, ArrayList tasks) { Task newTask; String taskName; @@ -73,6 +84,10 @@ private static void readTaskFile(String taskDetails, ArrayList tasks) { } } + /** + * Creates directories and files to store task list. + * Only created when task text datafile does not exist. + */ private void createTaskFile() { try { if (taskFile.getParentFile().mkdirs()) { @@ -93,6 +108,12 @@ private void createTaskFile() { Ui.printHorizontalLine(); } + /** + * Saves task lists into a text datafile. + * + * @param tasks List of tasks. + * @throws IOException If unable to write to text datafile. + */ public void saveTaskFile(ArrayList tasks) throws IOException { FileWriter fileWriter = new FileWriter(taskFile); for (Task task : tasks) { diff --git a/src/main/java/nano/ui/Ui.java b/src/main/java/nano/ui/Ui.java index faff48606..22be41aa9 100644 --- a/src/main/java/nano/ui/Ui.java +++ b/src/main/java/nano/ui/Ui.java @@ -20,11 +20,16 @@ public class Ui { private static final String MESSAGE_HELP_COMMAND = "Enter \"/help\" for full command list"; private static final String MESSAGE_EXIT = "Sleep mode activated."; private static final String MESSAGE_HELP_LIST_COMMAND = "/list : Displays list of tasks"; - private static final String MESSAGE_HELP_ADD_EVENT = "/add from/ to/ : Add new event"; + private static final String MESSAGE_HELP_ADD_EVENT = "/add from/ to/" + + " : Add new event"; private static final String MESSAGE_HELP_ADD_DEADLINE = "/add by/ : Add new deadline"; private static final String MESSAGE_HELP_ADD_TODO = "/add : Add new Todo"; - private static final String MESSAGE_HELP_MARK_TASK = "/mark : set task as completed"; - private static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : set task as undone"; + private static final String MESSAGE_HELP_DELETE_TASK = "/delete : Delete task \"Task_Name\""; + private static final String MESSAGE_HELP_MARK_TASK = "/mark : Set \"Task_Name\" as completed"; + private static final String MESSAGE_HELP_UNMARK_TASK = "/unmark : Set \"Task_Name\" as " + + "undone"; + private static final String MESSAGE_HELP_FIND_TASK = "/find : Find and displays all tasks " + + "with keyword"; private static final String MESSAGE_HELP_HELP = "/help : Displays list of all commands"; private static final String MESSAGE_HELP_EXIT = "/exit : Exit chatbot"; public static final String MESSAGE_INVALID_KEYWORD = "Invalid keyword entered!"; @@ -35,18 +40,35 @@ public Ui() { displayWelcomeMessage(); } + /** + * Displays header message when displaying list of tasks found using find command. + * + * @param numOfTask number of tasks in list. + * @param keyword keyword used in search. + */ public static void displayFindTaskMessage(int numOfTask, String keyword) { System.out.println("There are " + numOfTask + " tasks with \"" + keyword +"\":"); } + /** + * Displays error message when an invalid keyword is used for find command. + */ public static void displayKeywordError() { System.out.println(MESSAGE_INVALID_KEYWORD); } + /** + * Returns input entered by user. + * + * @return Input by user. + */ public String getUserInput() { return in.nextLine(); } + /** + * Displays the startup message of NANO chatbot. + */ public static void displayWelcomeMessage() { printHorizontalLine(); System.out.println(NANO_LOGO); @@ -57,11 +79,19 @@ public static void displayWelcomeMessage() { printHorizontalLine(); } - //print horizontal line + /** + * Display a horizontal line. + * This improves visual readability of output by separating chunks of text. + */ public static void printHorizontalLine() { System.out.println(HORIZONTAL_LINE); } + /** + * Displays a list of tasks with numbering. + * + * @param tasks List of tasks. + */ public static void displayTaskList(ArrayList tasks) { int counter = 1; for (Task task : tasks) { @@ -70,16 +100,28 @@ public static void displayTaskList(ArrayList tasks) { } } + /** + * Displays lists of tasks with list command. + * It also informs user how many tasks are completed and uncompleted. + * + * @param tasks List of tasks. + */ public static void displayTaskListMessage(ArrayList tasks) { System.out.println("You have completed " + Task.getCompletedTaskCount() + " tasks. " + Task.getUncompletedTaskCount() + " more to go!"); displayTaskList(tasks); } + /** + * Displays exit message after exit command. + */ public static void displayExitMessage() { System.out.println(MESSAGE_EXIT); } + /** + * Displays details and formats for all commands. + */ public static void displayCommandList() { // list,add,mark,unmark,help,exit printHorizontalLine(); @@ -87,41 +129,75 @@ public static void displayCommandList() { System.out.println(MESSAGE_HELP_ADD_EVENT); System.out.println(MESSAGE_HELP_ADD_DEADLINE); System.out.println(MESSAGE_HELP_ADD_TODO); + System.out.println(MESSAGE_HELP_DELETE_TASK); System.out.println(MESSAGE_HELP_MARK_TASK); System.out.println(MESSAGE_HELP_UNMARK_TASK); + System.out.println(MESSAGE_HELP_FIND_TASK); System.out.println(MESSAGE_HELP_HELP); System.out.println(MESSAGE_HELP_EXIT); } + /** + * Displays how to use help command when user enters an invalid input. + */ public static void displayHelpMessage() { System.out.println(MESSAGE_HELP_COMMAND); } + /** + * Displays message when task does not exists in the list. + */ public static void displayTaskNotFoundMessage() { System.out.println(MESSAGE_TASK_NOT_FOUND); } + /** + * Displays message when task has been unmarked. + * + * @param taskName Name of task unmarked. + */ public static void displayUnmarkTaskMessage(String taskName) { System.out.println(taskName + MESSAGE_TASK_UNMARKED); } + /** + * Displays message when task is already undone. + * + * @param taskName Name of task being unmarked. + */ public static void displayTaskAlreadyUndoneMessage(String taskName) { System.out.println(taskName + MESSAGE_TASK_ALREADY_UNDONE); } + /** + * Displays message when task is marked. + * + * @param taskName Name of task marked. + */ public static void displayMarkTaskMessage(String taskName) { System.out.println(MESSAGE_TASK_MARKED + taskName + '!'); } + /** + * Displays message when task is already done. + * + * @param taskName Name of task being marked. + */ public static void displayTaskAlreadyDoneMessage(String taskName) { System.out.println(taskName + MESSAGE_TASK_ALREADY_DONE); } + /** + * Displays message when user enters an invalid input. + */ public static void displayInputErrorMessage() { System.out.println("Input error!"); displayHelpMessage(); } + /** + * Displays message when user enters an unknown command. + */ public static void displayUnknownCommandMessage() { System.out.println("Unknown command!"); displayHelpMessage(); From f9280aa2b15f0ca0e9c97240a836a5a23ef21725 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Fri, 3 Mar 2023 23:51:34 +0800 Subject: [PATCH 19/20] Add user guide for Nano --- README.md | 135 ++++++++++++++++++++++++++++------ src/main/java/nano/ui/Ui.java | 2 +- 2 files changed, 112 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 8715d4d91..b5d3c2b2d 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,111 @@ -# Duke project template - -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. - -## Setting up in Intellij - -Prerequisites: JDK 11, update Intellij to the most recent version. - -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 1. If there are any further prompts, accept the defaults. -1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
- In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: - ``` - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` +# Nano User Guide + +Nano is the chatbot for individual project for CS2113, AY22/23 Semester 2. + +Nano is named after the nano machine from the fantasy wuxia novel Nano Machine! + +## Table of Contents + +- [Nano User Guide](#nano-user-guide) + - [Features](#features) + - [Task Creation](#task-creation) + - [Task Management](#task-management) + - [Commands](#commands) + - [add - Add new task](#add---add-new-task) + - [list - Display your Task List](#list---display-your-task-list) + - [mark - Tag task as done](#mark---tag-task-as-done) + - [unmark - Tag task as undone](#unmark---tag-task-as-undone) + - [delete - Delete a Task](#delete---delete-a-task) + - [find - Query for a task](#find---look-for-a-task) + - [exit - Nano goes to sleep](#exit---nano-goes-to-sleep) + +## Features + +Nano has a variety of features for you to manage your tasks efficiently via CLI. + +### Task Creation + +Keep track of your tasks in a list. + +Nano can manage up to three types of tasks: +1. Todo - regular todo tasks +2. Deadline - tasks that with a deadline +3. Event - tasks that have a start and end time + +### Task Management + +Nano can help you mark, unmark, list, find, and save your tasks easily! + +- Nano marks your tasks to indicated that you have completed it. +- Nano can list out all your current tasks and its details. +- Nano allows you to look for specific tasks using a keyword. +- Nano can save your task list. + +## Commands + +### add - Add new task + +Add a new task(Todo, Deadline, Event). Nano will automatically detect the type of task for you. + +Syntax: + +``/add `` + +``/add by/`` + +``/add from/ to/`` + +### list - Display your task list + +Nano will show you your list of tasks. +The list contains all the task details as well + +Syntax: + +``/list`` + +### mark - Tag task as done +Nano marks a task in the task list as done + +Syntax: +``/mark `` + + +### unmark - Tag task as undone + +Nano marks a task in the task list as not done. + +Syntax: +``/unmark `` + + +### delete - Delete a Task + +Nano deletes a task from your task list. + +Syntax: +``delete `` + +### find - Look for a task + +Nano will look for the tasks containing a keyword and display them to you. + +Syntax: + +``/find `` + +### help - Displays all commands + +Nano reminds you of all his features and their syntax + +Syntax: +``/help`` + +### exit - Nano goes to sleep + +Nano enters into sleeping mode. + +Syntax: + +``/exit`` + diff --git a/src/main/java/nano/ui/Ui.java b/src/main/java/nano/ui/Ui.java index 22be41aa9..a6f00fe3b 100644 --- a/src/main/java/nano/ui/Ui.java +++ b/src/main/java/nano/ui/Ui.java @@ -145,7 +145,7 @@ public static void displayHelpMessage() { } /** - * Displays message when task does not exists in the list. + * Displays message when task does not exist in the list. */ public static void displayTaskNotFoundMessage() { System.out.println(MESSAGE_TASK_NOT_FOUND); From 0d5f8448e6a38ce623705f06f621bd768b7af4e5 Mon Sep 17 00:00:00 2001 From: calebcjl Date: Mon, 6 Mar 2023 11:23:20 +0800 Subject: [PATCH 20/20] Update the correct README for user guide --- README.md | 135 +++++++++---------------------------------------- docs/README.md | 114 +++++++++++++++++++++++++++++++++++------ 2 files changed, 122 insertions(+), 127 deletions(-) diff --git a/README.md b/README.md index b5d3c2b2d..8715d4d91 100644 --- a/README.md +++ b/README.md @@ -1,111 +1,24 @@ -# Nano User Guide - -Nano is the chatbot for individual project for CS2113, AY22/23 Semester 2. - -Nano is named after the nano machine from the fantasy wuxia novel Nano Machine! - -## Table of Contents - -- [Nano User Guide](#nano-user-guide) - - [Features](#features) - - [Task Creation](#task-creation) - - [Task Management](#task-management) - - [Commands](#commands) - - [add - Add new task](#add---add-new-task) - - [list - Display your Task List](#list---display-your-task-list) - - [mark - Tag task as done](#mark---tag-task-as-done) - - [unmark - Tag task as undone](#unmark---tag-task-as-undone) - - [delete - Delete a Task](#delete---delete-a-task) - - [find - Query for a task](#find---look-for-a-task) - - [exit - Nano goes to sleep](#exit---nano-goes-to-sleep) - -## Features - -Nano has a variety of features for you to manage your tasks efficiently via CLI. - -### Task Creation - -Keep track of your tasks in a list. - -Nano can manage up to three types of tasks: -1. Todo - regular todo tasks -2. Deadline - tasks that with a deadline -3. Event - tasks that have a start and end time - -### Task Management - -Nano can help you mark, unmark, list, find, and save your tasks easily! - -- Nano marks your tasks to indicated that you have completed it. -- Nano can list out all your current tasks and its details. -- Nano allows you to look for specific tasks using a keyword. -- Nano can save your task list. - -## Commands - -### add - Add new task - -Add a new task(Todo, Deadline, Event). Nano will automatically detect the type of task for you. - -Syntax: - -``/add `` - -``/add by/`` - -``/add from/ to/`` - -### list - Display your task list - -Nano will show you your list of tasks. -The list contains all the task details as well - -Syntax: - -``/list`` - -### mark - Tag task as done -Nano marks a task in the task list as done - -Syntax: -``/mark `` - - -### unmark - Tag task as undone - -Nano marks a task in the task list as not done. - -Syntax: -``/unmark `` - - -### delete - Delete a Task - -Nano deletes a task from your task list. - -Syntax: -``delete `` - -### find - Look for a task - -Nano will look for the tasks containing a keyword and display them to you. - -Syntax: - -``/find `` - -### help - Displays all commands - -Nano reminds you of all his features and their syntax - -Syntax: -``/help`` - -### exit - Nano goes to sleep - -Nano enters into sleeping mode. - -Syntax: - -``/exit`` - +# Duke project template + +This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. + +## Setting up in Intellij + +Prerequisites: JDK 11, update Intellij to the most recent version. + +1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) +1. Open the project into Intellij as follows: + 1. Click `Open`. + 1. Select the project directory, and click `OK`. + 1. If there are any further prompts, accept the defaults. +1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
+ In the same dialog, set the **Project language level** field to the `SDK default` option. +3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: + ``` + Hello from + ____ _ + | _ \ _ _| | _____ + | | | | | | | |/ / _ \ + | |_| | |_| | < __/ + |____/ \__,_|_|\_\___| + ``` diff --git a/docs/README.md b/docs/README.md index 8077118eb..7c98ffa2a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,111 @@ -# User Guide +# Nano User Guide -## Features +Nano is the chatbot for individual project for CS2113, AY22/23 Semester 2. -### Feature-ABC +Nano is named after the nano machine from the fantasy wuxia novel Nano Machine! -Description of the feature. +## Table of Contents -### Feature-XYZ +- [Nano User Guide](#nano-user-guide) + - [Features](#features) + - [Task Creation](#task-creation) + - [Task Management](#task-management) + - [Commands](#commands) + - [add - Add new task](#add---add-new-task) + - [list - Display your Task List](#list---display-your-task-list) + - [mark - Tag task as done](#mark---tag-task-as-done) + - [unmark - Tag task as undone](#unmark---tag-task-as-undone) + - [delete - Delete a Task](#delete---delete-a-task) + - [find - Query for a task](#find---look-for-a-task) + - [exit - Nano goes to sleep](#exit---nano-goes-to-sleep) -Description of the feature. +## Features -## Usage +Nano has a variety of features for you to manage your tasks efficiently via CLI. -### `Keyword` - Describe action +### Task Creation -Describe the action and its outcome. +Keep track of your tasks in a list. -Example of usage: +Nano can manage up to three types of tasks: +1. Todo - regular todo tasks +2. Deadline - tasks that with a deadline +3. Event - tasks that have a start and end time -`keyword (optional arguments)` +### Task Management -Expected outcome: +Nano can help you mark, unmark, list, find, and save your tasks easily! -Description of the outcome. +- Nano marks your tasks to indicated that you have completed it. +- Nano can list out all your current tasks and its details. +- Nano allows you to look for specific tasks using a keyword. +- Nano can save your task list. + +## Commands + +### add - Add new task + +Add a new task(Todo, Deadline, Event). Nano will automatically detect the type of task for you. + +Syntax: + +``/add `` + +``/add by/`` + +``/add from/ to/`` + +### list - Display your task list + +Nano will show you your list of tasks. +The list contains all the task details as well + +Syntax: + +``/list`` + +### mark - Tag task as done +Nano marks a task in the task list as done + +Syntax: +``/mark `` + + +### unmark - Tag task as undone + +Nano marks a task in the task list as not done. + +Syntax: +``/unmark `` + + +### delete - Delete a Task + +Nano deletes a task from your task list. + +Syntax: +``delete `` + +### find - Look for a task + +Nano will look for the tasks containing a keyword and display them to you. + +Syntax: + +``/find `` + +### help - Displays all commands + +Nano reminds you of all his features and their syntax + +Syntax: +``/help`` + +### exit - Nano goes to sleep + +Nano enters into sleeping mode. + +Syntax: + +``/exit`` -``` -expected output -```