From cbcbfb2a264480c67b32110c02e890825d7e866a Mon Sep 17 00:00:00 2001 From: sowgro Date: Mon, 6 Oct 2025 22:57:49 -0400 Subject: Remove unused args parameter in Action --- src/main/java/design/controller/userinput/Action.java | 2 +- src/main/java/design/controller/userinput/Menu.java | 7 ++++--- src/main/java/design/controller/userinput/MenuOption.java | 4 ++-- .../java/design/controller/userinput/menus/CourseSelectMenu.java | 4 ++-- src/main/java/design/controller/userinput/menus/HolePlayMenu.java | 8 ++++---- src/main/java/design/controller/userinput/menus/MainMenu.java | 8 ++++---- src/main/java/design/controller/userinput/menus/SelectUser.java | 4 ++-- .../java/design/controller/userinput/menus/StatisticsMenu.java | 2 +- src/main/java/design/controller/userinput/menus/UserSettings.java | 8 ++++---- 9 files changed, 24 insertions(+), 23 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/Action.java b/src/main/java/design/controller/userinput/Action.java index 0b52bfc..bb16585 100644 --- a/src/main/java/design/controller/userinput/Action.java +++ b/src/main/java/design/controller/userinput/Action.java @@ -2,5 +2,5 @@ package design.controller.userinput; @FunctionalInterface public interface Action { - void onCommand(String[] args); + void onCommand(); } diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index 605b640..8eac5dd 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -14,13 +14,14 @@ public abstract class Menu { MenuOption menuOption = menuOptions.get(i); System.out.printf("%s: %s\n", i, menuOption.getName()); } + + System.out.print("Selection: "); Scanner sc = new Scanner(System.in); var line = sc.nextLine(); - var split = line.split(" "); try { - int i = Integer.parseInt(split[0]); - menuOptions.get(i).onCommand(Arrays.copyOfRange(split, 1, split.length)); + int i = Integer.parseInt(line); + menuOptions.get(i).onCommand(); } catch (ArrayIndexOutOfBoundsException ex) { System.err.printf("Invalid option \"%s\"\n", line); present(); diff --git a/src/main/java/design/controller/userinput/MenuOption.java b/src/main/java/design/controller/userinput/MenuOption.java index 9635ebd..5ae9521 100644 --- a/src/main/java/design/controller/userinput/MenuOption.java +++ b/src/main/java/design/controller/userinput/MenuOption.java @@ -13,7 +13,7 @@ public class MenuOption { return name; } - public void onCommand(String[] args) { - action.onCommand(args); + public void onCommand() { + action.onCommand(); } } diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index 881c393..8df9823 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -26,10 +26,10 @@ public class CourseSelectMenu extends Menu { List opts = new ArrayList<>(); // 0) back - opts.add(new MenuOption("back to main menu", a -> new MainMenu().present())); + opts.add(new MenuOption("back to main menu", () -> new MainMenu().present())); // 1) pick course by number TODO: add error checking - opts.add(new MenuOption("pick course by number (1..1000)", a -> { + opts.add(new MenuOption("pick course by number (1..1000)", () -> { Scanner sc = new Scanner(System.in); System.out.print("Course number (1..1000): "); diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index bcd7560..e12bdfa 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -36,14 +36,14 @@ public class HolePlayMenu extends Menu { if (inSetup) { // 0) Start hole - opts.add(new MenuOption("start hole", (a) -> { + opts.add(new MenuOption("start hole", () -> { ctx.startHole(); System.out.println("Started hole " + round.getCurrentHole().getNumber() + "."); this.present(); })); } else { // 0) Take a shot - opts.add(new MenuOption("take a shot", (a) -> { + opts.add(new MenuOption("take a shot", () -> { // Gets club Scanner sc = new Scanner(System.in); System.out.print("Club nickname: "); @@ -68,7 +68,7 @@ public class HolePlayMenu extends Menu { })); // 1) Hole out - opts.add(new MenuOption("hole out", (a) -> { + opts.add(new MenuOption("hole out", () -> { // Precedes to next hole int prev = round.getCurrentHole().getNumber(); ctx.holeOut(); @@ -78,7 +78,7 @@ public class HolePlayMenu extends Menu { } // End round (always shown) - opts.add(new MenuOption("end round", (a) -> { + opts.add(new MenuOption("end round", () -> { ctx.endRoundNow(); System.out.println("Round ended."); new MainMenu().present(); diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index c76e61a..1d6b72d 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -14,9 +14,9 @@ public class MainMenu extends Menu { @Override public List getMenuOptions() { return List.of( - new MenuOption("user settings...", (a) -> new UserSettings().present()), - new MenuOption("statistics...", (a) -> new StatisticsMenu().present()), - new MenuOption("log round...", (a) -> new CourseSelectMenu().present()), - new MenuOption("quit", (a) -> {})); + new MenuOption("user settings...", () -> new UserSettings().present()), + new MenuOption("statistics...", () -> new StatisticsMenu().present()), + new MenuOption("log round...", () -> new CourseSelectMenu().present()), + new MenuOption("quit", () -> {})); } } diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 2f1a867..fd73b47 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -21,12 +21,12 @@ public class SelectUser extends Menu { public List getMenuOptions() { var l = new ArrayList(); // Sets user in Session too - l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), (a) -> { + l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), () -> { Session.setCurrentGolfer(i); System.out.printf("Loaded user: %s%n", i.getUsername()); new UserSettings().present(); })).toList()); - l.add(new MenuOption("", (a) -> { + l.add(new MenuOption("", () -> { })); return l; } diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java index 66d60e3..c609177 100644 --- a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -15,7 +15,7 @@ public class StatisticsMenu extends Menu { @Override public List getMenuOptions() { return List.of( - new MenuOption("return to main menu", (c) -> new MainMenu().present()) + new MenuOption("return to main menu", () -> new MainMenu().present()) ); } } diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index a866889..3fda5d9 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -15,10 +15,10 @@ public class UserSettings extends Menu { @Override public List getMenuOptions() { return List.of( - new MenuOption("return to main menu", (a) -> new MainMenu().present()), - new MenuOption("switch user...", (a) -> new SelectUser().present()), - new MenuOption("set username...", (a -> {})), - new MenuOption("set password...", (a) -> {}) + new MenuOption("return to main menu", () -> new MainMenu().present()), + new MenuOption("switch user...", () -> new SelectUser().present()), + new MenuOption("set username...", () -> {}), + new MenuOption("set password...", () -> {}) ); } } -- cgit v1.2.3 From 1e243817fc4072c8da1905f0e5791e1756f179e4 Mon Sep 17 00:00:00 2001 From: sowgro Date: Mon, 6 Oct 2025 23:17:33 -0400 Subject: prompt user first and code cleanup --- src/main/java/design/ParPal.java | 5 +++- .../controller/userinput/menus/SelectUser.java | 28 ++++++++++++++-------- .../controller/userinput/menus/UserSettings.java | 6 ++++- 3 files changed, 27 insertions(+), 12 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/ParPal.java b/src/main/java/design/ParPal.java index 4ed6949..6ea9872 100644 --- a/src/main/java/design/ParPal.java +++ b/src/main/java/design/ParPal.java @@ -1,9 +1,12 @@ package design; +import design.controller.userinput.Action; import design.controller.userinput.menus.MainMenu; +import design.controller.userinput.menus.SelectUser; public class ParPal { public static void main(String[] args) { - new MainMenu().present(); + Action doAfter = () -> new MainMenu().present(); + new SelectUser(doAfter).present(); } } diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index fd73b47..82e2338 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -1,16 +1,22 @@ package design.controller.userinput.menus; +import design.controller.userinput.Action; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import design.model.Golfer; import design.runtime.Session; import design.persistence.PersonalDatabase; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class SelectUser extends Menu { - PersonalDatabase personalDB = PersonalDatabase.INSTANCE; + private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; + private final Action doAfter; + + public SelectUser(Action doAfter) { + this.doAfter = doAfter; + } @Override public String getTitle() { @@ -20,14 +26,16 @@ public class SelectUser extends Menu { @Override public List getMenuOptions() { var l = new ArrayList(); - // Sets user in Session too - l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), () -> { - Session.setCurrentGolfer(i); - System.out.printf("Loaded user: %s%n", i.getUsername()); - new UserSettings().present(); - })).toList()); - l.add(new MenuOption("", () -> { - })); + for (Golfer i : personalDB.getGolfers()) { + MenuOption menuOption = new MenuOption(i.getUsername(), () -> { + // Sets user in Session too + Session.setCurrentGolfer(i); + System.out.printf("Loaded user: %s%n", i.getUsername()); + doAfter.onCommand(); + }); + l.add(menuOption); + } + l.add(new MenuOption("", () -> {})); return l; } } diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index 3fda5d9..ab260da 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -1,5 +1,6 @@ package design.controller.userinput.menus; +import design.controller.userinput.Action; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; @@ -16,7 +17,10 @@ public class UserSettings extends Menu { public List getMenuOptions() { return List.of( new MenuOption("return to main menu", () -> new MainMenu().present()), - new MenuOption("switch user...", () -> new SelectUser().present()), + new MenuOption("switch user...", () -> { + Action doAfter = this::present; + new SelectUser(doAfter).present(); + }), new MenuOption("set username...", () -> {}), new MenuOption("set password...", () -> {}) ); -- cgit v1.2.3 From 068477d80b35ba67d1c401b973e2d111ee30f28c Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Tue, 7 Oct 2025 09:02:00 -0400 Subject: Updated CourseSelectMenu to allow user to select a course from profile --- .../userinput/menus/CourseSelectMenu.java | 76 ++++++++++++++++++---- 1 file changed, 62 insertions(+), 14 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index 8df9823..af825e0 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -28,25 +28,73 @@ public class CourseSelectMenu extends Menu { // 0) back opts.add(new MenuOption("back to main menu", () -> new MainMenu().present())); - // 1) pick course by number TODO: add error checking - opts.add(new MenuOption("pick course by number (1..1000)", () -> { - Scanner sc = new Scanner(System.in); - - System.out.print("Course number (1..1000): "); - int n = Integer.parseInt(sc.nextLine().trim()); - Course c = MasterDatabase.INSTANCE.getCourse(n - 1); + // 1) go to CourseSearchMenu to search for a course and add it profile + opts.add(new MenuOption("Add Course to Profile", () -> new MainMenu().present())); - System.out.print("Starting hole (1..18, blank=1): "); - String s = sc.nextLine().trim(); - int start = s.isEmpty() ? 1 : Integer.parseInt(s); + // 2) pick course from MY PROFILE only + opts.add(new MenuOption("pick course from my profile", () -> { + var golfer = Session.getCurrentGolfer(); + Course[] mine = (golfer == null) ? new Course[0] : golfer.getCourses(); - Hole startHole = c.getHoles().get(start - 1); + // Checks user has courses of not informs them to add one to there profile + if (mine == null || mine.length == 0) { + System.out.println("You don't have any courses saved to your profile yet."); + System.out.println("Use the 'Add Course to Profile' menu first."); + this.present(); + return; + } + // Select a course + Scanner sc = new Scanner(System.in); - Round r = new Round(c, LocalDateTime.now(), startHole); - Session.getCurrentGolfer().addRound(r); - new HolePlayMenu(r).present(); + // Prints all courses + System.out.println("-- MY COURSES --"); + for (int i = 0; i < mine.length; i++) { + Course c = mine[i]; + System.out.printf("%d: %s (%s) | Holes: %d | Total Par: %d | Difficulty: %.1f%n", + i + 1, c.getName(), c.getLocation(), c.getHoleCount(), c.getTotalPar(), + c.getDifficultyRating()); + } + // Select course by number + Course selected = null; + while (selected == null) { + System.out.print("Select course # (1.." + mine.length + "): "); + String line = sc.nextLine().trim(); + int idx = Integer.parseInt(line); + if (idx < 1 || idx > mine.length) { + System.out.println("Out of range. Try again."); + continue; + } + selected = mine[idx - 1]; + } + // Gets starting hole on course + int startHoleNum = readStartingHole(sc, selected.getHoleCount()); + // Starts round and sends user to HolePlayMenu + startRound(selected, startHoleNum); })); return opts; } + + private int readStartingHole(Scanner sc, int holeCount) { + // Asks for a hole number until a valid number is selected + while (true) { + System.out.print("Starting hole (1.." + holeCount + ", blank=1): "); + String s = sc.nextLine().trim(); + if (s.isEmpty()) + return 1; + int start = Integer.parseInt(s); + if (start < 1 || start > holeCount) { + System.out.println("Starting hole must be between 1 and " + holeCount + "."); + continue; + } + return start; + } + } + + private void startRound(Course c, int startHoleNum) { + Hole startHole = c.getHoles().get(startHoleNum - 1); + Round r = new Round(c, LocalDateTime.now(), startHole); + Session.getCurrentGolfer().addRound(r); + new HolePlayMenu(r).present(); + } } -- cgit v1.2.3 From 0dbbb2956c67e4d22a9ee8614a29c3919177d7d5 Mon Sep 17 00:00:00 2001 From: sowgro Date: Tue, 7 Oct 2025 09:10:34 -0400 Subject: Add user settings --- .../java/design/controller/userinput/Menu.java | 1 + .../controller/userinput/menus/SelectUser.java | 31 ++++++++++-- .../controller/userinput/menus/UserSettings.java | 55 ++++++++++++++++++---- 3 files changed, 74 insertions(+), 13 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index 8eac5dd..c8090f6 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -9,6 +9,7 @@ public abstract class Menu { public void present() { var menuOptions = getMenuOptions(); + System.out.println(); System.out.printf("-- %s --\n", getTitle().toUpperCase()); for (int i = 0; i < menuOptions.size(); i++) { MenuOption menuOption = menuOptions.get(i); diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 82e2338..8dee860 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -7,8 +7,10 @@ import design.model.Golfer; import design.runtime.Session; import design.persistence.PersonalDatabase; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Scanner; public class SelectUser extends Menu { private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; @@ -25,7 +27,8 @@ public class SelectUser extends Menu { @Override public List getMenuOptions() { - var l = new ArrayList(); + var opts = new ArrayList(); + for (Golfer i : personalDB.getGolfers()) { MenuOption menuOption = new MenuOption(i.getUsername(), () -> { // Sets user in Session too @@ -33,9 +36,29 @@ public class SelectUser extends Menu { System.out.printf("Loaded user: %s%n", i.getUsername()); doAfter.onCommand(); }); - l.add(menuOption); + opts.add(menuOption); } - l.add(new MenuOption("", () -> {})); - return l; + + opts.add(new MenuOption("", () -> { + Scanner sc = new Scanner(System.in); + + System.out.print("Enter username: "); + var username = sc.nextLine(); + + System.out.print("Enter full name: "); + var fullName = sc.nextLine(); + + System.out.print("Enter password: "); + var password = sc.nextLine(); + + try { + personalDB.addGolfer(new Golfer(fullName, username, password)); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + this.present(); + })); + + return opts; } } diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index ab260da..04ec4d0 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -3,11 +3,21 @@ package design.controller.userinput.menus; import design.controller.userinput.Action; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import design.model.Golfer; +import design.persistence.PersonalDatabase; +import design.runtime.Session; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.Scanner; public class UserSettings extends Menu { + private final Golfer golfer = Session.getCurrentGolfer(); + private final PersonalDatabase personalDatabase = PersonalDatabase.INSTANCE; + private final Scanner scanner = new Scanner(System.in); + @Override public String getTitle() { return "user settings"; @@ -15,14 +25,41 @@ public class UserSettings extends Menu { @Override public List getMenuOptions() { - return List.of( - new MenuOption("return to main menu", () -> new MainMenu().present()), - new MenuOption("switch user...", () -> { - Action doAfter = this::present; - new SelectUser(doAfter).present(); - }), - new MenuOption("set username...", () -> {}), - new MenuOption("set password...", () -> {}) - ); + var opts = new ArrayList(); + + opts.add(new MenuOption("return to main menu", () -> new MainMenu().present())); + + opts.add(new MenuOption("switch user...", () -> { + Action doAfter = this::present; + new SelectUser(doAfter).present(); + })); + + opts.add(new MenuOption("set password...", () -> { + System.out.print("Enter password: "); + var password = scanner.nextLine(); + + golfer.setPassword(password); + try { + personalDatabase.updateGolfer(golfer); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + this.present(); + })); + + opts.add(new MenuOption("set full name...", () -> { + System.out.print("Enter full name: "); + var fullName = scanner.nextLine(); + + golfer.setFullName(fullName); + try { + personalDatabase.updateGolfer(golfer); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + this.present(); + })); + + return opts; } } -- cgit v1.2.3 From 701aba30fe05f65ab0e027f9d9aac0928d814560 Mon Sep 17 00:00:00 2001 From: sowgro Date: Tue, 7 Oct 2025 09:54:16 -0400 Subject: Prompt for password and cleanup --- .../java/design/controller/userinput/Action.java | 2 +- .../java/design/controller/userinput/Menu.java | 2 +- .../design/controller/userinput/MenuOption.java | 4 ++-- .../controller/userinput/menus/SelectUser.java | 23 ++++++++++++++-------- 4 files changed, 19 insertions(+), 12 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/Action.java b/src/main/java/design/controller/userinput/Action.java index bb16585..2c95b2b 100644 --- a/src/main/java/design/controller/userinput/Action.java +++ b/src/main/java/design/controller/userinput/Action.java @@ -2,5 +2,5 @@ package design.controller.userinput; @FunctionalInterface public interface Action { - void onCommand(); + void onAction(); } diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index c8090f6..0b2fb26 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -22,7 +22,7 @@ public abstract class Menu { try { int i = Integer.parseInt(line); - menuOptions.get(i).onCommand(); + menuOptions.get(i).onAction(); } catch (ArrayIndexOutOfBoundsException ex) { System.err.printf("Invalid option \"%s\"\n", line); present(); diff --git a/src/main/java/design/controller/userinput/MenuOption.java b/src/main/java/design/controller/userinput/MenuOption.java index 5ae9521..f5707a9 100644 --- a/src/main/java/design/controller/userinput/MenuOption.java +++ b/src/main/java/design/controller/userinput/MenuOption.java @@ -13,7 +13,7 @@ public class MenuOption { return name; } - public void onCommand() { - action.onCommand(); + public void onAction() { + action.onAction(); } } diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 8dee860..ffae559 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -15,6 +15,7 @@ import java.util.Scanner; public class SelectUser extends Menu { private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; private final Action doAfter; + private final Scanner scanner = new Scanner(System.in); public SelectUser(Action doAfter) { this.doAfter = doAfter; @@ -31,25 +32,31 @@ public class SelectUser extends Menu { for (Golfer i : personalDB.getGolfers()) { MenuOption menuOption = new MenuOption(i.getUsername(), () -> { - // Sets user in Session too - Session.setCurrentGolfer(i); - System.out.printf("Loaded user: %s%n", i.getUsername()); - doAfter.onCommand(); + System.out.print("Enter password: "); + var password = scanner.nextLine(); + if (i.checkPassword(password)) { + // Sets user in Session too + Session.setCurrentGolfer(i); + System.out.printf("Loaded user: %s%n", i.getUsername()); + doAfter.onAction(); + } else { + System.out.println("Incorrect password. "); + this.present(); + } }); opts.add(menuOption); } opts.add(new MenuOption("", () -> { - Scanner sc = new Scanner(System.in); System.out.print("Enter username: "); - var username = sc.nextLine(); + var username = scanner.nextLine(); System.out.print("Enter full name: "); - var fullName = sc.nextLine(); + var fullName = scanner.nextLine(); System.out.print("Enter password: "); - var password = sc.nextLine(); + var password = scanner.nextLine(); try { personalDB.addGolfer(new Golfer(fullName, username, password)); -- cgit v1.2.3 From b50bce5a1c303e03cc50e1945de9c16cee044976 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Tue, 7 Oct 2025 13:14:41 -0400 Subject: Added AddClubMenu and modified club and golfer to allow club id's, added menu to UserSettings --- .../controller/userinput/menus/AddClubMenu.java | 70 ++++++++++++++++++++++ .../controller/userinput/menus/HolePlayMenu.java | 2 +- .../controller/userinput/menus/UserSettings.java | 2 + src/main/java/design/model/Club.java | 13 +++- src/main/java/design/model/Golfer.java | 19 ++++-- 5 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/main/java/design/controller/userinput/menus/AddClubMenu.java (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/menus/AddClubMenu.java b/src/main/java/design/controller/userinput/menus/AddClubMenu.java new file mode 100644 index 0000000..ad22eb3 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/AddClubMenu.java @@ -0,0 +1,70 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.model.Club; +import design.model.Golfer; +import design.persistence.PersonalDatabase; +import design.runtime.Session; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class AddClubMenu extends Menu { + + @Override + public String getTitle() { + return "add a club"; + } + + @Override + public List getMenuOptions() { + List opts = new ArrayList<>(); + + opts.add(new MenuOption("create new club", () -> { + Golfer g = Session.getCurrentGolfer(); + if (g == null) { + System.out.println("No user loaded."); + new UserSettings().present(); + return; + } + + Scanner sc = new Scanner(System.in); + + System.out.print("Manufacturer: "); + String manufacture = sc.nextLine().trim(); + + System.out.print("Nickname: "); + String nickname = sc.nextLine().trim(); + + // Pick type + Club.ClubType[] types = Club.ClubType.values(); + System.out.println("Club type:"); + for (int i = 0; i < types.length; i++) { + System.out.printf("%d: %s%n", i + 1, types[i]); + } + + Club.ClubType type = null; + while (type == null) { + System.out.print("Select (1.." + types.length + "): "); + String line = sc.nextLine().trim(); + int idx = Integer.parseInt(line); + if (idx < 1 || idx > types.length) { + System.out.println("Out of range. Try again."); + continue; + } + type = types[idx - 1]; + } + + g.addClub(manufacture, nickname, type); + + new UserSettings().present(); + })); + + opts.add(new MenuOption("cancel", () -> new UserSettings().present())); + return opts; + } +} diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index e12bdfa..34e36f6 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -50,7 +50,7 @@ public class HolePlayMenu extends Menu { String nick = sc.nextLine().trim(); // Defaulted to Driver for now // TODO update logic - Club club = new Club("Generic", nick, Club.ClubType.DRIVER); + Club club = new Club(0, "Generic", nick, Club.ClubType.DRIVER); // Get shot distance (defaults to 0 of not stated) System.out.print("Distance (yds, blank=0): "); diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index 04ec4d0..34b645d 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -60,6 +60,8 @@ public class UserSettings extends Menu { this.present(); })); + opts.add(new MenuOption("add a club...", () -> new AddClubMenu().present())); + return opts; } } diff --git a/src/main/java/design/model/Club.java b/src/main/java/design/model/Club.java index 57a43d1..9fa3c87 100644 --- a/src/main/java/design/model/Club.java +++ b/src/main/java/design/model/Club.java @@ -13,16 +13,22 @@ public class Club { PUTTER } + private final int id; private final String manufacture; private final String nickname; private final ClubType clubType; - public Club(String manufacture, String nickname, ClubType clubType) { + public Club(int id, String manufacture, String nickname, ClubType clubType) { + this.id = id; this.manufacture = manufacture; this.nickname = nickname; this.clubType = clubType; } + public int getId() { + return id; + } + public String getManufacture() { return manufacture; } @@ -34,4 +40,9 @@ public class Club { public ClubType getClubType() { return clubType; } + + @Override + public String toString() { + return String.format("#%d %s - %s (%s)", id, nickname, manufacture, clubType); + } } diff --git a/src/main/java/design/model/Golfer.java b/src/main/java/design/model/Golfer.java index 19d6ac6..d34073f 100644 --- a/src/main/java/design/model/Golfer.java +++ b/src/main/java/design/model/Golfer.java @@ -11,15 +11,19 @@ public class Golfer { private String fullName; private final List courses; private final List rounds; - private final List clubs = new ArrayList<>(); // Keep track of golfer's clubs + private final List clubs; // Keep track of golfer's clubs + private int nextClubId = 1; @JsonCreator - private Golfer(String username, int passwordHash, String fullName, List courses, List rounds) { + private Golfer(String username, int passwordHash, String fullName, List courses, List rounds, + List clubs) { this.username = username; this.passwordHash = passwordHash; this.fullName = fullName; this.courses = courses; this.rounds = rounds; + this.clubs = clubs; + this.nextClubId = this.clubs.stream().mapToInt(Club::getId).max().orElse(0) + 1; } public Golfer(String fullName, String username, String password) { @@ -28,6 +32,8 @@ public class Golfer { this.passwordHash = password.hashCode(); this.courses = new ArrayList<>(); this.rounds = new ArrayList<>(); + this.clubs = new ArrayList<>(); + this.nextClubId = 1; } public String getUsername() { @@ -74,12 +80,17 @@ public class Golfer { rounds.add(round); } - // Helpers dealing with clubs - public void addClub(Club c) { + public Club addClub(String manufacture, String nickname, Club.ClubType type) { + Club c = new Club(nextClubId++, manufacture, nickname, type); clubs.add(c); + return c; } public boolean hasClub(Club c) { return clubs.contains(c); } + + public Club[] getClubs() { + return clubs.toArray(Club[]::new); + } } -- cgit v1.2.3 From 821c44c8ca0bc364c83fac2e116fd8c8ec8e86c9 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Tue, 7 Oct 2025 13:50:05 -0400 Subject: Added club to json --- src/main/java/design/controller/userinput/menus/AddClubMenu.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/menus/AddClubMenu.java b/src/main/java/design/controller/userinput/menus/AddClubMenu.java index ad22eb3..ea18ed5 100644 --- a/src/main/java/design/controller/userinput/menus/AddClubMenu.java +++ b/src/main/java/design/controller/userinput/menus/AddClubMenu.java @@ -61,6 +61,13 @@ public class AddClubMenu extends Menu { g.addClub(manufacture, nickname, type); + // Add club to JSON + try { + PersonalDatabase.INSTANCE.updateGolfer(g); + System.out.println("Club added and saved."); + } catch (IOException e) { + throw new RuntimeException("Failed to save club", e); + } new UserSettings().present(); })); -- cgit v1.2.3 From a20f2f027981ce9c7677b969be24c962c0029907 Mon Sep 17 00:00:00 2001 From: Michael Lizzio Date: Tue, 7 Oct 2025 13:57:32 -0400 Subject: Updated HolePlayMenu to allow user to select one of their clubs --- .../controller/userinput/menus/HolePlayMenu.java | 37 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'src/main') diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index 34e36f6..14e5345 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -44,13 +44,38 @@ public class HolePlayMenu extends Menu { } else { // 0) Take a shot opts.add(new MenuOption("take a shot", () -> { - // Gets club + // loads golfers clubs + var golfer = Session.getCurrentGolfer(); + Club[] clubs = (golfer == null) ? new Club[0] : golfer.getClubs(); + + if (clubs.length == 0) { + System.out.println("You don't have any clubs yet. Add one first."); + new AddClubMenu().present(); + this.present(); + return; + } + + // list clubs + System.out.println("-- YOUR CLUBS --"); + for (int i = 0; i < clubs.length; i++) { + Club c = clubs[i]; + System.out.printf("%d: #%d %s - %s (%s)%n", + i + 1, c.getId(), c.getNickname(), c.getManufacture(), c.getClubType()); + } + + // user selects one of their clubs Scanner sc = new Scanner(System.in); - System.out.print("Club nickname: "); - String nick = sc.nextLine().trim(); - // Defaulted to Driver for now - // TODO update logic - Club club = new Club(0, "Generic", nick, Club.ClubType.DRIVER); + Club club = null; + while (club == null) { + System.out.print("Select club # (1.." + clubs.length + "): "); + String line = sc.nextLine().trim(); + int idx = Integer.parseInt(line); + if (idx < 1 || idx > clubs.length) { + System.out.println("Out of range. Try again."); + continue; + } + club = clubs[idx - 1]; + } // Get shot distance (defaults to 0 of not stated) System.out.print("Distance (yds, blank=0): "); -- cgit v1.2.3