By: Naggy Joel Since: Jan 2020 Licence: MIT

1. Introduction

Does the name Naggy Joel sound like a very boring application? Fret not, it is actually the exact opposite! It helps you maximise your time to get as much fun as you can amidst your hectic work schedule. In fact, it aims to help you be the best friend and best student that you can ever be!

Naggy Joel is for those who prefer to use a desktop app for managing their social life. It is an application that allows you to manage all aspects of your social life, ranging from your different social circles and contacts, to your events all without compromising on your academic life. More importantly, Naggy Joel is optimized for those who prefer to work with a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, Naggy Joel can get social life managed faster than traditional GUI apps. Interested? Jump to Section 2, “Quick Start” to get started. Enjoy!

2. Quick Start

  1. Ensure you have Java 11 or above installed in your Computer.

  2. Download the latest naggyJoel.jar here.

  3. Copy the file to the folder you want to use as the home folder for Naggy Joel.

  4. Double-click the file to start the app. The GUI should appear in a few seconds.

    Ui
  5. Type the command in the command box and press Enter to execute it.
    e.g. typing help and pressing Enter will open the help window.

  6. Some example commands you can try:

    • (ab)list: Lists all contacts

    • (ab)add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 : Adds a contact named John Doe with phone 98765432, email address johnd@example.com and address John street, block 123, #01-01 to the Address Book.

    • (ab)delete 3 : Deletes the 3rd contact shown in the current persons list.

    • (st)list : Lists all assignments.

    • (st)add t/CS2103 tP d/2020-11-11 23:59 e/10 : Adds an assignment titled CS2103 tP with deadline on 11 November 2020 11:59 PM and an estimated completion time of 10 hours.

    • (rt)list : Lists all restaurants

    • (rt)add n/McDonalds l/NUS o/0900:2300 p/$ v/Yes : Adds a new visited restaurant named McDonalds located in NUS with operating hours 9:00 AM to 11:00 PM with the lowest price point.

    • exit : exits the app

  7. Refer to Section 3, “Features” for details of each command.

3. Features

Command Format

  • Words in UPPER_CASE are the parameters to be supplied by the user e.g. in (ab)add n/NAME, NAME is a parameter which can be used as (ab)add n/John Doe.

  • Items in square brackets are optional e.g n/NAME [t/TAG] can be used as n/John Doe t/friend or as n/John Doe.

  • Items with ​ after them can be used multiple times including zero times e.g. [t/TAG]…​ can be used as   (i.e. 0 times), t/friend, t/friend t/family etc.

  • Parameters can be in any order e.g. if the command specifies n/NAME p/PHONE_NUMBER, p/PHONE_NUMBER n/NAME is also acceptable.

  • For dates, supplying dates up to 31st will succeed regardless of month. However, for months without these dates, it will be auto-converted to the last date of the month.

3.1. General Commands

3.1.1. Viewing help : help

Show program usage instructions
Format: help

Show command usage in detail
Format: help h/INDEX

  • Shows the command usage of the command at the specified INDEX. The index refers to the index number shown in the displayed help list. The index must be a positive integer 1, 2, 3, …​

tag::clear[]

3.1.2. Undo and redo commands: undo/redo

Undoes and redoes the last command.
Format: undo/redo

3.1.3. Clearing all entries : clear

Clears all entries from the address book, schoolwork tracker, events book and restaurant book.
Format: clear

end::clear[]

3.1.4. Exiting the program : exit

Exits the program.
Format: exit

3.2. Address Book Commands

3.2.1. Adding a person : (ab)add

Adds a person to the address book
Format: (ab)add n/NAME p/PHONE_NUMBER [e/EMAIL] [a/ADDRESS] [t/TAG] [o/ORGANIZATION] [b/BIRTHDAY]

A person can have any number of tags (including 0)
  • BIRTHDAY must be written in a MM-dd format.

  • Fields inside square brackets are optional.

  • You will not be allowed to add 2 persons with the same name (case sensitive) and phone number.

