From 29a97dbbb1d6e356fb6c6c0ae98f1bef02b3b4f5 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sun, 21 Jan 2024 22:18:36 +0800 Subject: [PATCH 01/54] Add Kowalski Class --- src/main/java/Kowalski.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/Kowalski.java diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java new file mode 100644 index 000000000..8526e5c82 --- /dev/null +++ b/src/main/java/Kowalski.java @@ -0,0 +1,6 @@ +public class Kowalski { + public static void main(String[] args){ + System.out.println("Hello, I'm Kowalski! Reporting for duty! \n" + + "What can I do for you today, Skipper?" ); + } +} From 79d34510a4ee694d3b894646d33773d0d785badb Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 30 Jan 2024 22:38:09 +0800 Subject: [PATCH 02/54] Add Echo Functionality --- src/main/java/Kowalski.java | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index 8526e5c82..7d6703472 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -1,6 +1,27 @@ +import java.util.Scanner; + public class Kowalski { public static void main(String[] args){ - System.out.println("Hello, I'm Kowalski! Reporting for duty! \n" + - "What can I do for you today, Skipper?" ); + String dividingline = "____________________________________________________________"; + System.out.println(dividingline); + System.out.println("Hello, I'm Kowalski!" + + "What can I do for you?" ); + System.out.println(dividingline); + + String userInput; + Scanner in = new Scanner(System.in); + + while (true){ + userInput = in.nextLine(); + System.out.println(dividingline); + if (userInput.equals("bye")) { + System.out.println("Bye. Hope to see you again soon!"); + System.out.println(dividingline); + break; + } + System.out.println(userInput); + System.out.println(dividingline); + + } } } From 8a51274e677d25eed218b6044da62cb9fcf14aa8 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 30 Jan 2024 23:55:58 +0800 Subject: [PATCH 03/54] Add functionality to list and add tasks --- src/main/java/Kowalski.java | 38 ++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index 7d6703472..e1dabca79 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -2,26 +2,42 @@ public class Kowalski { public static void main(String[] args){ - String dividingline = "____________________________________________________________"; - System.out.println(dividingline); - System.out.println("Hello, I'm Kowalski!" + + String[] currentTasks = new String[100]; + String dividingLine = "____________________________________________________________"; + String userInput; + int counter = 0; + + // Introduction to User + System.out.println(dividingLine); + System.out.println("Hello, I'm Kowalski!\n" + "What can I do for you?" ); - System.out.println(dividingline); + System.out.println(dividingLine); - String userInput; + // Turn on scanner Scanner in = new Scanner(System.in); + //Continuous loop until break statement while (true){ - userInput = in.nextLine(); - System.out.println(dividingline); + //User Inputs + userInput = ((in.nextLine()).trim()).toLowerCase(); + System.out.println(dividingLine); + + //Cases for the userInput if (userInput.equals("bye")) { System.out.println("Bye. Hope to see you again soon!"); - System.out.println(dividingline); + System.out.println(dividingLine); break; + } else if (userInput.equals("list")){ + for (int i = 1; i < counter+1;i++){ + System.out.println(i + ". " + currentTasks[i-1]); + } + System.out.println(dividingLine); + } else { + System.out.println("added: " + userInput); + currentTasks[counter] = userInput; + counter++; + System.out.println(dividingLine); } - System.out.println(userInput); - System.out.println(dividingline); - } } } From 72d11f6ad07788e2cce1dbd7f041838c91aa8384 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 31 Jan 2024 01:07:27 +0800 Subject: [PATCH 04/54] Add mark as done functionality --- src/main/java/Kowalski.java | 36 +++++++++++++++++++++++++++++++++--- src/main/java/Task.java | 20 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index e1dabca79..50c921a73 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -2,7 +2,7 @@ public class Kowalski { public static void main(String[] args){ - String[] currentTasks = new String[100]; + Task[] currentTasks = new Task[100]; String dividingLine = "____________________________________________________________"; String userInput; int counter = 0; @@ -29,12 +29,42 @@ public static void main(String[] args){ break; } else if (userInput.equals("list")){ for (int i = 1; i < counter+1;i++){ - System.out.println(i + ". " + currentTasks[i-1]); + System.out.println(i + ".[" + currentTasks[i-1].getStatusIcon() +"] " + currentTasks[i-1].description); } System.out.println(dividingLine); + } else if (userInput.contains("unmark")) { + int unmarkPosition = userInput.indexOf("k"); + String taskNumberString = (userInput.substring(unmarkPosition+1)).trim(); + int taskNumber = Integer.parseInt(taskNumberString); + + //Checking for valid task number + if (taskNumber-1 <= counter){ + currentTasks[taskNumber-1].removeDone(); + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + currentTasks[taskNumber-1].description); + System.out.println(dividingLine); + } else { + break; + } + + } else if (userInput.contains("mark")){ + int markPosition = userInput.indexOf("k"); + String taskNumberString = (userInput.substring(markPosition+1)).trim(); + int taskNumber = Integer.parseInt(taskNumberString); + + //Checking for valid task number + if (taskNumber-1 <= counter){ + currentTasks[taskNumber-1].setDone(); + System.out.println("Nice! I've marked this task as done:"); + System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + currentTasks[taskNumber-1].description); + System.out.println(dividingLine); + } else { + break; + } + } else { System.out.println("added: " + userInput); - currentTasks[counter] = userInput; + currentTasks[counter] = new Task(userInput); counter++; System.out.println(dividingLine); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..295cda6bc --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,20 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X + } + + public void removeDone(){ + this.isDone = false; + } + public void setDone(){ + this.isDone = true; + } +} From 25ed6a7b6074781058ee04c2c8b1cd11e66a8461 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 6 Feb 2024 23:43:18 +0800 Subject: [PATCH 05/54] Update code layout to follow Java coding standard --- src/main/java/Kowalski.java | 13 ++++++++----- src/main/java/Task.java | 6 +++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index 50c921a73..96187a59e 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -29,7 +29,8 @@ public static void main(String[] args){ break; } else if (userInput.equals("list")){ for (int i = 1; i < counter+1;i++){ - System.out.println(i + ".[" + currentTasks[i-1].getStatusIcon() +"] " + currentTasks[i-1].description); + System.out.println(i + ".[" + currentTasks[i-1].getStatusIcon() +"] " + + currentTasks[i-1].description); } System.out.println(dividingLine); } else if (userInput.contains("unmark")) { @@ -39,9 +40,10 @@ public static void main(String[] args){ //Checking for valid task number if (taskNumber-1 <= counter){ - currentTasks[taskNumber-1].removeDone(); + currentTasks[taskNumber-1].markAsNotDone(); System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + currentTasks[taskNumber-1].description); + System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + + currentTasks[taskNumber-1].description); System.out.println(dividingLine); } else { break; @@ -54,9 +56,10 @@ public static void main(String[] args){ //Checking for valid task number if (taskNumber-1 <= counter){ - currentTasks[taskNumber-1].setDone(); + currentTasks[taskNumber-1].markAsDone(); System.out.println("Nice! I've marked this task as done:"); - System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + currentTasks[taskNumber-1].description); + System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " + + currentTasks[taskNumber-1].description); System.out.println(dividingLine); } else { break; diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 295cda6bc..a9ece8126 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -11,10 +11,10 @@ public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } - public void removeDone(){ - this.isDone = false; + public void markAsNotDone(){ + this.isDone = false; } - public void setDone(){ + public void markAsDone(){ this.isDone = true; } } From 99c3382bdc448e833b9426641fb74c9b70cce1e2 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 7 Feb 2024 00:53:10 +0800 Subject: [PATCH 06/54] Update functionality for Task class --- src/main/java/Task.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index a9ece8126..c003c13d8 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,6 +7,10 @@ public Task(String description) { this.isDone = false; } + public String getDescription() { + return description; + } + public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } @@ -17,4 +21,9 @@ public void markAsNotDone(){ public void markAsDone(){ this.isDone = true; } + + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + getDescription(); + } } From 125183c7b1255a15426e239bf3290462958f04ca Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 7 Feb 2024 00:54:09 +0800 Subject: [PATCH 07/54] Add Todo, Deadline, Event Class --- src/main/java/Deadline.java | 14 ++++++++++++++ src/main/java/Event.java | 18 ++++++++++++++++++ src/main/java/Todo.java | 9 +++++++++ 3 files changed, 41 insertions(+) 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..e4e4b232c --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task { + + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..2cd9f10a6 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,18 @@ +public class Event extends Task { + protected String startDayAndTime; + protected String endDayAndTime; + + public Event (String description, String startDayAndTime, String endDayAndTime) { + super(description); + this.startDayAndTime = startDayAndTime; + this.endDayAndTime = endDayAndTime; + } + @Override + public String getDescription(){ + return description + " (from: " + startDayAndTime + " to: " + endDayAndTime; + } + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + startDayAndTime + " to: " + endDayAndTime + ")"; + } +} diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..0233c0ad7 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,9 @@ +public class Todo extends Task { + public Todo(String description){ + super(description); + } + @Override + public String toString() { + return "[T]" + super.toString(); + } +} From 985febcabd128da008d288b4eda1746d21cd89c7 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 8 Feb 2024 12:25:32 +0800 Subject: [PATCH 08/54] Add level-4 functionalities --- src/main/java/Event.java | 5 +- src/main/java/Kowalski.java | 224 ++++++++++++++++++++++++++---------- src/main/java/Task.java | 2 + src/main/java/Todo.java | 2 + 4 files changed, 167 insertions(+), 66 deletions(-) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 2cd9f10a6..4cde4e44f 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -7,10 +7,7 @@ public Event (String description, String startDayAndTime, String endDayAndTime) this.startDayAndTime = startDayAndTime; this.endDayAndTime = endDayAndTime; } - @Override - public String getDescription(){ - return description + " (from: " + startDayAndTime + " to: " + endDayAndTime; - } + @Override public String toString() { return "[E]" + super.toString() + " (from: " + startDayAndTime + " to: " + endDayAndTime + ")"; diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index 96187a59e..0ee26310b 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -1,76 +1,176 @@ import java.util.Scanner; +import java.util.ArrayList; +import java.util.List; + public class Kowalski { - public static void main(String[] args){ - Task[] currentTasks = new Task[100]; - String dividingLine = "____________________________________________________________"; - String userInput; - int counter = 0; + private static final String DIVIDING_LINE = "____________________________________________________________"; + + public static List currentTask = new ArrayList<>(); + public static Scanner in = new Scanner (System.in); + + /** + * Prints out the message introducing the functionalities of Kowalski Bot + * + */ + public static void printIntro(){ // Introduction to User - System.out.println(dividingLine); - System.out.println("Hello, I'm Kowalski!\n" + - "What can I do for you?" ); - System.out.println(dividingLine); - - // Turn on scanner - Scanner in = new Scanner(System.in); - - //Continuous loop until break statement - while (true){ - //User Inputs - userInput = ((in.nextLine()).trim()).toLowerCase(); - System.out.println(dividingLine); - - //Cases for the userInput - if (userInput.equals("bye")) { - System.out.println("Bye. Hope to see you again soon!"); - System.out.println(dividingLine); - break; - } else if (userInput.equals("list")){ - for (int i = 1; i < counter+1;i++){ - System.out.println(i + ".[" + currentTasks[i-1].getStatusIcon() +"] " - + currentTasks[i-1].description); - } - System.out.println(dividingLine); - } else if (userInput.contains("unmark")) { - int unmarkPosition = userInput.indexOf("k"); - String taskNumberString = (userInput.substring(unmarkPosition+1)).trim(); - int taskNumber = Integer.parseInt(taskNumberString); - - //Checking for valid task number - if (taskNumber-1 <= counter){ - currentTasks[taskNumber-1].markAsNotDone(); - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " - + currentTasks[taskNumber-1].description); - System.out.println(dividingLine); - } else { - break; + System.out.println(DIVIDING_LINE); + System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" + System.lineSeparator() + + "What can I do for you today?" ); + System.out.println(DIVIDING_LINE); + } + + /** + * Used to process the different variations of the users inputs + * + * @param userInput : String which the user inputs + * @return String which is in lowercase and clear of any unnecessary whitespace + */ + public static String processInput(String userInput){ + return (userInput.trim()).toLowerCase(); + } + + public static void printCurrentTaskMessage(int number){ + switch (number){ + case 0: + System.out.println("Now you have 0 tasks in the list."); + break; + case 1: + System.out.println("Now you have 1 task in the list."); + break; + default: + System.out.println("Now you have " + number + " tasks in the list."); + } + } + + public static void parseUserCommand(String UserCommand){ + + int taskNumber; + int lastTaskIndex = currentTask.size() - 1; + String remainingCommand; + + switch (UserCommand){ + case "bye": + break; + + case "list": + for (int i = 1; i <= currentTask.size(); i++){ + System.out.println(i + "." + currentTask.get(i-1)); } + System.out.println(DIVIDING_LINE); + break; + + case "unmark": + taskNumber = in.nextInt(); + + if(taskNumber >= 0 || taskNumber < lastTaskIndex ){ + currentTask.get(taskNumber - 1).markAsNotDone(); + System.out.println( "Nice! I've marked this task as done:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + } + System.out.println(DIVIDING_LINE); + break; + + case "mark": + taskNumber = in.nextInt(); + + if(taskNumber >= 0 || taskNumber < lastTaskIndex ){ + currentTask.get(taskNumber - 1).markAsDone(); + System.out.println( "Nice! I've marked this task as done:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + } + System.out.println(DIVIDING_LINE); + break; - } else if (userInput.contains("mark")){ - int markPosition = userInput.indexOf("k"); - String taskNumberString = (userInput.substring(markPosition+1)).trim(); - int taskNumber = Integer.parseInt(taskNumberString); - - //Checking for valid task number - if (taskNumber-1 <= counter){ - currentTasks[taskNumber-1].markAsDone(); - System.out.println("Nice! I've marked this task as done:"); - System.out.println(" [" + currentTasks[taskNumber-1].getStatusIcon() +"] " - + currentTasks[taskNumber-1].description); - System.out.println(dividingLine); - } else { - break; + case "todo": + String toDoDetails = in.nextLine(); + + Task newToDoTask = new Todo(toDoDetails.trim()); + currentTask.add(newToDoTask); + lastTaskIndex = currentTask.size() - 1; + + System.out.println("Got it. I've added this task:"); + System.out.println(" " + currentTask.get( lastTaskIndex)); + printCurrentTaskMessage(currentTask.size()); + System.out.println(DIVIDING_LINE); + break; + + case "deadline": + //Processing + String deadlineDetails = in.nextLine(); + + if (deadlineDetails.contains("/by")) { + String[] deadlineArray = deadlineDetails.split("/by"); + for (int i = 0; i < deadlineArray.length; i++) { + deadlineArray[i] = deadlineArray[i].trim(); } + Task newDeadlineTask = new Deadline(deadlineArray[0], deadlineArray[1]); + currentTask.add(newDeadlineTask); + lastTaskIndex = currentTask.size() - 1; + + System.out.println("Got it. I've added this task:"); + System.out.println(" " + currentTask.get( lastTaskIndex)); + printCurrentTaskMessage(currentTask.size()); + System.out.println(DIVIDING_LINE); + } else { + System.out.println("Something wrong with the input! Please try again!"); + } + break; + + case "event": + String eventDetails = in.nextLine(); + if ((eventDetails.contains("/from")) && (eventDetails.contains("/to"))) { + String[] eventArray = eventDetails.split("/from"); + String eventInformation = eventArray[0].trim(); + String [] fromAndTo = eventArray[1].split("/to"); + String eventFrom = fromAndTo[0].trim(); + String eventTo = fromAndTo[1].trim(); + + Task newEventTask = new Event(eventInformation, eventFrom, eventTo); + currentTask.add(newEventTask); + lastTaskIndex = currentTask.size() - 1; + + System.out.println("Got it. I've added this task:"); + System.out.println(" " + currentTask.get(lastTaskIndex)); + printCurrentTaskMessage(currentTask.size()); + System.out.println(DIVIDING_LINE); } else { - System.out.println("added: " + userInput); - currentTasks[counter] = new Task(userInput); - counter++; - System.out.println(dividingLine); + System.out.println("Something wrong with the input! Please try again!"); } + break; + + + default: + remainingCommand = in.nextLine(); + Task newTask = new Task(UserCommand + remainingCommand); + currentTask.add(newTask); + System.out.println("added: " + UserCommand + remainingCommand); + System.out.println(DIVIDING_LINE); + break; + } + } + + /** + * Prints out the message to end conversation with the user + * + */ + public static void printEndConversation(){ + System.out.println("Bye Skipper! Hope to serve you again for your next mission!"); + System.out.println(DIVIDING_LINE); + } + + public static void main(String[] args){ + printIntro(); + String userCommand = processInput(in.next()); + + while (!(userCommand.equals("bye"))){ + parseUserCommand(processInput(userCommand)); + userCommand = in.next(); } + + printEndConversation(); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c003c13d8..86c5ee114 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -16,9 +16,11 @@ public String getStatusIcon() { } public void markAsNotDone(){ + this.isDone = false; } public void markAsDone(){ + this.isDone = true; } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 0233c0ad7..7f7d46a5f 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,7 +1,9 @@ public class Todo extends Task { + public Todo(String description){ super(description); } + @Override public String toString() { return "[T]" + super.toString(); From 7aad7dd27adb9891125d702640acd4ac9f0c4839 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 8 Feb 2024 15:44:01 +0800 Subject: [PATCH 09/54] Update code layout to follow coding standard --- src/main/java/Task.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 86c5ee114..00b3a4eea 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,6 +12,7 @@ public String getDescription() { } public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X } From 0c822223012237c2912c21f3d6ecc5f0f8f931f8 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 15 Feb 2024 02:33:25 +0800 Subject: [PATCH 10/54] Add Kowalski Exception Class --- src/main/java/KowalskiException.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/KowalskiException.java diff --git a/src/main/java/KowalskiException.java b/src/main/java/KowalskiException.java new file mode 100644 index 000000000..56a97420b --- /dev/null +++ b/src/main/java/KowalskiException.java @@ -0,0 +1,2 @@ +public class KowalskiException extends Exception{ +} From 9fcbffbfc3f50f08607ddfe51c63bd9f089ee358 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 15 Feb 2024 02:33:50 +0800 Subject: [PATCH 11/54] Add IndexOutOfBoundsException for mark and unmark --- src/main/java/Kowalski.java | 39 ++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index 0ee26310b..e70f906c8 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -45,10 +45,16 @@ public static void printCurrentTaskMessage(int number){ } } - public static void parseUserCommand(String UserCommand){ + public static void printCurrentTaskItems(){ + for (int i = 1; i <= currentTask.size(); i++){ + System.out.println(i + "." + currentTask.get(i-1)); + } + } + + public static void parseUserCommand(String UserCommand) { int taskNumber; - int lastTaskIndex = currentTask.size() - 1; + int lastTaskIndex; String remainingCommand; switch (UserCommand){ @@ -56,19 +62,20 @@ public static void parseUserCommand(String UserCommand){ break; case "list": - for (int i = 1; i <= currentTask.size(); i++){ - System.out.println(i + "." + currentTask.get(i-1)); - } + + printCurrentTaskItems(); System.out.println(DIVIDING_LINE); break; case "unmark": taskNumber = in.nextInt(); - if(taskNumber >= 0 || taskNumber < lastTaskIndex ){ + try{ currentTask.get(taskNumber - 1).markAsNotDone(); - System.out.println( "Nice! I've marked this task as done:"); + System.out.println( "C'mon Skipper, you're much better than that! I've marked this task as undone:"); System.out.println(" " + currentTask.get(taskNumber - 1)); + } catch (IndexOutOfBoundsException e) { + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); } System.out.println(DIVIDING_LINE); break; @@ -76,10 +83,12 @@ public static void parseUserCommand(String UserCommand){ case "mark": taskNumber = in.nextInt(); - if(taskNumber >= 0 || taskNumber < lastTaskIndex ){ + try{ currentTask.get(taskNumber - 1).markAsDone(); - System.out.println( "Nice! I've marked this task as done:"); + System.out.println( "Way to go Skipper! I've marked this task as done:"); System.out.println(" " + currentTask.get(taskNumber - 1)); + } catch (IndexOutOfBoundsException e) { + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); } System.out.println(DIVIDING_LINE); break; @@ -91,7 +100,7 @@ public static void parseUserCommand(String UserCommand){ currentTask.add(newToDoTask); lastTaskIndex = currentTask.size() - 1; - System.out.println("Got it. I've added this task:"); + System.out.println("Skipper you've got this work to do:"); System.out.println(" " + currentTask.get( lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); System.out.println(DIVIDING_LINE); @@ -111,12 +120,13 @@ public static void parseUserCommand(String UserCommand){ currentTask.add(newDeadlineTask); lastTaskIndex = currentTask.size() - 1; - System.out.println("Got it. I've added this task:"); + System.out.println("Skipper, I have recorded this deadline:"); System.out.println(" " + currentTask.get( lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); System.out.println(DIVIDING_LINE); } else { - System.out.println("Something wrong with the input! Please try again!"); + System.out.println("Skipper your inputs are wrong! Don't be sorry, be better!"); + //throw new KowalskiException(); } break; @@ -133,12 +143,13 @@ public static void parseUserCommand(String UserCommand){ currentTask.add(newEventTask); lastTaskIndex = currentTask.size() - 1; - System.out.println("Got it. I've added this task:"); + System.out.println("Skipper I've noted this event in my calendar:"); System.out.println(" " + currentTask.get(lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); System.out.println(DIVIDING_LINE); } else { - System.out.println("Something wrong with the input! Please try again!"); + System.out.println("Skipper your inputs are wrong! Don't be sorry, be better!"); + //throw new KowalskiException(); } break; From 0daa13c6a3db91cfc2abea0ea6ac2ceaec934f94 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 15 Feb 2024 11:23:25 +0800 Subject: [PATCH 12/54] Add error handling using KowalskiException --- src/main/java/Kowalski.java | 122 ++++++++++++++++++++++++++++-------- 1 file changed, 95 insertions(+), 27 deletions(-) diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski.java index e70f906c8..7760cfcbe 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski.java @@ -1,6 +1,7 @@ import java.util.Scanner; import java.util.ArrayList; import java.util.List; +import java.util.InputMismatchException; public class Kowalski { @@ -12,19 +13,38 @@ public class Kowalski { /** * Prints out the message introducing the functionalities of Kowalski Bot - * */ public static void printIntro(){ - // Introduction to User System.out.println(DIVIDING_LINE); System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" + System.lineSeparator() + "What can I do for you today?" ); System.out.println(DIVIDING_LINE); } + /** + * Used to check if the user has accurately input the deadline by stating the "/by" + * @param deadlineDetails : Contains the details of the deadline task + * @throws KowalskiException In the event that the input has no "/by" + */ + public static void checkDeadlineInput(String deadlineDetails) throws KowalskiException{ + if (!(deadlineDetails.contains("/by"))) { + throw new KowalskiException(); + } + } + + /** + * Used to check if the user has accurately input the deadline by stating the "/from" and "/to" + * @param eventDetails : Contains the details of the event task + * @throws KowalskiException In the event that the input has no "/from" or "/to" or both + */ + public static void checkEventInput(String eventDetails) throws KowalskiException{ + if (!((eventDetails.contains("/from")) && (eventDetails.contains("/to")))) { + throw new KowalskiException(); + } + } + /** * Used to process the different variations of the users inputs - * * @param userInput : String which the user inputs * @return String which is in lowercase and clear of any unnecessary whitespace */ @@ -32,6 +52,10 @@ public static String processInput(String userInput){ return (userInput.trim()).toLowerCase(); } + /** + * Prints out an accurate message for the number of tasks in the list. + * @param number : represents the total current task count + */ public static void printCurrentTaskMessage(int number){ switch (number){ case 0: @@ -45,12 +69,50 @@ public static void printCurrentTaskMessage(int number){ } } + /** + * Used in the "list" command to print all the Current Tasks in the proper format + */ public static void printCurrentTaskItems(){ for (int i = 1; i <= currentTask.size(); i++){ System.out.println(i + "." + currentTask.get(i-1)); } } + /** + * Cleans up the user input and forms new Deadline Task + * @param deadlineDetails : User input for details of the deadline task + * @return new deadline task created + */ + private static Task getNewDeadlineTask(String deadlineDetails) { + String[] deadlineArray = deadlineDetails.split("/by"); + for (int i = 0; i < deadlineArray.length; i++) { + deadlineArray[i] = deadlineArray[i].trim(); + } + + + return new Deadline(deadlineArray[0], deadlineArray[1]); + } + + + /** + * Cleans up the user input and forms new event Task + * @param eventDetails : User input for details of the event task + * @return new event task created + */ + private static Task getNewEventTask(String eventDetails) { + String[] eventArray = eventDetails.split("/from"); + String eventInformation = eventArray[0].trim(); + String [] fromAndTo = eventArray[1].split("/to"); + String eventFrom = fromAndTo[0].trim(); + String eventTo = fromAndTo[1].trim(); + + return new Event(eventInformation, eventFrom, eventTo); + } + + /** + * Processes all the inputs from the user and categorises the User Commands + * @param UserCommand: The first word input by the user + */ public static void parseUserCommand(String UserCommand) { int taskNumber; @@ -68,7 +130,12 @@ public static void parseUserCommand(String UserCommand) { break; case "unmark": - taskNumber = in.nextInt(); + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + break; + } try{ currentTask.get(taskNumber - 1).markAsNotDone(); @@ -81,7 +148,12 @@ public static void parseUserCommand(String UserCommand) { break; case "mark": - taskNumber = in.nextInt(); + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + break; + } try{ currentTask.get(taskNumber - 1).markAsDone(); @@ -107,49 +179,46 @@ public static void parseUserCommand(String UserCommand) { break; case "deadline": - //Processing String deadlineDetails = in.nextLine(); - if (deadlineDetails.contains("/by")) { - String[] deadlineArray = deadlineDetails.split("/by"); - for (int i = 0; i < deadlineArray.length; i++) { - deadlineArray[i] = deadlineArray[i].trim(); - } + try{ + checkDeadlineInput(deadlineDetails); - Task newDeadlineTask = new Deadline(deadlineArray[0], deadlineArray[1]); + //Adding the new deadline task into currentTask List after processing and cleaning inputs + Task newDeadlineTask = getNewDeadlineTask(deadlineDetails); currentTask.add(newDeadlineTask); lastTaskIndex = currentTask.size() - 1; + //Printing the appropriate information for the User System.out.println("Skipper, I have recorded this deadline:"); System.out.println(" " + currentTask.get( lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); System.out.println(DIVIDING_LINE); - } else { - System.out.println("Skipper your inputs are wrong! Don't be sorry, be better!"); - //throw new KowalskiException(); + } catch (KowalskiException e){ + System.out.println("Skipper your inputs are wrong! Try again!"); + System.out.println(DIVIDING_LINE); } break; case "event": String eventDetails = in.nextLine(); - if ((eventDetails.contains("/from")) && (eventDetails.contains("/to"))) { - String[] eventArray = eventDetails.split("/from"); - String eventInformation = eventArray[0].trim(); - String [] fromAndTo = eventArray[1].split("/to"); - String eventFrom = fromAndTo[0].trim(); - String eventTo = fromAndTo[1].trim(); - - Task newEventTask = new Event(eventInformation, eventFrom, eventTo); + + try{ + checkEventInput(eventDetails); + + //Adding the new event task into currentTask List after processing and cleaning inputs + Task newEventTask = getNewEventTask(eventDetails); currentTask.add(newEventTask); lastTaskIndex = currentTask.size() - 1; + //Printing the appropriate information for the User System.out.println("Skipper I've noted this event in my calendar:"); System.out.println(" " + currentTask.get(lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); System.out.println(DIVIDING_LINE); - } else { - System.out.println("Skipper your inputs are wrong! Don't be sorry, be better!"); - //throw new KowalskiException(); + } catch (KowalskiException e) { + System.out.println("Skipper your inputs are wrong! Try again!"); + System.out.println(DIVIDING_LINE); } break; @@ -166,7 +235,6 @@ public static void parseUserCommand(String UserCommand) { /** * Prints out the message to end conversation with the user - * */ public static void printEndConversation(){ System.out.println("Bye Skipper! Hope to serve you again for your next mission!"); From 49a8435969423a84b8503fec330001b835ff5e5c Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 20 Feb 2024 21:33:27 +0800 Subject: [PATCH 13/54] Add packaging for java files --- src/main/java/{ => Kowalski}/Duke.java | 2 ++ src/main/java/{ => Kowalski}/Kowalski.java | 16 ++++++++++++---- .../commands}/KowalskiException.java | 2 ++ src/main/java/{ => Kowalski/tasks}/Deadline.java | 2 ++ src/main/java/{ => Kowalski/tasks}/Event.java | 2 ++ src/main/java/{ => Kowalski/tasks}/Task.java | 2 ++ src/main/java/{ => Kowalski/tasks}/Todo.java | 2 ++ 7 files changed, 24 insertions(+), 4 deletions(-) rename src/main/java/{ => Kowalski}/Duke.java (94%) rename src/main/java/{ => Kowalski}/Kowalski.java (95%) rename src/main/java/{ => Kowalski/commands}/KowalskiException.java (65%) rename src/main/java/{ => Kowalski/tasks}/Deadline.java (92%) rename src/main/java/{ => Kowalski/tasks}/Event.java (95%) rename src/main/java/{ => Kowalski/tasks}/Task.java (96%) rename src/main/java/{ => Kowalski/tasks}/Todo.java (88%) diff --git a/src/main/java/Duke.java b/src/main/java/Kowalski/Duke.java similarity index 94% rename from src/main/java/Duke.java rename to src/main/java/Kowalski/Duke.java index 5d313334c..3757fc655 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Kowalski/Duke.java @@ -1,3 +1,5 @@ +package Kowalski; + public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" diff --git a/src/main/java/Kowalski.java b/src/main/java/Kowalski/Kowalski.java similarity index 95% rename from src/main/java/Kowalski.java rename to src/main/java/Kowalski/Kowalski.java index 7760cfcbe..cc02bc324 100644 --- a/src/main/java/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -1,3 +1,11 @@ +package Kowalski; + +import Kowalski.commands.KowalskiException; +import Kowalski.tasks.Deadline; +import Kowalski.tasks.Event; +import Kowalski.tasks.Task; +import Kowalski.tasks.Todo; + import java.util.Scanner; import java.util.ArrayList; import java.util.List; @@ -54,10 +62,10 @@ public static String processInput(String userInput){ /** * Prints out an accurate message for the number of tasks in the list. - * @param number : represents the total current task count + * @param numberOfTasks : represents the total current task count */ - public static void printCurrentTaskMessage(int number){ - switch (number){ + public static void printCurrentTaskMessage(int numberOfTasks){ + switch (numberOfTasks){ case 0: System.out.println("Now you have 0 tasks in the list."); break; @@ -65,7 +73,7 @@ public static void printCurrentTaskMessage(int number){ System.out.println("Now you have 1 task in the list."); break; default: - System.out.println("Now you have " + number + " tasks in the list."); + System.out.println("Now you have " + numberOfTasks + " tasks in the list."); } } diff --git a/src/main/java/KowalskiException.java b/src/main/java/Kowalski/commands/KowalskiException.java similarity index 65% rename from src/main/java/KowalskiException.java rename to src/main/java/Kowalski/commands/KowalskiException.java index 56a97420b..17ee5f1f5 100644 --- a/src/main/java/KowalskiException.java +++ b/src/main/java/Kowalski/commands/KowalskiException.java @@ -1,2 +1,4 @@ +package Kowalski.commands; + public class KowalskiException extends Exception{ } diff --git a/src/main/java/Deadline.java b/src/main/java/Kowalski/tasks/Deadline.java similarity index 92% rename from src/main/java/Deadline.java rename to src/main/java/Kowalski/tasks/Deadline.java index e4e4b232c..49ae221c1 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Kowalski/tasks/Deadline.java @@ -1,3 +1,5 @@ +package Kowalski.tasks; + public class Deadline extends Task { protected String by; diff --git a/src/main/java/Event.java b/src/main/java/Kowalski/tasks/Event.java similarity index 95% rename from src/main/java/Event.java rename to src/main/java/Kowalski/tasks/Event.java index 4cde4e44f..251d6d576 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Kowalski/tasks/Event.java @@ -1,3 +1,5 @@ +package Kowalski.tasks; + public class Event extends Task { protected String startDayAndTime; protected String endDayAndTime; diff --git a/src/main/java/Task.java b/src/main/java/Kowalski/tasks/Task.java similarity index 96% rename from src/main/java/Task.java rename to src/main/java/Kowalski/tasks/Task.java index 00b3a4eea..a0d315bc4 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Kowalski/tasks/Task.java @@ -1,3 +1,5 @@ +package Kowalski.tasks; + public class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/Todo.java b/src/main/java/Kowalski/tasks/Todo.java similarity index 88% rename from src/main/java/Todo.java rename to src/main/java/Kowalski/tasks/Todo.java index 7f7d46a5f..4ef5ea3e9 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Kowalski/tasks/Todo.java @@ -1,3 +1,5 @@ +package Kowalski.tasks; + public class Todo extends Task { public Todo(String description){ From fac8ce4903e2c3990081bbf30c3d44a893cab775 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 20 Feb 2024 21:36:41 +0800 Subject: [PATCH 14/54] Remove original Duke java file --- src/main/java/Kowalski/Duke.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/main/java/Kowalski/Duke.java diff --git a/src/main/java/Kowalski/Duke.java b/src/main/java/Kowalski/Duke.java deleted file mode 100644 index 3757fc655..000000000 --- a/src/main/java/Kowalski/Duke.java +++ /dev/null @@ -1,12 +0,0 @@ -package Kowalski; - -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From 5c1ccf87331264bc451ff02ec4d1c3d3cf7ff6f7 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 20 Feb 2024 23:51:35 +0800 Subject: [PATCH 15/54] Add support for deleting tasks --- src/main/java/Kowalski/Kowalski.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index cc02bc324..dfdb6b47e 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -132,11 +132,29 @@ public static void parseUserCommand(String UserCommand) { break; case "list": - printCurrentTaskItems(); System.out.println(DIVIDING_LINE); break; + case "delete": + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + break; + } + + try { + System.out.println( "Damn Skipper, you're got some courage removing this task:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + printCurrentTaskMessage(currentTask.size()-1); + currentTask.remove(taskNumber-1); + } catch (IndexOutOfBoundsException e){ + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + } + System.out.println(DIVIDING_LINE); + break; + case "unmark": try { taskNumber = in.nextInt(); From f81854a1c4fabbcfeff0d691ec77a00a9a0255e7 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 21 Feb 2024 00:38:16 +0800 Subject: [PATCH 16/54] Add help commands for user --- src/main/java/Kowalski/Kowalski.java | 39 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index cc02bc324..48505394d 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -24,11 +24,27 @@ public class Kowalski { */ public static void printIntro(){ System.out.println(DIVIDING_LINE); - System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" + System.lineSeparator() + - "What can I do for you today?" ); + System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" + + System.lineSeparator() ); + printHelpCommands(); + System.out.println(System.lineSeparator() + +"What can I do for you today?" ); + System.out.println(DIVIDING_LINE); } + public static void printHelpCommands(){ + System.out.println("Enter commands, and I will echo them back to you, as well as add them to your list."); + System.out.println("Type 'list' to see your to-do list."); + System.out.println("Type 'mark' to mark a task as done."); + System.out.println("Type 'unmark' to mark a task as not done."); + System.out.println("Type 'todo ' to add a task to the list."); + System.out.println("Type 'deadline /by ' to add a task with a deadline to the list."); + System.out.println("Type 'event /from /to ' to add an event to the list."); + System.out.println("Type 'delete ' to delete a task from your list."); + System.out.println("Type 'bye' to end the conversation."); + } + /** * Used to check if the user has accurately input the deadline by stating the "/by" * @param deadlineDetails : Contains the details of the deadline task @@ -142,6 +158,7 @@ public static void parseUserCommand(String UserCommand) { taskNumber = in.nextInt(); } catch (InputMismatchException e) { System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + System.out.println(DIVIDING_LINE); break; } @@ -151,8 +168,10 @@ public static void parseUserCommand(String UserCommand) { System.out.println(" " + currentTask.get(taskNumber - 1)); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + System.out.println(DIVIDING_LINE); + break; } - System.out.println(DIVIDING_LINE); + //System.out.println(DIVIDING_LINE); break; case "mark": @@ -160,6 +179,7 @@ public static void parseUserCommand(String UserCommand) { taskNumber = in.nextInt(); } catch (InputMismatchException e) { System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + System.out.println(DIVIDING_LINE); break; } @@ -169,6 +189,8 @@ public static void parseUserCommand(String UserCommand) { System.out.println(" " + currentTask.get(taskNumber - 1)); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + System.out.println(DIVIDING_LINE); + break; } System.out.println(DIVIDING_LINE); break; @@ -232,10 +254,13 @@ public static void parseUserCommand(String UserCommand) { default: - remainingCommand = in.nextLine(); - Task newTask = new Task(UserCommand + remainingCommand); - currentTask.add(newTask); - System.out.println("added: " + UserCommand + remainingCommand); + System.out.println("Skipper pull up your socks!" + + System.lineSeparator()); + printHelpCommands(); +// remainingCommand = in.nextLine(); +// Task newTask = new Task(UserCommand + remainingCommand); +// currentTask.add(newTask); +// System.out.println("added: " + UserCommand + remainingCommand); System.out.println(DIVIDING_LINE); break; } From 623ce3a0e176eb2621bdc328e11f022027ece647 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 21 Feb 2024 00:39:04 +0800 Subject: [PATCH 17/54] Remove default task adder code --- src/main/java/Kowalski/Kowalski.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 48505394d..4b6408dbd 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -257,10 +257,6 @@ public static void parseUserCommand(String UserCommand) { System.out.println("Skipper pull up your socks!" + System.lineSeparator()); printHelpCommands(); -// remainingCommand = in.nextLine(); -// Task newTask = new Task(UserCommand + remainingCommand); -// currentTask.add(newTask); -// System.out.println("added: " + UserCommand + remainingCommand); System.out.println(DIVIDING_LINE); break; } From 431ab81cc20b9f876cceb300545c408de451f8ee Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 01:35:34 +0800 Subject: [PATCH 18/54] Add textFileInputString methods for all tasks --- src/main/java/Kowalski/tasks/Deadline.java | 18 +++++++++++++++--- src/main/java/Kowalski/tasks/Event.java | 17 +++++++++++++++++ src/main/java/Kowalski/tasks/Task.java | 6 ++++++ src/main/java/Kowalski/tasks/Todo.java | 8 ++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/main/java/Kowalski/tasks/Deadline.java b/src/main/java/Kowalski/tasks/Deadline.java index 49ae221c1..7dbc79733 100644 --- a/src/main/java/Kowalski/tasks/Deadline.java +++ b/src/main/java/Kowalski/tasks/Deadline.java @@ -2,15 +2,27 @@ public class Deadline extends Task { - protected String by; + protected String deadline; public Deadline(String description, String by) { super(description); - this.by = by; + this.deadline = by; + } + + public String getDeadline() { + return deadline; + } + + @Override + public String textFileInputString(){ + return String.format("D | %s | %s | %s", + isDone? "X" : "0", + getDescription().trim(), + getDeadline()); } @Override public String toString() { - return "[D]" + super.toString() + " (by: " + by + ")"; + return "[D]" + super.toString() + " (by: " + deadline + ")"; } } diff --git a/src/main/java/Kowalski/tasks/Event.java b/src/main/java/Kowalski/tasks/Event.java index 251d6d576..6c46500bb 100644 --- a/src/main/java/Kowalski/tasks/Event.java +++ b/src/main/java/Kowalski/tasks/Event.java @@ -10,6 +10,23 @@ public Event (String description, String startDayAndTime, String endDayAndTime) this.endDayAndTime = endDayAndTime; } + public String getStartDayAndTime() { + return startDayAndTime; + } + + public String getEndDayAndTime() { + return endDayAndTime; + } + + @Override + public String textFileInputString(){ + return String.format("E | %s | %s | %s - %s", + isDone? "X" : "0", + getDescription().trim(), + getStartDayAndTime(), + getEndDayAndTime()); + } + @Override public String toString() { return "[E]" + super.toString() + " (from: " + startDayAndTime + " to: " + endDayAndTime + ")"; diff --git a/src/main/java/Kowalski/tasks/Task.java b/src/main/java/Kowalski/tasks/Task.java index a0d315bc4..36c60ae28 100644 --- a/src/main/java/Kowalski/tasks/Task.java +++ b/src/main/java/Kowalski/tasks/Task.java @@ -27,6 +27,12 @@ public void markAsDone(){ this.isDone = true; } + public String textFileInputString() { + return String.format("%s | %s", + isDone? "X" : "0", + getDescription().trim()); + } + @Override public String toString() { return "[" + getStatusIcon() + "] " + getDescription(); diff --git a/src/main/java/Kowalski/tasks/Todo.java b/src/main/java/Kowalski/tasks/Todo.java index 4ef5ea3e9..3d4519840 100644 --- a/src/main/java/Kowalski/tasks/Todo.java +++ b/src/main/java/Kowalski/tasks/Todo.java @@ -6,6 +6,14 @@ public Todo(String description){ super(description); } + + @Override + public String textFileInputString(){ + return String.format("T | %s | %s", + isDone? "X" : "0", + getDescription().trim()); + } + @Override public String toString() { return "[T]" + super.toString(); From 723935298fcb03a67df4474271738f99945a1b33 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 14:35:36 +0800 Subject: [PATCH 19/54] Add basic write functionalities --- src/main/java/Kowalski/Kowalski.java | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 4b6408dbd..74f653ae4 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -6,6 +6,12 @@ import Kowalski.tasks.Task; import Kowalski.tasks.Todo; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Scanner; import java.util.ArrayList; import java.util.List; @@ -15,6 +21,9 @@ public class Kowalski { private static final String DIVIDING_LINE = "____________________________________________________________"; + private static final String TEXT_FILE_FOLDER = "data"; + private static final String TEXT_FILE_DIRECTORY = "/Kowalski.txt"; + public static List currentTask = new ArrayList<>(); public static Scanner in = new Scanner (System.in); @@ -38,7 +47,7 @@ public static void printHelpCommands(){ System.out.println("Type 'list' to see your to-do list."); System.out.println("Type 'mark' to mark a task as done."); System.out.println("Type 'unmark' to mark a task as not done."); - System.out.println("Type 'todo ' to add a task to the list."); + System.out.println("Type 'todo ' to add a task to the list."); System.out.println("Type 'deadline /by ' to add a task with a deadline to the list."); System.out.println("Type 'event /from /to ' to add an event to the list."); System.out.println("Type 'delete ' to delete a task from your list."); @@ -166,6 +175,7 @@ public static void parseUserCommand(String UserCommand) { currentTask.get(taskNumber - 1).markAsNotDone(); System.out.println( "C'mon Skipper, you're much better than that! I've marked this task as undone:"); System.out.println(" " + currentTask.get(taskNumber - 1)); + writeText(); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); System.out.println(DIVIDING_LINE); @@ -187,6 +197,7 @@ public static void parseUserCommand(String UserCommand) { currentTask.get(taskNumber - 1).markAsDone(); System.out.println( "Way to go Skipper! I've marked this task as done:"); System.out.println(" " + currentTask.get(taskNumber - 1)); + writeText(); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); System.out.println(DIVIDING_LINE); @@ -205,6 +216,7 @@ public static void parseUserCommand(String UserCommand) { System.out.println("Skipper you've got this work to do:"); System.out.println(" " + currentTask.get( lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); + writeText(); System.out.println(DIVIDING_LINE); break; @@ -223,6 +235,7 @@ public static void parseUserCommand(String UserCommand) { System.out.println("Skipper, I have recorded this deadline:"); System.out.println(" " + currentTask.get( lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); + writeText(); System.out.println(DIVIDING_LINE); } catch (KowalskiException e){ System.out.println("Skipper your inputs are wrong! Try again!"); @@ -245,6 +258,7 @@ public static void parseUserCommand(String UserCommand) { System.out.println("Skipper I've noted this event in my calendar:"); System.out.println(" " + currentTask.get(lastTaskIndex)); printCurrentTaskMessage(currentTask.size()); + writeText(); System.out.println(DIVIDING_LINE); } catch (KowalskiException e) { System.out.println("Skipper your inputs are wrong! Try again!"); @@ -262,6 +276,32 @@ public static void parseUserCommand(String UserCommand) { } } + public static void writeText(){ + List lines = new ArrayList<>(); + for (Task task:currentTask){ + lines.add(task.textFileInputString()); + } + System.out.println("Kowalski analysing..."); + writeTextFile(lines); + } + + public static void writeTextFile(List lines) { + try { + Path parentPath = Paths.get(TEXT_FILE_FOLDER); + createTextFileFolder(parentPath); + + FileWriter writer = new FileWriter(TEXT_FILE_FOLDER+TEXT_FILE_DIRECTORY); + for (String line : lines) { + writer.write(line + "\n"); + + } + System.out.println("Kowalski Analysis Complete!"); + writer.close(); + } catch (IOException e){ + System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); + } + } + /** * Prints out the message to end conversation with the user */ From 0f62b00f8037908538608f8b6f1ac010729d2d7f Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 14:37:02 +0800 Subject: [PATCH 20/54] Add folder creation code for text file --- src/main/java/Kowalski/Kowalski.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 74f653ae4..adf8f68da 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -301,6 +301,17 @@ public static void writeTextFile(List lines) { System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); } } + + public static void createTextFileFolder(Path parentPath ) throws IOException{ + try { + Files.createDirectories(parentPath); + } catch (FileAlreadyExistsException ignored){ + //Ignore this error if file exists + } catch (IOException e){ + System.out.println("Skipper, I am unable to create the data directory for you!"); + throw e; + } + } /** * Prints out the message to end conversation with the user From e6e5d36dc8bebee365d87a25cf2aa15a64dd0357 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 16:20:30 +0800 Subject: [PATCH 21/54] Add saving and retrieving functionality to project --- data/Kowalski.txt | 3 ++ src/main/java/Kowalski/Kowalski.java | 75 ++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 data/Kowalski.txt diff --git a/data/Kowalski.txt b/data/Kowalski.txt new file mode 100644 index 000000000..76b612f78 --- /dev/null +++ b/data/Kowalski.txt @@ -0,0 +1,3 @@ +E | X | go for swimming | Sat 6pm - 7pm +T | X | code 2113 +D | 0 | ST Assignment | tmr diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index adf8f68da..ce6bafb01 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -6,6 +6,8 @@ import Kowalski.tasks.Task; import Kowalski.tasks.Todo; +import java.io.BufferedReader; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; @@ -23,6 +25,7 @@ public class Kowalski { private static final String DIVIDING_LINE = "____________________________________________________________"; private static final String TEXT_FILE_FOLDER = "data"; private static final String TEXT_FILE_DIRECTORY = "/Kowalski.txt"; + private static final String FULL_FILE_PATH = TEXT_FILE_FOLDER+TEXT_FILE_DIRECTORY; public static List currentTask = new ArrayList<>(); @@ -276,12 +279,73 @@ public static void parseUserCommand(String UserCommand) { } } + public static void restoreTaskList(String fileInput){ + String [] inputArray = fileInput.split("\\s*\\|\\s*"); + switch (inputArray[0].trim()){ + case "T": + Task newToDoTask = new Todo(inputArray[2].trim()); + if (inputArray[1].trim().equals("X")) { + newToDoTask.markAsDone(); + } else { + newToDoTask.markAsNotDone(); + } + currentTask.add(newToDoTask); + break; + + case "D": + Task newDeadlineTask = new Deadline(inputArray[2].trim(), inputArray[3].trim()); + if (inputArray[1].trim().equals("X")) { + newDeadlineTask.markAsDone(); + } else { + newDeadlineTask.markAsNotDone(); + } + currentTask.add(newDeadlineTask); + break; + case "E": + String [] fromAndTo = inputArray[3].trim().split(" - "); + Task newEventTask = new Event(inputArray[2].trim(), fromAndTo[0].trim(), fromAndTo[1].trim()); + if (inputArray[1].trim().equals("X")) { + newEventTask.markAsDone(); + } else { + newEventTask.markAsNotDone(); + } + currentTask.add(newEventTask); + break; + default: + System.out.println("Kowalski Analysis Error: Text File Corrupted!"); + break; + } + } + + public static void readTextFile() throws IOException{ + try { + createTextFileFolder(Paths.get(TEXT_FILE_FOLDER)); + Path filePath = Paths.get(FULL_FILE_PATH); + if (!Files.exists(filePath)){ + System.out.println("Creating new Kowalski.txt file"); + Files.createFile(filePath); + } + FileReader fileReader = new FileReader(TEXT_FILE_FOLDER + TEXT_FILE_DIRECTORY); + BufferedReader line = new BufferedReader(fileReader); + System.out.println("Kowalski retrieving previous data..."); + while (line.ready()) { + restoreTaskList(line.readLine()); + } + System.out.println("Kowalski Data Retrieval Complete!"); + System.out.println(DIVIDING_LINE); + } catch (IOException e){ + System.out.println("Kowalski Data Retrieval Failed!"); + throw e; + } + } + public static void writeText(){ List lines = new ArrayList<>(); for (Task task:currentTask){ lines.add(task.textFileInputString()); } - System.out.println("Kowalski analysing..."); + System.out.println(DIVIDING_LINE); + System.out.println("Kowalski analysing inputs..."); writeTextFile(lines); } @@ -290,18 +354,18 @@ public static void writeTextFile(List lines) { Path parentPath = Paths.get(TEXT_FILE_FOLDER); createTextFileFolder(parentPath); - FileWriter writer = new FileWriter(TEXT_FILE_FOLDER+TEXT_FILE_DIRECTORY); + FileWriter writer = new FileWriter(FULL_FILE_PATH); for (String line : lines) { writer.write(line + "\n"); } - System.out.println("Kowalski Analysis Complete!"); + System.out.println("Task recorded in the Text file!"); writer.close(); } catch (IOException e){ System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); } } - + public static void createTextFileFolder(Path parentPath ) throws IOException{ try { Files.createDirectories(parentPath); @@ -321,8 +385,9 @@ public static void printEndConversation(){ System.out.println(DIVIDING_LINE); } - public static void main(String[] args){ + public static void main(String[] args) throws IOException { printIntro(); + readTextFile(); String userCommand = processInput(in.next()); while (!(userCommand.equals("bye"))){ From ac9ed1e1ae0e0c831c94c30c4ccd0710f464a186 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 16:28:13 +0800 Subject: [PATCH 22/54] Add saving functionality for delete command --- data/Kowalski.txt | 3 +-- src/main/java/Kowalski/Kowalski.java | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Kowalski.txt b/data/Kowalski.txt index 76b612f78..0528ba3ca 100644 --- a/data/Kowalski.txt +++ b/data/Kowalski.txt @@ -1,3 +1,2 @@ E | X | go for swimming | Sat 6pm - 7pm -T | X | code 2113 -D | 0 | ST Assignment | tmr +T | 0 | code 2113 diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 65e279536..a4a429fdf 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -177,6 +177,7 @@ public static void parseUserCommand(String UserCommand) { System.out.println(" " + currentTask.get(taskNumber - 1)); printCurrentTaskMessage(currentTask.size()-1); currentTask.remove(taskNumber-1); + writeText(); } catch (IndexOutOfBoundsException e){ System.out.println("Invalid Task Number! Skipper stop acting like Private!"); } From 2d77b06560ba6221ae097ae1741753353b186f86 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 16:49:59 +0800 Subject: [PATCH 23/54] Update documentation for functions in Kowalski bot --- src/main/java/Kowalski/Kowalski.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index a4a429fdf..207dfea3f 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -298,6 +298,11 @@ public static void parseUserCommand(String UserCommand) { } } + /** + * This function takes in the lines of code from the Kowalski.txt and processes them to + * list out all the previous tasks which we had saved. + * @param fileInput: String containing each line of input from Kowalski.txt + */ public static void restoreTaskList(String fileInput){ String [] inputArray = fileInput.split("\\s*\\|\\s*"); switch (inputArray[0].trim()){ @@ -336,6 +341,10 @@ public static void restoreTaskList(String fileInput){ } } + /** + * Read text file accesses Kowalski.txt and calls the restoreTaskList function + * @throws IOException when unable to get the Kowalski file or has any input errors + */ public static void readTextFile() throws IOException{ try { createTextFileFolder(Paths.get(TEXT_FILE_FOLDER)); @@ -358,6 +367,10 @@ public static void readTextFile() throws IOException{ } } + /** + * Function which is called to generate an arrayList "lines" which updates according to the users' inputs. + * Calls the writeTextFile function to update Kowalski.txt + */ public static void writeText(){ List lines = new ArrayList<>(); for (Task task:currentTask){ @@ -368,6 +381,10 @@ public static void writeText(){ writeTextFile(lines); } + /** + * Accesses the Kowalski.txt and updates it in the correct format. + * @param lines: Arraylist containing the processed current tasks in the CurrentTask + */ public static void writeTextFile(List lines) { try { Path parentPath = Paths.get(TEXT_FILE_FOLDER); @@ -385,6 +402,11 @@ public static void writeTextFile(List lines) { } } + /** + * Used to create the data folder to store the Kowalski.txt file + * @param parentPath: Path file containing the path we intend to make Kowalski.txt in + * @throws IOException whenever the input for the path or creation of the directory is improper + */ public static void createTextFileFolder(Path parentPath ) throws IOException{ try { Files.createDirectories(parentPath); From f47b008689b4963afbd6b1d456834d004a1cbc1c Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Sat, 24 Feb 2024 17:09:49 +0800 Subject: [PATCH 24/54] Jar commit --- src/main/java/META-INF/MANIFEST.MF | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..6d10568b7 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Kowalski.Kowalski + From 27734849217edae9581e9e0accd49b9734449015 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 19:59:15 +0800 Subject: [PATCH 25/54] Add new Ui class to hold all the print messages --- src/main/java/Kowalski/UI/Ui.java | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/Kowalski/UI/Ui.java diff --git a/src/main/java/Kowalski/UI/Ui.java b/src/main/java/Kowalski/UI/Ui.java new file mode 100644 index 000000000..9d80ea8e7 --- /dev/null +++ b/src/main/java/Kowalski/UI/Ui.java @@ -0,0 +1,32 @@ +package Kowalski.UI; + +public class Ui { + private static final String DIVIDING_LINE = "____________________________________________________________"; + + /** + * Prints out the message introducing the functionalities of Kowalski Bot + */ + public static void printIntro(){ + System.out.println(DIVIDING_LINE); + System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" + + System.lineSeparator() ); + printHelpCommands(); + System.out.println(System.lineSeparator() + +"What can I do for you today?" ); + + System.out.println(DIVIDING_LINE); + } + + public static void printHelpCommands(){ + System.out.println("Enter commands, and I will echo them back to you, as well as add them to your list."); + System.out.println("Type 'list' to see your to-do list."); + System.out.println("Type 'mark' to mark a task as done."); + System.out.println("Type 'unmark' to mark a task as not done."); + System.out.println("Type 'todo ' to add a task to the list."); + System.out.println("Type 'deadline /by ' to add a task with a deadline to the list."); + System.out.println("Type 'event /from /to ' to add an event to the list."); + System.out.println("Type 'delete ' to delete a task from your list."); + System.out.println("Type 'bye' to end the conversation."); + } + +} From d957c3e9400a8ce8b2646f324870e2592542220e Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 20:16:23 +0800 Subject: [PATCH 26/54] Update Ui Class with more printing functions --- src/main/java/Kowalski/UI/Ui.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/Kowalski/UI/Ui.java b/src/main/java/Kowalski/UI/Ui.java index 9d80ea8e7..f548e132f 100644 --- a/src/main/java/Kowalski/UI/Ui.java +++ b/src/main/java/Kowalski/UI/Ui.java @@ -29,4 +29,24 @@ public static void printHelpCommands(){ System.out.println("Type 'bye' to end the conversation."); } + public static void printDivider(){ + System.out.println(DIVIDING_LINE); + } + + /** + * Prints out an accurate message for the number of tasks in the list. + * @param numberOfTasks : represents the total current task count + */ + public static void printCurrentTaskMessage(int numberOfTasks){ + switch (numberOfTasks){ + case 0: + System.out.println("Now you have 0 tasks in the list."); + break; + case 1: + System.out.println("Now you have 1 task in the list."); + break; + default: + System.out.println("Now you have " + numberOfTasks + " tasks in the list."); + } + } } From 42cb726482c81db2f2a61b3cd0082c2397b1966c Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 20:17:25 +0800 Subject: [PATCH 27/54] Refactor Kowalski.java to incorporate functions from Ui Class --- src/main/java/Kowalski/Kowalski.java | 85 ++++++++-------------------- 1 file changed, 23 insertions(+), 62 deletions(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 207dfea3f..d7789f3e1 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -1,5 +1,6 @@ package Kowalski; +import Kowalski.UI.Ui; import Kowalski.commands.KowalskiException; import Kowalski.tasks.Deadline; import Kowalski.tasks.Event; @@ -22,7 +23,6 @@ public class Kowalski { - private static final String DIVIDING_LINE = "____________________________________________________________"; private static final String TEXT_FILE_FOLDER = "data"; private static final String TEXT_FILE_DIRECTORY = "/Kowalski.txt"; private static final String FULL_FILE_PATH = TEXT_FILE_FOLDER+TEXT_FILE_DIRECTORY; @@ -31,31 +31,10 @@ public class Kowalski { public static List currentTask = new ArrayList<>(); public static Scanner in = new Scanner (System.in); - /** - * Prints out the message introducing the functionalities of Kowalski Bot - */ public static void printIntro(){ - System.out.println(DIVIDING_LINE); - System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" - + System.lineSeparator() ); - printHelpCommands(); - System.out.println(System.lineSeparator() - +"What can I do for you today?" ); - - System.out.println(DIVIDING_LINE); + Ui.printIntro(); } - public static void printHelpCommands(){ - System.out.println("Enter commands, and I will echo them back to you, as well as add them to your list."); - System.out.println("Type 'list' to see your to-do list."); - System.out.println("Type 'mark' to mark a task as done."); - System.out.println("Type 'unmark' to mark a task as not done."); - System.out.println("Type 'todo ' to add a task to the list."); - System.out.println("Type 'deadline /by ' to add a task with a deadline to the list."); - System.out.println("Type 'event /from /to ' to add an event to the list."); - System.out.println("Type 'delete ' to delete a task from your list."); - System.out.println("Type 'bye' to end the conversation."); - } /** * Used to check if the user has accurately input the deadline by stating the "/by" @@ -88,22 +67,6 @@ public static String processInput(String userInput){ return (userInput.trim()).toLowerCase(); } - /** - * Prints out an accurate message for the number of tasks in the list. - * @param numberOfTasks : represents the total current task count - */ - public static void printCurrentTaskMessage(int numberOfTasks){ - switch (numberOfTasks){ - case 0: - System.out.println("Now you have 0 tasks in the list."); - break; - case 1: - System.out.println("Now you have 1 task in the list."); - break; - default: - System.out.println("Now you have " + numberOfTasks + " tasks in the list."); - } - } /** * Used in the "list" command to print all the Current Tasks in the proper format @@ -153,7 +116,6 @@ public static void parseUserCommand(String UserCommand) { int taskNumber; int lastTaskIndex; - String remainingCommand; switch (UserCommand){ case "bye": @@ -161,7 +123,7 @@ public static void parseUserCommand(String UserCommand) { case "list": printCurrentTaskItems(); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; case "delete": @@ -175,13 +137,13 @@ public static void parseUserCommand(String UserCommand) { try { System.out.println( "Damn Skipper, you're got some courage removing this task:"); System.out.println(" " + currentTask.get(taskNumber - 1)); - printCurrentTaskMessage(currentTask.size()-1); + Ui.printCurrentTaskMessage(currentTask.size()-1); currentTask.remove(taskNumber-1); writeText(); } catch (IndexOutOfBoundsException e){ System.out.println("Invalid Task Number! Skipper stop acting like Private!"); } - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; case "unmark": @@ -189,7 +151,7 @@ public static void parseUserCommand(String UserCommand) { taskNumber = in.nextInt(); } catch (InputMismatchException e) { System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; } @@ -200,10 +162,9 @@ public static void parseUserCommand(String UserCommand) { writeText(); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; } - //System.out.println(DIVIDING_LINE); break; case "mark": @@ -211,7 +172,7 @@ public static void parseUserCommand(String UserCommand) { taskNumber = in.nextInt(); } catch (InputMismatchException e) { System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; } @@ -222,10 +183,10 @@ public static void parseUserCommand(String UserCommand) { writeText(); } catch (IndexOutOfBoundsException e) { System.out.println("Invalid Task Number! Skipper stop acting like Private!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; } - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; case "todo": @@ -237,9 +198,9 @@ public static void parseUserCommand(String UserCommand) { System.out.println("Skipper you've got this work to do:"); System.out.println(" " + currentTask.get( lastTaskIndex)); - printCurrentTaskMessage(currentTask.size()); + Ui.printCurrentTaskMessage(currentTask.size()); writeText(); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); break; case "deadline": @@ -256,12 +217,12 @@ public static void parseUserCommand(String UserCommand) { //Printing the appropriate information for the User System.out.println("Skipper, I have recorded this deadline:"); System.out.println(" " + currentTask.get( lastTaskIndex)); - printCurrentTaskMessage(currentTask.size()); + Ui.printCurrentTaskMessage(currentTask.size()); writeText(); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } catch (KowalskiException e){ System.out.println("Skipper your inputs are wrong! Try again!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } break; @@ -279,12 +240,12 @@ public static void parseUserCommand(String UserCommand) { //Printing the appropriate information for the User System.out.println("Skipper I've noted this event in my calendar:"); System.out.println(" " + currentTask.get(lastTaskIndex)); - printCurrentTaskMessage(currentTask.size()); + Ui.printCurrentTaskMessage(currentTask.size()); writeText(); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } catch (KowalskiException e) { System.out.println("Skipper your inputs are wrong! Try again!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } break; @@ -292,8 +253,8 @@ public static void parseUserCommand(String UserCommand) { default: System.out.println("Skipper pull up your socks!" + System.lineSeparator()); - printHelpCommands(); - System.out.println(DIVIDING_LINE); + Ui.printHelpCommands(); + Ui.printDivider(); break; } } @@ -360,7 +321,7 @@ public static void readTextFile() throws IOException{ restoreTaskList(line.readLine()); } System.out.println("Kowalski Data Retrieval Complete!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } catch (IOException e){ System.out.println("Kowalski Data Retrieval Failed!"); throw e; @@ -376,7 +337,7 @@ public static void writeText(){ for (Task task:currentTask){ lines.add(task.textFileInputString()); } - System.out.println(DIVIDING_LINE); + Ui.printDivider(); System.out.println("Kowalski analysing inputs..."); writeTextFile(lines); } @@ -423,7 +384,7 @@ public static void createTextFileFolder(Path parentPath ) throws IOException{ */ public static void printEndConversation(){ System.out.println("Bye Skipper! Hope to serve you again for your next mission!"); - System.out.println(DIVIDING_LINE); + Ui.printDivider(); } public static void main(String[] args) throws IOException { From 8430048bdb66e6fe33228a5c63b578deacf1fc61 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 20:37:22 +0800 Subject: [PATCH 28/54] Clean up Ui class and reduce magic literals --- src/main/java/Kowalski/UI/Ui.java | 53 +++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/src/main/java/Kowalski/UI/Ui.java b/src/main/java/Kowalski/UI/Ui.java index f548e132f..c7b0bfd90 100644 --- a/src/main/java/Kowalski/UI/Ui.java +++ b/src/main/java/Kowalski/UI/Ui.java @@ -2,33 +2,52 @@ public class Ui { private static final String DIVIDING_LINE = "____________________________________________________________"; + private static final String KOWALSKI_INTRODUCTION = "Welcome Skipper! I'm Kowalski, reporting for Duty!"; + private static final String KOWALSKI_STARTING_QN = "What can I do for you today?"; + private static final String KOWALSKI_ECHO = "Enter commands, and I will echo them back to you, " + + "as well as add them to your list."; + private static final String KOWALSKI_LIST_COMMAND = "Type 'list' to see your to-do list."; + private static final String KOWALSKI_MARK_COMMAND = "Type 'mark' to mark a task as done."; + private static final String KOWALSKI_UNMARK_COMMAND = "Type 'unmark' to mark a task as not done."; + private static final String KOWALSKI_TODO_TASK_COMMAND = "Type 'todo ' to add a task to the list."; + private static final String KOWALSKI_DEADLINE_TASK_COMMAND = "Type 'deadline /by ' to add a task " + + "with a deadline to the list."; + private static final String KOWALSKI_EVENT_TASK_COMMAND = "Type 'event /from /to ' to add an " + + "event to the list."; + private static final String KOWALSKI_DELETE_TASK_COMMAND = "Type 'delete ' to delete a task from your list."; + private static final String KOWALSKI_BYE_COMMAND = "Type 'bye' to end the conversation."; + private static final String ZERO_TASK_MESSAGE = "Now you have 0 tasks in the list."; + private static final String ONE_TASK_MESSAGE = "Now you have 1 task in the list."; /** * Prints out the message introducing the functionalities of Kowalski Bot */ public static void printIntro(){ System.out.println(DIVIDING_LINE); - System.out.println("Welcome Skipper! I'm Kowalski, reporting for Duty!" - + System.lineSeparator() ); + System.out.println(KOWALSKI_INTRODUCTION + System.lineSeparator()); printHelpCommands(); - System.out.println(System.lineSeparator() - +"What can I do for you today?" ); - - System.out.println(DIVIDING_LINE); + System.out.println(System.lineSeparator() + KOWALSKI_STARTING_QN ); + printDivider(); } + /** + * Prints out a list of commands to guide the user to accurately use the Kowalski Bot + */ public static void printHelpCommands(){ - System.out.println("Enter commands, and I will echo them back to you, as well as add them to your list."); - System.out.println("Type 'list' to see your to-do list."); - System.out.println("Type 'mark' to mark a task as done."); - System.out.println("Type 'unmark' to mark a task as not done."); - System.out.println("Type 'todo ' to add a task to the list."); - System.out.println("Type 'deadline /by ' to add a task with a deadline to the list."); - System.out.println("Type 'event /from /to ' to add an event to the list."); - System.out.println("Type 'delete ' to delete a task from your list."); - System.out.println("Type 'bye' to end the conversation."); + System.out.println(KOWALSKI_ECHO); + System.out.println(KOWALSKI_LIST_COMMAND); + System.out.println(KOWALSKI_MARK_COMMAND); + System.out.println(KOWALSKI_UNMARK_COMMAND); + System.out.println(KOWALSKI_TODO_TASK_COMMAND); + System.out.println(KOWALSKI_DEADLINE_TASK_COMMAND); + System.out.println(KOWALSKI_EVENT_TASK_COMMAND); + System.out.println(KOWALSKI_DELETE_TASK_COMMAND); + System.out.println(KOWALSKI_BYE_COMMAND); } + /** + * Prints a dividing line between statements for added clarity + */ public static void printDivider(){ System.out.println(DIVIDING_LINE); } @@ -40,10 +59,10 @@ public static void printDivider(){ public static void printCurrentTaskMessage(int numberOfTasks){ switch (numberOfTasks){ case 0: - System.out.println("Now you have 0 tasks in the list."); + System.out.println(ZERO_TASK_MESSAGE); break; case 1: - System.out.println("Now you have 1 task in the list."); + System.out.println(ONE_TASK_MESSAGE); break; default: System.out.println("Now you have " + numberOfTasks + " tasks in the list."); From f8440dfd4af159904b43afad04690099bfaa9c99 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 21:39:03 +0800 Subject: [PATCH 29/54] Add printEndConversation method to Ui class --- src/main/java/Kowalski/UI/Ui.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/Kowalski/UI/Ui.java b/src/main/java/Kowalski/UI/Ui.java index c7b0bfd90..06ce8a91d 100644 --- a/src/main/java/Kowalski/UI/Ui.java +++ b/src/main/java/Kowalski/UI/Ui.java @@ -18,6 +18,7 @@ public class Ui { private static final String KOWALSKI_BYE_COMMAND = "Type 'bye' to end the conversation."; private static final String ZERO_TASK_MESSAGE = "Now you have 0 tasks in the list."; private static final String ONE_TASK_MESSAGE = "Now you have 1 task in the list."; + private static final String KOWALSKI_BYE_MESSAGE = "Bye Skipper! Hope to serve you again for your next mission!"; /** * Prints out the message introducing the functionalities of Kowalski Bot @@ -68,4 +69,12 @@ public static void printCurrentTaskMessage(int numberOfTasks){ System.out.println("Now you have " + numberOfTasks + " tasks in the list."); } } + + /** + * Prints out the message to end conversation with the user + */ + public static void printEndConversation(){ + System.out.println(KOWALSKI_BYE_MESSAGE); + printDivider(); + } } From 4f0fddc5621125c53137ddc839b4dfb6f4688a73 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Tue, 5 Mar 2024 21:43:35 +0800 Subject: [PATCH 30/54] Refactor Kowalski Class printIntro and printEndConversation methods --- src/main/java/Kowalski/Kowalski.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index d7789f3e1..599cbf4d9 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -24,16 +24,12 @@ public class Kowalski { private static final String TEXT_FILE_FOLDER = "data"; - private static final String TEXT_FILE_DIRECTORY = "/Kowalski.txt"; - private static final String FULL_FILE_PATH = TEXT_FILE_FOLDER+TEXT_FILE_DIRECTORY; + private static final String FULL_FILE_PATH = "data/Kowalski.txt"; public static List currentTask = new ArrayList<>(); public static Scanner in = new Scanner (System.in); - public static void printIntro(){ - Ui.printIntro(); - } /** @@ -314,7 +310,7 @@ public static void readTextFile() throws IOException{ System.out.println("Creating new Kowalski.txt file"); Files.createFile(filePath); } - FileReader fileReader = new FileReader(TEXT_FILE_FOLDER + TEXT_FILE_DIRECTORY); + FileReader fileReader = new FileReader(FULL_FILE_PATH); BufferedReader line = new BufferedReader(fileReader); System.out.println("Kowalski retrieving previous data..."); while (line.ready()) { @@ -388,7 +384,7 @@ public static void printEndConversation(){ } public static void main(String[] args) throws IOException { - printIntro(); + Ui.printIntro(); readTextFile(); String userCommand = processInput(in.next()); @@ -397,6 +393,6 @@ public static void main(String[] args) throws IOException { userCommand = in.next(); } - printEndConversation(); + Ui.printEndConversation(); } } From 9fd02bfb9117e3d5b38fafdd8fa61759056e8f8e Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 00:02:11 +0800 Subject: [PATCH 31/54] Add Storage, Parser, and TaskList Class for more OOP --- src/main/java/Kowalski/Parser.java | 215 +++++++++++++++++++++++++++ src/main/java/Kowalski/Storage.java | 148 ++++++++++++++++++ src/main/java/Kowalski/TaskList.java | 30 ++++ 3 files changed, 393 insertions(+) create mode 100644 src/main/java/Kowalski/Parser.java create mode 100644 src/main/java/Kowalski/Storage.java create mode 100644 src/main/java/Kowalski/TaskList.java diff --git a/src/main/java/Kowalski/Parser.java b/src/main/java/Kowalski/Parser.java new file mode 100644 index 000000000..615c70699 --- /dev/null +++ b/src/main/java/Kowalski/Parser.java @@ -0,0 +1,215 @@ +package Kowalski; + +import Kowalski.UI.Ui; +import Kowalski.commands.KowalskiException; +import Kowalski.tasks.Deadline; +import Kowalski.tasks.Event; +import Kowalski.tasks.Task; +import Kowalski.tasks.Todo; + +import java.util.InputMismatchException; +import java.util.List; +import java.util.Scanner; + +public class Parser { + + /** + * Used to check if the user has accurately input the deadline by stating the "/by" + * @param deadlineDetails : Contains the details of the deadline task + * @throws KowalskiException In the event that the input has no "/by" + */ + public static void checkDeadlineInput(String deadlineDetails) throws KowalskiException{ + if (!(deadlineDetails.contains("/by"))) { + throw new KowalskiException(); + } + } + + /** + * Used to check if the user has accurately input the deadline by stating the "/from" and "/to" + * @param eventDetails : Contains the details of the event task + * @throws KowalskiException In the event that the input has no "/from" or "/to" or both + */ + public static void checkEventInput(String eventDetails) throws KowalskiException{ + if (!((eventDetails.contains("/from")) && (eventDetails.contains("/to")))) { + throw new KowalskiException(); + } + } + + /** + * Cleans up the user input and forms new Deadline Task + * @param deadlineDetails : User input for details of the deadline task + * @return new deadline task created + */ + private static Task getNewDeadlineTask(String deadlineDetails) { + String[] deadlineArray = deadlineDetails.split("/by"); + for (int i = 0; i < deadlineArray.length; i++) { + deadlineArray[i] = deadlineArray[i].trim(); + } + + + return new Deadline(deadlineArray[0], deadlineArray[1]); + } + + /** + * Cleans up the user input and forms new event Task + * @param eventDetails : User input for details of the event task + * @return new event task created + */ + private static Task getNewEventTask(String eventDetails) { + String[] eventArray = eventDetails.split("/from"); + String eventInformation = eventArray[0].trim(); + String [] fromAndTo = eventArray[1].split("/to"); + String eventFrom = fromAndTo[0].trim(); + String eventTo = fromAndTo[1].trim(); + + return new Event(eventInformation, eventFrom, eventTo); + } + + public static void parseUserCommand(String UserCommand, List currentTask, Scanner in) { + + int taskNumber; + int lastTaskIndex; + + switch (UserCommand){ + case "bye": + break; + + case "list": + TaskList.printCurrentTaskItems(); + Ui.printDivider(); + break; + + case "delete": + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + break; + } + + try { + System.out.println( "Damn Skipper, you're got some courage removing this task:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + Ui.printCurrentTaskMessage(currentTask.size()-1); + currentTask.remove(taskNumber-1); + Storage.writeText(currentTask); + } catch (IndexOutOfBoundsException e){ + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + } + Ui.printDivider(); + break; + + case "unmark": + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + Ui.printDivider(); + break; + } + + try{ + currentTask.get(taskNumber - 1).markAsNotDone(); + System.out.println( "C'mon Skipper, you're much better than that! I've marked this task as undone:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + Storage.writeText(currentTask); + } catch (IndexOutOfBoundsException e) { + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + Ui.printDivider(); + break; + } + break; + + case "mark": + try { + taskNumber = in.nextInt(); + } catch (InputMismatchException e) { + System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + Ui.printDivider(); + break; + } + + try{ + currentTask.get(taskNumber - 1).markAsDone(); + System.out.println( "Way to go Skipper! I've marked this task as done:"); + System.out.println(" " + currentTask.get(taskNumber - 1)); + Storage.writeText(currentTask); + } catch (IndexOutOfBoundsException e) { + System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + Ui.printDivider(); + break; + } + Ui.printDivider(); + break; + + case "todo": + String toDoDetails = in.nextLine(); + + Task newToDoTask = new Todo(toDoDetails.trim()); + currentTask.add(newToDoTask); + lastTaskIndex = currentTask.size() - 1; + + System.out.println("Skipper you've got this work to do:"); + System.out.println(" " + currentTask.get( lastTaskIndex)); + Ui.printCurrentTaskMessage(currentTask.size()); + Storage.writeText(currentTask); + Ui.printDivider(); + break; + + case "deadline": + String deadlineDetails = in.nextLine(); + + try{ + checkDeadlineInput(deadlineDetails); + + //Adding the new deadline task into currentTask List after processing and cleaning inputs + Task newDeadlineTask = getNewDeadlineTask(deadlineDetails); + currentTask.add(newDeadlineTask); + lastTaskIndex = currentTask.size() - 1; + + //Printing the appropriate information for the User + System.out.println("Skipper, I have recorded this deadline:"); + System.out.println(" " + currentTask.get( lastTaskIndex)); + Ui.printCurrentTaskMessage(currentTask.size()); + Storage.writeText(currentTask); + Ui.printDivider(); + } catch (KowalskiException e){ + System.out.println("Skipper your inputs are wrong! Try again!"); + Ui.printDivider(); + } + break; + + case "event": + String eventDetails = in.nextLine(); + + try{ + checkEventInput(eventDetails); + + //Adding the new event task into currentTask List after processing and cleaning inputs + Task newEventTask = getNewEventTask(eventDetails); + currentTask.add(newEventTask); + lastTaskIndex = currentTask.size() - 1; + + //Printing the appropriate information for the User + System.out.println("Skipper I've noted this event in my calendar:"); + System.out.println(" " + currentTask.get(lastTaskIndex)); + Ui.printCurrentTaskMessage(currentTask.size()); + Storage.writeText(currentTask); + Ui.printDivider(); + } catch (KowalskiException e) { + System.out.println("Skipper your inputs are wrong! Try again!"); + Ui.printDivider(); + } + break; + + + default: + System.out.println("Skipper pull up your socks!" + + System.lineSeparator()); + Ui.printHelpCommands(); + Ui.printDivider(); + break; + } + } + +} diff --git a/src/main/java/Kowalski/Storage.java b/src/main/java/Kowalski/Storage.java new file mode 100644 index 000000000..f87f5ac6f --- /dev/null +++ b/src/main/java/Kowalski/Storage.java @@ -0,0 +1,148 @@ +package Kowalski; + +import Kowalski.UI.Ui; +import Kowalski.tasks.Deadline; +import Kowalski.tasks.Event; +import Kowalski.tasks.Task; +import Kowalski.tasks.Todo; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class Storage { + private static final String TEXT_FILE_FOLDER = "data"; + private static final String FULL_FILE_PATH = "data/Kowalski.txt"; + private static final String TODO = "T"; + private static final String DEADLINE = "D"; + private static final String EVENT = "E"; + private static final String COMPLETED_TASK_CROSS = "X"; + private static final String FROM_AND_TO_SEPARATOR = " - "; + + /** + * This function takes in the lines of code from the Kowalski.txt and processes them to + * list out all the previous tasks which we had saved. + * @param fileInput: String containing each line of input from Kowalski.txt + */ + public static void restoreTaskList(String fileInput, List currentTask){ + String [] inputArray = fileInput.split("\\s*\\|\\s*"); + switch (inputArray[0].trim()){ + case TODO: + Task newToDoTask = new Todo(inputArray[2].trim()); + if (inputArray[1].trim().equals(COMPLETED_TASK_CROSS)) { + newToDoTask.markAsDone(); + } else { + newToDoTask.markAsNotDone(); + } + currentTask.add(newToDoTask); + break; + + case DEADLINE: + Task newDeadlineTask = new Deadline(inputArray[2].trim(), inputArray[3].trim()); + if (inputArray[1].trim().equals(COMPLETED_TASK_CROSS)) { + newDeadlineTask.markAsDone(); + } else { + newDeadlineTask.markAsNotDone(); + } + currentTask.add(newDeadlineTask); + break; + case EVENT: + String [] fromAndTo = inputArray[3].trim().split(FROM_AND_TO_SEPARATOR); + Task newEventTask = new Event(inputArray[2].trim(), fromAndTo[0].trim(), fromAndTo[1].trim()); + if (inputArray[1].trim().equals(COMPLETED_TASK_CROSS)) { + newEventTask.markAsDone(); + } else { + newEventTask.markAsNotDone(); + } + currentTask.add(newEventTask); + break; + default: + System.out.println("Kowalski Analysis Error: Text File Corrupted!"); + break; + } + } + + /** + * Read text file accesses Kowalski.txt and calls the restoreTaskList function + * @throws IOException when unable to get the Kowalski file or has any input errors + */ + public static void readTextFile(List currentTask) throws IOException{ + try { + createTextFileFolder(Paths.get(TEXT_FILE_FOLDER)); + Path filePath = Paths.get(FULL_FILE_PATH); + if (!Files.exists(filePath)){ + System.out.println("Creating new Kowalski.txt file"); + Files.createFile(filePath); + } + FileReader fileReader = new FileReader(FULL_FILE_PATH); + BufferedReader line = new BufferedReader(fileReader); + System.out.println("Kowalski retrieving previous data..."); + while (line.ready()) { + restoreTaskList(line.readLine(), currentTask); + } + System.out.println("Kowalski Data Retrieval Complete!"); + Ui.printDivider(); + } catch (IOException e){ + System.out.println("Kowalski Data Retrieval Failed!"); + throw e; + } + } + + /** + * Function which is called to generate an arrayList "lines" which updates according to the users' inputs. + * Calls the writeTextFile function to update Kowalski.txt + */ + public static void writeText(List currentTask){ + List lines = new ArrayList<>(); + for (Task task:currentTask){ + lines.add(task.textFileInputString()); + } + Ui.printDivider(); + System.out.println("Kowalski analysing inputs..."); + writeTextFile(lines); + } + + /** + * Accesses the Kowalski.txt and updates it in the correct format. + * @param lines: Arraylist containing the processed current tasks in the CurrentTask + */ + public static void writeTextFile(List lines) { + try { + Path parentPath = Paths.get(TEXT_FILE_FOLDER); + createTextFileFolder(parentPath); + + FileWriter writer = new FileWriter(FULL_FILE_PATH); + for (String line : lines) { + writer.write(line + "\n"); + + } + System.out.println("Task recorded in the Text file!"); + writer.close(); + } catch (IOException e){ + System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); + } + } + + /** + * Used to create the data folder to store the Kowalski.txt file + * @param parentPath: Path file containing the path we intend to make Kowalski.txt in + * @throws IOException whenever the input for the path or creation of the directory is improper + */ + public static void createTextFileFolder(Path parentPath ) throws IOException{ + try { + Files.createDirectories(parentPath); + } catch (FileAlreadyExistsException ignored){ + //Ignore this error if file exists + } catch (IOException e){ + System.out.println("Skipper, I am unable to create the data directory for you!"); + throw e; + } + } +} diff --git a/src/main/java/Kowalski/TaskList.java b/src/main/java/Kowalski/TaskList.java new file mode 100644 index 000000000..e4dc98341 --- /dev/null +++ b/src/main/java/Kowalski/TaskList.java @@ -0,0 +1,30 @@ +package Kowalski; + +import Kowalski.tasks.Task; + +import java.util.ArrayList; +import java.util.List; + +public class TaskList { + public static List currentTask = new ArrayList<>(); + public static final int ONE = 1; + public static final String DOT = "."; + + /** + * Used to process the different variations of the users inputs + * @param userInput : String which the user inputs + * @return String which is in lowercase and clear of any unnecessary whitespace + */ + public static String processInput(String userInput){ + return (userInput.trim()).toLowerCase(); + } + + /** + * Used in the "list" command to print all the Current Tasks in the proper format + */ + public static void printCurrentTaskItems(){ + for (int i = ONE; i <= currentTask.size(); i++){ + System.out.println(i + DOT + currentTask.get(i-ONE)); + } + } +} From c844f4bbbe14e67cd61862f692af67af2f62529f Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 00:03:08 +0800 Subject: [PATCH 32/54] Refactor Kowalski Class to use OOP --- src/main/java/Kowalski/Kowalski.java | 386 +-------------------------- 1 file changed, 4 insertions(+), 382 deletions(-) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 599cbf4d9..985a36afe 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -1,398 +1,20 @@ package Kowalski; import Kowalski.UI.Ui; -import Kowalski.commands.KowalskiException; -import Kowalski.tasks.Deadline; -import Kowalski.tasks.Event; -import Kowalski.tasks.Task; -import Kowalski.tasks.Todo; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; -import java.nio.file.FileAlreadyExistsException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Scanner; -import java.util.ArrayList; -import java.util.List; -import java.util.InputMismatchException; - public class Kowalski { - - private static final String TEXT_FILE_FOLDER = "data"; - private static final String FULL_FILE_PATH = "data/Kowalski.txt"; - - - public static List currentTask = new ArrayList<>(); public static Scanner in = new Scanner (System.in); - - - /** - * Used to check if the user has accurately input the deadline by stating the "/by" - * @param deadlineDetails : Contains the details of the deadline task - * @throws KowalskiException In the event that the input has no "/by" - */ - public static void checkDeadlineInput(String deadlineDetails) throws KowalskiException{ - if (!(deadlineDetails.contains("/by"))) { - throw new KowalskiException(); - } - } - - /** - * Used to check if the user has accurately input the deadline by stating the "/from" and "/to" - * @param eventDetails : Contains the details of the event task - * @throws KowalskiException In the event that the input has no "/from" or "/to" or both - */ - public static void checkEventInput(String eventDetails) throws KowalskiException{ - if (!((eventDetails.contains("/from")) && (eventDetails.contains("/to")))) { - throw new KowalskiException(); - } - } - - /** - * Used to process the different variations of the users inputs - * @param userInput : String which the user inputs - * @return String which is in lowercase and clear of any unnecessary whitespace - */ - public static String processInput(String userInput){ - return (userInput.trim()).toLowerCase(); - } - - - /** - * Used in the "list" command to print all the Current Tasks in the proper format - */ - public static void printCurrentTaskItems(){ - for (int i = 1; i <= currentTask.size(); i++){ - System.out.println(i + "." + currentTask.get(i-1)); - } - } - - /** - * Cleans up the user input and forms new Deadline Task - * @param deadlineDetails : User input for details of the deadline task - * @return new deadline task created - */ - private static Task getNewDeadlineTask(String deadlineDetails) { - String[] deadlineArray = deadlineDetails.split("/by"); - for (int i = 0; i < deadlineArray.length; i++) { - deadlineArray[i] = deadlineArray[i].trim(); - } - - - return new Deadline(deadlineArray[0], deadlineArray[1]); - } - - - /** - * Cleans up the user input and forms new event Task - * @param eventDetails : User input for details of the event task - * @return new event task created - */ - private static Task getNewEventTask(String eventDetails) { - String[] eventArray = eventDetails.split("/from"); - String eventInformation = eventArray[0].trim(); - String [] fromAndTo = eventArray[1].split("/to"); - String eventFrom = fromAndTo[0].trim(); - String eventTo = fromAndTo[1].trim(); - - return new Event(eventInformation, eventFrom, eventTo); - } - - /** - * Processes all the inputs from the user and categorises the User Commands - * @param UserCommand: The first word input by the user - */ - public static void parseUserCommand(String UserCommand) { - - int taskNumber; - int lastTaskIndex; - - switch (UserCommand){ - case "bye": - break; - - case "list": - printCurrentTaskItems(); - Ui.printDivider(); - break; - - case "delete": - try { - taskNumber = in.nextInt(); - } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); - break; - } - - try { - System.out.println( "Damn Skipper, you're got some courage removing this task:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); - Ui.printCurrentTaskMessage(currentTask.size()-1); - currentTask.remove(taskNumber-1); - writeText(); - } catch (IndexOutOfBoundsException e){ - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); - } - Ui.printDivider(); - break; - - case "unmark": - try { - taskNumber = in.nextInt(); - } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); - Ui.printDivider(); - break; - } - - try{ - currentTask.get(taskNumber - 1).markAsNotDone(); - System.out.println( "C'mon Skipper, you're much better than that! I've marked this task as undone:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); - writeText(); - } catch (IndexOutOfBoundsException e) { - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); - Ui.printDivider(); - break; - } - break; - - case "mark": - try { - taskNumber = in.nextInt(); - } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); - Ui.printDivider(); - break; - } - - try{ - currentTask.get(taskNumber - 1).markAsDone(); - System.out.println( "Way to go Skipper! I've marked this task as done:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); - writeText(); - } catch (IndexOutOfBoundsException e) { - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); - Ui.printDivider(); - break; - } - Ui.printDivider(); - break; - - case "todo": - String toDoDetails = in.nextLine(); - - Task newToDoTask = new Todo(toDoDetails.trim()); - currentTask.add(newToDoTask); - lastTaskIndex = currentTask.size() - 1; - - System.out.println("Skipper you've got this work to do:"); - System.out.println(" " + currentTask.get( lastTaskIndex)); - Ui.printCurrentTaskMessage(currentTask.size()); - writeText(); - Ui.printDivider(); - break; - - case "deadline": - String deadlineDetails = in.nextLine(); - - try{ - checkDeadlineInput(deadlineDetails); - - //Adding the new deadline task into currentTask List after processing and cleaning inputs - Task newDeadlineTask = getNewDeadlineTask(deadlineDetails); - currentTask.add(newDeadlineTask); - lastTaskIndex = currentTask.size() - 1; - - //Printing the appropriate information for the User - System.out.println("Skipper, I have recorded this deadline:"); - System.out.println(" " + currentTask.get( lastTaskIndex)); - Ui.printCurrentTaskMessage(currentTask.size()); - writeText(); - Ui.printDivider(); - } catch (KowalskiException e){ - System.out.println("Skipper your inputs are wrong! Try again!"); - Ui.printDivider(); - } - break; - - case "event": - String eventDetails = in.nextLine(); - - try{ - checkEventInput(eventDetails); - - //Adding the new event task into currentTask List after processing and cleaning inputs - Task newEventTask = getNewEventTask(eventDetails); - currentTask.add(newEventTask); - lastTaskIndex = currentTask.size() - 1; - - //Printing the appropriate information for the User - System.out.println("Skipper I've noted this event in my calendar:"); - System.out.println(" " + currentTask.get(lastTaskIndex)); - Ui.printCurrentTaskMessage(currentTask.size()); - writeText(); - Ui.printDivider(); - } catch (KowalskiException e) { - System.out.println("Skipper your inputs are wrong! Try again!"); - Ui.printDivider(); - } - break; - - - default: - System.out.println("Skipper pull up your socks!" - + System.lineSeparator()); - Ui.printHelpCommands(); - Ui.printDivider(); - break; - } - } - - /** - * This function takes in the lines of code from the Kowalski.txt and processes them to - * list out all the previous tasks which we had saved. - * @param fileInput: String containing each line of input from Kowalski.txt - */ - public static void restoreTaskList(String fileInput){ - String [] inputArray = fileInput.split("\\s*\\|\\s*"); - switch (inputArray[0].trim()){ - case "T": - Task newToDoTask = new Todo(inputArray[2].trim()); - if (inputArray[1].trim().equals("X")) { - newToDoTask.markAsDone(); - } else { - newToDoTask.markAsNotDone(); - } - currentTask.add(newToDoTask); - break; - - case "D": - Task newDeadlineTask = new Deadline(inputArray[2].trim(), inputArray[3].trim()); - if (inputArray[1].trim().equals("X")) { - newDeadlineTask.markAsDone(); - } else { - newDeadlineTask.markAsNotDone(); - } - currentTask.add(newDeadlineTask); - break; - case "E": - String [] fromAndTo = inputArray[3].trim().split(" - "); - Task newEventTask = new Event(inputArray[2].trim(), fromAndTo[0].trim(), fromAndTo[1].trim()); - if (inputArray[1].trim().equals("X")) { - newEventTask.markAsDone(); - } else { - newEventTask.markAsNotDone(); - } - currentTask.add(newEventTask); - break; - default: - System.out.println("Kowalski Analysis Error: Text File Corrupted!"); - break; - } - } - - /** - * Read text file accesses Kowalski.txt and calls the restoreTaskList function - * @throws IOException when unable to get the Kowalski file or has any input errors - */ - public static void readTextFile() throws IOException{ - try { - createTextFileFolder(Paths.get(TEXT_FILE_FOLDER)); - Path filePath = Paths.get(FULL_FILE_PATH); - if (!Files.exists(filePath)){ - System.out.println("Creating new Kowalski.txt file"); - Files.createFile(filePath); - } - FileReader fileReader = new FileReader(FULL_FILE_PATH); - BufferedReader line = new BufferedReader(fileReader); - System.out.println("Kowalski retrieving previous data..."); - while (line.ready()) { - restoreTaskList(line.readLine()); - } - System.out.println("Kowalski Data Retrieval Complete!"); - Ui.printDivider(); - } catch (IOException e){ - System.out.println("Kowalski Data Retrieval Failed!"); - throw e; - } - } - - /** - * Function which is called to generate an arrayList "lines" which updates according to the users' inputs. - * Calls the writeTextFile function to update Kowalski.txt - */ - public static void writeText(){ - List lines = new ArrayList<>(); - for (Task task:currentTask){ - lines.add(task.textFileInputString()); - } - Ui.printDivider(); - System.out.println("Kowalski analysing inputs..."); - writeTextFile(lines); - } - - /** - * Accesses the Kowalski.txt and updates it in the correct format. - * @param lines: Arraylist containing the processed current tasks in the CurrentTask - */ - public static void writeTextFile(List lines) { - try { - Path parentPath = Paths.get(TEXT_FILE_FOLDER); - createTextFileFolder(parentPath); - - FileWriter writer = new FileWriter(FULL_FILE_PATH); - for (String line : lines) { - writer.write(line + "\n"); - - } - System.out.println("Task recorded in the Text file!"); - writer.close(); - } catch (IOException e){ - System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); - } - } - - /** - * Used to create the data folder to store the Kowalski.txt file - * @param parentPath: Path file containing the path we intend to make Kowalski.txt in - * @throws IOException whenever the input for the path or creation of the directory is improper - */ - public static void createTextFileFolder(Path parentPath ) throws IOException{ - try { - Files.createDirectories(parentPath); - } catch (FileAlreadyExistsException ignored){ - //Ignore this error if file exists - } catch (IOException e){ - System.out.println("Skipper, I am unable to create the data directory for you!"); - throw e; - } - } - - /** - * Prints out the message to end conversation with the user - */ - public static void printEndConversation(){ - System.out.println("Bye Skipper! Hope to serve you again for your next mission!"); - Ui.printDivider(); - } - public static void main(String[] args) throws IOException { Ui.printIntro(); - readTextFile(); - String userCommand = processInput(in.next()); - + Storage.readTextFile(TaskList.currentTask); + String userCommand = TaskList.processInput(in.next()); while (!(userCommand.equals("bye"))){ - parseUserCommand(processInput(userCommand)); + Parser.parseUserCommand(TaskList.processInput(userCommand), TaskList.currentTask, in); userCommand = in.next(); } - Ui.printEndConversation(); } -} +} \ No newline at end of file From 960551a727e7f089fb5598f9c69ce46671a7e0b4 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 00:04:36 +0800 Subject: [PATCH 33/54] Remove magic literals in Ui class --- src/main/java/Kowalski/UI/Ui.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/Kowalski/UI/Ui.java b/src/main/java/Kowalski/UI/Ui.java index 06ce8a91d..6092acfc5 100644 --- a/src/main/java/Kowalski/UI/Ui.java +++ b/src/main/java/Kowalski/UI/Ui.java @@ -19,7 +19,8 @@ public class Ui { private static final String ZERO_TASK_MESSAGE = "Now you have 0 tasks in the list."; private static final String ONE_TASK_MESSAGE = "Now you have 1 task in the list."; private static final String KOWALSKI_BYE_MESSAGE = "Bye Skipper! Hope to serve you again for your next mission!"; - + private static final String NOW_YOU_HAVE = "Now you have "; + private static final String TASKS_IN_THE_LIST = " tasks in the list."; /** * Prints out the message introducing the functionalities of Kowalski Bot */ @@ -66,7 +67,7 @@ public static void printCurrentTaskMessage(int numberOfTasks){ System.out.println(ONE_TASK_MESSAGE); break; default: - System.out.println("Now you have " + numberOfTasks + " tasks in the list."); + System.out.println(NOW_YOU_HAVE + numberOfTasks + TASKS_IN_THE_LIST); } } From bf338ba54b501f201db1f78c473740e803d66174 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 00:35:15 +0800 Subject: [PATCH 34/54] Remove magic literals in Storage Class --- src/main/java/Kowalski/Storage.java | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/Kowalski/Storage.java b/src/main/java/Kowalski/Storage.java index f87f5ac6f..f0c56d88a 100644 --- a/src/main/java/Kowalski/Storage.java +++ b/src/main/java/Kowalski/Storage.java @@ -25,6 +25,16 @@ public class Storage { private static final String EVENT = "E"; private static final String COMPLETED_TASK_CROSS = "X"; private static final String FROM_AND_TO_SEPARATOR = " - "; + private static final String TEXT_FILE_CORRUPTED_ERROR = "Kowalski Analysis Error: Text File Corrupted!"; + private static final String CREATE_NEW_TEXT_FILE = "Creating new Kowalski.txt file"; + private static final String RETRIEVING_PREVIOUS_DATA_MESSAGE = "Kowalski retrieving previous data..."; + private static final String DATA_RETRIEVAL_SUCCESS_MESSAGE = "Kowalski Data Retrieval Success!"; + private static final String DATA_RETRIEVAL_FAIL_MESSAGE = "Kowalski Data Retrieval Failed!"; + private static final String ANALYSING_INPUT_MESSAGE = "Kowalski analysing inputs..." ; + private static final String CHANGE_RECORDED_IN_TEXT_FILE = "Change recorded in the Text file!"; + private static final String ISSUE_WITH_DIRECTORY_OR_TEXT_FILE = "Kowalski Analysis failed - Issue with directory/text file!"; + private static final String FAILURE_TO_CREATE_DIRECTORY = "Skipper, I am unable to create the data directory for you!" ; + private static final String NEWLINE = "\n" ; /** * This function takes in the lines of code from the Kowalski.txt and processes them to @@ -64,7 +74,7 @@ public static void restoreTaskList(String fileInput, List currentTask){ currentTask.add(newEventTask); break; default: - System.out.println("Kowalski Analysis Error: Text File Corrupted!"); + System.out.println(TEXT_FILE_CORRUPTED_ERROR); break; } } @@ -78,19 +88,19 @@ public static void readTextFile(List currentTask) throws IOException{ createTextFileFolder(Paths.get(TEXT_FILE_FOLDER)); Path filePath = Paths.get(FULL_FILE_PATH); if (!Files.exists(filePath)){ - System.out.println("Creating new Kowalski.txt file"); + System.out.println(CREATE_NEW_TEXT_FILE); Files.createFile(filePath); } FileReader fileReader = new FileReader(FULL_FILE_PATH); BufferedReader line = new BufferedReader(fileReader); - System.out.println("Kowalski retrieving previous data..."); + System.out.println(RETRIEVING_PREVIOUS_DATA_MESSAGE); while (line.ready()) { restoreTaskList(line.readLine(), currentTask); } - System.out.println("Kowalski Data Retrieval Complete!"); + System.out.println(DATA_RETRIEVAL_SUCCESS_MESSAGE); Ui.printDivider(); } catch (IOException e){ - System.out.println("Kowalski Data Retrieval Failed!"); + System.out.println(DATA_RETRIEVAL_FAIL_MESSAGE); throw e; } } @@ -105,7 +115,7 @@ public static void writeText(List currentTask){ lines.add(task.textFileInputString()); } Ui.printDivider(); - System.out.println("Kowalski analysing inputs..."); + System.out.println(ANALYSING_INPUT_MESSAGE); writeTextFile(lines); } @@ -120,13 +130,13 @@ public static void writeTextFile(List lines) { FileWriter writer = new FileWriter(FULL_FILE_PATH); for (String line : lines) { - writer.write(line + "\n"); + writer.write(line + NEWLINE); } - System.out.println("Task recorded in the Text file!"); + System.out.println(CHANGE_RECORDED_IN_TEXT_FILE); writer.close(); } catch (IOException e){ - System.out.println("Kowalski Analysis failed - Issue with directory/text file!"); + System.out.println(ISSUE_WITH_DIRECTORY_OR_TEXT_FILE); } } @@ -141,7 +151,7 @@ public static void createTextFileFolder(Path parentPath ) throws IOException{ } catch (FileAlreadyExistsException ignored){ //Ignore this error if file exists } catch (IOException e){ - System.out.println("Skipper, I am unable to create the data directory for you!"); + System.out.println(FAILURE_TO_CREATE_DIRECTORY); throw e; } } From a7db57935c60894f1866dd3887a87fa4d860c2ab Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 01:08:59 +0800 Subject: [PATCH 35/54] Remove unnecessary constant --- src/main/java/Kowalski/TaskList.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/Kowalski/TaskList.java b/src/main/java/Kowalski/TaskList.java index e4dc98341..2abd09206 100644 --- a/src/main/java/Kowalski/TaskList.java +++ b/src/main/java/Kowalski/TaskList.java @@ -7,7 +7,6 @@ public class TaskList { public static List currentTask = new ArrayList<>(); - public static final int ONE = 1; public static final String DOT = "."; /** @@ -23,8 +22,8 @@ public static String processInput(String userInput){ * Used in the "list" command to print all the Current Tasks in the proper format */ public static void printCurrentTaskItems(){ - for (int i = ONE; i <= currentTask.size(); i++){ - System.out.println(i + DOT + currentTask.get(i-ONE)); + for (int i = 1; i <= currentTask.size(); i++){ + System.out.println(i + DOT + currentTask.get(i-1)); } } } From 1cc2e52ce286a3689e4c1ef92730a9c7b27d4229 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 01:09:41 +0800 Subject: [PATCH 36/54] Remove magic literals in Parser class --- src/main/java/Kowalski/Parser.java | 93 ++++++++++++++++++------------ 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/src/main/java/Kowalski/Parser.java b/src/main/java/Kowalski/Parser.java index 615c70699..3c86281f5 100644 --- a/src/main/java/Kowalski/Parser.java +++ b/src/main/java/Kowalski/Parser.java @@ -12,6 +12,28 @@ import java.util.Scanner; public class Parser { + private static final String BYE = "bye"; + private static final String LIST = "list"; + private static final String DELETE = "delete"; + private static final String UNMARK = "unmark"; + private static final String MARK = "mark"; + private static final String TODO = "todo"; + private static final String DEADLINE = "deadline"; + private static final String EVENT = "event"; + private static final String BY = "/by"; + private static final String FROM = "/from"; + private static final String TO = "/to"; + private static final String INPUT_MISMATCH_EXCEPTION_MESSAGE = "Skipper input a god damn number!"; + private static final String INDEX_OUT_OF_BOUNDS_EXCEPTION_MESSAGE = "Invalid Task Number! Skipper stop acting like Private!"; + private static final String KOWALSKI_EXCEPTION_MESSAGE = "Skipper your inputs are wrong! Try again!"; + private static final String DEFAULT_ERROR_MESSAGE = "Skipper pull up your socks!"; + private static final String TASK_DELETE_MESSAGE = "Damn Skipper, you've got some courage removing this task:"; + private static final String MARK_AS_DONE_MESSAGE = "Way to go Skipper! I've marked this task as done:"; + private static final String MARK_AS_NOT_DONE_MESSAGE = "C'mon Skipper, you're much better than that! I've marked this task as undone:"; + private static final String TODO_MESSAGE = "Skipper you've got this work to do:"; + private static final String DEADLINE_MESSAGE = "Skipper, I have recorded this deadline:"; + private static final String EVENT_MESSAGE = "Skipper I've noted this event in my calendar:"; + private static final String TWO_SPACE_GAP = " "; /** * Used to check if the user has accurately input the deadline by stating the "/by" @@ -19,7 +41,7 @@ public class Parser { * @throws KowalskiException In the event that the input has no "/by" */ public static void checkDeadlineInput(String deadlineDetails) throws KowalskiException{ - if (!(deadlineDetails.contains("/by"))) { + if (!(deadlineDetails.contains(BY))) { throw new KowalskiException(); } } @@ -30,7 +52,7 @@ public static void checkDeadlineInput(String deadlineDetails) throws KowalskiExc * @throws KowalskiException In the event that the input has no "/from" or "/to" or both */ public static void checkEventInput(String eventDetails) throws KowalskiException{ - if (!((eventDetails.contains("/from")) && (eventDetails.contains("/to")))) { + if (!((eventDetails.contains(FROM)) && (eventDetails.contains(TO)))) { throw new KowalskiException(); } } @@ -41,12 +63,10 @@ public static void checkEventInput(String eventDetails) throws KowalskiException * @return new deadline task created */ private static Task getNewDeadlineTask(String deadlineDetails) { - String[] deadlineArray = deadlineDetails.split("/by"); + String[] deadlineArray = deadlineDetails.split(BY); for (int i = 0; i < deadlineArray.length; i++) { deadlineArray[i] = deadlineArray[i].trim(); } - - return new Deadline(deadlineArray[0], deadlineArray[1]); } @@ -56,9 +76,9 @@ private static Task getNewDeadlineTask(String deadlineDetails) { * @return new event task created */ private static Task getNewEventTask(String eventDetails) { - String[] eventArray = eventDetails.split("/from"); + String[] eventArray = eventDetails.split(FROM); String eventInformation = eventArray[0].trim(); - String [] fromAndTo = eventArray[1].split("/to"); + String [] fromAndTo = eventArray[1].split(TO); String eventFrom = fromAndTo[0].trim(); String eventTo = fromAndTo[1].trim(); @@ -71,92 +91,92 @@ public static void parseUserCommand(String UserCommand, List currentTask, int lastTaskIndex; switch (UserCommand){ - case "bye": + case BYE: break; - case "list": + case LIST: TaskList.printCurrentTaskItems(); Ui.printDivider(); break; - case "delete": + case DELETE: try { taskNumber = in.nextInt(); } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + System.out.println(INPUT_MISMATCH_EXCEPTION_MESSAGE); break; } try { - System.out.println( "Damn Skipper, you're got some courage removing this task:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); + System.out.println(TASK_DELETE_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get(taskNumber - 1)); Ui.printCurrentTaskMessage(currentTask.size()-1); currentTask.remove(taskNumber-1); Storage.writeText(currentTask); } catch (IndexOutOfBoundsException e){ - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + System.out.println(INDEX_OUT_OF_BOUNDS_EXCEPTION_MESSAGE); } Ui.printDivider(); break; - case "unmark": + case UNMARK: try { taskNumber = in.nextInt(); } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + System.out.println(INPUT_MISMATCH_EXCEPTION_MESSAGE); Ui.printDivider(); break; } try{ currentTask.get(taskNumber - 1).markAsNotDone(); - System.out.println( "C'mon Skipper, you're much better than that! I've marked this task as undone:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); + System.out.println(MARK_AS_NOT_DONE_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get(taskNumber - 1)); Storage.writeText(currentTask); } catch (IndexOutOfBoundsException e) { - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + System.out.println(INDEX_OUT_OF_BOUNDS_EXCEPTION_MESSAGE); Ui.printDivider(); break; } break; - case "mark": + case MARK: try { taskNumber = in.nextInt(); } catch (InputMismatchException e) { - System.out.println("Skipper input a god damn number! I am now gonna add the text which you inputted into our list!"); + System.out.println(INPUT_MISMATCH_EXCEPTION_MESSAGE); Ui.printDivider(); break; } try{ currentTask.get(taskNumber - 1).markAsDone(); - System.out.println( "Way to go Skipper! I've marked this task as done:"); - System.out.println(" " + currentTask.get(taskNumber - 1)); + System.out.println(MARK_AS_DONE_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get(taskNumber - 1)); Storage.writeText(currentTask); } catch (IndexOutOfBoundsException e) { - System.out.println("Invalid Task Number! Skipper stop acting like Private!"); + System.out.println(INDEX_OUT_OF_BOUNDS_EXCEPTION_MESSAGE); Ui.printDivider(); break; } Ui.printDivider(); break; - case "todo": + case TODO: String toDoDetails = in.nextLine(); Task newToDoTask = new Todo(toDoDetails.trim()); currentTask.add(newToDoTask); lastTaskIndex = currentTask.size() - 1; - System.out.println("Skipper you've got this work to do:"); - System.out.println(" " + currentTask.get( lastTaskIndex)); + System.out.println(TODO_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get(lastTaskIndex)); Ui.printCurrentTaskMessage(currentTask.size()); Storage.writeText(currentTask); Ui.printDivider(); break; - case "deadline": + case DEADLINE: String deadlineDetails = in.nextLine(); try{ @@ -168,18 +188,18 @@ public static void parseUserCommand(String UserCommand, List currentTask, lastTaskIndex = currentTask.size() - 1; //Printing the appropriate information for the User - System.out.println("Skipper, I have recorded this deadline:"); - System.out.println(" " + currentTask.get( lastTaskIndex)); + System.out.println(DEADLINE_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get( lastTaskIndex)); Ui.printCurrentTaskMessage(currentTask.size()); Storage.writeText(currentTask); Ui.printDivider(); } catch (KowalskiException e){ - System.out.println("Skipper your inputs are wrong! Try again!"); + System.out.println(KOWALSKI_EXCEPTION_MESSAGE); Ui.printDivider(); } break; - case "event": + case EVENT: String eventDetails = in.nextLine(); try{ @@ -191,21 +211,20 @@ public static void parseUserCommand(String UserCommand, List currentTask, lastTaskIndex = currentTask.size() - 1; //Printing the appropriate information for the User - System.out.println("Skipper I've noted this event in my calendar:"); - System.out.println(" " + currentTask.get(lastTaskIndex)); + System.out.println(EVENT_MESSAGE); + System.out.println(TWO_SPACE_GAP + currentTask.get(lastTaskIndex)); Ui.printCurrentTaskMessage(currentTask.size()); Storage.writeText(currentTask); Ui.printDivider(); } catch (KowalskiException e) { - System.out.println("Skipper your inputs are wrong! Try again!"); + System.out.println(KOWALSKI_EXCEPTION_MESSAGE); Ui.printDivider(); } break; default: - System.out.println("Skipper pull up your socks!" - + System.lineSeparator()); + System.out.println(DEFAULT_ERROR_MESSAGE+ System.lineSeparator()); Ui.printHelpCommands(); Ui.printDivider(); break; From 9b6a2d940d51845423f593bb7087a6c7b7178742 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 01:13:58 +0800 Subject: [PATCH 37/54] Sort new classes into the relevant packages --- src/main/java/Kowalski/Kowalski.java | 4 ++++ src/main/java/Kowalski/{ => commands}/Parser.java | 3 +-- src/main/java/Kowalski/{ => commands}/Storage.java | 2 +- src/main/java/Kowalski/{ => commands}/TaskList.java | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) rename src/main/java/Kowalski/{ => commands}/Parser.java (99%) rename src/main/java/Kowalski/{ => commands}/Storage.java (99%) rename src/main/java/Kowalski/{ => commands}/TaskList.java (96%) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 985a36afe..0b6e00db3 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -1,6 +1,10 @@ package Kowalski; import Kowalski.UI.Ui; +import Kowalski.commands.Parser; +import Kowalski.commands.Storage; +import Kowalski.commands.TaskList; + import java.io.IOException; import java.util.Scanner; diff --git a/src/main/java/Kowalski/Parser.java b/src/main/java/Kowalski/commands/Parser.java similarity index 99% rename from src/main/java/Kowalski/Parser.java rename to src/main/java/Kowalski/commands/Parser.java index 3c86281f5..a5d562e53 100644 --- a/src/main/java/Kowalski/Parser.java +++ b/src/main/java/Kowalski/commands/Parser.java @@ -1,7 +1,6 @@ -package Kowalski; +package Kowalski.commands; import Kowalski.UI.Ui; -import Kowalski.commands.KowalskiException; import Kowalski.tasks.Deadline; import Kowalski.tasks.Event; import Kowalski.tasks.Task; diff --git a/src/main/java/Kowalski/Storage.java b/src/main/java/Kowalski/commands/Storage.java similarity index 99% rename from src/main/java/Kowalski/Storage.java rename to src/main/java/Kowalski/commands/Storage.java index f0c56d88a..5a4383535 100644 --- a/src/main/java/Kowalski/Storage.java +++ b/src/main/java/Kowalski/commands/Storage.java @@ -1,4 +1,4 @@ -package Kowalski; +package Kowalski.commands; import Kowalski.UI.Ui; import Kowalski.tasks.Deadline; diff --git a/src/main/java/Kowalski/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java similarity index 96% rename from src/main/java/Kowalski/TaskList.java rename to src/main/java/Kowalski/commands/TaskList.java index 2abd09206..ff915a2da 100644 --- a/src/main/java/Kowalski/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -1,4 +1,4 @@ -package Kowalski; +package Kowalski.commands; import Kowalski.tasks.Task; From 2bd8515c7e5abeb8b527cc0bef17d8804c1a710a Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 11:20:25 +0800 Subject: [PATCH 38/54] Refactor code to align with requirements --- src/main/java/Kowalski/commands/Parser.java | 8 ++++---- src/main/java/Kowalski/commands/TaskList.java | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/Kowalski/commands/Parser.java b/src/main/java/Kowalski/commands/Parser.java index a5d562e53..4f62fa355 100644 --- a/src/main/java/Kowalski/commands/Parser.java +++ b/src/main/java/Kowalski/commands/Parser.java @@ -110,7 +110,7 @@ public static void parseUserCommand(String UserCommand, List currentTask, System.out.println(TASK_DELETE_MESSAGE); System.out.println(TWO_SPACE_GAP + currentTask.get(taskNumber - 1)); Ui.printCurrentTaskMessage(currentTask.size()-1); - currentTask.remove(taskNumber-1); + TaskList.removeTask(taskNumber-1); Storage.writeText(currentTask); } catch (IndexOutOfBoundsException e){ System.out.println(INDEX_OUT_OF_BOUNDS_EXCEPTION_MESSAGE); @@ -165,7 +165,7 @@ public static void parseUserCommand(String UserCommand, List currentTask, String toDoDetails = in.nextLine(); Task newToDoTask = new Todo(toDoDetails.trim()); - currentTask.add(newToDoTask); + TaskList.addTask(newToDoTask); lastTaskIndex = currentTask.size() - 1; System.out.println(TODO_MESSAGE); @@ -183,7 +183,7 @@ public static void parseUserCommand(String UserCommand, List currentTask, //Adding the new deadline task into currentTask List after processing and cleaning inputs Task newDeadlineTask = getNewDeadlineTask(deadlineDetails); - currentTask.add(newDeadlineTask); + TaskList.addTask(newDeadlineTask); lastTaskIndex = currentTask.size() - 1; //Printing the appropriate information for the User @@ -206,7 +206,7 @@ public static void parseUserCommand(String UserCommand, List currentTask, //Adding the new event task into currentTask List after processing and cleaning inputs Task newEventTask = getNewEventTask(eventDetails); - currentTask.add(newEventTask); + TaskList.addTask(newEventTask); lastTaskIndex = currentTask.size() - 1; //Printing the appropriate information for the User diff --git a/src/main/java/Kowalski/commands/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java index ff915a2da..806e29c43 100644 --- a/src/main/java/Kowalski/commands/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -26,4 +26,12 @@ public static void printCurrentTaskItems(){ System.out.println(i + DOT + currentTask.get(i-1)); } } + + public static void addTask(Task task) { + currentTask.add(task);; + } + + public static void removeTask(int index){ + currentTask.remove(index); + } } From aa6004d73db2ead19d118db8baafd7a14a1f65e6 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 12:35:38 +0800 Subject: [PATCH 39/54] Implement findMatch method in TaskList class --- src/main/java/Kowalski/commands/TaskList.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/Kowalski/commands/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java index 806e29c43..280f8352d 100644 --- a/src/main/java/Kowalski/commands/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -34,4 +34,17 @@ public static void addTask(Task task) { public static void removeTask(int index){ currentTask.remove(index); } + + public static void findMatch(String input){ + ListmatchList = currentTask.stream() + .filter(task -> task.getDescription().toLowerCase().contains(input)) + .collect(Collectors.toList()); + + if (matchList.isEmpty()){ + System.out.println("My analysis shows no matches Skipper!"); + } else { + System.out.println("Skipper here are the matching tasks:"); + printMatchingTasks(matchList); + } + } } From 882f3467c5f0fd9943fcac94446443e675252966 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 12:36:37 +0800 Subject: [PATCH 40/54] Implement printMatchingTask function for TaskList Class --- src/main/java/Kowalski/commands/TaskList.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/Kowalski/commands/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java index 280f8352d..e761bf66a 100644 --- a/src/main/java/Kowalski/commands/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class TaskList { public static List currentTask = new ArrayList<>(); @@ -27,6 +28,15 @@ public static void printCurrentTaskItems(){ } } + /** + * Used in the "find" command to print all the matching Tasks in the proper format + */ + public static void printMatchingTasks(List matchList){ + for (int i = 1; i <= matchList.size(); i++){ + System.out.println(i + DOT + matchList.get(i-1)); + } + } + public static void addTask(Task task) { currentTask.add(task);; } From 06b6d9cd88f65cb796bb07d755d3a03341e1b10b Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 12:37:26 +0800 Subject: [PATCH 41/54] Add Find functionalities into parseUserCommand method --- src/main/java/Kowalski/commands/Parser.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/Kowalski/commands/Parser.java b/src/main/java/Kowalski/commands/Parser.java index 4f62fa355..39427ade7 100644 --- a/src/main/java/Kowalski/commands/Parser.java +++ b/src/main/java/Kowalski/commands/Parser.java @@ -13,6 +13,7 @@ public class Parser { private static final String BYE = "bye"; private static final String LIST = "list"; + private static final String FIND = "find"; private static final String DELETE = "delete"; private static final String UNMARK = "unmark"; private static final String MARK = "mark"; @@ -98,6 +99,16 @@ public static void parseUserCommand(String UserCommand, List currentTask, Ui.printDivider(); break; + case FIND: + String wordToMatch = in.nextLine(); + if (!wordToMatch.isEmpty()) { + TaskList.findMatch(wordToMatch.trim().toLowerCase()); + } else { + System.out.println(KOWALSKI_EXCEPTION_MESSAGE); + } + Ui.printDivider(); + break; + case DELETE: try { taskNumber = in.nextInt(); From 257227c53e4fed10e974f7e0b859bfac00f04a0a Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 12:44:03 +0800 Subject: [PATCH 42/54] Remove magic literals in TaskList Class --- src/main/java/Kowalski/commands/TaskList.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/Kowalski/commands/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java index e761bf66a..e47ca2d2e 100644 --- a/src/main/java/Kowalski/commands/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -9,6 +9,8 @@ public class TaskList { public static List currentTask = new ArrayList<>(); public static final String DOT = "."; + public static final String NO_MATCHES_MESSAGE = "My analysis shows no matches Skipper!"; + public static final String MATCHES_FOUND_MESSAGE = "Skipper here are the matching tasks:"; /** * Used to process the different variations of the users inputs @@ -51,9 +53,9 @@ public static void findMatch(String input){ .collect(Collectors.toList()); if (matchList.isEmpty()){ - System.out.println("My analysis shows no matches Skipper!"); + System.out.println(NO_MATCHES_MESSAGE); } else { - System.out.println("Skipper here are the matching tasks:"); + System.out.println(MATCHES_FOUND_MESSAGE); printMatchingTasks(matchList); } } From ea0db839e0522cbb139c5ff18b270ec64f0f55b4 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 18:50:12 +0800 Subject: [PATCH 43/54] Add JavaDoc for Kowalski Class --- src/main/java/Kowalski/Kowalski.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/Kowalski/Kowalski.java b/src/main/java/Kowalski/Kowalski.java index 0b6e00db3..2ebe8d342 100644 --- a/src/main/java/Kowalski/Kowalski.java +++ b/src/main/java/Kowalski/Kowalski.java @@ -8,6 +8,12 @@ import java.io.IOException; import java.util.Scanner; +/** + * Kowalski is a bot for users to keep track of your everyday tasks. + * It is able to store and retrieve tasks which you need to do, tasks with deadlines and events important to users. + * It allows you to easily add, remove tasks, or even mark and unmark tasks. + * It also allows users to find previous tasks based on their inputs. + */ public class Kowalski { public static Scanner in = new Scanner (System.in); From b2fd79260bc39d152785182737314dc742ec951e Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 18:51:31 +0800 Subject: [PATCH 44/54] Add JavaDoc for the different Task classes --- src/main/java/Kowalski/tasks/Deadline.java | 4 ++++ src/main/java/Kowalski/tasks/Event.java | 8 ++++++++ src/main/java/Kowalski/tasks/Task.java | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/main/java/Kowalski/tasks/Deadline.java b/src/main/java/Kowalski/tasks/Deadline.java index 7dbc79733..597925af8 100644 --- a/src/main/java/Kowalski/tasks/Deadline.java +++ b/src/main/java/Kowalski/tasks/Deadline.java @@ -9,6 +9,10 @@ public Deadline(String description, String by) { this.deadline = by; } + /** + * This function returns the deadline of the "deadline" event + * @return String of the Deadline + */ public String getDeadline() { return deadline; } diff --git a/src/main/java/Kowalski/tasks/Event.java b/src/main/java/Kowalski/tasks/Event.java index 6c46500bb..e4aa458c8 100644 --- a/src/main/java/Kowalski/tasks/Event.java +++ b/src/main/java/Kowalski/tasks/Event.java @@ -10,10 +10,18 @@ public Event (String description, String startDayAndTime, String endDayAndTime) this.endDayAndTime = endDayAndTime; } + /** + * Method obtains the start date and time of the event + * @return String of the start date and time + */ public String getStartDayAndTime() { return startDayAndTime; } + /** + * Method obtains the end date and time of the event + * @return String of the end date and time + */ public String getEndDayAndTime() { return endDayAndTime; } diff --git a/src/main/java/Kowalski/tasks/Task.java b/src/main/java/Kowalski/tasks/Task.java index 36c60ae28..72004cc99 100644 --- a/src/main/java/Kowalski/tasks/Task.java +++ b/src/main/java/Kowalski/tasks/Task.java @@ -9,24 +9,43 @@ public Task(String description) { this.isDone = false; } + /** + * This method provides the description of a certain task + * @return details of task + */ public String getDescription() { return description; } + /** + * This method returns the symbol to store the status of a task in the text file + * @return "X" or " " depending on whether the task is done + */ public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } + /** + * Marks a task as incomplete + */ public void markAsNotDone(){ this.isDone = false; } + + /** + * Marks a task as complete + */ public void markAsDone(){ this.isDone = true; } + /** + * Returns the information of the task in a proper format to be stored in the text file + * @return various information regarding a task in the proper format + */ public String textFileInputString() { return String.format("%s | %s", isDone? "X" : "0", From d188010e641cbc4ec83af0f71b94fce679bb2639 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 18:52:08 +0800 Subject: [PATCH 45/54] Update JavaDoc for TaskList Class --- src/main/java/Kowalski/commands/TaskList.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/Kowalski/commands/TaskList.java b/src/main/java/Kowalski/commands/TaskList.java index e47ca2d2e..c316a3f8c 100644 --- a/src/main/java/Kowalski/commands/TaskList.java +++ b/src/main/java/Kowalski/commands/TaskList.java @@ -32,6 +32,7 @@ public static void printCurrentTaskItems(){ /** * Used in the "find" command to print all the matching Tasks in the proper format + * @param matchList ArrayList containing the matching tasks */ public static void printMatchingTasks(List matchList){ for (int i = 1; i <= matchList.size(); i++){ @@ -39,14 +40,26 @@ public static void printMatchingTasks(List matchList){ } } + /** + * Method to add tasks in the ArrayList currentTask + * @param task an instance of the task which needs to be added + */ public static void addTask(Task task) { currentTask.add(task);; } + /** + * Method to remove tasks in the ArrayList currentTask + * @param index index of the task to be removed from currentTask + */ public static void removeTask(int index){ currentTask.remove(index); } + /** + * Method to return the task with descriptions matching the user's input word + * @param input user's input word + */ public static void findMatch(String input){ ListmatchList = currentTask.stream() .filter(task -> task.getDescription().toLowerCase().contains(input)) From 1afcfa53358cae2f4d3550794e9b6824dcf1d7a1 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 18:52:44 +0800 Subject: [PATCH 46/54] Update JavaDoc for method parseUserCommand in Parser Class --- src/main/java/Kowalski/commands/Parser.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/Kowalski/commands/Parser.java b/src/main/java/Kowalski/commands/Parser.java index 39427ade7..a4b668a2f 100644 --- a/src/main/java/Kowalski/commands/Parser.java +++ b/src/main/java/Kowalski/commands/Parser.java @@ -85,6 +85,13 @@ private static Task getNewEventTask(String eventDetails) { return new Event(eventInformation, eventFrom, eventTo); } + /** + * Parses user command and initiates actions according to the first word input by the user. + * Able to initiate actions for commands - bye, list, find, delete, unmark, mark, todo, deadline, event + * @param UserCommand first word input by the user + * @param currentTask is an ArrayList storing the current tasks + * @param in is of scanner class to enable usage of the scanning library's functions + */ public static void parseUserCommand(String UserCommand, List currentTask, Scanner in) { int taskNumber; From b12bf1368e643c169be4cb725810b8c5def35fa7 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Wed, 6 Mar 2024 18:53:17 +0800 Subject: [PATCH 47/54] Update JavaDoc for Storage Class --- src/main/java/Kowalski/commands/Storage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/Kowalski/commands/Storage.java b/src/main/java/Kowalski/commands/Storage.java index 5a4383535..af6ff85b0 100644 --- a/src/main/java/Kowalski/commands/Storage.java +++ b/src/main/java/Kowalski/commands/Storage.java @@ -40,6 +40,7 @@ public class Storage { * This function takes in the lines of code from the Kowalski.txt and processes them to * list out all the previous tasks which we had saved. * @param fileInput: String containing each line of input from Kowalski.txt + * @param currentTask ArrayList containing the current tasks */ public static void restoreTaskList(String fileInput, List currentTask){ String [] inputArray = fileInput.split("\\s*\\|\\s*"); @@ -81,6 +82,7 @@ public static void restoreTaskList(String fileInput, List currentTask){ /** * Read text file accesses Kowalski.txt and calls the restoreTaskList function + * @param currentTask ArrayList containing the current tasks * @throws IOException when unable to get the Kowalski file or has any input errors */ public static void readTextFile(List currentTask) throws IOException{ @@ -108,6 +110,7 @@ public static void readTextFile(List currentTask) throws IOException{ /** * Function which is called to generate an arrayList "lines" which updates according to the users' inputs. * Calls the writeTextFile function to update Kowalski.txt + * @param currentTask ArrayList containing the current tasks */ public static void writeText(List currentTask){ List lines = new ArrayList<>(); From a5a2dd67d94f0e211602c0c1b041dc4b317291ae Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 01:59:38 +0800 Subject: [PATCH 48/54] Update main README.md file to include a picture of Kowalski --- README.md | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 8715d4d91..0748dbdf0 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,37 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 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 - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` + 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: + + ``` + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⣴⠶⠶⣦⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡾⠟⠋⠉⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣧⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠋⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⠀⠀⠀⣠⣾⠟⠛⠛⠛⠻⢶⣄⠀⠀⠀⠀⠀⠀⣴⡾⠛⠛⢿⣧⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⣾⠁⠀⠀⠀⢀⣾⠏⠀⠀⠀⠀⠀⠀⠀⠙⣷⡀⠀⠀⠀⢸⡟⠀⠀⠀⠈⣿⡆⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⣼⠏⠀⠀⠀⠀⠀⣠⣤⡀⠀⠘⣷⣤⣶⢶⣿⣇⠀⣖⣶⡆⠘⣿⡀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⢠⣿⠀⠀⠀⠀⠀⠸⣧⣿⣿⠀⣼⠏⠁⠀⠀⠀⠹⣧⠙⠛⠁⠀⣿⣧⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠈⣿⠀⠀⠀⠀⠀⠀⠈⠉⠀⠀⢻⣿⣶⠶⣶⣶⣿⠏⠀⠀⠀⣰⣿⡏⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⢰⡟⠀⠀⠀⠀⠹⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠋⠉⠀⠀⠀⣠⣾⠋⢹⡆⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⢀⣿⠃⠀⠀⠀⠀⠀⠙⢷⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠟⠻⢷⣄⢻⣦⠀⠀⠀ + ⠀⠀⠀⠀⠀⢠⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⣻⣶⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣷⡙⢷⣄⠀ + ⠀⠀⠀⠀⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠃⠈⢻⣆ + ⠀⠀⠀⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣦⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠏⠀⠀⠀⣿ + ⠀⠀⠀⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡟⠀⠀⠀⢠⣿ + ⠀⠀⢰⡟⠀⠀⠀⠀⠀⠀⠠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⣾⠃ + ⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣦⣀⠀⠀⠀⠀⠀⠀⢹⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡇⠀⣠⣾⠏⠀ + ⢀⣴⡿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠻⢷⣄⡀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⠿⣿⠃⠀⠀ + ⣿⡏⠀⢹⣧⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠙⠿⣦⣤⣤⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⢿⣦⠀⠀ + ⠙⢿⣦⣀⠻⣧⡀⠀⠀⠀⠀⠀⢠⣼⣷⣄⠀⣀⣀⡀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠏⢰⡿⢶⡆ + ⠀⠀⠉⠙⠛⠿⠿⣦⣀⢠⣶⣶⡿⠁⠀⠹⣿⠋⠉⢿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡿⠃⠀⠀⣠⡾⠃ + ⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⡦⠀⠀⠀⠀⠀⠀⠀⢸⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣋⣀⣤⣴⠟⠋⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⣀⠀⠀⠀⠀⣰⡿⠁⠀⠀⠀⠀⠀⢀⣀⣠⣴⠿⠛⠉⠙⠛⠉⠉⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠻⠶⠶⠟⠛⠛⠛⠛⠛⠛⠛⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠘⠦⣠⠀⠀⠠⠀⡀⠀⠀⣘⢦⠀⢤⡄⠀⠈⠡⡄⡀⠀⡀⣄⠈⠀⠀⠐⠀⠀⠀⠈⠀⠀⠀⠀ + ⠀⠀⠀⠀⠐⠶⠠⠄⠠⠀⠀⠤⠀⠤⠄⠀⡰⡉⠈⠱⠘⠀⡄⣀⠀⠀⠀⠠⠀⠭⠰⠶⠤⠆⠰⡶⠘⢤⠄⠀⢀⠀ + KOWALSKI ANALYSIS! + ``` \ No newline at end of file From 187e8fc62144d0c3cdf115d2af0a5b99e4bf65ea Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 02:00:18 +0800 Subject: [PATCH 49/54] Update Kowalski.txt --- data/Kowalski.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/Kowalski.txt b/data/Kowalski.txt index 0528ba3ca..59b16c06a 100644 --- a/data/Kowalski.txt +++ b/data/Kowalski.txt @@ -1,2 +1,3 @@ -E | X | go for swimming | Sat 6pm - 7pm -T | 0 | code 2113 +T | X | Code for CS1010 Assignment +D | 0 | Write up your analysis report for Skipper | Friday 2359 +E | 0 | Attend Snowball Olympics | Tomorrow 9am - Friday 6pm From 058195331f38e5cb879716e0ab43ca4ac02e7b48 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 02:00:56 +0800 Subject: [PATCH 50/54] Include missing UI.printDivider method in parseUserCommand method --- src/main/java/Kowalski/commands/Parser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Kowalski/commands/Parser.java b/src/main/java/Kowalski/commands/Parser.java index a4b668a2f..b9deca213 100644 --- a/src/main/java/Kowalski/commands/Parser.java +++ b/src/main/java/Kowalski/commands/Parser.java @@ -155,6 +155,7 @@ public static void parseUserCommand(String UserCommand, List currentTask, Ui.printDivider(); break; } + Ui.printDivider(); break; case MARK: From 04ffa8a43644d1526e9f79fdb2c34b35150463d3 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 02:03:20 +0800 Subject: [PATCH 51/54] Update docs/README.md with User Guide --- docs/README.md | 268 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 255 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8077118eb..db36845f7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,271 @@ -# User Guide +# Kowalski Bot +If you've watched **[Penguins of Madagascar](https://youtu.be/Z-5SrndEVrI?si=_ivcZTA_PTUoJhI8)**, you'll know **_[Kowalski](https://youtu.be/f3CVuo_HFLM?si=v1hv_y0UU4YP8HYb)_**. -## Features +He is often referred to as Skipper's Lieutenant, the second-in-command. -### Feature-ABC +If you're someone who needs a Kowalski by your side at all times, this bot is for you! -Description of the feature. -### Feature-XYZ +## Overview -Description of the feature. +Kowalski is a bot for you to keep track of your everyday tasks. +Be it keeping track of your homework assignments, +your daily chores, Kowalski's got your back! + +Kowalski has got 3 types of tasks - ToDo task, Deadline task, and Event task. + +### Task types +- ToDo: Task with ```Name``` +- Deadline: Task with ```Name``` and ```Deadline``` +- Event: Task with ```Name```, ```From``` and ```To``` + + +### Kowalski.txt + +Kowalski is able to save the tasks which you add by storing them in a text file called **Kowalski.txt**. + +If you are using this bot for the **_first time_**, this bot will +automatically create a directory called **data** which will then store your **Kowalski.txt** inside of it. + +E.g. ```C:\Users\Skipper\Desktop\Kowalski_Bot\data\Kowalski.txt``` +assuming you are storing the jar file in ```C:\Users\Skipper\Desktop\Kowalski_Bot``` + +## Running Kowalski Bot +#### Prerequisites: +- Java _(version >= 11)_ installed +- Having the latest JAR file release of Kowalski +- ~~[Kowalski's energy](https://youtu.be/xv9ek6RP4r8?si=AhwSaukCiyUihn-X)~~ + +#### Steps: +1. Open terminal and change directory to the directory in which you've stored the JAR file. +2. Run `java -jar ./Kowalski.jar` + +To exit the application, type the keyword `bye`. +To restart the application, repeat steps 1 & 2. + +## Features + +### 1. List all tasks ```list``` + +Lists all tasks which the user has input. + +### 2. Find matching tasks ```find``` + +Finds and filters tasks containing a keyword, and prints them out in a list. + +### 3. Remove a task ```delete``` + +Removes a task from the list of tasks. + +### 4. Mark a task ```mark``` + +Marks a task as complete. + +### 5. Unmark a task ```unmark``` + +Marks a task as **_incomplete_**. + +### 5. Add a ToDo task ```todo``` + +Adds in a task for the user, containing only the name. + +### 6. Add a Deadline task ```deadline``` + +Adds in a deadline for the user, containing a name and deadline of the task. + +### 7. Add an Event task ```event``` + +Adds in an event for the user, containing a name, start date/time and end date/time. ## Usage -### `Keyword` - Describe action +### Adding a task + +The format for adding specific tasks are as follows. The command keyword is not case sensitive, but the /*vars* are. + + +**Formats**: +- Todo: ```todo NAME``` +- Deadline: ```deadline NAME /by STRING``` +- Event: ```event NAME /from STRING /to STRING``` + + +***Example usage***: + +- ```todo Code for CS1010 Assignment``` +- ```deadline Write up your analysis report for Skipper /by Friday 2359``` +- ```event Attend Snowball Olympics /from Tomorrow 9am /to Friday 6pm``` + + +***Expected outcome***: + +If the arguments were entered correctly, the task should be added successfully. + +***Example output***: + +_For Todo Tasks:_ +``` +Skipper you've got this work to do: + [T][ ] Code for CS1010 Assignment +Now you have 1 task in the list. +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ +``` +_For Deadline Tasks:_ +``` +Skipper, I have recorded this deadline: + [D][ ] Write up your analysis report for Skipper (by: Friday 2359) +Now you have 2 tasks in the list. +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ +``` +_For Event Tasks:_ +``` +Skipper I've noted this event in my calendar: + [E][ ] Attend Snowball Olympics (from: Tomorrow 9am to: Friday 6pm) +Now you have 3 tasks in the list. +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ +``` -Describe the action and its outcome. -Example of usage: +### ```mark``` / ```unmark``` : Mark/Unmark tasks -`keyword (optional arguments)` +**Format**: ```mark/unmark NUMBER``` -Expected outcome: +Firstly, the task number must be retrieved. This can be done easily using the command ```list```. -Description of the outcome. +Next, use ```mark x``` or ```unmark x``` to set the state of the task to the desired state. +***Example usage***: + +- ```mark 1``` +- ```unmark 3``` + +***Expected outcome***: + +If a valid number is entered, a response marking the task will be shown. + +***Example output***: + +_After marking task:_ +``` +Way to go Skipper! I've marked this task as done: + [T][X] Code for CS1010 Assignment +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ ``` -expected output +_After unmarking task:_ + ``` +C'mon Skipper, you're much better than that! I've marked this task as undone: + [E][ ] Attend Snowball Olympics (from: Tomorrow 9am to: Friday 6pm) +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ +``` + + +### List: ```list```: Listing all tasks + +**Format**: ```list``` + +By typing list, the user can print out all existing tasks into the command line. + +***Example usage***: + +- ```list``` + +*Expected outcome*: + +All tasks will be printed out in the console. + +*Example output*: + +``` +1.[T][X] Code for CS1010 Assignment +2.[D][ ] Write up your analysis report for Skipper (by: Friday 2359) +3.[E][ ] Attend Snowball Olympics (from: Tomorrow 9am to: Friday 6pm) +____________________________________________________________ +``` + + +### Find: ```find``` : Finding keywords + +**Format**: ```find STRING``` + +The command looks through all existing tasks, and prints them out if their name contains the string query. + +*Example usage*: + +- ```find lecture``` +- ```find homework``` + +*Expected outcome*: + +All tasks containing the keywords in their name will be printed out. + +*Example output*: + +__Input:__``` find report``` + +``` +Skipper here are the matching tasks: +1.[D][ ] Write up your analysis report for Skipper (by: Friday 2359) +____________________________________________________________ +``` + +### Delete: ```delete``` : Deleting a task + +**Format**: ```delete NUMBER``` + +As with *mark/unmark*, the number of the task to be deleted must be obtained. + +Next, typing the command in the given format will delete said task from the list. + +Once deleted, said task **CANNOT** be retrieved. + +***Example usage***: + +- ```delete 4``` + +***Expected outcome***: + +Task of the given number (in the list) will be deleted. + +***Example output***: + +``` +Damn Skipper, you've got some courage removing this task: + [T][ ] Admire favourite snack +Now you have 3 tasks in the list. +____________________________________________________________ +Kowalski analysing inputs... +Change recorded in the Text file! +____________________________________________________________ +``` + +### Bye:```bye``` : Exit the program + +**Format**: ```bye``` + +***Expected outcome***: + +Exits the program and updates the stored tasks in **_Kowalski.txt_** file. + +***Expected output***: +``` +Bye Skipper! Hope to serve you again for your next mission! +____________________________________________________________ +``` + + From a77e317ef45f9af8e36804d5372ad855422bafe8 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 02:05:44 +0800 Subject: [PATCH 52/54] Add missing spacing --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index db36845f7..49e528eff 100644 --- a/docs/README.md +++ b/docs/README.md @@ -254,7 +254,7 @@ Change recorded in the Text file! ____________________________________________________________ ``` -### Bye:```bye``` : Exit the program +### Bye: ```bye``` : Exit the program **Format**: ```bye``` From 665139d3b79be9ddc5af591addf0ad2187929567 Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 02:55:24 +0800 Subject: [PATCH 53/54] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0748dbdf0..a4099a296 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 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: ``` + Kowalski ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⣴⠶⠶⣦⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡾⠟⠋⠉⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀ From 73eac7811009e7f2546735309dcdc384d18c357f Mon Sep 17 00:00:00 2001 From: Parth Sanjay Gandhi Date: Thu, 7 Mar 2024 03:09:40 +0800 Subject: [PATCH 54/54] Edit README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4099a296..07ce6d819 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 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: ``` - Kowalski + Kowalski ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⣴⠶⠶⣦⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡾⠟⠋⠉⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