- Use only builtin language functions for your calculations rather than relying
- Use only builtin language functions for your calculations rather than relying
on a library or package like [MomentJS](https://momentjs.com/). This assumes,
on a library or package like [MomentJS](https://momentjs.com/). This assumes,
of course, that the language of your choice has adequate date and time
of course, that the language of your choice has adequate date and time
manipulation functions built in.
manipulation functions built in.
- You may not use any code generators such as the
- You may not use any code generators such as the
[Counting Down To](https://countingdownto.com/) site. You should develop your
[Counting Down To](https://countingdownto.com/) site. You should develop your
own original implementation.
own original implementation.
## User Stories
## User Stories
- [ ] User can see an event input box containing an event name field, an
- [ ] User can see an event input box containing an event name field, an
date field, an optional time, and a 'Start' button.
date field, an optional time, and a 'Start' button.
- [ ] User can define the event by entering its name, the date it is
- [ ] User can define the event by entering its name, the date it is
scheduled to take place, and an optional time of the event. If the time is
scheduled to take place, and an optional time of the event. If the time is
omitted it is assumed to be at Midnight on the event date in the local time
omitted it is assumed to be at Midnight on the event date in the local time
zone.
zone.
- [ ] User can see a warning message if the event name is blank.
- [ ] User can see a warning message if the event name is blank.
- [ ] User can see a warning message if the event date or time are incorrectly
- [ ] User can see a warning message if the event date or time are incorrectly
entered.
entered.
- [ ] User can see a warning message if the time until the event data and time
- [ ] User can see a warning message if the time until the event data and time
that has been entered would overflow the precision of the countdown timer.
that has been entered would overflow the precision of the countdown timer.
- [ ] User can click on the 'Start' button to see the countdown timer start
- [ ] User can click on the 'Start' button to see the countdown timer start
displaying the days, hours, minutes, and seconds until the event takes place.
displaying the days, hours, minutes, and seconds until the event takes place.
- [ ] User can see the elements in the countdown timer automatically
- [ ] User can see the elements in the countdown timer automatically
decrement. For example, when the remaining seconds count reaches 0 the remaining
decrement. For example, when the remaining seconds count reaches 0 the remaining
minutes count will decrement by 1 and the seconds will start to countdown from 59. This progression must take place from seconds all the way up to the remaining days position in countdown display.
minutes count will decrement by 1 and the seconds will start to countdown from 59. This progression must take place from seconds all the way up to the remaining days position in countdown display.
## Bonus features
## Bonus features
- [ ] User can save the event so that it persists across sessions
- [ ] User can save the event so that it persists across sessions
- [ ] User can see an alert when the event is reached
- [ ] User can see an alert when the event is reached
- [ ] User can specify more than one event.
- [ ] User can specify more than one event.
- [ ] User can see a countdown timers for each event that has been defined.
- [ ] User can see a countdown timers for each event that has been defined.
## Useful links and resources
## Useful links and resources
- Images of analog tube-based countdown timers can be found
- Images of analog tube-based countdown timers can be found
In this challenge, you'd create a javascript validation script to validate the inputs entered by a user using RegEx.
In this challenge, you'd create a javascript validation script to validate the inputs entered by a user using RegEx.
You could always refer to the [Regular Expression Library](http://regexlib.com/(X(1)A(GijS7qxVy-6Gyc4cweUyFoK4ZvRn2WnlOe8SSKuq9sT7ps-2nbiTmZZMTCn_rFk4-mNoGnYL-DPU8pJhmNNOtkP-syqWE4WO_1aVt4bPa5nTsQPQe6VRAALnm6QW3YIWbYkVS78JFbZN39vmMI1UYiWlHXKwNMB99WjsZOn0qc_8dcN0unp2KMOBw0P__3OH0))/CheatSheet.aspx?AspxAutoDetectCookieSupport=1) for support
You could always refer to the [Regular Expression Library](<http://regexlib.com/(X(1)A(GijS7qxVy-6Gyc4cweUyFoK4ZvRn2WnlOe8SSKuq9sT7ps-2nbiTmZZMTCn_rFk4-mNoGnYL-DPU8pJhmNNOtkP-syqWE4WO_1aVt4bPa5nTsQPQe6VRAALnm6QW3YIWbYkVS78JFbZN39vmMI1UYiWlHXKwNMB99WjsZOn0qc_8dcN0unp2KMOBw0P__3OH0))/CheatSheet.aspx?AspxAutoDetectCookieSupport=1>) for support
For this project, there'd be three required inputs for validation:
For this project, there'd be three required inputs for validation:
- The first would require the user to enter five (5) capital letters, six (6) symbols and two hyphens (-) in any order. This could be used as a password.
- The first would require the user to enter five (5) capital letters, six (6) symbols and two hyphens (-) in any order. This could be used as a password.
- The second which could be used as username would require the user to enter letters without spaces
- The second which could be used as username would require the user to enter letters without spaces
- The third which could be used as email address would require the user to enter only email addresses on gmail (...@gmail.com).
- The third which could be used as email address would require the user to enter only email addresses on gmail (...@gmail.com).
## User Stories
## User Stories
- [ ] User should be notified of any invalid inputs by error messages displayed on the form.
- [ ] User should be notified of any invalid inputs by error messages displayed on the form.
- [ ] The submit button on the form would never be executed until all entries are validated.
- [ ] The submit button on the form would never be executed until all entries are validated.
@ -8,31 +14,31 @@ Roman numerals, as used today, employ seven symbols, each with a fixed integer v
See the below table the _Symbol - Value_ pairs:
See the below table the _Symbol - Value_ pairs:
- I - 1
- I - 1
- V - 5
- V - 5
- X - 10
- X - 10
- L - 50
- L - 50
- C - 100
- C - 100
- D - 500
- D - 500
- M - 1000
- M - 1000
## User Stories
## User Stories
- [ ] User should be able to enter one Roman number in an input field
- [ ] User should be able to enter one Roman number in an input field
- [ ] User could see the results in a single output field containing the decimal (base 10) equivalent of the roman number that was entered by pressing a button
- [ ] User could see the results in a single output field containing the decimal (base 10) equivalent of the roman number that was entered by pressing a button
- [ ] If a wrong symbol is entered, the User should see an error
- [ ] If a wrong symbol is entered, the User should see an error
## Bonus features
## Bonus features
- [ ] User could see the conversion to be made automatically as I type
- [ ] User could see the conversion to be made automatically as I type
- [ ] User should be able to convert from decimal to Roman (vice-versa)
- [ ] User should be able to convert from decimal to Roman (vice-versa)
## Useful links and resources
## Useful links and resources
- [An explanation of Roman Numbers](https://en.wikipedia.org/wiki/Roman_numerals)
- [An explanation of Roman Numbers](https://en.wikipedia.org/wiki/Roman_numerals)
## Example projects
## Example projects
Try not to view this until you've developed your own solution:
Try not to view this until you've developed your own solution:
- [Roman Number Converter](https://www.calculatorsoup.com/calculators/conversions/roman-numeral-converter.php)
- [Roman Number Converter](https://www.calculatorsoup.com/calculators/conversions/roman-numeral-converter.php)
- [ ] User can select the measurement system calculations will be performed in - Metric or English
- [ ] User can select the measurement system calculations will be performed in - Metric or English
- [ ] User can enter the actual temperature and the wind speed
- [ ] User can enter the actual temperature and the wind speed
- [ ] User can press the `Calculate` button to display the wind chill
- [ ] User can press the `Calculate` button to display the wind chill
- [ ] User will receive an error message when `Calculate` is clicked if data values are not entered
- [ ] User will receive an error message when `Calculate` is clicked if data values are not entered
## Bonus features
## Bonus features
- [ ] User will receive an error message when `Calculate` is clicked if the resulting wind chill factor is greater than or equal to the actual temperature. Since this signifies an internal error in the calculation you may also satisfy this requirement using an assertion
- [ ] User will receive an error message when `Calculate` is clicked if the resulting wind chill factor is greater than or equal to the actual temperature. Since this signifies an internal error in the calculation you may also satisfy this requirement using an assertion
- [ ] User will be prompted to enter new data values if `Calculate` is pressed without first changing at least one of the input fields
- [ ] User will be prompted to enter new data values if `Calculate` is pressed without first changing at least one of the input fields
- [ ] User will see an updated wind chill factor whenever new actual temperature or wind speed values are entered, without being required to click the `Calculate` button
- [ ] User will see an updated wind chill factor whenever new actual temperature or wind speed values are entered, without being required to click the `Calculate` button
- [ ] User can display game rules by entering `bb help` into the chat window.
- [ ] User can display game rules by entering `bb help` into the chat window.
- [ ] User can start a game by entering `bb start` into the chat
- [ ] User can start a game by entering `bb start` into the chat
- [ ] User can target a cell by entering `bb shoot r,c` into the chat window, where `r` and `c` are the row and column coordinates of the cell to be targeted.
- [ ] User can target a cell by entering `bb shoot r,c` into the chat window, where `r` and `c` are the row and column coordinates of the cell to be targeted.
- [ ] User can see the game board showing hits and misses displayed by the bot after each shot is taken
- [ ] User can see the game board showing hits and misses displayed by the bot after each shot is taken
- [ ] User can see a congratulations message after the shot that sinks the last remaining ship.
- [ ] User can see a congratulations message after the shot that sinks the last remaining ship.
## Bonus features
## Bonus features
- [ ] User can surrender a game by entering `bb surrender` in the chat window.
- [ ] User can surrender a game by entering `bb surrender` in the chat window.
- [ ] User can see a card containing a graphical representation of the hits and misses rather than a simple 2D table of characters.
- [ ] User can see a card containing a graphical representation of the hits and misses rather than a simple 2D table of characters.
@ -22,48 +28,48 @@ BGE is responsible for maintaining game state.
### BGE
### BGE
- [ ] Caller can invoke a `startGame()` function to begin a 1-player game. This function will generate an 8x8 game board consisting of 3 ships having a width of one square and a length of:
- [ ] Caller can invoke a `startGame()` function to begin a 1-player game. This function will generate an 8x8 game board consisting of 3 ships having a width of one square and a length of:
- Destroyer: 2 squares
- Destroyer: 2 squares
- Cruiser: 3 squares
- Cruiser: 3 squares
- Battleship: 4 squares
- Battleship: 4 squares
`startGame()` will randomly place these ships on the board in any direction and will return an array representing ship placement.
`startGame()` will randomly place these ships on the board in any direction and will return an array representing ship placement.
- [ ] Caller can invoke a `shoot()` function passing the target row and column coordinates of the targeted cell on the game board. `shoot()` will return indicators representing if the shot resulted in a hit or miss, the number of ships left (i.e. not yet sunk), the ship placement array, and an updated hits and misses array.
- [ ] Caller can invoke a `shoot()` function passing the target row and column coordinates of the targeted cell on the game board. `shoot()` will return indicators representing if the shot resulted in a hit or miss, the number of ships left (i.e. not yet sunk), the ship placement array, and an updated hits and misses array.
Cells in the hits and misses array will contain a space if they have yet to be targeted, `O` if they were targeted but no part of a ship was at that location, or `X` if the cell was occupied by part of a ship.
Cells in the hits and misses array will contain a space if they have yet to be targeted, `O` if they were targeted but no part of a ship was at that location, or `X` if the cell was occupied by part of a ship.
### Text-based Presentation Layer
### Text-based Presentation Layer
- [ ] User can see the hits and misses array displayed as a 2 dimensional character representation of the game board returned by the `startGame()` function.
- [ ] User can see the hits and misses array displayed as a 2 dimensional character representation of the game board returned by the `startGame()` function.
- [ ] User can be prompted to enter the coordinates of a target square on the game board.
- [ ] User can be prompted to enter the coordinates of a target square on the game board.
- [ ] User can see an updated hits and misses array display after taking a shot.
- [ ] User can see an updated hits and misses array display after taking a shot.
- [ ] User can see a message after each shot indicating whether the shot resulted in a hit or miss.
- [ ] User can see a message after each shot indicating whether the shot resulted in a hit or miss.
- [ ] User can see an congratulations message after the shot that sinks the last remaining ship.
- [ ] User can see an congratulations message after the shot that sinks the last remaining ship.
- [ ] User can be prompted to play again at the end of each game. Declining to play again stops the game.
- [ ] User can be prompted to play again at the end of each game. Declining to play again stops the game.
## Bonus features
## Bonus features
### BGE
### BGE
- [ ] Caller can specify the number of rows and columns in the game board as a parameter to the `startGame()` function.
- [ ] Caller can specify the number of rows and columns in the game board as a parameter to the `startGame()` function.
- [ ] Caller can invoke a `gameStats()` function that returns a Javascript object containing metrics for the current game. For example, number of turns played, current number of hits and misses, etc.
- [ ] Caller can invoke a `gameStats()` function that returns a Javascript object containing metrics for the current game. For example, number of turns played, current number of hits and misses, etc.
- [ ] Caller can specify the number of players (1 or 2) when calling `startGame()` which will generate one board for each player randomly populated with ships.
- [ ] Caller can specify the number of players (1 or 2) when calling `startGame()` which will generate one board for each player randomly populated with ships.
`shoot()` will accept the player number the shot is being made for along with the coordinates of the shot. The data it returns will be for that player.
`shoot()` will accept the player number the shot is being made for along with the coordinates of the shot. The data it returns will be for that player.
### Text-based Presentation Layer
### Text-based Presentation Layer
- [ ] User can see the current game statics at any point by entering the phrase `stats` in place of target coordinates. (Note that this requires the `gameStats()` function in the BGE)
- [ ] User can see the current game statics at any point by entering the phrase `stats` in place of target coordinates. (Note that this requires the `gameStats()` function in the BGE)
- [ ] User can specify a two player game is to be played, with each player alternating turns in the same terminal session (Note that this requires corresponding Bonus Features in the BGE)
- [ ] User can specify a two player game is to be played, with each player alternating turns in the same terminal session (Note that this requires corresponding Bonus Features in the BGE)
- [ ] User can see the player number in prompts associated with the inputs in each turn.
- [ ] User can see the player number in prompts associated with the inputs in each turn.
- [ ] User can see both players boards at the end of each turn.
- [ ] User can see both players boards at the end of each turn.
## Useful links and resources
## Useful links and resources
- [Battleship Game (Wikipedia)](<https://en.wikipedia.org/wiki/Battleship_(game)>)
- [Battleship Game (Wikipedia)](<https://en.wikipedia.org/wiki/Battleship_(game)>)
- [Battleship Game Rules (Hasbro)](https://www.hasbro.com/common/instruct/battleship.pdf)
- [Battleship Game Rules (Hasbro)](https://www.hasbro.com/common/instruct/battleship.pdf)
## Example projects
## Example projects
@ -71,4 +77,4 @@ This YouTube video shows how a text-based [Battleship Game](https://www.youtube.
The following example is provided as a demonstration of the Battleship game if it is unfamiliar to you. Remember you are to implement a text based presentation layer for testing.
The following example is provided as a demonstration of the Battleship game if it is unfamiliar to you. Remember you are to implement a text based presentation layer for testing.
- [Battleship Game by Chris Brody](https://codepen.io/CodifyAcademy/pen/ByBEOz)
- [Battleship Game by Chris Brody](https://codepen.io/CodifyAcademy/pen/ByBEOz)
@ -8,27 +14,27 @@ As a MVP(Minimum Viable Product) you can focus on building the Chat interface. R
## User Stories
## User Stories
- [ ] User is prompted to enter a username when he visits the chat app. The username will be stored in the application
- [ ] User is prompted to enter a username when he visits the chat app. The username will be stored in the application
- [ ] User can see an `input field` where he can type a new message
- [ ] User can see an `input field` where he can type a new message
- [ ] By pressing the `enter` key or by clicking on the `send` button the text will be displayed in the `chat box` alongside his username (e.g. `John Doe: Hello World!`)
- [ ] By pressing the `enter` key or by clicking on the `send` button the text will be displayed in the `chat box` alongside his username (e.g. `John Doe: Hello World!`)
## Bonus features
## Bonus features
- [ ] The messages will be visible to all the Users that are in the chat app (using WebSockets)
- [ ] The messages will be visible to all the Users that are in the chat app (using WebSockets)
- [ ] When a new User joins the chat, a message is displayed to all the existing Users
- [ ] When a new User joins the chat, a message is displayed to all the existing Users
- [ ] Messages are saved in a database
- [ ] Messages are saved in a database
- [ ] User can send images, videos and links which will be displayed properly
- [ ] User can send images, videos and links which will be displayed properly
- [ ] User can select and send an emoji
- [ ] User can select and send an emoji
- [ ] Users can chat in private
- [ ] Users can chat in private
- [ ] Users can join `channels` on specific topics
- [ ] Users can join `channels` on specific topics
## Useful links and resources
## Useful links and resources
- [Socket.io](https://socket.io)
- [Socket.io](https://socket.io)
- [How to build a React.js chat app in 10 minutes - article](https://medium.freecodecamp.org/how-to-build-a-react-js-chat-app-in-10-minutes-c9233794642b)
- [How to build a React.js chat app in 10 minutes - article](https://medium.freecodecamp.org/how-to-build-a-react-js-chat-app-in-10-minutes-c9233794642b)
- [Build a chat application like Slack - React / JavaScript Tutorial - Youtube](https://www.youtube.com/watch?v=a-JKj7m2LIo)
- [Build a chat application like Slack - React / JavaScript Tutorial - Youtube](https://www.youtube.com/watch?v=a-JKj7m2LIo)
- [Socket.io Chat App Using Websockets - Youtube Tutorial](https://www.youtube.com/watch?v=tHbCkikFfDE)
- [Socket.io Chat App Using Websockets - Youtube Tutorial](https://www.youtube.com/watch?v=tHbCkikFfDE)
@ -12,92 +18,86 @@ purposes. For example, for tax reporting.
### Constraints
### Constraints
- Developers may use Vanilla JS, or a framework of their choice (like React,
- Developers may use Vanilla JS, or a framework of their choice (like React,
VueJS, etc.).
VueJS, etc.).
- Developers should not use libraries for calculating and manipulating monetary
- Developers should not use libraries for calculating and manipulating monetary
amounts. All calculation and formatting should be done in the language chosen
amounts. All calculation and formatting should be done in the language chosen
to develop the application.
to develop the application.
- Developers may use a graphics presentation library or service of their choice,
- Developers may use a graphics presentation library or service of their choice,
like [AMCharts](https://www.amcharts.com/).
like [AMCharts](https://www.amcharts.com/).
- Developers may choose to have transactions persist across sessions using
- Developers may choose to have transactions persist across sessions using
either files or databases. Sensitive data, like transactions, must not be
either files or databases. Sensitive data, like transactions, must not be
maintained in local storage. Remember that although you can implement
maintained in local storage. Remember that although you can implement
protections it is impossible to totally secure browser applications.
protections it is impossible to totally secure browser applications.
## User Stories
## User Stories
- [ ] User can see a Navigation Bar at the top of each page containing the
- [ ] User can see a Navigation Bar at the top of each page containing the
application name and a "hamburger" menu with these option:
application name and a "hamburger" menu with these option: - Dashboard - Transactions
- Dashboard
- [ ] User can see a Footer Bar at the bottom of each page containing an
- Transactions
About link
- [ ] User can see a Footer Bar at the bottom of each page containing an
About link
### Dashboard Page
### Dashboard Page
- [ ] User can see the Dashboard page when the app is started containing
graphical summaries of the following key metrics. The graphical representation
- [ ] User can see the Dashboard page when the app is started containing
for each is left up to the Developer.
graphical summaries of the following key metrics. The graphical representation
- Contributions by month for the current year
for each is left up to the Developer. - Contributions by month for the current year - Total contributions by year - Contribution increase/decrease by year - Average contribution amount by month and year
- Total contributions by year
- [ ] User can return to the Dashboard page, if currently on another page, by
- Contribution increase/decrease by year
clicking on the 'Dashboard' option in the hamburger menu in the Navigation Bar.
- Average contribution amount by month and year
- [ ] User can return to the Dashboard page, if currently on another page, by
clicking on the 'Dashboard' option in the hamburger menu in the Navigation Bar.
### Transactions Page
### Transactions Page
- [ ] User can see a transaction input panel containing the following:
- Transaction date
- [ ] User can see a transaction input panel containing the following:
- Payee name
- Transaction date
- Amount
- Payee name
- Memo
- Amount
- Action buttons - 'Clear', 'Add'
- Memo
- [ ] User can see a tabular transaction ledger containing previously
- Action buttons - 'Clear', 'Add'
entered transactions. Each row will also contain a 'Modify' and a 'Delete'
- [ ] User can see a tabular transaction ledger containing previously
button.
entered transactions. Each row will also contain a 'Modify' and a 'Delete'
- [ ] User can enter values describing the transaction into the input fields
button.
- [ ] User can click the 'Clear' button to reset all input fields to an
- [ ] User can enter values describing the transaction into the input fields
empty state.
- [ ] User can click the 'Clear' button to reset all input fields to an
- [ ] User can click the 'Add' button to validate the input that has been
empty state.
entered, add the validated entry to the transaction ledger, and clear the input
- [ ] User can click the 'Add' button to validate the input that has been
fields.
entered, add the validated entry to the transaction ledger, and clear the input
- [ ] User can see a consolidated error message detailing any errors detected
fields.
in input fields, including:
- [ ] User can see a consolidated error message detailing any errors detected
- Invalid date
in input fields, including: - Invalid date - Blank Payee name - Non-numeric amount field
- Blank Payee name
- [ ] User can click on the 'Update' button to modify a previously entered
- Non-numeric amount field
transaction. The transaction details will be copied to the transaction input
- [ ] User can click on the 'Update' button to modify a previously entered
panel and the 'Add' button will change to 'Modify'.
transaction. The transaction details will be copied to the transaction input
- [ ] User can change values in the input fields and click the 'Modify' to
panel and the 'Add' button will change to 'Modify'.
validate the input and update that transactions entry in the ledger. If
- [ ] User can change values in the input fields and click the 'Modify' to
successful the 'Modify' button will change back to 'Add' and the input fields
validate the input and update that transactions entry in the ledger. If
will be cleared.
successful the 'Modify' button will change back to 'Add' and the input fields
- [ ] User can click the 'Delete' button to remove a previously entered
will be cleared.
transaction. A popup dialog will be displayed containing 'Cancel' and 'Okay'
- [ ] User can click the 'Delete' button to remove a previously entered
buttons to cancel or confirm the delete. If the delete is confirmed the
transaction. A popup dialog will be displayed containing 'Cancel' and 'Okay'
transaction will be removed from the ledger.
buttons to cancel or confirm the delete. If the delete is confirmed the
- [ ] User can return to the Transactions page, if currently on another page,
transaction will be removed from the ledger.
by clicking on the 'Transactions' option in the hamburger menu in the Navigation
- [ ] User can return to the Transactions page, if currently on another page,
Bar.
by clicking on the 'Transactions' option in the hamburger menu in the Navigation
Bar.
### About Page
### About Page
- [ ] User can click the About link in the Footer Bar to display information
about the Developer.
- [ ] User can click the About link in the Footer Bar to display information
- [ ] User can see links to the Developers GitHub and social media accounts
about the Developer.
including social media icons (like the Twitter icon).
- [ ] User can see links to the Developers GitHub and social media accounts
including social media icons (like the Twitter icon).
## Bonus features
## Bonus features
- [ ] User can click in the transaction date field to display a calendar
- [ ] User can click in the transaction date field to display a calendar
the date can be selected from rather than manually entering it.
the date can be selected from rather than manually entering it.
- [ ] User can see alternating row background colors in the transaction ledger.
- [ ] User can see alternating row background colors in the transaction ledger.
- [ ] User can click on a column heading in the transaction ledger to toggle
- [ ] User can click on a column heading in the transaction ledger to toggle
the sort sequence on the values in that column.
the sort sequence on the values in that column.
- [ ] User can see a PDF option near the Transaction Ledger to create a PDF
- [ ] User can see a PDF option near the Transaction Ledger to create a PDF
of all transactions (Hint: checkout how this capability can be implemented via
of all transactions (Hint: checkout how this capability can be implemented via
@ -11,32 +17,32 @@ efforts and to make it available through a simple Slack command.
## User Stories
## User Stories
- [ ] User can create a kudu using the Slack command: `/kudo add <slack-id> <text>` where:
- [ ] User can create a kudu using the Slack command: `/kudo add <slack-id> <text>` where:
-`<slack-id>` defines the individual receiving the recognition
- `<slack-id>` defines the individual receiving the recognition
-`<text>` is your kudo for that person
- `<text>` is your kudo for that person
- [ ] User can modify a kudu using the Slack command: `/kudo replace <kudo-id> <text>` where:
- [ ] User can modify a kudu using the Slack command: `/kudo replace <kudo-id> <text>` where:
-`<action>` is 'replace' or 'delete'
- `<action>` is 'replace' or 'delete'
-`<kudo-id>` is the kudo identifier
- `<kudo-id>` is the kudo identifier
-`<text>` is your kudo for that person
- `<text>` is your kudo for that person
- [ ] User can delete a kudu using the Slack command: `/kudo delete <kudo-id>`
- [ ] User can delete a kudu using the Slack command: `/kudo delete <kudo-id>`
- [ ] User may display the most recent _n_ kudos using the Slack command: `/kudo list <n>` where `n` is an integer or `*` for all kudos
- [ ] User may display the most recent _n_ kudos using the Slack command: `/kudo list <n>` where `n` is an integer or `*` for all kudos
- [ ] User may display all kudos for an individual with the Slack command: `/kudo user <slack-id>`
- [ ] User may display all kudos for an individual with the Slack command: `/kudo user <slack-id>`
## Bonus features
## Bonus features
- [ ] User may list the individual having the most kudos, in descending order, user the Slack command: `/kudo top <n>` where `n` is an integer or `*` for all individuals who have received a kudo
- [ ] User may list the individual having the most kudos, in descending order, user the Slack command: `/kudo top <n>` where `n` is an integer or `*` for all individuals who have received a kudo
@ -25,15 +31,15 @@ development of this application.
## User Stories
## User Stories
- [ ] Allow the user to specify the channels to be archived. This includes both adding and removing channels from the list
- [ ] Allow the user to specify the channels to be archived. This includes both adding and removing channels from the list
- [ ] Only the owners of the Slack Team should be allowed to archive messages
- [ ] Only the owners of the Slack Team should be allowed to archive messages
- [ ] For each channel to be archived periodically extract messages starting from the last message retrieved in the last extract and write them to a database
- [ ] For each channel to be archived periodically extract messages starting from the last message retrieved in the last extract and write them to a database
- [ ] Allow the user to copy and extracted channel to a file
- [ ] Allow the user to copy and extracted channel to a file
- [ ] Archiving should be an automatic process. Unlike a Slack 'bot, no manual intervention should be required to start or stop and archive operation
- [ ] Archiving should be an automatic process. Unlike a Slack 'bot, no manual intervention should be required to start or stop and archive operation
## Bonus features
## Bonus features
- [ ] Implement an API that allows an application to extract archived messages from the archive database
- [ ] Implement an API that allows an application to extract archived messages from the archive database