Examples:

  • (ab)add n/Akshay o/NUS p/56789012
    Adds a contact named Akshay with phone number 56789012 and organization NUS.

  • (ab)add n/Joel HH e/joel@yahoo.com.sg p/12345678 o/NUS a/Pasir Ris St. 71, Blk 123, #01-79
    Adds a contact named Joel HH with email address joel@yahoo.com.sg, phone number 12345678, address Pasir Ris St. 71, Blk 123, #01-79 and organization NUS.

  • (ab)add n/Aisyle Nat e/aisyle@gmail.com p/87654321 o/NUS b/02-12
    Adds a contact named Aisyle Nat with email address aisyle@gmail.com, phone number 87654321, birthday 12 February and organization NUS.

tag::editPerson[]

3.2.2. Editing a person : (ab)edit

Edits an existing person in the address book.
Format: (ab)edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [b/BIRTHDAY] [o/ORGANIZATION] [t/TAG_TO_BE_ADDED]…​ [-t/TAG_TO_BE_DELETED]…​

  • Edits the person at the specified INDEX. The index refers to the index number shown in the displayed person list. The index must be a positive integer 1, 2, 3, …​

  • At least one of the optional fields must be provided.

  • If a field is specified but the parameter is left empty, the entire field will be deleted (except for the TAG_TO_BE_ADDED, NAME and PHONE_NUMBER prefixes).

  • Existing values will be updated to the input values (except tags).

  • Tags will be appended or deleted according to the prefix specified.

  • Remarks cannot be edited using this command.

Multiple TO_BE_ADDED tags can be specified and all will be added, if it is not a duplicate.
Multiple TO_BE_DELETED tags can be specified and all will be deleted, if they exist.
To delete all tags, specify the tag-deletion prefix -t/ without any parameters.

Examples:

  • (ab)edit 37 a/2 Cactus Road, S903281
    Changes the 37th person’s address to 2 Cactus Road, S903281.

  • (ab)edit 2 n/Elysia Tan o/Comp Club
    Changes the 2nd person’s name to Elysia Tan, and organization to Comp Club.

  • (ab)edit 2 t/best friend -t/good friend
    Removes the tag good friend from the 2nd person and adds the tag best friend to him/her.

  • (ab)edit 3 e/ a/
    Deletes the email and address of the 3rd person.

end::editPerson[]

3.2.3. Deleting a person : (ab)delete

Deletes the contact at index INDEX
Format: (ab)delete INDEX

  • INDEX must be a positive integer. It refers to the index of the respective contact as shown in the displayed person list.

Examples:

  • (ab)delete 2
    Deletes the 2nd person in the address book

tag::notetaker[]

3.2.4. Store additional information about contacts using the Note Taker: (ab)addnote

Store additional information about contacts using the Note Taker
Format: (ab)addnote INDEX i/INFO…​

  • INDEX must be a positive integer. It refers to the index of the respective contact as shown in the displayed person list.

  • There should be at least one i/INFO specified.

Example:

  • (ab)addnote 1 i/Like to swim i/Likes cheese
    Adds the notes 'Like to swim' and 'Likes cheese' to the first person in the displayed person list.

3.2.5. Edit additional information about contacts : (ab)editnote

Edit additional information about contacts using the Note Taker
Format: (ab)editnote INDEX l/LINE_NUMBER i/INFO

  • INDEX must be a positive integer. It refers to the index of the respective contact as displayed in the LIST function.

  • l/LINE_NUMBER Line number of information to be replaced.

  • Only one information can be edited each time.

Example:

  • (ab)editnote 1 l/5 i/Likes having fun
    Replaces the 5th note of the 1st person to 'Likes having fun'.

3.2.6. Delete additional information about contacts : (ab)deletenote

Delete additional information about contacts using the Note Taker
Format: (ab)deletenote INDEX l/LINE_NUMBER…​

  • INDEX must be a positive integer. It refers to the index of the respective contact as displayed in the LIST function.

  • l/LINE_NUMBER Line number of information to be deleted

Example:

  • (ab)deletenote 1 l/4 l/5
    Deletes the 4th and 5th note from the first person.

end::notetaker[]

