From e3bb1f112bfcfa72bddef8b33355b9f3cdfa960f Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 25 Jan 2024 20:55:13 +0800 Subject: [PATCH 01/23] Duke.java: change chatbot name to Pythia --- src/main/java/Duke.java | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..7f612691d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,24 @@ public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + String lineBreak = "----------------------------------------------------------"; + String idle = " █████████████ \n" + + " ██ ██ \n" + + " ██ █████ ██ \n" + + " ██ █████ ██ \n" + + " ██ ██ \n" + + " █████████████ \n" + + " ██ ██\n" + + " ██████████████████ \n\n"; + + String happy= " ███ \n" + + " ███████ \n" + + " ████ ████ \n" + + " ███ ███ \n" + + " ██ ██ \n" + + " ██ ██\n" + + " ███ ███ \n" + + " ███████████████ \n\n"; + System.out.println(idle + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); + System.out.println(happy+"Happy to help, have a great day.\n"+lineBreak); } } From 550f897970668ea8474280514a288091fe6aa676 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 1 Feb 2024 22:57:27 +0800 Subject: [PATCH 02/23] Duke.java: Increment level 1 --- src/main/java/Duke.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7f612691d..900e02163 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,5 @@ +import java.util.Arrays; +import java.util.Scanner; public class Duke { public static void main(String[] args) { String lineBreak = "----------------------------------------------------------"; @@ -18,7 +20,14 @@ public static void main(String[] args) { + " ██ ██\n" + " ███ ███ \n" + " ███████████████ \n\n"; + + String input = "Start"; + Scanner in = new Scanner(System.in); System.out.println(idle + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); + while (!input.equals("bye")) { + input = in.nextLine(); + System.out.println(input+"\n"+lineBreak); + } System.out.println(happy+"Happy to help, have a great day.\n"+lineBreak); } } From 6c2a44c66a1d97dc552f99259b19948f11118d04 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 2 Feb 2024 00:47:50 +0800 Subject: [PATCH 03/23] Duke.java: increment level 2 --- src/main/java/Duke.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 900e02163..904f8b208 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,6 +1,12 @@ -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class Duke { + public static void printList(List list) { + for (int i = 0; i < list.size(); i++) { + System.out.println((i+1)+"."+list.get(i)); + } + } public static void main(String[] args) { String lineBreak = "----------------------------------------------------------"; String idle = " █████████████ \n" @@ -22,11 +28,18 @@ public static void main(String[] args) { + " ███████████████ \n\n"; String input = "Start"; + List list = new ArrayList(10); Scanner in = new Scanner(System.in); System.out.println(idle + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); while (!input.equals("bye")) { input = in.nextLine(); - System.out.println(input+"\n"+lineBreak); + if (input.equals("list")) { + printList(list); + } + else { + System.out.println("added: "+input+"\n"+lineBreak); + list.add(input); + } } System.out.println(happy+"Happy to help, have a great day.\n"+lineBreak); } From c9bf241a2ea496c115811b2854aac500228a4561 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 2 Feb 2024 01:20:17 +0800 Subject: [PATCH 04/23] Duke.java: increment level 3 --- src/main/java/Duke.java | 27 +++++++++++++++++++++------ src/main/java/Task.java | 26 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 904f8b208..a074774e4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,9 +2,9 @@ import java.util.List; import java.util.Scanner; public class Duke { - public static void printList(List list) { + public static void printList(List list) { for (int i = 0; i < list.size(); i++) { - System.out.println((i+1)+"."+list.get(i)); + System.out.println((i+1)+"."+list.get(i).getDoneStatus()+" "+list.get(i).getDescription()); } } public static void main(String[] args) { @@ -28,18 +28,33 @@ public static void main(String[] args) { + " ███████████████ \n\n"; String input = "Start"; - List list = new ArrayList(10); + List list = new ArrayList<>(2); Scanner in = new Scanner(System.in); System.out.println(idle + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); while (!input.equals("bye")) { input = in.nextLine(); - if (input.equals("list")) { + if (input.equalsIgnoreCase("list")) { printList(list); } + else if (input.contains("add ")) { + String[] splitInput = input.split(" "); + System.out.println("added: "+splitInput[1]); + list.add(new Task(input)); + } + else if (input.contains("unmark ")) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); + System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); + } + else if (input.contains("mark ")) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); + System.out.println("Marked "+ Integer.parseInt(splitInput[1])); + } else { - System.out.println("added: "+input+"\n"+lineBreak); - list.add(input); + System.out.println(input); } + System.out.println(lineBreak); } System.out.println(happy+"Happy to help, have a great day.\n"+lineBreak); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..418c1a759 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,26 @@ +public class Task { + private String description; + private boolean isDone; + + public Task(String description) { + this.description = description; + isDone = false; + } + + public void doneIsFalse() { + isDone = false; + } + + public void doneIsTrue() { + isDone = true; + } + + public String getDoneStatus() { + return (isDone ? "[X]" : "[ ]"); + } + + public String getDescription() { + return description; + } + +} From 93f250ddcb13726360e87a19e26a6426a5ca59b1 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 9 Feb 2024 23:36:05 +0800 Subject: [PATCH 05/23] Level 4: add todo, deadline, event functionality --- src/main/java/Deadline.java | 14 ++++++++++++++ src/main/java/Duke.java | 35 +++++++++------------------------- src/main/java/Event.java | 17 +++++++++++++++++ src/main/java/MoodSprite.java | 27 ++++++++++++++++++++++++++ src/main/java/Parser.java | 36 +++++++++++++++++++++++++++++++++++ src/main/java/Task.java | 10 ++++++++-- src/main/java/Todo.java | 7 +++++++ 7 files changed, 118 insertions(+), 28 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/MoodSprite.java create mode 100644 src/main/java/Parser.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..8276ed84d --- /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.replaceFirst("by", "by:"); + this.taskId = "[D]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (" + by + ")"; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a074774e4..4ae6536c8 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,44 +2,27 @@ import java.util.List; import java.util.Scanner; public class Duke { + private static final String lineBreak = "----------------------------------------------------------"; public static void printList(List list) { for (int i = 0; i < list.size(); i++) { - System.out.println((i+1)+"."+list.get(i).getDoneStatus()+" "+list.get(i).getDescription()); + System.out.println((i+1)+"."+list.get(i)); } } public static void main(String[] args) { - String lineBreak = "----------------------------------------------------------"; - String idle = " █████████████ \n" - + " ██ ██ \n" - + " ██ █████ ██ \n" - + " ██ █████ ██ \n" - + " ██ ██ \n" - + " █████████████ \n" - + " ██ ██\n" - + " ██████████████████ \n\n"; - - String happy= " ███ \n" - + " ███████ \n" - + " ████ ████ \n" - + " ███ ███ \n" - + " ██ ██ \n" - + " ██ ██\n" - + " ███ ███ \n" - + " ███████████████ \n\n"; - String input = "Start"; + MoodSprite mood = new MoodSprite(); + Parser parser = new Parser(); List list = new ArrayList<>(2); Scanner in = new Scanner(System.in); - System.out.println(idle + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); + System.out.println(mood.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); while (!input.equals("bye")) { input = in.nextLine(); if (input.equalsIgnoreCase("list")) { printList(list); } - else if (input.contains("add ")) { - String[] splitInput = input.split(" "); - System.out.println("added: "+splitInput[1]); - list.add(new Task(input)); + else if (parser.isValidCommand(input)) { + list.add(parser.addTask(input)); + System.out.println("added: "+ list.get(list.size()-1)); } else if (input.contains("unmark ")) { String[] splitInput = input.split(" "); @@ -56,6 +39,6 @@ else if (input.contains("mark ")) { } System.out.println(lineBreak); } - System.out.println(happy+"Happy to help, have a great day.\n"+lineBreak); + System.out.println(mood.getHappy()+"Happy to help, have a great day.\n"+lineBreak); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..8107f6d55 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,17 @@ + +public class Event extends Task{ + protected String from; + protected String to; + + public Event(String description, String from, String to) { + super(description); + this.from = from.replaceFirst("from", "from:"); + this.to = to.replaceFirst("to", "to:"); + this.taskId = "[E]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (" + from + " " + to + ")"; + } +} diff --git a/src/main/java/MoodSprite.java b/src/main/java/MoodSprite.java new file mode 100644 index 000000000..43e12a456 --- /dev/null +++ b/src/main/java/MoodSprite.java @@ -0,0 +1,27 @@ +public class MoodSprite { + private static final String HAPPY = " ███ \n" + + " ███████ \n" + + " ████ ████ \n" + + " ███ ███ \n" + + " ██ ██ \n" + + " ██ ██\n" + + " ███ ███ \n" + + " ███████████████ \n\n"; + + private static final String IDLE = " █████████████ \n" + + " ██ ██ \n" + + " ██ █████ ██ \n" + + " ██ █████ ██ \n" + + " ██ ██ \n" + + " █████████████ \n" + + " ██ ██\n" + + " ██████████████████ \n\n"; + + public String getHappy() { + return HAPPY; + } + + public String getIdle() { + return IDLE; + } +} diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 000000000..9f3b251dc --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,36 @@ +public class Parser { + public String[] splitTaskTrimmer(String[] splitTask) { + for (int i = 0; i < splitTask.length; i++) { + splitTask[i] = splitTask[i].trim(); + } + return splitTask; + } + public String[] parseDeadline(String task) { + task = task.replaceFirst("deadline", ""); + return splitTaskTrimmer(task.split("/")); + } + + public String[] parseEvent(String task) { + task = task.replaceFirst("event", ""); + return splitTaskTrimmer((task.split("/"))); + } + public Task addTask(String task) { + String[] parsedTask; + if (task.contains("todo ")) { + task = task.replaceFirst("todo", ""); + return new Todo(task); + } else if (task.contains("deadline ")) { + parsedTask = parseDeadline(task); + return new Deadline(parsedTask[0], parsedTask[1]); + } else if (task.contains("event ")){ + parsedTask = parseEvent(task); + return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); + } else { + return null; + } + } + + public boolean isValidCommand(String task) { + return (task.contains("todo") | task.contains("deadline") | task.contains("event")); + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 418c1a759..47e4e913a 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,6 +1,7 @@ public class Task { - private String description; - private boolean isDone; + protected String description; + protected boolean isDone; + protected String taskId; public Task(String description) { this.description = description; @@ -23,4 +24,9 @@ public String getDescription() { return description; } + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description; + } + } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..30962a529 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,7 @@ +public class Todo extends Task{ + + public Todo (String description) { + super(description); + this.taskId = "[T]"; + } +} From 2ff2c784f3c1196e57eac82e2026e808567c6d31 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Thu, 15 Feb 2024 12:53:05 +0800 Subject: [PATCH 06/23] Add PythiaException class --- src/main/java/PythiaException.java | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/java/PythiaException.java diff --git a/src/main/java/PythiaException.java b/src/main/java/PythiaException.java new file mode 100644 index 000000000..bd658d66e --- /dev/null +++ b/src/main/java/PythiaException.java @@ -0,0 +1,3 @@ +public class PythiaException extends Exception{ + +} From 617ba63ae4bc82ab8b90a7e49a40dcd4bb4f2d1c Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Thu, 15 Feb 2024 12:53:54 +0800 Subject: [PATCH 07/23] Add throws and catches to main loop --- src/main/java/Duke.java | 60 +++++++++++++++++++++++---------------- src/main/java/Parser.java | 15 ++++++++-- 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4ae6536c8..d81f87a2a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,42 +2,54 @@ import java.util.List; import java.util.Scanner; public class Duke { + private static MoodSprite mood = new MoodSprite(); + private static List list = new ArrayList<>(2); + private static Parser parser = new Parser(); private static final String lineBreak = "----------------------------------------------------------"; public static void printList(List list) { for (int i = 0; i < list.size(); i++) { System.out.println((i+1)+"."+list.get(i)); } } + + public static void mainLoop(String input) throws PythiaException { + if (input.equalsIgnoreCase("list")) { + printList(list); + } + else if (parser.isTaskCommand(input)) { + try { + list.add(parser.addTask(input)); + System.out.println("added: " + list.get(list.size() - 1)); + } catch (PythiaException pe) { + System.out.println("Please provide a proper input"); + } + } + else if (input.contains("unmark ")) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); + System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); + } + else if (input.contains("mark ")) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); + System.out.println("Marked "+ Integer.parseInt(splitInput[1])); + } + else { + throw new PythiaException(); + } + System.out.println(lineBreak); + } public static void main(String[] args) { String input = "Start"; - MoodSprite mood = new MoodSprite(); - Parser parser = new Parser(); - List list = new ArrayList<>(2); Scanner in = new Scanner(System.in); System.out.println(mood.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); while (!input.equals("bye")) { - input = in.nextLine(); - if (input.equalsIgnoreCase("list")) { - printList(list); - } - else if (parser.isValidCommand(input)) { - list.add(parser.addTask(input)); - System.out.println("added: "+ list.get(list.size()-1)); - } - else if (input.contains("unmark ")) { - String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); - System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); - } - else if (input.contains("mark ")) { - String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); - System.out.println("Marked "+ Integer.parseInt(splitInput[1])); - } - else { - System.out.println(input); + input = in.nextLine(); + try { + mainLoop(input); + } catch (PythiaException pe) { + System.out.println("Not a valid command"); } - System.out.println(lineBreak); } System.out.println(mood.getHappy()+"Happy to help, have a great day.\n"+lineBreak); } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 9f3b251dc..061af0b7e 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -14,23 +14,32 @@ public String[] parseEvent(String task) { task = task.replaceFirst("event", ""); return splitTaskTrimmer((task.split("/"))); } - public Task addTask(String task) { + public Task addTask(String task) throws PythiaException{ String[] parsedTask; if (task.contains("todo ")) { task = task.replaceFirst("todo", ""); + if (task.isBlank()) { + throw new PythiaException(); + } return new Todo(task); } else if (task.contains("deadline ")) { parsedTask = parseDeadline(task); + if (parsedTask.length < 2) { + throw new PythiaException(); + } return new Deadline(parsedTask[0], parsedTask[1]); } else if (task.contains("event ")){ parsedTask = parseEvent(task); + if (parsedTask.length < 3) { + throw new PythiaException(); + } return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); } else { - return null; + throw new PythiaException(); } } - public boolean isValidCommand(String task) { + public boolean isTaskCommand(String task) { return (task.contains("todo") | task.contains("deadline") | task.contains("event")); } } From 99083da2980868104d71c779ddc462ee44e093a3 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Wed, 21 Feb 2024 23:24:57 +0800 Subject: [PATCH 08/23] Add package duke --- src/main/java/{ => duke}/Deadline.java | 30 +++--- src/main/java/{ => duke}/Duke.java | 2 + src/main/java/{ => duke}/Event.java | 35 +++---- src/main/java/{ => duke}/MoodSprite.java | 56 +++++------ src/main/java/{ => duke}/Parser.java | 92 ++++++++++--------- src/main/java/{ => duke}/PythiaException.java | 2 + src/main/java/{ => duke}/Task.java | 66 ++++++------- src/main/java/{ => duke}/Todo.java | 16 ++-- 8 files changed, 157 insertions(+), 142 deletions(-) rename src/main/java/{ => duke}/Deadline.java (96%) rename src/main/java/{ => duke}/Duke.java (99%) rename src/main/java/{ => duke}/Event.java (96%) rename src/main/java/{ => duke}/MoodSprite.java (98%) rename src/main/java/{ => duke}/Parser.java (97%) rename src/main/java/{ => duke}/PythiaException.java (77%) rename src/main/java/{ => duke}/Task.java (95%) rename src/main/java/{ => duke}/Todo.java (90%) diff --git a/src/main/java/Deadline.java b/src/main/java/duke/Deadline.java similarity index 96% rename from src/main/java/Deadline.java rename to src/main/java/duke/Deadline.java index 8276ed84d..1b07bd47a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/Deadline.java @@ -1,14 +1,16 @@ -public class Deadline extends Task { - protected String by; - - public Deadline(String description, String by) { - super(description); - this.by = by.replaceFirst("by", "by:"); - this.taskId = "[D]"; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description + " (" + by + ")"; - } -} +package duke; + +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by.replaceFirst("by", "by:"); + this.taskId = "[D]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (" + by + ")"; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 99% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index d81f87a2a..778935470 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,3 +1,5 @@ +package duke; + import java.util.ArrayList; import java.util.List; import java.util.Scanner; diff --git a/src/main/java/Event.java b/src/main/java/duke/Event.java similarity index 96% rename from src/main/java/Event.java rename to src/main/java/duke/Event.java index 8107f6d55..ae19c3cf3 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/Event.java @@ -1,17 +1,18 @@ - -public class Event extends Task{ - protected String from; - protected String to; - - public Event(String description, String from, String to) { - super(description); - this.from = from.replaceFirst("from", "from:"); - this.to = to.replaceFirst("to", "to:"); - this.taskId = "[E]"; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description + " (" + from + " " + to + ")"; - } -} +package duke; + +public class Event extends Task{ + protected String from; + protected String to; + + public Event(String description, String from, String to) { + super(description); + this.from = from.replaceFirst("from", "from:"); + this.to = to.replaceFirst("to", "to:"); + this.taskId = "[E]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (" + from + " " + to + ")"; + } +} diff --git a/src/main/java/MoodSprite.java b/src/main/java/duke/MoodSprite.java similarity index 98% rename from src/main/java/MoodSprite.java rename to src/main/java/duke/MoodSprite.java index 43e12a456..5db92b02a 100644 --- a/src/main/java/MoodSprite.java +++ b/src/main/java/duke/MoodSprite.java @@ -1,27 +1,29 @@ -public class MoodSprite { - private static final String HAPPY = " ███ \n" - + " ███████ \n" - + " ████ ████ \n" - + " ███ ███ \n" - + " ██ ██ \n" - + " ██ ██\n" - + " ███ ███ \n" - + " ███████████████ \n\n"; - - private static final String IDLE = " █████████████ \n" - + " ██ ██ \n" - + " ██ █████ ██ \n" - + " ██ █████ ██ \n" - + " ██ ██ \n" - + " █████████████ \n" - + " ██ ██\n" - + " ██████████████████ \n\n"; - - public String getHappy() { - return HAPPY; - } - - public String getIdle() { - return IDLE; - } -} +package duke; + +public class MoodSprite { + private static final String HAPPY = " ███ \n" + + " ███████ \n" + + " ████ ████ \n" + + " ███ ███ \n" + + " ██ ██ \n" + + " ██ ██\n" + + " ███ ███ \n" + + " ███████████████ \n\n"; + + private static final String IDLE = " █████████████ \n" + + " ██ ██ \n" + + " ██ █████ ██ \n" + + " ██ █████ ██ \n" + + " ██ ██ \n" + + " █████████████ \n" + + " ██ ██\n" + + " ██████████████████ \n\n"; + + public String getHappy() { + return HAPPY; + } + + public String getIdle() { + return IDLE; + } +} diff --git a/src/main/java/Parser.java b/src/main/java/duke/Parser.java similarity index 97% rename from src/main/java/Parser.java rename to src/main/java/duke/Parser.java index 061af0b7e..632e0d9a9 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,45 +1,47 @@ -public class Parser { - public String[] splitTaskTrimmer(String[] splitTask) { - for (int i = 0; i < splitTask.length; i++) { - splitTask[i] = splitTask[i].trim(); - } - return splitTask; - } - public String[] parseDeadline(String task) { - task = task.replaceFirst("deadline", ""); - return splitTaskTrimmer(task.split("/")); - } - - public String[] parseEvent(String task) { - task = task.replaceFirst("event", ""); - return splitTaskTrimmer((task.split("/"))); - } - public Task addTask(String task) throws PythiaException{ - String[] parsedTask; - if (task.contains("todo ")) { - task = task.replaceFirst("todo", ""); - if (task.isBlank()) { - throw new PythiaException(); - } - return new Todo(task); - } else if (task.contains("deadline ")) { - parsedTask = parseDeadline(task); - if (parsedTask.length < 2) { - throw new PythiaException(); - } - return new Deadline(parsedTask[0], parsedTask[1]); - } else if (task.contains("event ")){ - parsedTask = parseEvent(task); - if (parsedTask.length < 3) { - throw new PythiaException(); - } - return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); - } else { - throw new PythiaException(); - } - } - - public boolean isTaskCommand(String task) { - return (task.contains("todo") | task.contains("deadline") | task.contains("event")); - } -} +package duke; + +public class Parser { + public String[] splitTaskTrimmer(String[] splitTask) { + for (int i = 0; i < splitTask.length; i++) { + splitTask[i] = splitTask[i].trim(); + } + return splitTask; + } + public String[] parseDeadline(String task) { + task = task.replaceFirst("deadline", ""); + return splitTaskTrimmer(task.split("/")); + } + + public String[] parseEvent(String task) { + task = task.replaceFirst("event", ""); + return splitTaskTrimmer((task.split("/"))); + } + public Task addTask(String task) throws PythiaException{ + String[] parsedTask; + if (task.contains("todo ")) { + task = task.replaceFirst("todo", ""); + if (task.isBlank()) { + throw new PythiaException(); + } + return new Todo(task); + } else if (task.contains("deadline ")) { + parsedTask = parseDeadline(task); + if (parsedTask.length < 2) { + throw new PythiaException(); + } + return new Deadline(parsedTask[0], parsedTask[1]); + } else if (task.contains("event ")){ + parsedTask = parseEvent(task); + if (parsedTask.length < 3) { + throw new PythiaException(); + } + return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); + } else { + throw new PythiaException(); + } + } + + public boolean isTaskCommand(String task) { + return (task.contains("todo") | task.contains("deadline") | task.contains("event")); + } +} diff --git a/src/main/java/PythiaException.java b/src/main/java/duke/PythiaException.java similarity index 77% rename from src/main/java/PythiaException.java rename to src/main/java/duke/PythiaException.java index bd658d66e..a75b02021 100644 --- a/src/main/java/PythiaException.java +++ b/src/main/java/duke/PythiaException.java @@ -1,3 +1,5 @@ +package duke; + public class PythiaException extends Exception{ } diff --git a/src/main/java/Task.java b/src/main/java/duke/Task.java similarity index 95% rename from src/main/java/Task.java rename to src/main/java/duke/Task.java index 47e4e913a..7a1f97380 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/Task.java @@ -1,32 +1,34 @@ -public class Task { - protected String description; - protected boolean isDone; - protected String taskId; - - public Task(String description) { - this.description = description; - isDone = false; - } - - public void doneIsFalse() { - isDone = false; - } - - public void doneIsTrue() { - isDone = true; - } - - public String getDoneStatus() { - return (isDone ? "[X]" : "[ ]"); - } - - public String getDescription() { - return description; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description; - } - -} +package duke; + +public class Task { + protected String description; + protected boolean isDone; + protected String taskId; + + public Task(String description) { + this.description = description; + isDone = false; + } + + public void doneIsFalse() { + isDone = false; + } + + public void doneIsTrue() { + isDone = true; + } + + public String getDoneStatus() { + return (isDone ? "[X]" : "[ ]"); + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description; + } + +} diff --git a/src/main/java/Todo.java b/src/main/java/duke/Todo.java similarity index 90% rename from src/main/java/Todo.java rename to src/main/java/duke/Todo.java index 30962a529..09fa2edc5 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/duke/Todo.java @@ -1,7 +1,9 @@ -public class Todo extends Task{ - - public Todo (String description) { - super(description); - this.taskId = "[T]"; - } -} +package duke; + +public class Todo extends Task{ + + public Todo (String description) { + super(description); + this.taskId = "[T]"; + } +} From b18d968aab0bc41a48e0e3fcd746f3d6af18634e Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Wed, 21 Feb 2024 23:40:12 +0800 Subject: [PATCH 09/23] Add delete functionality --- src/main/java/duke/Duke.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 778935470..e53470fe7 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -36,6 +36,11 @@ else if (input.contains("mark ")) { list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); System.out.println("Marked "+ Integer.parseInt(splitInput[1])); } + else if (input.contains("delete ")) { + String[] splitInput = input.split(" "); + System.out.println("Deleted " + list.get(Integer.parseInt(splitInput[1])-1)); + list.remove(list.get(Integer.parseInt(splitInput[1])-1)); + } else { throw new PythiaException(); } From 11a53c85679a7ea525b8d844676cb7e4f8b291a0 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Thu, 22 Feb 2024 00:51:46 +0800 Subject: [PATCH 10/23] Add save functionality, jar file --- src/main/java/duke/Duke.java | 15 +++++++++++++++ src/main/java/savedList.txt | 0 src/main/out/CS2113.jar | Bin 0 -> 17100 bytes 3 files changed, 15 insertions(+) create mode 100644 src/main/java/savedList.txt create mode 100644 src/main/out/CS2113.jar diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 778935470..1a7f7ff6e 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,6 +1,8 @@ package duke; +import java.io.IOException; import java.util.ArrayList; +import java.io.FileWriter; import java.util.List; import java.util.Scanner; public class Duke { @@ -14,6 +16,13 @@ public static void printList(List list) { } } + public static void saveList() throws IOException { + FileWriter fileInput = new FileWriter("./ip/src/main/java/savedList.txt"); + for (int i = 0; i < list.size(); i++) { + fileInput.write(list.get(i).toString() + "\n"); + } + } + public static void mainLoop(String input) throws PythiaException { if (input.equalsIgnoreCase("list")) { printList(list); @@ -35,6 +44,12 @@ else if (input.contains("mark ")) { String[] splitInput = input.split(" "); list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); System.out.println("Marked "+ Integer.parseInt(splitInput[1])); + } else if (input.contains("save")) { + try { + saveList(); + } catch (IOException e) { + System.out.println("File not found"); + } } else { throw new PythiaException(); diff --git a/src/main/java/savedList.txt b/src/main/java/savedList.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/out/CS2113.jar b/src/main/out/CS2113.jar new file mode 100644 index 0000000000000000000000000000000000000000..08c991c6bf23c3518a5bf0cefd68fb480df62f0e GIT binary patch literal 17100 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 literal 0 HcmV?d00001 From 8dd0afc8261fa9e06a68dfbcdf045df987befe42 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Thu, 22 Feb 2024 00:53:54 +0800 Subject: [PATCH 11/23] Bug fix, add filewriter.close --- src/main/java/duke/Duke.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 1a7f7ff6e..9d0cba46b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -21,6 +21,7 @@ public static void saveList() throws IOException { for (int i = 0; i < list.size(); i++) { fileInput.write(list.get(i).toString() + "\n"); } + fileInput.close(); } public static void mainLoop(String input) throws PythiaException { From c2444c90def7779b9a76f4fcceff19e80b65e9f6 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Thu, 22 Feb 2024 13:02:58 +0800 Subject: [PATCH 12/23] Fix format for event printing, save list automatically --- src/main/java/duke/Duke.java | 14 +++++++------- src/main/java/duke/Event.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index a1036332d..320bb8910 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -5,6 +5,7 @@ import java.io.FileWriter; import java.util.List; import java.util.Scanner; +import java.io.File; public class Duke { private static MoodSprite mood = new MoodSprite(); private static List list = new ArrayList<>(2); @@ -17,7 +18,7 @@ public static void printList(List list) { } public static void saveList() throws IOException { - FileWriter fileInput = new FileWriter("./ip/src/main/java/savedList.txt"); + FileWriter fileInput = new FileWriter("./savedList.txt"); for (int i = 0; i < list.size(); i++) { fileInput.write(list.get(i).toString() + "\n"); } @@ -45,12 +46,6 @@ else if (input.contains("mark ")) { String[] splitInput = input.split(" "); list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); System.out.println("Marked "+ Integer.parseInt(splitInput[1])); - } else if (input.contains("save")) { - try { - saveList(); - } catch (IOException e) { - System.out.println("File not found"); - } } else if (input.contains("delete ")) { String[] splitInput = input.split(" "); @@ -60,6 +55,11 @@ else if (input.contains("delete ")) { else { throw new PythiaException(); } + try { + saveList(); + } catch (IOException e) { + System.out.println("savedList not found, creating now"); + } System.out.println(lineBreak); } public static void main(String[] args) { diff --git a/src/main/java/duke/Event.java b/src/main/java/duke/Event.java index ae19c3cf3..03d8f6d49 100644 --- a/src/main/java/duke/Event.java +++ b/src/main/java/duke/Event.java @@ -13,6 +13,6 @@ public Event(String description, String from, String to) { @Override public String toString() { - return taskId + this.getDoneStatus() + " " + description + " (" + from + " " + to + ")"; + return taskId + this.getDoneStatus() + " " + description + " (from: " + from + " to: " + to + ")"; } } From a608d2addb829329f87a0bf7e1ad54cf37e63aa7 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 23 Feb 2024 12:04:08 +0800 Subject: [PATCH 13/23] Bug fixes --- src/main/java/duke/Deadline.java | 32 +++++++-------- src/main/java/duke/Event.java | 36 ++++++++--------- src/main/java/duke/Task.java | 68 ++++++++++++++++---------------- src/main/java/duke/Todo.java | 18 ++++----- 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/main/java/duke/Deadline.java b/src/main/java/duke/Deadline.java index 1b07bd47a..edc7a1208 100644 --- a/src/main/java/duke/Deadline.java +++ b/src/main/java/duke/Deadline.java @@ -1,16 +1,16 @@ -package duke; - -public class Deadline extends Task { - protected String by; - - public Deadline(String description, String by) { - super(description); - this.by = by.replaceFirst("by", "by:"); - this.taskId = "[D]"; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description + " (" + by + ")"; - } -} +package duke; + +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by.replaceFirst("by", "by:"); + this.taskId = "[D]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (" + by + ")"; + } +} diff --git a/src/main/java/duke/Event.java b/src/main/java/duke/Event.java index 03d8f6d49..e0162a3b0 100644 --- a/src/main/java/duke/Event.java +++ b/src/main/java/duke/Event.java @@ -1,18 +1,18 @@ -package duke; - -public class Event extends Task{ - protected String from; - protected String to; - - public Event(String description, String from, String to) { - super(description); - this.from = from.replaceFirst("from", "from:"); - this.to = to.replaceFirst("to", "to:"); - this.taskId = "[E]"; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description + " (from: " + from + " to: " + to + ")"; - } -} +package duke; + +public class Event extends Task{ + protected String from; + protected String to; + + public Event(String description, String from, String to) { + super(description); + this.from = from.replaceFirst("from", "from:"); + this.to = to.replaceFirst("to", "to:"); + this.taskId = "[E]"; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description + " (from: " + from + " to: " + to + ")"; + } +} diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index 7a1f97380..90fb04107 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -1,34 +1,34 @@ -package duke; - -public class Task { - protected String description; - protected boolean isDone; - protected String taskId; - - public Task(String description) { - this.description = description; - isDone = false; - } - - public void doneIsFalse() { - isDone = false; - } - - public void doneIsTrue() { - isDone = true; - } - - public String getDoneStatus() { - return (isDone ? "[X]" : "[ ]"); - } - - public String getDescription() { - return description; - } - - @Override - public String toString() { - return taskId + this.getDoneStatus() + " " + description; - } - -} +package duke; + +public class Task { + protected String description; + protected boolean isDone; + protected String taskId; + + public Task(String description) { + this.description = description; + isDone = false; + } + + public void doneIsFalse() { + isDone = false; + } + + public void doneIsTrue() { + isDone = true; + } + + public String getDoneStatus() { + return (isDone ? "[X]" : "[ ]"); + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return taskId + this.getDoneStatus() + " " + description; + } + +} diff --git a/src/main/java/duke/Todo.java b/src/main/java/duke/Todo.java index 09fa2edc5..7de01e430 100644 --- a/src/main/java/duke/Todo.java +++ b/src/main/java/duke/Todo.java @@ -1,9 +1,9 @@ -package duke; - -public class Todo extends Task{ - - public Todo (String description) { - super(description); - this.taskId = "[T]"; - } -} +package duke; + +public class Todo extends Task{ + + public Todo (String description) { + super(description); + this.taskId = "[T]"; + } +} From 0639287f8ffb72111eb8464a8825cfdc91431041 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 23 Feb 2024 12:05:32 +0800 Subject: [PATCH 14/23] Refactor code, add command class, bug fix savedlist retrieval --- src/main/java/duke/Command.java | 77 ++++++++++++++ src/main/java/duke/Duke.java | 106 +++++-------------- src/main/java/duke/MoodSprite.java | 62 ++++++----- src/main/java/duke/Parser.java | 135 +++++++++++++++--------- src/main/java/duke/PythiaException.java | 10 +- src/main/java/savedList.txt | 1 + src/main/out/CS2113.jar | Bin 17100 -> 0 bytes 7 files changed, 231 insertions(+), 160 deletions(-) create mode 100644 src/main/java/duke/Command.java delete mode 100644 src/main/out/CS2113.jar diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java new file mode 100644 index 000000000..8122c506e --- /dev/null +++ b/src/main/java/duke/Command.java @@ -0,0 +1,77 @@ +package duke; + +import java.util.ArrayList; + +public class Command { + + public static void list(ArrayList list) { + for (int i = 0; i < list.size(); i++) { + System.out.println((i+1)+"."+list.get(i)); + } + } + + public static void tryAddTask(String input, ArrayList list, ArrayList stringList) { + try { + list.add(addTask(input)); + stringList.add(input); + System.out.println("added: " + list.get(list.size() - 1)); + } catch (PythiaException pe) { + System.out.println("Please provide a proper input"); + } + } + + public static void directAddTask(String input, ArrayList list, ArrayList stringList) { + try { + list.add(addTask(input)); + stringList.add(input); + } catch (PythiaException pe) { + System.out.println("Please provide a proper input"); + } + } + + public static Task addTask(String task) throws PythiaException{ + Parser taskParser = new Parser(); + String[] parsedTask; + if (task.contains("todo ")) { + task = task.replaceFirst("todo", ""); + if (task.isBlank()) { + throw new PythiaException(); + } + return new Todo(task); + } else if (task.contains("deadline ")) { + parsedTask = taskParser.parseDeadline(task); + if (parsedTask.length < 2) { + throw new PythiaException(); + } + return new Deadline(parsedTask[0], parsedTask[1]); + } else if (task.contains("event ")){ + parsedTask = taskParser.parseEvent(task); + if (parsedTask.length < 3) { + throw new PythiaException(); + } + return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); + } else { + throw new PythiaException(); + } + } + + public static void unmark(String input, ArrayList list) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); + System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); + } + + public static void mark(String input, ArrayList list) { + String[] splitInput = input.split(" "); + list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); + System.out.println("Marked "+ Integer.parseInt(splitInput[1])); + } + + public static void delete(String input, ArrayList list, ArrayList stringList) { + String[] splitInput = input.split(" "); + int indexToRemove = Integer.parseInt(splitInput[1])-1; + System.out.println("Deleted " + list.get(Integer.parseInt(splitInput[1])-1)); + list.remove(list.get(indexToRemove)); + stringList.remove(stringList.get(indexToRemove)); + } +} diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 320bb8910..e418dcd0a 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,79 +1,27 @@ -package duke; - -import java.io.IOException; -import java.util.ArrayList; -import java.io.FileWriter; -import java.util.List; -import java.util.Scanner; -import java.io.File; -public class Duke { - private static MoodSprite mood = new MoodSprite(); - private static List list = new ArrayList<>(2); - private static Parser parser = new Parser(); - private static final String lineBreak = "----------------------------------------------------------"; - public static void printList(List list) { - for (int i = 0; i < list.size(); i++) { - System.out.println((i+1)+"."+list.get(i)); - } - } - - public static void saveList() throws IOException { - FileWriter fileInput = new FileWriter("./savedList.txt"); - for (int i = 0; i < list.size(); i++) { - fileInput.write(list.get(i).toString() + "\n"); - } - fileInput.close(); - } - - public static void mainLoop(String input) throws PythiaException { - if (input.equalsIgnoreCase("list")) { - printList(list); - } - else if (parser.isTaskCommand(input)) { - try { - list.add(parser.addTask(input)); - System.out.println("added: " + list.get(list.size() - 1)); - } catch (PythiaException pe) { - System.out.println("Please provide a proper input"); - } - } - else if (input.contains("unmark ")) { - String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); - System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); - } - else if (input.contains("mark ")) { - String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); - System.out.println("Marked "+ Integer.parseInt(splitInput[1])); - } - else if (input.contains("delete ")) { - String[] splitInput = input.split(" "); - System.out.println("Deleted " + list.get(Integer.parseInt(splitInput[1])-1)); - list.remove(list.get(Integer.parseInt(splitInput[1])-1)); - } - else { - throw new PythiaException(); - } - try { - saveList(); - } catch (IOException e) { - System.out.println("savedList not found, creating now"); - } - System.out.println(lineBreak); - } - public static void main(String[] args) { - String input = "Start"; - Scanner in = new Scanner(System.in); - System.out.println(mood.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+lineBreak); - while (!input.equals("bye")) { - input = in.nextLine(); - try { - mainLoop(input); - } catch (PythiaException pe) { - System.out.println("Not a valid command"); - } - } - System.out.println(mood.getHappy()+"Happy to help, have a great day.\n"+lineBreak); - } -} +package duke; + +import java.util.Scanner; +public class Duke { + private static Parser parser = new Parser(); + + public static void mainLoop(String input) { + try { + parser.parseInput(input); + } catch (PythiaException pe) { + System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); + } + } + + public static void main(String[] args) { + String input = "Start"; + Scanner in = new Scanner(System.in); + //System.out.println("Working Directory = " + System.getProperty("user.dir") + "\n"); + System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+ MoodSprite.getLineBreak()); + parser.tryRetrieveList(); + while (!input.equals("bye")) { + input = in.nextLine(); + mainLoop(input); + } + System.out.println(MoodSprite.getHappy()+"Happy to help, have a great day.\n"+ MoodSprite.getLineBreak()); + } +} diff --git a/src/main/java/duke/MoodSprite.java b/src/main/java/duke/MoodSprite.java index 5db92b02a..e2bcd3a3f 100644 --- a/src/main/java/duke/MoodSprite.java +++ b/src/main/java/duke/MoodSprite.java @@ -1,29 +1,33 @@ -package duke; - -public class MoodSprite { - private static final String HAPPY = " ███ \n" - + " ███████ \n" - + " ████ ████ \n" - + " ███ ███ \n" - + " ██ ██ \n" - + " ██ ██\n" - + " ███ ███ \n" - + " ███████████████ \n\n"; - - private static final String IDLE = " █████████████ \n" - + " ██ ██ \n" - + " ██ █████ ██ \n" - + " ██ █████ ██ \n" - + " ██ ██ \n" - + " █████████████ \n" - + " ██ ██\n" - + " ██████████████████ \n\n"; - - public String getHappy() { - return HAPPY; - } - - public String getIdle() { - return IDLE; - } -} +package duke; + +public class MoodSprite { + private static final String HAPPY = " ███ \n" + + " ███████ \n" + + " ████ ████ \n" + + " ███ ███ \n" + + " ██ ██ \n" + + " ██ ██\n" + + " ███ ███ \n" + + " ███████████████ \n\n"; + + private static final String IDLE = " █████████████ \n" + + " ██ ██ \n" + + " ██ █████ ██ \n" + + " ██ █████ ██ \n" + + " ██ ██ \n" + + " █████████████ \n" + + " ██ ██\n" + + " ██████████████████ \n\n"; + + private static final String LINEBREAK = "----------------------------------------------------------"; + + public static String getHappy() { + return HAPPY; + } + + public static String getIdle() { + return IDLE; + } + + public static String getLineBreak() {return LINEBREAK;} +} diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 632e0d9a9..8227cdb06 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,47 +1,88 @@ -package duke; - -public class Parser { - public String[] splitTaskTrimmer(String[] splitTask) { - for (int i = 0; i < splitTask.length; i++) { - splitTask[i] = splitTask[i].trim(); - } - return splitTask; - } - public String[] parseDeadline(String task) { - task = task.replaceFirst("deadline", ""); - return splitTaskTrimmer(task.split("/")); - } - - public String[] parseEvent(String task) { - task = task.replaceFirst("event", ""); - return splitTaskTrimmer((task.split("/"))); - } - public Task addTask(String task) throws PythiaException{ - String[] parsedTask; - if (task.contains("todo ")) { - task = task.replaceFirst("todo", ""); - if (task.isBlank()) { - throw new PythiaException(); - } - return new Todo(task); - } else if (task.contains("deadline ")) { - parsedTask = parseDeadline(task); - if (parsedTask.length < 2) { - throw new PythiaException(); - } - return new Deadline(parsedTask[0], parsedTask[1]); - } else if (task.contains("event ")){ - parsedTask = parseEvent(task); - if (parsedTask.length < 3) { - throw new PythiaException(); - } - return new Event(parsedTask[0], parsedTask[1], parsedTask[2]); - } else { - throw new PythiaException(); - } - } - - public boolean isTaskCommand(String task) { - return (task.contains("todo") | task.contains("deadline") | task.contains("event")); - } -} +package duke; + +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.io.File; +import java.util.Scanner; + +public class Parser { + private ArrayList parsedTaskList = new ArrayList<>(2); + private ArrayList unparsedTaskList = new ArrayList<>(2); + + public void trySaveList() { + try { + saveList(); + } catch (IOException e) { + System.out.println("savedList not found, creating now"); + } + } + + public void saveList() throws IOException { + FileWriter fileInput = new FileWriter("./savedList.txt"); + for (int i = 0; i < unparsedTaskList.size(); i++) { + fileInput.write(unparsedTaskList.get(i) + "\n"); + } + fileInput.close(); + } + + public void tryRetrieveList() { + try { + retrieveList(); + } + catch (FileNotFoundException e) { + System.out.println("File does not exist"); + } + } + + public void retrieveList() throws FileNotFoundException { + File f = new File("./savedList.txt"); + Scanner in = new Scanner(f); + while (in.hasNext()) { + Command.directAddTask(in.nextLine(), parsedTaskList, unparsedTaskList); + } + } + + public void parseInput(String input) throws PythiaException { + if (input.equalsIgnoreCase("list")) { + Command.list(parsedTaskList); + } + else if (isTaskCommand(input)) { + Command.tryAddTask(input, parsedTaskList, unparsedTaskList); + } + else if (input.contains("unmark ")) { + Command.unmark(input, parsedTaskList); + } + else if (input.contains("mark ")) { + Command.mark(input, parsedTaskList); + } + else if (input.contains("delete ")) { + Command.delete(input, parsedTaskList, unparsedTaskList); + } + else { + throw new PythiaException(); + } + trySaveList(); + System.out.println(MoodSprite.getLineBreak()); + } + public String[] splitTaskTrimmer(String[] splitTask) { + for (int i = 0; i < splitTask.length; i++) { + splitTask[i] = splitTask[i].trim(); + } + return splitTask; + } + public String[] parseDeadline(String task) { + task = task.replaceFirst("deadline", ""); + return splitTaskTrimmer(task.split("/")); + } + + public String[] parseEvent(String task) { + task = task.replaceFirst("event", ""); + return splitTaskTrimmer((task.split("/"))); + } + + public boolean isTaskCommand(String task) { + return (task.contains("todo") | task.contains("deadline") | task.contains("event")); + } +} diff --git a/src/main/java/duke/PythiaException.java b/src/main/java/duke/PythiaException.java index a75b02021..828b7d9f8 100644 --- a/src/main/java/duke/PythiaException.java +++ b/src/main/java/duke/PythiaException.java @@ -1,5 +1,5 @@ -package duke; - -public class PythiaException extends Exception{ - -} +package duke; + +public class PythiaException extends Exception{ + +} diff --git a/src/main/java/savedList.txt b/src/main/java/savedList.txt index e69de29bb..e8ec059ec 100644 --- a/src/main/java/savedList.txt +++ b/src/main/java/savedList.txt @@ -0,0 +1 @@ +[E][ ] ijaaz attend CS2113 lecture Friday 23 Feb 2024 (4pm 6pm) diff --git a/src/main/out/CS2113.jar b/src/main/out/CS2113.jar deleted file mode 100644 index 08c991c6bf23c3518a5bf0cefd68fb480df62f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17100 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 From bfffd2bfe1d5ee4c00e36b75a1a899f2349c81b2 Mon Sep 17 00:00:00 2001 From: "LAPTOP-6F19PDN9\\Ijaaz" Date: Wed, 6 Mar 2024 22:53:22 +0800 Subject: [PATCH 15/23] Add find functionality --- src/main/java/duke/Command.java | 14 ++++++++++++++ src/main/java/duke/Duke.java | 1 - src/main/java/duke/Parser.java | 22 +++++++++------------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 8122c506e..4e7d19f70 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -74,4 +74,18 @@ public static void delete(String input, ArrayList list, ArrayList list.remove(list.get(indexToRemove)); stringList.remove(stringList.get(indexToRemove)); } + + public static void find(String input, ArrayList list) { + boolean isFound = false; + String[] splitInput = input.split(" "); + for (int i = 0; i < list.size(); i++) { + if (list.get(i).getDescription().contains(splitInput[1])) { + isFound = true; + System.out.println(list.get(i)); + } + } + if (!isFound) { + System.out.println("No such keyword exists"); + } + } } diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index e418dcd0a..5c73ff81d 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -15,7 +15,6 @@ public static void mainLoop(String input) { public static void main(String[] args) { String input = "Start"; Scanner in = new Scanner(System.in); - //System.out.println("Working Directory = " + System.getProperty("user.dir") + "\n"); System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+ MoodSprite.getLineBreak()); parser.tryRetrieveList(); while (!input.equals("bye")) { diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 8227cdb06..dce7105ed 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -30,9 +30,8 @@ public void saveList() throws IOException { public void tryRetrieveList() { try { retrieveList(); - } - catch (FileNotFoundException e) { - System.out.println("File does not exist"); + } catch (FileNotFoundException e) { + System.out.println("Saved list not found, creating now"); } } @@ -47,20 +46,17 @@ public void retrieveList() throws FileNotFoundException { public void parseInput(String input) throws PythiaException { if (input.equalsIgnoreCase("list")) { Command.list(parsedTaskList); - } - else if (isTaskCommand(input)) { + } else if (isTaskCommand(input)) { Command.tryAddTask(input, parsedTaskList, unparsedTaskList); - } - else if (input.contains("unmark ")) { + } else if (input.contains("unmark ")) { Command.unmark(input, parsedTaskList); - } - else if (input.contains("mark ")) { + } else if (input.contains("mark ")) { Command.mark(input, parsedTaskList); - } - else if (input.contains("delete ")) { + } else if (input.contains("delete ")) { Command.delete(input, parsedTaskList, unparsedTaskList); - } - else { + } else if (input.contains("find ")) { + Command.find(input, parsedTaskList); + } else { throw new PythiaException(); } trySaveList(); From 8c70edb317166f9e282241f81f14b62f41408e10 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 01:06:19 +0800 Subject: [PATCH 16/23] Add UI, TaskList, unparsedTaskList and Storage classes --- src/main/java/duke/Command.java | 48 ++++++++++---------- src/main/java/duke/Duke.java | 29 +++++------- src/main/java/duke/Parser.java | 56 ++++-------------------- src/main/java/duke/Storage.java | 42 ++++++++++++++++++ src/main/java/duke/TaskList.java | 24 ++++++++++ src/main/java/duke/UI.java | 22 ++++++++++ src/main/java/duke/UnparsedTaskList.java | 23 ++++++++++ src/main/java/savedList.txt | 1 - 8 files changed, 155 insertions(+), 90 deletions(-) create mode 100644 src/main/java/duke/Storage.java create mode 100644 src/main/java/duke/TaskList.java create mode 100644 src/main/java/duke/UI.java create mode 100644 src/main/java/duke/UnparsedTaskList.java delete mode 100644 src/main/java/savedList.txt diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 4e7d19f70..3354850a1 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -1,29 +1,29 @@ package duke; -import java.util.ArrayList; - public class Command { + private static TaskList taskList = new TaskList(); + private static UnparsedTaskList inputList = new UnparsedTaskList(); - public static void list(ArrayList list) { - for (int i = 0; i < list.size(); i++) { - System.out.println((i+1)+"."+list.get(i)); + public static void list() { + for (int i = 0; i < taskList.size(); i++) { + System.out.println((i+1)+"."+taskList.get(i)); } } - public static void tryAddTask(String input, ArrayList list, ArrayList stringList) { + public static void tryAddTask(String input) { try { - list.add(addTask(input)); - stringList.add(input); - System.out.println("added: " + list.get(list.size() - 1)); + taskList.add(addTask(input)); + inputList.add(input); + System.out.println("added: " + taskList.get(taskList.size() - 1)); } catch (PythiaException pe) { System.out.println("Please provide a proper input"); } } - public static void directAddTask(String input, ArrayList list, ArrayList stringList) { + public static void directAddTask(String input) { try { - list.add(addTask(input)); - stringList.add(input); + taskList.add(addTask(input)); + inputList.add(input); } catch (PythiaException pe) { System.out.println("Please provide a proper input"); } @@ -55,33 +55,33 @@ public static Task addTask(String task) throws PythiaException{ } } - public static void unmark(String input, ArrayList list) { + public static void unmark(String input) { String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); + taskList.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); } - public static void mark(String input, ArrayList list) { + public static void mark(String input) { String[] splitInput = input.split(" "); - list.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); + taskList.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); System.out.println("Marked "+ Integer.parseInt(splitInput[1])); } - public static void delete(String input, ArrayList list, ArrayList stringList) { + public static void delete(String input) { String[] splitInput = input.split(" "); int indexToRemove = Integer.parseInt(splitInput[1])-1; - System.out.println("Deleted " + list.get(Integer.parseInt(splitInput[1])-1)); - list.remove(list.get(indexToRemove)); - stringList.remove(stringList.get(indexToRemove)); + System.out.println("Deleted " + taskList.get(Integer.parseInt(splitInput[1])-1)); + taskList.remove(taskList.get(indexToRemove)); + inputList.remove(inputList.get(indexToRemove)); } - public static void find(String input, ArrayList list) { + public static void find(String input) { boolean isFound = false; String[] splitInput = input.split(" "); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getDescription().contains(splitInput[1])) { + for (int i = 0; i < taskList.size(); i++) { + if (taskList.get(i).getDescription().contains(splitInput[1])) { isFound = true; - System.out.println(list.get(i)); + System.out.println(taskList.get(i)); } } if (!isFound) { diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 5c73ff81d..5a6f0b270 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,26 +1,21 @@ package duke; - -import java.util.Scanner; public class Duke { - private static Parser parser = new Parser(); + private UI input; + private Storage storage; - public static void mainLoop(String input) { - try { - parser.parseInput(input); - } catch (PythiaException pe) { - System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); - } + public Duke() { + input = new UI(); + storage = new Storage(); } - public static void main(String[] args) { - String input = "Start"; - Scanner in = new Scanner(System.in); + public void run() { System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+ MoodSprite.getLineBreak()); - parser.tryRetrieveList(); - while (!input.equals("bye")) { - input = in.nextLine(); - mainLoop(input); - } + storage.tryRetrieveList(); + input.mainLoop(); System.out.println(MoodSprite.getHappy()+"Happy to help, have a great day.\n"+ MoodSprite.getLineBreak()); } + + public static void main(String[] args) { + new Duke().run(); + } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index dce7105ed..c126b928b 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,65 +1,25 @@ package duke; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.io.File; -import java.util.Scanner; - public class Parser { - private ArrayList parsedTaskList = new ArrayList<>(2); - private ArrayList unparsedTaskList = new ArrayList<>(2); - - public void trySaveList() { - try { - saveList(); - } catch (IOException e) { - System.out.println("savedList not found, creating now"); - } - } - - public void saveList() throws IOException { - FileWriter fileInput = new FileWriter("./savedList.txt"); - for (int i = 0; i < unparsedTaskList.size(); i++) { - fileInput.write(unparsedTaskList.get(i) + "\n"); - } - fileInput.close(); - } - - public void tryRetrieveList() { - try { - retrieveList(); - } catch (FileNotFoundException e) { - System.out.println("Saved list not found, creating now"); - } - } - - public void retrieveList() throws FileNotFoundException { - File f = new File("./savedList.txt"); - Scanner in = new Scanner(f); - while (in.hasNext()) { - Command.directAddTask(in.nextLine(), parsedTaskList, unparsedTaskList); - } - } + private Storage storage = new Storage(); public void parseInput(String input) throws PythiaException { if (input.equalsIgnoreCase("list")) { - Command.list(parsedTaskList); + Command.list(); } else if (isTaskCommand(input)) { - Command.tryAddTask(input, parsedTaskList, unparsedTaskList); + Command.tryAddTask(input); } else if (input.contains("unmark ")) { - Command.unmark(input, parsedTaskList); + Command.unmark(input); } else if (input.contains("mark ")) { - Command.mark(input, parsedTaskList); + Command.mark(input); } else if (input.contains("delete ")) { - Command.delete(input, parsedTaskList, unparsedTaskList); + Command.delete(input); } else if (input.contains("find ")) { - Command.find(input, parsedTaskList); + Command.find(input); } else { throw new PythiaException(); } - trySaveList(); + storage.trySaveList(); System.out.println(MoodSprite.getLineBreak()); } public String[] splitTaskTrimmer(String[] splitTask) { diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java new file mode 100644 index 000000000..e624be650 --- /dev/null +++ b/src/main/java/duke/Storage.java @@ -0,0 +1,42 @@ +package duke; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; + +public class Storage { + private static UnparsedTaskList inputList = new UnparsedTaskList(); + public void trySaveList() { + try { + saveList(); + } catch (IOException e) { + System.out.println("savedList not found, creating now"); + } + } + + public void saveList() throws IOException { + FileWriter fileInput = new FileWriter("./savedList.txt"); + for (int i = 0; i < inputList.size(); i++) { + fileInput.write(inputList.get(i) + "\n"); + } + fileInput.close(); + } + + public void tryRetrieveList() { + try { + retrieveList(); + } catch (FileNotFoundException e) { + System.out.println("Saved list not found, creating now"); + } + } + + public void retrieveList() throws FileNotFoundException { + File f = new File("./savedList.txt"); + Scanner in = new Scanner(f); + while (in.hasNext()) { + Command.directAddTask(in.nextLine()); + } + } +} diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java new file mode 100644 index 000000000..b8319fa74 --- /dev/null +++ b/src/main/java/duke/TaskList.java @@ -0,0 +1,24 @@ +package duke; + +import java.util.ArrayList; + +public class TaskList { + private static ArrayList parsedTaskList = new ArrayList<>(2); + + public Task get(int i) { + return parsedTaskList.get(i); + } + + public void add(Task input) { + parsedTaskList.add(input); + } + + public void remove(Task input) { + parsedTaskList.remove(input); + } + + public int size() { + return parsedTaskList.size(); + } + +} diff --git a/src/main/java/duke/UI.java b/src/main/java/duke/UI.java new file mode 100644 index 000000000..2f3cf94fc --- /dev/null +++ b/src/main/java/duke/UI.java @@ -0,0 +1,22 @@ +package duke; +import java.util.Scanner; + +public class UI { + private Parser parser = new Parser(); + + public void tryParseInput(String input) { + try { + parser.parseInput(input); + } catch (PythiaException pe) { + System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); + } + } + public void mainLoop() { + String input = "Start"; + Scanner in = new Scanner(System.in); + while (!input.equals("bye")) { + input = in.nextLine(); + tryParseInput(input); + } + } +} diff --git a/src/main/java/duke/UnparsedTaskList.java b/src/main/java/duke/UnparsedTaskList.java new file mode 100644 index 000000000..0a7e40263 --- /dev/null +++ b/src/main/java/duke/UnparsedTaskList.java @@ -0,0 +1,23 @@ +package duke; + +import java.util.ArrayList; + +public class UnparsedTaskList { + private static ArrayList unparsedTaskList = new ArrayList<>(2); + + public String get(int i) { + return unparsedTaskList.get(i); + } + + public void add(String input) { + unparsedTaskList.add(input); + } + + public void remove(String input) { + unparsedTaskList.remove(input); + } + + public int size() { + return unparsedTaskList.size(); + } +} diff --git a/src/main/java/savedList.txt b/src/main/java/savedList.txt deleted file mode 100644 index e8ec059ec..000000000 --- a/src/main/java/savedList.txt +++ /dev/null @@ -1 +0,0 @@ -[E][ ] ijaaz attend CS2113 lecture Friday 23 Feb 2024 (4pm 6pm) From 8fbb3605b4716b04d81b331262f59bda96fc81a1 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 13:35:48 +0800 Subject: [PATCH 17/23] Add JavaDoc for UI, Parser and Command classes --- src/main/java/duke/Command.java | 43 ++++++++++++++++++++++++++++++ src/main/java/duke/Parser.java | 46 +++++++++++++++++++++++++++++++++ src/main/java/duke/UI.java | 15 +++++------ 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 3354850a1..23c3b60a8 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -4,12 +4,22 @@ public class Command { private static TaskList taskList = new TaskList(); private static UnparsedTaskList inputList = new UnparsedTaskList(); + /** + * Prints out all items in the task list + */ public static void list() { for (int i = 0; i < taskList.size(); i++) { System.out.println((i+1)+"."+taskList.get(i)); } } + /** + * Tries to add a task to the task list. + * If a proper command is not given asks user to provide a proper input + * Also adds the raw command into the inputlist to be saved on their device + * + * @param input Input provided by the user + */ public static void tryAddTask(String input) { try { taskList.add(addTask(input)); @@ -20,6 +30,12 @@ public static void tryAddTask(String input) { } } + /** + * Adds a task without the 'added ...' message appearing + * Used only on startup when the locally saved list is retrieved + * + * @param input Input from the savedlist.txt file + */ public static void directAddTask(String input) { try { taskList.add(addTask(input)); @@ -29,6 +45,13 @@ public static void directAddTask(String input) { } } + /** + * Parses the input string and returns the appropriate task type + * + * @param task The user input the contains the task command + * @return A Task type variable + * @throws PythiaException Thrown if the required number of fields are not present + */ public static Task addTask(String task) throws PythiaException{ Parser taskParser = new Parser(); String[] parsedTask; @@ -55,18 +78,33 @@ public static Task addTask(String task) throws PythiaException{ } } + /** + * Updates the Done status of a task to be false + * + * @param input The user input that contains the unmark command + */ public static void unmark(String input) { String[] splitInput = input.split(" "); taskList.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); } + /** + * Updates the Done status of a task to be true + * + * @param input The user input that contains the mark command + */ public static void mark(String input) { String[] splitInput = input.split(" "); taskList.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); System.out.println("Marked "+ Integer.parseInt(splitInput[1])); } + /** + * Deletes a specific task from both the taskList and the inputList + * + * @param input The user input that contains the index of the item they want to delete + */ public static void delete(String input) { String[] splitInput = input.split(" "); int indexToRemove = Integer.parseInt(splitInput[1])-1; @@ -75,6 +113,11 @@ public static void delete(String input) { inputList.remove(inputList.get(indexToRemove)); } + /** + * Finds and prints all tasks that contain the keyword specified by the user + * + * @param input User input that contains the keyword they would like to find + */ public static void find(String input) { boolean isFound = false; String[] splitInput = input.split(" "); diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index c126b928b..ed4ff51c3 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -3,6 +3,26 @@ public class Parser { private Storage storage = new Storage(); + /** + * Tries to parse the input. + * If an exception is thrown prints out that it is not a valid command + * + * @param input The user input read from UI + */ + public void tryParseInput(String input) { + try { + parseInput(input); + } catch (PythiaException pe) { + System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); + } + } + + /** + * Parses the input to determine what command was given and executes the relevant command + * + * @param input Input given by user + * @throws PythiaException Thrown if no recognised commands are found in the user input + */ public void parseInput(String input) throws PythiaException { if (input.equalsIgnoreCase("list")) { Command.list(); @@ -22,22 +42,48 @@ public void parseInput(String input) throws PythiaException { storage.trySaveList(); System.out.println(MoodSprite.getLineBreak()); } + + /** + * Removes any extra spaces for each of the inputs + * + * @param splitTask An array which contains a split version of the user input + * @return Trimmed split array + */ public String[] splitTaskTrimmer(String[] splitTask) { for (int i = 0; i < splitTask.length; i++) { splitTask[i] = splitTask[i].trim(); } return splitTask; } + + /** + * Parses the input containing deadline command + * + * @param task The deadline command provided by the user + * @return A array with just the time of the deadline + */ public String[] parseDeadline(String task) { task = task.replaceFirst("deadline", ""); return splitTaskTrimmer(task.split("/")); } + /** + * Parses an input containing an event command + * + * @param task The event command provided by the user + * @return An array with the start and end times of the event + */ public String[] parseEvent(String task) { task = task.replaceFirst("event", ""); return splitTaskTrimmer((task.split("/"))); } + /** + * Determines if a string contains one of the task related commands (todo, deadline, event) + * + * @param task The string containing the input from the user + * @return True if the input contains a task command and false otherwise + */ public boolean isTaskCommand(String task) { return (task.contains("todo") | task.contains("deadline") | task.contains("event")); } diff --git a/src/main/java/duke/UI.java b/src/main/java/duke/UI.java index 2f3cf94fc..6357762be 100644 --- a/src/main/java/duke/UI.java +++ b/src/main/java/duke/UI.java @@ -1,22 +1,21 @@ package duke; import java.util.Scanner; +/** + * A class that acts as the User Interface (UI) to take in inputs from the user + */ public class UI { private Parser parser = new Parser(); - public void tryParseInput(String input) { - try { - parser.parseInput(input); - } catch (PythiaException pe) { - System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); - } - } + /** + * the main loop of the programme which keeps running until the user inputs 'bye' + */ public void mainLoop() { String input = "Start"; Scanner in = new Scanner(System.in); while (!input.equals("bye")) { input = in.nextLine(); - tryParseInput(input); + parser.tryParseInput(input); } } } From 1f2ea47395f158787cd9484147c480d0eac37344 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 15:57:30 +0800 Subject: [PATCH 18/23] Add JavaDoc headers for Duke, Storage, TaskList and UnparsedTaskList --- src/main/java/duke/Command.java | 3 +++ src/main/java/duke/Duke.java | 10 ++++++++++ src/main/java/duke/Storage.java | 20 +++++++++++++++++++ src/main/java/duke/TaskList.java | 25 +++++++++++++++++++++++- src/main/java/duke/UnparsedTaskList.java | 24 +++++++++++++++++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 23c3b60a8..24966ef5a 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -1,5 +1,8 @@ package duke; +/** + * Class that contains the executions for all possible commands + */ public class Command { private static TaskList taskList = new TaskList(); private static UnparsedTaskList inputList = new UnparsedTaskList(); diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 5a6f0b270..8bd8f4773 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,13 +1,23 @@ package duke; + +/** + * Main class of the programme + */ public class Duke { private UI input; private Storage storage; + /** + * Constructor class to instantiate variables + */ public Duke() { input = new UI(); storage = new Storage(); } + /** + * Main logic flow of the programme + */ public void run() { System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+ MoodSprite.getLineBreak()); storage.tryRetrieveList(); diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index e624be650..6feeb5b0a 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -6,8 +6,15 @@ import java.io.IOException; import java.util.Scanner; +/** + * Class that deals with storage and retrieval of task list + */ public class Storage { private static UnparsedTaskList inputList = new UnparsedTaskList(); + + /** + * Tries to save the list locally if the file is not found it creates it instead + */ public void trySaveList() { try { saveList(); @@ -16,6 +23,11 @@ public void trySaveList() { } } + /** + * Saves list the list locally the users device so that the list data can be later retrieved + * + * @throws IOException Thrown savedList.txt is not found + */ public void saveList() throws IOException { FileWriter fileInput = new FileWriter("./savedList.txt"); for (int i = 0; i < inputList.size(); i++) { @@ -24,6 +36,9 @@ public void saveList() throws IOException { fileInput.close(); } + /** + * Tries to retrieve the list stored locally, prints error message if the list does not exist + */ public void tryRetrieveList() { try { retrieveList(); @@ -32,6 +47,11 @@ public void tryRetrieveList() { } } + /** + * Reads from locally saved text file and adds the tasks to the task list, creates file if it doesnt exist + * + * @throws FileNotFoundException Thrown when the file does not exist + */ public void retrieveList() throws FileNotFoundException { File f = new File("./savedList.txt"); Scanner in = new Scanner(f); diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index b8319fa74..713492def 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -2,23 +2,46 @@ import java.util.ArrayList; +/** + * Class that holds all the parsed tasks + */ public class TaskList { private static ArrayList parsedTaskList = new ArrayList<>(2); + /** + * Returns the Task at the chosen index + * + * @param i The chosen index + * @return The chosen Task + */ public Task get(int i) { return parsedTaskList.get(i); } + /** + * Adds the Task into the list + * + * @param input Task that is to be added to the list + */ public void add(Task input) { parsedTaskList.add(input); } + /** + * Removes chosen Task from list + * + * @param input Task to be removed + */ public void remove(Task input) { parsedTaskList.remove(input); } + /** + * Returns the current size of the task list + * + * @return Length of list + */ public int size() { return parsedTaskList.size(); } - } diff --git a/src/main/java/duke/UnparsedTaskList.java b/src/main/java/duke/UnparsedTaskList.java index 0a7e40263..985b09e59 100644 --- a/src/main/java/duke/UnparsedTaskList.java +++ b/src/main/java/duke/UnparsedTaskList.java @@ -2,21 +2,45 @@ import java.util.ArrayList; +/** + * Class contains a static list that holds unparsed task commands, to be saved locally to the users device + */ public class UnparsedTaskList { private static ArrayList unparsedTaskList = new ArrayList<>(2); + /** + * Returns the unparsed task at the chosen index + * + * @param i The chosen index + * @return The chosen unparsed task + */ public String get(int i) { return unparsedTaskList.get(i); } + /** + * Adds the unparsed task into the list + * + * @param input unparsed task that is to be added to the list + */ public void add(String input) { unparsedTaskList.add(input); } + /** + * Removes chosen unparsed task from list + * + * @param input Unparsed task to be removed + */ public void remove(String input) { unparsedTaskList.remove(input); } + /** + * Returns the current size of the unparsed task list + * + * @return Length of list + */ public int size() { return unparsedTaskList.size(); } From 1347803d335a230993e351c5a64f181ff7ac8568 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 17:10:10 +0800 Subject: [PATCH 19/23] Edit made to README.md file --- docs/README.md | 140 +++++++++++++++++++++++++++++--- src/main/java/duke/Command.java | 4 +- 2 files changed, 131 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8077118eb..0cb1e1314 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,147 @@ # User Guide -## Features +## Features -### Feature-ABC +### `todo` -Description of the feature. +Add a todo task (task with no due date) -### Feature-XYZ +Format: `todo [TASK]` -Description of the feature. +Example of usage: -## Usage +`todo placeholder1` -### `Keyword` - Describe action +Expected outcome: +``` +added: [T][ ] placeholder1 +---------------------------------------------------------- +``` + +### `deadline` + +Add a deadline task (task with a due date) + +Format: `deadline [TASK] /[DUEDATE]` + +Example of usage: + +`deadline placeholder2 /June 25th 6pm` + +Expected outcome: +``` +added: [D][ ] placeholder2 (June 25th 6pm) +---------------------------------------------------------- +``` + +### `event` + +Add an event task (task with a start and end time) + +Format: `event [TASK] /[STARTTIME] /[ENDTIME]` -Describe the action and its outcome. +Example of usage: + +`event placeholder3 /3pm /6pm` + +Expected outcome: +``` +added: [E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- +``` + +### `list` + +Lists all tasks currently in the list + +Format: `list` Example of usage: -`keyword (optional arguments)` +`list` + +Expected outcome: +``` +1.[T][ ] placeholder1 +2.[D][ ] placeholder2 (June 25th 6pm) +3.[E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- +``` + +### `mark` + +Marks the specified index in the list + +Format: `mark [INDEX]` + +Example of usage: + +`mark 1` Expected outcome: +``` +Marked placeholder1 +---------------------------------------------------------- +list +1.[T][X] placeholder1 +2.[D][ ] placeholder2 (June 25th 6pm) +3.[E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- +``` + +### `delete` + +Delete a specific index in the task list + +Format: `delete [INDEX]` -Description of the outcome. +Example of usage: +`delete 2` + +Expected outcome: ``` -expected output +Deleted [D][ ] placeholder2 (June 25th 6pm) +---------------------------------------------------------- +list +1.[T][X] placeholder1 +2.[E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- ``` + +### `unmark` + +Unmarks the specified index in the list + +Format: `unmark [INDEX]` + +Example of usage: + +`unmark 1` + +Expected outcome: +``` +Unmarked placeholder1 +---------------------------------------------------------- +list +1.[T][ ] placeholder1 +2.[E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- +``` + +### `find` + +Finds and prints all tasks that contain the specified keyword (only applies to task description) + +Format: `find [KEYWORD]` + +Example of usage: + +`find 3` + +Expected outcome: +``` +[E][ ] placeholder3 (from: 3pm to: 6pm) +---------------------------------------------------------- +``` + diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 24966ef5a..6e592c8dc 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -89,7 +89,7 @@ public static Task addTask(String task) throws PythiaException{ public static void unmark(String input) { String[] splitInput = input.split(" "); taskList.get(Integer.parseInt(splitInput[1])-1).doneIsFalse(); - System.out.println("Unmarked "+ Integer.parseInt(splitInput[1])); + System.out.println("Unmarked "+ taskList.get(Integer.parseInt(splitInput[1])-1).getDescription()); } /** @@ -100,7 +100,7 @@ public static void unmark(String input) { public static void mark(String input) { String[] splitInput = input.split(" "); taskList.get(Integer.parseInt(splitInput[1])-1).doneIsTrue(); - System.out.println("Marked "+ Integer.parseInt(splitInput[1])); + System.out.println("Marked "+ taskList.get(Integer.parseInt(splitInput[1])-1).getDescription()); } /** From f5e750d30d2a967cbe3a5489b06998eabfab1e3c Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 17:25:50 +0800 Subject: [PATCH 20/23] Final touch ups to README file --- docs/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/README.md b/docs/README.md index 0cb1e1314..6c6964429 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,15 @@ +# Pythia + + █████████████ + ██ ██ + ██ █████ ██ + ██ █████ ██ + ██ ██ + █████████████ + ██ ██ + ████████████████████ +This is Pythia an assistant that makes use of the CLI keep track of all your day to day tasks + # User Guide ## Features From 2b44fe6c1b1ca0cebfa84f213d23fe715f74070d Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Thu, 7 Mar 2024 17:28:03 +0800 Subject: [PATCH 21/23] Fix formatting error in README file --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index 6c6964429..876c06c7b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,7 @@ █████████████ ██ ██ ████████████████████ + This is Pythia an assistant that makes use of the CLI keep track of all your day to day tasks # User Guide From def90c3a0ea09244607421bd1457830dd9210088 Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 8 Mar 2024 20:06:23 +0800 Subject: [PATCH 22/23] Add help command and angry sprite --- src/main/java/duke/Command.java | 31 ++++++++++++++++++++++++++++++ src/main/java/duke/Duke.java | 2 +- src/main/java/duke/MoodSprite.java | 19 +++++++++++++++++- src/main/java/duke/Parser.java | 6 +++++- src/main/java/duke/Storage.java | 2 +- 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index 6e592c8dc..ea72f8220 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -4,7 +4,31 @@ * Class that contains the executions for all possible commands */ public class Command { + + private static final String HELP_TEXT = "list\n" + + " - prints all items in list\n" + + " - Format: list\n" + + "mark/unmark\n" + + " - marks/unmarks an item in the list\n" + + " - Format: mark/unmark [INDEX]\n" + + "delete\n" + + " - deletes an item in the list\n" + + " - Format: delete [INDEX]\n" + + "find\n" + + " - finds all task descriptions that contain a keyword\n" + + " - Format: find [KEYWORD]\n" + + "todo\n" + + " - creates a todo task with no deadline\n" + + " - Format: todo [TASK]" + + "deadline\n" + + " - creates a task with a deadline\n" + + " - Format: deadline [TASK] /[DUEDATE]\n" + + "event\n" + + " - creates a task with start and end time/date\n" + + " - Format: event [TASK] /[STARTTIME] /[ENDTIME]\n"; + private static TaskList taskList = new TaskList(); + private static UnparsedTaskList inputList = new UnparsedTaskList(); /** @@ -134,4 +158,11 @@ public static void find(String input) { System.out.println("No such keyword exists"); } } + + /** + * Prints out a list of commands that the user can perform + */ + public static void help() { + System.out.print(HELP_TEXT); + } } diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 8bd8f4773..bc0c8bd9b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -19,8 +19,8 @@ public Duke() { * Main logic flow of the programme */ public void run() { - System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, how may I help you today?\n"+ MoodSprite.getLineBreak()); storage.tryRetrieveList(); + System.out.println(MoodSprite.getIdle() + "Hello, Im Pythia, input 'help' if you would like to know what I can do!\n"+ MoodSprite.getLineBreak()); input.mainLoop(); System.out.println(MoodSprite.getHappy()+"Happy to help, have a great day.\n"+ MoodSprite.getLineBreak()); } diff --git a/src/main/java/duke/MoodSprite.java b/src/main/java/duke/MoodSprite.java index e2bcd3a3f..6d8444d0f 100644 --- a/src/main/java/duke/MoodSprite.java +++ b/src/main/java/duke/MoodSprite.java @@ -19,6 +19,17 @@ public class MoodSprite { + " ██ ██\n" + " ██████████████████ \n\n"; + private static final String ANGRY = " ███ ███ \n" + + " ██ ██ ███ ██ \n" + + " ██ █████ ██ \n" + + " ██ █████ ██ \n" + + " ██ ██ \n" + + " █████████████ \n" + + " \n" + + " ███████████████ \n" + + " ███ ███ \n" + + " ██ ██\n\n"; + private static final String LINEBREAK = "----------------------------------------------------------"; public static String getHappy() { @@ -29,5 +40,11 @@ public static String getIdle() { return IDLE; } - public static String getLineBreak() {return LINEBREAK;} + public static String getLineBreak() { + return LINEBREAK; + } + + public static String getAngry() { + return ANGRY; + } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index ed4ff51c3..a0c965408 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -13,7 +13,7 @@ public void tryParseInput(String input) { try { parseInput(input); } catch (PythiaException pe) { - System.out.println("Not a valid command\n" + MoodSprite.getLineBreak()); + System.out.println(MoodSprite.getAngry() + "Not a valid command\n" + MoodSprite.getLineBreak()); } } @@ -36,6 +36,10 @@ public void parseInput(String input) throws PythiaException { Command.delete(input); } else if (input.contains("find ")) { Command.find(input); + } else if (input.contains("help")) { + Command.help(); + } else if (input.contains("bye")) { + return; } else { throw new PythiaException(); } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 6feeb5b0a..17778c881 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -43,7 +43,7 @@ public void tryRetrieveList() { try { retrieveList(); } catch (FileNotFoundException e) { - System.out.println("Saved list not found, creating now"); + System.out.println(MoodSprite.getHappy() + "Saved list not found, creating now\n" + MoodSprite.getLineBreak()); } } From 12225f9cf3762ae75a589bf23fa7a663cb3517ba Mon Sep 17 00:00:00 2001 From: Ijaaz01 Date: Fri, 8 Mar 2024 20:09:51 +0800 Subject: [PATCH 23/23] Add help command to README file --- docs/README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/README.md b/docs/README.md index 876c06c7b..3ae34b4a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -158,3 +158,38 @@ Expected outcome: ---------------------------------------------------------- ``` +### `help` + +Lists all commands that can be inputted by the user + +Format: `help` + +Example of usage: + +`help` + +Expected outcome: +``` +list + - prints all items in list + - Format: list +mark/unmark + - marks/unmarks an item in the list + - Format: mark/unmark [INDEX] +delete + - deletes an item in the list + - Format: delete [INDEX] +find + - finds all task descriptions that contain a keyword + - Format: find [KEYWORD] +todo + - creates a todo task with no deadline + - Format: todo [TASK]deadline + - creates a task with a deadline + - Format: deadline [TASK] /[DUEDATE] +event + - creates a task with start and end time/date + - Format: event [TASK] /[STARTTIME] /[ENDTIME] +---------------------------------------------------------- +``` +