3.2.7. Lists all contacts: (ab)list

Lists all contacts stored in the address book, only displaying the name, phone number and tags (if any)
Format: (ab)list

If you want to search for a particular contact, see (ab)find
If you want more information about a particular contact, see (ab)get

tag::findCommand[]

3.2.8. Finding contacts : (ab)find

Lists out all your contacts in the address book which match a certain criteria. Each contact will have a displayed index. Only the contact’s name, phone number and tags (if present) will be listed
Format: (ab)find [o/ORGANIZATION] [n/NAME] [t/TAG]

  • If more than 1 switch is indicated, it will be treated as a conjunction of filters

  • [o] [t] List all contacts from a particular organization with the particular tag

Examples:

  • (ab)find o/NUS n/Lim
    Finds and lists all contacts that is in organization “NUS” and have the word “Lim” in his name

end::findCommand[]

3.2.9. List everything about a contact in field : (ab)get

Displays all information about the queried contact
Format: (ab)get INDEX

  • INDEX must be a positive integer. It refers to the index of the respective contact in the displayed persons list.

  • Displays all information relating to a contact at index INDEX

Example:

  • (ab)get 1
    Displays all information about the 1st person.

3.2.10. List contacts with upcoming birthdays : (ab)birthday

Lists all contacts with birthdays in the next 5 days (current day included)
Format: (ab)birthday

3.3. Restaurant Book commands

tag::res[]

3.3.1. Adds a new restaurant : (rt)add

Adds a new restaurant
Format: (rt)add n/NAME l/LOCATION v/VISITED [o/OPERATING_HOURS] [p/PRICE_POINT] [c/CUISINE]

  • VISITED can only be "Yes" or "No"

  • OPERATING_HOURS must be written in HHmm:HHmm format

  • PRICE_POINT contains only dollar signs

    • There are 3 price points, each one distinguished according to the number of dollar signs

      • The lowest price point is $

      • The medium price point is $$

      • The highest price point is $$$

Examples:

  • (rt)add n/rubbish l/bedok o/0900:2300 p/$$ v/No
    Adds a new restaurant called rubbish at bedok with 2 dollar signs price point and opens from 9am to 11pm, and has yet to be visited.

3.3.2. Edits a restaurant: (rt)edit

Edits a restaurant from the list
Format: (rt)edit INDEX [n/RESTAURANT] [l/LOCATION] [v/VISITED] [o/OPERATING_HOURS] [p/PRICE] [c/CUISINE]

  • INDEX must be a positive integer. It corresponds to the INDEX of the restaurant as shown when you list all restaurants in the Restaurant Book using the list function.

  • At least one optional field needs to be specified.

  • Specify nothing after the prefix to delete the field (RESTAURANT, LOCATION, VISITED cannot be deleted)

Example:

  • (rt)edit 1 o/0700:2200
    Edits the 1st restaurant’s operating hours to "0700:2200" in the restaurant book.

  • `(rt)edit 3 p/ `
    Removes the 3rd restaurant’s price point.

3.3.3. Deletes a restaurant: (rt)delete

Deletes a restaurant from the list
Format: (rt)delete INDEX

Example:

  • (rt)delete 1
    Deletes the 1st restaurant in the restaurant book.

end::res[]

tag::rtnotetaker[]

3.3.4. Add notes to a restaurant : (rt)addnote

Adds a new note to a restaurant
Format: (rt)addnote INDEX [r/RECOMMENDED_FOOD]…​ [g/GOOD_FOOD]…​ [b/BAD_FOOD] …​

  • INDEX must be a positive integer. It refers to the index of the respective restaurant as displayed in the LIST function.

  • There should be at least either one r/RECOMMENDED_FOOD, one g/GOOD_FOOD, or one b/BAD_FOOD specified.

Examples:

  • (rt)addnote 5 r/chicken chop g/truffle fries b/risotto
    Add notes to the restaurant at index 5 with recommended food Chicken Chop, good food Truffle Fries, and bad food Risotto.

  • (rt)addnote 2 g/Cheese baked rice
    Adds a note to the restaurant at index 2 with good food Cheese baked rice.

  • (rt)addnote 1 b/Fried rice b/Latte
    Add notes to the restaurant at index 1 with bad food Fried rice and Latte.

3.3.5. Edit notes to a restaurant : (rt)editnote

Edits a note to a restaurant
Format: (rt)editnote INDEX [rl/LINE_NUMBER] [r/RECOMMENDED_FOOD] [gl/LINE_NUMBER] [g/GOOD_FOOD] [bl/BAD_FOOD] [b/BAD_FOOD]

  • INDEX must be a positive integer. It refers to the index of the respective restaurant as displayed in the LIST function.

  • There should be at least either one r/RECOMMENDED_FOOD, one g/GOOD_FOOD, or one b/BAD_FOOD specified to be edited.

  • For each of the food notes, at most one can be edited each time.

  • Line number for the respective food notes to be edited should be present.

Examples:

  • (rt)editnote 1 rl/2 r/Lobster pasta gl/1 g/Mushroom soup bl/3 b/Salad
    Edit notes to the restaurant at index 1 with recommend food Lobster pasta at line number 2, good food Mushroom soup at line number 1, and bad food Salad at line number 3.

  • (rt)editnote 2 gl/2 g/Chicken chop
    Edits note to the restaurant at index 2 with good food Chicken chop.

3.3.6. Delete notes to a restaurant : (rt)deletenote

Deletes a note to a restaurant
Format: (rt)deletenote INDEX [rl/LINE_NUMBER1]…​ [gl/LINE_NUMBER]…​ [bl/BAD_FOOD]…​

  • INDEX must be a positive integer. It refers to the index of the respective restaurant as displayed in the LIST function.

  • There should be at least either one rl/LINE_NUMBER, one gl/LINE_NUMBER, or one bl/LINE_NUMBER specified to be deleted from the respective notes.

Examples:

  • (rt)deletenote 1 rl/2 gl/1 bl/3
    Delete notes to the restaurant at index 1, at line number 2 of recommended food notes, at line number 1 of good food notes, at line number 3 of bad food notes.

  • (rt)deletenote 2 gl/1 gl/2
    Deletes a note to the restaurant at index 2, at line numbers 1 and 2 of good food notes.

end::rtnotetaker[]

3.3.7. List all restaurants : (rt)list

Lists all restaurants
Format: (rt)list

Examples:

  • (rt)list
    Lists all restaurants.

tag::findRestaurantCommand[]

3.3.8. Find restaurants : (rt)find

Finds restaurants based on a number of criteria.
Format: (rt)find [n/RESTAURANT_NAME] [l/LOCATION]

  • At least one search criteria must be filled in.

  • All are case insensitive.

  • If more than 1 optional parameters are filled, they are viewed as a conjunction of filters

Examples:

  • (rt)find n/no signboard
    Finds restaurants with the keyword no signboard.

  • (rt)find l/bedok
    Finds restaurants in the Bedok area.

  • [COMING SOON] Ability to search by price point and operating hours.

end::findRestaurantCommand[]

tag::schoolworkTracker[]

3.4. Schoolwork Tracker commands

3.4.1. Adding an assignment : (st)add

Adds a new assignment to your list of assignments.
Format: (st)add t/TITLE d/DEADLINE e/ESTIMATED_COMPLETION_TIME

  • DEADLINE must be entered in a yyyy-MM-dd HH:mm format and cannot be one that has already passed.

  • ESTIMATED_COMPLETION_TIME is the number of hours you expect to take to finish the assignment, rounded off to the nearest half an hour (1 decimal point). If no estimates can be made, type 0.

  • You will not be able to add two assignments with both the same name (case sensitive) and deadline.

  • The status of the assignment is set to 'Uncompleted' by default.

Example:

  • (st)add t/CS2103 post lecture quiz d/2020-11-11 23:59 e/1
    Adds an assignment titled CS2103 post lecture quiz to the Schoolwork Tracker, due 11 November 2020 23:59 PM and which takes an estimated one hour to complete. Status of this assignment is 'Uncompleted' by default.

3.4.2. Editing an assignment: (st)edit

Edits an assignment in the Schoolwork Tracker.
Format: (st)edit INDEX [t/TITLE] [e/ESTIMATED_COMPLETION_TIME] [d/DEADLINE] [s/STATUS]

  • INDEX must be a positive integer. It corresponds to the INDEX of the assignment as shown when you list all assignments in the Schoolwork Tracker using the list function.

  • DEADLINE must be entered in a yyyy-MM-dd HH:mm format and cannot be one that has already passed.

  • ESTIMATED_COMPLETION_TIME is the number of hours that you expect to take to finish the assignment, rounded off to the nearest half an hour (1 decimal point). If no estimates can be made, type 0.

  • STATUS can only be Completed or Uncompleted (both are case insensitive).

  • At least one optional field needs to be specified.

Examples:

  • (st)edit 1 t/CS2103 Quiz e/1
    Changes the title of the first assignment to 'CS2103 Quiz' and estimated completion time to 1 hour.

  • (st)edit 2 d/2020-11-09 23:59
    Changes the deadline of the second assignment to 9 November 2020 11:59 PM.

3.4.3. Deleting an assignment : (st)delete

Deletes an assignment.
Format: (st)delete INDEX

  • INDEX must be a positive integer. It corresponds to the INDEX of the assignment as shown when you list all assignments in the Schoolwork Tracker using the list function.

Example:

  • (st)delete 1
    Deletes the 1st assignment in the Schoolwork Tracker.

end::schoolworkTracker[]

3.4.4. Listing assignments : (st)list

Sorts the user’s list of assignments and displays them. This helps the user choose which assignment to do first.
Format: (st)list [-d] [-e]

  • At most 1 optional field can be specified at each time

  • If no optional field is specified, assignments will be sorted in alphabetical order.

  • Completed assignments will always be shown at the bottom of the list.

  • [-d] : Assignments will be sorted in ascending order by deadline.

  • [-e] : Assignments will be sorted in descending order based on the estimated completion time.

Examples:

  • (st)list -d
    Assignments will be shown in chronological order, with respect to the deadline, with all completed assignments at the bottom of the list.

  • (st)list -e
    Assignments will be sorted in order of decreasing estimated work hours, with all completed assignments shown at the bottom of the list.

tag::schedule[]

3.4.5. Generate upcoming schedule : (st)schedule

Looks through the list of saved assignments to generate your upcoming schedule. The schedule is generated by distributing the estimated work hours of uncompleted and not overdue assignments across several days, ranging from query time to time that it is due. The schedule generated is based on the assumption that there is 24 hours each day to work with for days between query date and deadline (both exclusive) and remaining time available on query date.
Format: (st)schedule n/NUM_DAYS

  • NUM_DAYS: Has to be a positive integer and is the number of days you would like to display.

  • Each day will be colour-coded.

    • Red: You either have an assignment due (only for query date) or the expected work hours for the day is more than 10 hours.

    • Orange: The expected work hours for the day is between 5 (exclusive) and 10 hours (inclusive).

    • Green: The expected work hours for the day is less than or equals to 5 hours.

Example:

  • (st)schedule n/5
    Displays 5 days of your generated schedule.

end::schedule[]

tag::eventSchedule[]

3.5. Event Schedule commands

3.5.1. Create a new social event : (ev)add

Creates a social event.
Format: (ev)add t/EVENT_TITLE d/EVENT_DATE h/DURATION p/PLACE

  • EVENT DATE must be in a YYYY-MM-dd HH:mm format

Examples:

  • (ev)add t/Facebook job interview d/2020-10-18 10:00 h/3 p/Facebook APAC HQ
    Adds a new social event with title "Facebook job interview", event date 2020-10-18, duration of 3 hours and place of event at "Facebook APAC HQ".

3.5.2. Edit a social event : (ev)edit

Allows editing of a social event.
Format: (ev)edit INDEX [t/EVENT_TITLE] [d/EVENT_DATE] [h/DURATION] [p/LOCATION]

  • INDEX must be a positive integer. It corresponds to the INDEX of the event as shown when you list all events in the Event Schedule using the default event list function (see above).

  • At least one field must be non-empty.

  • All the non-empty fields will replace their respective previous data fields.

Examples:

  • (ev)edit 2 d/2020-10-09 22:00 h/2
    Edits the 2nd event in the Event Schedule by changing the timing to 10PM on the 9th of October and the estimated duration to be 2 hours.

3.5.3. Deletes a social event : (ev)delete

Deletes a social event.
Format: (ev)delete INDEX

  • INDEX must be a positive integer. It corresponds to the INDEX of the event as shown when you list all events in the Event Schedule using the default event list function (see above).

Examples:

  • (ev)delete 1
    Deletes the 1st Event in the Event Schedule.

3.5.4. Listing all events : (ev)list

Lists all social events in your Event Schedule.
Format: (ev)list

end::eventSchedule[]

3.6. Saving the data

Address book, Schoolwork Tracker, Event Book and Restaurant Book data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.

4. FAQ

Q: How do I transfer my data to another Computer?
A: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Address Book folder.

5. Command Summary

  • Add :

    • (ab)add n/NAME p/PHONE_NUMBER [e/EMAIL] [a/ADDRESS] [b/BIRTHDAY] [o/ORGANIZATION] [t/TAG]…​

    • (rt)add n/NAME l/LOCATION v/VISITED [o/OPERATING_HOURS] [p/PRICE_POINT] [c/CUISINE]

    • (st)add t/TITLE d/DEADLINE e/ESTIMATED_COMPLETION_TIME

    • (ev)add t/EVENT_TITLE d/EVENT_DATE h/DURATION p/PLACE

  • Delete :

    • (ab)delete INDEX

    • (rt)delete INDEX

    • (st)delete INDEX

    • (ev)delete INDEX

  • Edit :

    • (ab)edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [b/BIRTHDAY] [o/ORGANIZATION] [t/TAG_TO_BE_ADDED]…​ [-t/TAG_TO_BE_DELETED]…​

    • (rt)edit INDEX [n/RESTAURANT] [l/LOCATION] [v/VISITED] [o/OPERATING_HOURS] [p/PRICE] [c/CUISINE]

    • (st)edit INDEX [t/TITLE] [d/DEADLINE] [e/ESTIMATED_COMPLETION_TIME] [s/STATUS]

    • (ev)edit INDEX [t/EVENT_TITLE] [d/EVENT_DATE] [h/DURATION] [p/PLACE]

  • Find :

    • (ab)find [o/ORGANIZATION] [n/NAME] [t/TAG]

    • (rt)find [n/RESTAURANT_NAME] [l/LOCATION]

  • List :

    • (ab)list

    • (rt)list

    • (st)list [-d] [-e]

    • (ev)list

  • Add notes :

    • (ab)addnote INDEX i/INFO…​

    • (rt)addnote INDEX [r/RECOMMENDED_FOOD]…​ [g/GOOD_FOOD]…​ [b/BAD_FOOD]…​

  • Delete notes :

    • (ab)deletenote INDEX l/LINE_NUMBER…​

    • (rt)deletenote INDEX [rl/RECOMMENDED_FOOD_LINE_NUMBER]…​ [gl/GOOD_FOOD_LINE_NUMBER]…​ [bl/BAD_FOOD_LINE_NUMBER]…​

  • Edit notes :

    • (ab)editnote INDEX l/LINE_NUMBER i/INFO

    • (rt)editnote INDEX [rl/LINE_NUMBER_RECOMMENDED] [r/RECOMMENDED_FOOD] [gl/LINE_NUMBER_GOOD] [g/GOOD_FOOD] [bl/LINE_NUMBER_BAD] [b/BAD_FOOD]

  • Get all information about a contact :
    (ab)get INDEX

  • Show contacts with birthdays in the next 5 days :
    (ab)birthday

  • Shows the user’s upcoming schedule :
    (st)schedule n/NUM_DAYS

  • Undo command : undo

  • Redo command : redo

  • Clear : clear

  • Help : help

  • exit : exit