From fcbb2a870ee68547aa9ef90a2f5470e3f3564b46 Mon Sep 17 00:00:00 2001 From: 100yo Date: Mon, 20 Jan 2025 18:35:15 +0200 Subject: [PATCH] Add course projects assignments --- course-projects/README.md | 35 +++ course-projects/auth-server.md | 193 ++++++++++++++++ course-projects/bookmarks.md | 113 +++++++++ course-projects/cryptocurrency-wallet.md | 115 ++++++++++ course-projects/dungeons.md | 110 +++++++++ course-projects/food-analyzer.md | 92 ++++++++ course-projects/images/peer-to-peer.png | Bin 0 -> 103374 bytes course-projects/images/upc-barcode.gif | Bin 0 -> 3422 bytes course-projects/password-vault.md | 118 ++++++++++ course-projects/splitwise.md | 156 +++++++++++++ course-projects/spotify.md | 109 +++++++++ course-projects/todoist.md | 146 ++++++++++++ course-projects/torrent.md | 78 +++++++ course-projects/uno.md | 281 +++++++++++++++++++++++ 14 files changed, 1546 insertions(+) create mode 100644 course-projects/README.md create mode 100644 course-projects/auth-server.md create mode 100644 course-projects/bookmarks.md create mode 100644 course-projects/cryptocurrency-wallet.md create mode 100644 course-projects/dungeons.md create mode 100644 course-projects/food-analyzer.md create mode 100644 course-projects/images/peer-to-peer.png create mode 100644 course-projects/images/upc-barcode.gif create mode 100644 course-projects/password-vault.md create mode 100644 course-projects/splitwise.md create mode 100644 course-projects/spotify.md create mode 100644 course-projects/todoist.md create mode 100644 course-projects/torrent.md create mode 100644 course-projects/uno.md diff --git a/course-projects/README.md b/course-projects/README.md new file mode 100644 index 00000000..05c5c154 --- /dev/null +++ b/course-projects/README.md @@ -0,0 +1,35 @@ +# Указания за разработка на курсов проект + +1. Проектите са индивидуални + +2. Mоже да изберете един от предложените проекти или да измислите и предложите свой (приема се след наше одобрение - изпратете предложението си на екипа на курса) + +3. Всички проекти трябва да покриват следните общи условия: + - Демонстрират знания за + - вход-изход с файлове + - многонишково програмиране + - мрежова комуникация + - Имат unit тестове с поне 50% line code coverage + - Имат валидация на входните данни + - Имат добър обектно-ориентиран дизайн + - Използват подходящи изключения за докладване на грешки + - Използват подходящи структури от данни и ефективни алгоритми + - Имат четлив и добре структуриран код + - Ползват в имплементацията си само Java SE и външни библиотеки и API-та, изучавани в курса или изрично указани в условието. При нужда или желание да ползвате нещо допълнително, обсъдете с екипа на курса + +# Варианти за теми + +| # | Тема | +|:---|:--------------------------------------------------------- | +| 1 | [Authentication Server](auth-server.md) | +| 2 | [Bookmarks Manager](bookmarks.md) | +| 3 | [Dungeons Online](dungeons.md) | +| 4 | [Uno](uno.md) | +| 5 | [Food Analyzer](food-analyzer.md) | +| 6 | [Split(NotSo)Wise](splitwise.md) | +| 7 | [Spotify](spotify.md) | +| 8 | [Torrent Server](torrent.md) | +| 9 | [Password Vault](password-vault.md) | +| 10 | [Todoist](todoist.md) | +| 11 | [Cryptocurrency Wallet Manager](cryptocurrency-wallet.md) | +| 12 | По ваш избор | diff --git a/course-projects/auth-server.md b/course-projects/auth-server.md new file mode 100644 index 00000000..ccd7f480 --- /dev/null +++ b/course-projects/auth-server.md @@ -0,0 +1,193 @@ +# Authentication Server :cop: + +Когато се занимаваме с програмиране, няма как да избегнем въпросите, свързани със security. Обикновено имаме система, съставена от няколко компонента (наречени *микросървиси*) и един security server, който отговаря за комуникацията между потребителя и системата и тази между микросървисите да бъде защитена. + +### Authentication vs Authorization + +Най-общо, *authentication* наричаме проверката, дали потребителят, със своето име и парола, който опитва да се логне в системата, съществува в нея. + +*Authorization* проверката, от друга страна, се извършва срещу вече логнати потребители. Тя се състои в това дали потребителят има право да извърши операцията, която иска - ако има, му позволяваме, ако не - извеждаме подходящо съобщение за грешка. + +Например, всички ние сме потребители в СУСИ. Когато се логваме, минаваме през *authentication check*. Когато Стойо нанася оценките от курса, СУСИ се уверява, че той има необходимите права да нанася оценки и чак тогава му позволява да го направи. + +### Audit Log + +[Audit Log-ът](https://en.wikipedia.org/wiki/Audit_trail) е дневник, който пази информация за различни събития, свързани със сигурността, които са настъпили в системата ни. Такива събития могат да са например промяна на атрибутите на даден потребител, или пък негово нетипично или рисковано поведение. + +#### А каква е ползата от това да се пази audit log на системата? + +Чрез audit logging, бързо можем да открием кой е направил грешна конфигурация на системата ни, или пък кой (и от къде) е направил многократни неуспешни опити да се логне. Във втория сценарий, можем да продължим с анализа - с едно и също потребителско име ли е опитал да се логне, ако не, може би е опитал да направи DoS (Denial of Service) атака, проверяваме дали е от един IP адрес (хакерите в днешно време не са толкова глупави). Ако пък потребителят е един и същ, може това да е опит да се "разбие" профила му. + +Използването на audit logging е задължително за всяко по-сериозно приложение, платформа или онлайн услуга. В нашата задача ще използваме един простичък механизъм, но в практиката съществуват немалко препятствия, които трябва да се вземат под внимание. Няколко линка с информация за по-любопитните: + +- [What Are Audit Logs? | blogpost by Rodney Smith](https://rollout.io/blog/audit-logs/) +- [Audit logs for security and compliance | blogpost by Daniel Berman | long one, contains Linux examples of audit logging](https://logz.io/blog/audit-logs-security-compliance/) +- [Audit Log | Martin Fowler short blogpost](https://martinfowler.com/eaaDev/AuditLog.html) + +## Условие + +Имплементирайте ***сървър***, който да се грижи за authentication и authorization на потребители, както и конзолен ***клиент*** (CLI, Command-Line Interface), който да може да си комуникира с него. Сървърът трябва да поддържа паралелна работа с множество клиенти. + +Когато един потребител "влезе" в системата, за него се създава т. нар. ***потребителска сесия***. Тя има уникален идентификатор и време, за което е валидна. При успешен вход, потребителят получава този идентификатор и чрез него може да изпълнява операциите, които изискват authentication и authorization. + +Потребителите на Authentication Server-а са три типа: + +- unauthenticated +- authenticated +- admin (подтип на authenticated потребители) + +Сървърът предлага различен набор от функционалности на различните типове потребители. Затова, може да разделим и достъпните операции на няколко типа. + +### Unsecured команди + +За изпълнението на unsecured командите, не е необходима валидна потребителска сесия, тоест не е нужно да подаваме session ID като параметър. + +- **Регистрация** + + Добавяне на нов потребител, само ако вече не съществува друг потребител с такова име. След успешна регистрация, потребителят бива логнат автоматично. + + ```bash + register --username --password --first-name --last-name --email + ``` + +- **Вход** + + Потребителите могат да влизат в системата по два начина: + + - чрез своето потребителско име и парола + - чрез уникален идентификатор на вече съществуваща login сесия. + + **Сесията** е обект, който пази уникален идентификатор (*session ID*) и *time-to-live (ttl)*. + + В един момент един потребител може да има само една валидна сесия. Тя се създава в момента на успешен login, и session ID-то се връща на потребителя, за да може той да го преизползва (например от друг терминал). + След изтичане на time-to-live периода, сесията бива унищожена - потребителят e logout-нат и след това не може да преизползва това session ID за логване, а трябва да го направи със своето потребителско име и парола. + + Командите могат да имат следният вид: + + ```bash + login -–username --password + login -–session-id + ``` + +#### Failed login + + При надвишаване на определен брой неуспешни опити за вход в системата, потребителят се lock-ва за определен период от време. Потребителят може да направи следващ опит за логин едва след като това време изтече. + Броят неуспешни опити и lock периодът са част от конфигурацията на сървъра. + +### Secured команди + +Това са командите, достъпни за потребителите, които имат валидна сесия. Всички имат задължителен параметър session ID. +Също могат да бъдат разделени на две групи - такива, които са достъпни за всички потребители и такива, които са само за администратори. + +#### Основни команди + +- **Промяна на потребителските данни** + + Потребителите могат да променят своите *данни* (потребителско име, име, фамилия и мейл): + + ```bash + update-user -–session-id -–new-username --new-first-name --new-last-name --new-email . + ``` + + Всички параметри освен --session-id в тази команда са опционални. + +- **Промяна на парола** + + Потребителите могат да променят паролата си, като всички параметри в командата са задължителни. + + ```bash + reset-password -–session-id –-username --old-password --new-password + ``` + +- **Изход от системата** + + При изход, сесията се инвалидира и подаденото session ID не може да бъде използвано повторно за логин. + + ```bash + logout –-session-id + ``` + +#### Администраторски команди + +- **Добавяне на администраторски права на потребител** + + Администраторите могат да създават нови администратори. Правата на новите администратори влизат в действие веднага, без да има необходимост от повторен логин. + + ```bash + add-admin-user –-session-id –-username + ``` +- **Премахване на администраторски права на потребител** + + Администраторите могат да премахват правата на други администратори. Правата се премахват веднага, без необходимост от повторен логин. + + ```bash + remove-admin-user –-session-id –-username + ``` + Aдминистраторът може да премахне дори своите собствени права, освен, ако не е единствен администратор на сървъра. + +- **Премахване на потребител** + + Администраторите имат право да премахнат даден регистриран потребител. + + ```bash + delete-user –-session-id –-username + ``` + + При изтриване на user, се премахва всяка пазена информация за него (без тази в audit log-a), както и се инвалидира сесията му, ако има валидна такава. + +## Audit Log + +Както споменахме, системата ни ще съхранява и audit log-ове. Трябва да се пазят като текстови файлове на файловата система в предварително конфигурирана директория. + +### Типове събития, който ще записваме + +- **Неуспешен опит за вход** + + При неуспешен опит за вход логваме следното: + + - Timestamp + - Тип на събитието (failed login) + - Извършител - потребителят, който опитва да извърши действието и неговия IP адрес + +- **Изпълнение на команди, променящи ресурси на системата** (добавяне/премахване на администратор). Логовете, които се пишат при промяна на ресурс са два: + + - когато операцията започне: + + - Timestamp + - ID на операцията + - Тип на събитието (configuration change) + - Извършител - потребителят, който опитва да извърши действието и неговото IP + - какво се променя - кой user е засегнат и дали са премахнати или добавени права + + - когато операцията завърши: + + - Timestamp + - ID на операцията (същото, като това при започване) + - Тип на събитието (configuration change) + - Извършител - потребителят, който опитва да извържи действието и неговото IP + - резултата от нея - дали е била успешна или не + +Форматът на логовете е по ваш избор. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in ". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Уточнения + +- User информацията трябва да се пази във файл (ще играе ролята на база от данни за сървъра), като паролата **не трябва** да се пази в plain text +- При повторен login за даден потребител с username и password, предишната създадена сесия (ако има такава) трябва да се инвалидира и да се създаде нова + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/bookmarks.md b/course-projects/bookmarks.md new file mode 100644 index 00000000..13a8d7b9 --- /dev/null +++ b/course-projects/bookmarks.md @@ -0,0 +1,113 @@ +# Bookmarks Manager :paperclip: + +## Условие + +Създайте приложение за удобно съхранение и организиране на линкове (*bookmarks*). + +### Сървър + +Предоставя следните функционалности на клиента: +- регистриране и вход с потребителско име и парола +- добавяне на нови bookmarks +- премахване на bookmarks +- групиране на bookmarks +- търсене на bookmarks по заглавие или ключова дума + +:bulb: Bookmark-ите на потребителите трябва да се съхраняват във файлове на сървъра. + +:bulb: Всеки добавен bookmark трябва да има *заглавие*. То трябва да отговаря на съдържанието на **** таг-а от `html`-а на страницата. + +:bulb: При добавяне на нов bookmark, сървърът трябва да `extract`-не ключовите думи от страницата, за да могат потребителите да търсят по тях. + +- Ключовите думи са най-използваните думи в страницата. Погрижете се предварително да премахнете пунктуационни знаци, специални символи, `stopwords` и т.н. +- Опитайте се да сведете думите до техните корени, използвайки някой [`stemming`](https://en.wikipedia.org/wiki/Stemming) алгоритъм. Най-простият от тях, който можете да използвате, е `Suffix-stripping algorithm`: +> - if the word ends in 'ed', remove the 'ed' +> - if the word ends in 'ing', remove the 'ing' +> - if the word ends in 'ly', remove the 'ly' + +- За лесно `parse`-ване на `html`, може да използвате библиотеката [JSoup](https://jsoup.org/). + +### Клиент + +Клиентът трябва да има `command line interface` със следните команди: + + +#### Регистриране +```bash +register +``` +Регистрира нов потребител в приложението с име и парола + +#### Вход +```bash +login +``` + +#### Създаване на нова група за съхранение на bookmarks +```bash +new-group +``` + +#### Добавяне на нов bookmark в група +```bash +add-to {--shorten} +``` +Добавя bookmark в конкретна група. Aко опцията `--shorten` е налична, сървърът трябва да съкрати оригиналния bookmark, използвайки API-то на [Bitly](https://dev.bitly.com/api-reference), документирано [тук](https://dev.bitly.com). + +#### Премахване на bookmark от група +```bash +remove-from +``` + +#### List-ване на всички bookmarks +```bash +list - извежда списък с всички линкове на потребителя +``` + +#### List-ване на всички bookmarks от група +```bash +list --group-name - извежда списък с всички линкове от дадената група +``` + +#### Търсене на bookmarks по тагове +```bash +search --tags [ ...] +``` +#### Търсене на bookmarks по заглавие +```bash +search --title - връща всички линкове, в чиито заглавия се среща <title> +``` + +#### Изчистване на невалидни линкове +```bash +cleanup - премахва всички bookmarks, чиито линкове вече не са валидни (т.е при /GET на bookmark-a се връща статус код 404 Not Found) +``` + +#### Добавяне на bookmarks от Chrome +```bash +import-from-chrome - добавя всички bookmarks от Google Chrome +``` + +`Google Chrome` съхранява вашите `bookmarks` на файловата система в `json` формат. Файлът с `bookmarks` се намира в различни директории в зависимост от операционната система: +- **Windows** - `AppData\Local\Google\Chrome\User Data\Default` +- **Linux** - `~/.config/google-chrome/Default/` +- **MacOS** - `/Users/<Your UserName>/Library/Application\ Support/Google/Chrome` + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/cryptocurrency-wallet.md b/course-projects/cryptocurrency-wallet.md new file mode 100644 index 00000000..bee1f317 --- /dev/null +++ b/course-projects/cryptocurrency-wallet.md @@ -0,0 +1,115 @@ +# Cryptocurrency Wallet Manager :moneybag: :money_with_wings: + +Напишете клиент-сървър приложение, което симулира личен портфейл за криптовалути. Криптовалутите са един от най-популярните варианти за инвестиране в момента. Интерес към тях имат както опитни инвеститори, така и любители. + +## Условие + +Създайте клиентско конзолно приложение, което приема потребителски команди, изпраща ги за обработка на сървъра, приема отговора му и го предоставя на потребителя в human-readable формат. + +*Note*: Командите и output-ът в условието са примерни, свободни сте да ги преименувате и форматирате. Единственото условие е, те да бъдат интуитивни. За улеснение на потребителя, може да имплементирате команда help. + +## Функционални изисквания + +- **register** - регистрация на потребител с username и password. Регистрираните потребители се пазят във файл на сървъра - той служи като база от данни, като паролата не трябва да се пази в plain text. При спиране и повторно пускане, сървърът може да зареди в паметта си вече регистрираните потребители. + +- **login** - потребителят влиза в системата + +- **deposit-money** - добавя определена сума пари към портфейла на потребителя. Тъй като API-то, което ще използваме в задачата, работи с долари, ще приемем, че сумите, които депозираме, ще са в долари. + + ```bash + $ deposit-money 10000.00 + ``` +- **list-offerings** - предоставя информацията за всички налични криптовалути, от които потребителят може да купува. Информацията за наличните валути взимаме от [CoinAPI](#CoinAPI)-то. + ```bash + $ list-offerings + ``` +- **buy** - купува количество от дадена криптовалута за определената сума пари. Сумата трябва да е налична в портфейла на потребителя. + ```bash + $ buy --offering=<offering_code> --money=<amount> + ``` +- **sell** - продава конкрента криптовалута. Сумата, получена от печалбата, остава в портфейла на потребителя. + ```bash + $ sell --offering=<offering_code> + ``` +- **get-wallet-summary** - предоставя цялостна информацията за портфейла на потребителя - информация за всички активни инвестиции към момента на изпълнение на командата, за парите в портфейла му. + ```bash + $ get-wallet-summary + ``` +- **get-wallet-overall-summary** - предоставя информацията за цялостната печалба/загуба от инвестициите на потребителя. Приложението сравнява цената за всяка криптовалута от момента на купуване и текущата ѝ цена, за да получи цялостната информация. + ```bash + $ get-wallet-overall-summary + ``` +## CoinAPI +Информацията за криптовалутите, от която сървърът има нужда, е достъпна чрез публично безплатно REST API - [CoinAPI](https://www.coinapi.io/). + +Заявките към REST API-то изискват автентикация с API key, какъвто може да получите като се регистрирате [тук](https://www.coinapi.io/pricing?apikey). + +*Note*: Функционалността, която предлага API-то, е доста обширна, но ние ще се фокусираме на описаната [тук](https://docs.coinapi.io/#list-all-assets). Тя би била достатъчна за функционалността на проекта. + +Следните endpoints от API-то биха ви били полезни: +- **GET /v1/assets** - връща инфомрация за всички достъпи asset-и в JSON формат +- **GET /v1/assets/{asset_id}** - връща инфромация за конкретен asset в JSON формат. + + - **Пример:** +```bash + GET /v1/assets/BTC +``` + +```bash +[ + { + "asset_id": "BTC", + "name": "Bitcoin", + "type_is_crypto": 1, + "data_start": "2010-07-17", + "data_end": "2021-01-24", + "data_quote_start": "2014-02-24T17:43:05.0000000Z", + "data_quote_end": "2021-01-24T19:07:51.7954142Z", + "data_orderbook_start": "2014-02-24T17:43:05.0000000Z", + "data_orderbook_end": "2020-08-05T14:38:38.3413202Z", + "data_trade_start": "2010-07-17T23:09:17.0000000Z", + "data_trade_end": "2021-01-24T19:08:47.4460000Z", + "data_symbols_count": 46840, + "volume_1hrs_usd": 9160288508835.92, + "volume_1day_usd": 197928243055426.88, + "volume_1mth_usd": 11571260516151083.22, + "price_usd": 31304.448721266051267349441838, + "id_icon": "4caf2b16-a017-4e26-a348-2cea69c34cba" + } +] +``` + + - Сървърът трябва да кешира получената от API-то информация като тя ще е валидна само за период от 30 минути, заради постоянно променящата се цена на криптовалутите. + - Обмислете как оптимално да структурирате заявките до API-то. + - Може да използвате полето ***typeiscrypto*** от отговора, за да филтрирате само asset-ите, които са криптовалути. + - ***offeringcode*** от клиентските команди съответства на ***asset_id***-то от CoinAPI-то. + - Тъй като API-то връща огромен набор от валути, може да изберете да показвате на потребителя само първите 50, 100 или 150 валути от резултата или да филтрирате по някакъв друг критерий. Този избор оставяме на вас. + +## Нефункционални изисквания + +- Сървърът може да обслужва множество потребители паралелно. +- Сървърът пази информацията за потребителите и техните портфейли по начин, който му позволява след спиране или рестартиране да може да зареди тази информация отново. Помислете за подходящ формат на данни, в който може да съхранявате информацията от сървъра. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при логин на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Уточнения + +- Валидацията на потребителския вход е задължителна, т.е. покрийте всички сценарии, за които се сетите с невалиден вход - било то null, грешно форматиране, невалиден тип на данните и т.н. +- Командите и output-ът от тях са примерни. Свободни сте да представите ваша интерпретация на командите, както и да добавите нови. Единствената им цел тук е да помогнат за разбирането на условието. +- Всякакви допълнителни функционалности, за които се сетите, са добре дошли. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/dungeons.md b/course-projects/dungeons.md new file mode 100644 index 00000000..1b334e38 --- /dev/null +++ b/course-projects/dungeons.md @@ -0,0 +1,110 @@ +# Dungeons Online :video_game: + +Време е да хванем нашата Single-Player скучна игра от началото на курса и да я превърнем в супер яка Online игра. + +## Условие + +Реализирайте клиент-сървърна [MMORPG](https://en.wikipedia.org/wiki/Massively_multiplayer_online_role-playing_game), в която различни играчи ще могат да развиват своите герои и да водят ожесточени битки помежду си. + +## Основни елементи на играта + +### Герои + +Героите ще се управляват от клиентската част на приложението. + +За улеснение, нека приемем, че **едновременно ще могат да играят по 9 героя**, всеки с уникален номер (от 1 до 9), които ще се визуализират на картата. + +Те ще могат да: +- се движат по картата +- събират съкровища +- се бият с `Minions` и други играчи. + +Всеки герой трябва да има конкретен *level*. При всяка проведена битка, както и за всяко взето съкровище, героят трябва да вдига *experience*, като при достигане на нужния *experience* за следващoто ниво, то да *level-up*-ва. + +Героите също ще си имат `Backpack`, в която ще пазят събраните съкровища и при желание ще могат да консумират или просто да изхвърлят някое от тях. Нека тя да има капацитет от **10** предмета. + +Когато даден герой умре, нека да се изхвърля случаен предмет от раницата му (ако има такъв). + +Всеки герой има `Stats` (*health*, *mana*, *attack*, *deffense*). В началото, нека `Stats`-овете им да бъдат: +- **health: 100** +- **mana: 100** +- **attack: 50** +- **deffense: 50** + +При вдигане на всеки *level*, да се добавят към `Stats`-овете по **10 health**, **10 mana**, **5 аttack** и **5 deffense**. + +Героите ще могат да носят оръжия, както и да правят магии, които ще намират и научават чрез събиране на съкровища по картата. + +### Minions + +Това са статични чудовища по картата, които играчите ще могат да атакуват и да си вдигат чрез тях нивото. Minion-ите също ще имат *level* и `Stats`, който ще се определя от *level*-а им. Колкото по- голям *level* е даден `Minion`, толкова повече *experience* ще носи на играча, който го убие. + +### Treasure + +#### 1. Weapon + +Всеки `Weapon` си има *level* и *attack*, като героят ще може да се бие с него само ако има *level* >= на *level*-a на `Weapon`-a. В противен случай просто ще може да си го вземе в раницата. + +Когато героят се екипира с оръжието, към неговата атака ще се добави атаката на оръжието. + +#### 2. Spell + +Тук важат същите условия, както при оръжието, като `Spell`-ът допълнително си има *manaCost*. Героят ще може да изпълни `Spell`-a само ако има >= *mana* на неговия *manaCost*. + + - **Mana potion** + + Съдържа точки *mana*, които зарежда на героя. + +- **Health potion** + + Съдържа точки *health*, които зарежда на героя. + +### Map + +Нека картата да изглежда по подобен начин: +``` + . . # # . . 1 . . T + T # # . 3 # # # . # + . . . . M . # . M T + 2 M . . . . . . # # +``` + където: + + * \# - Препятствие, през което героите не могат да минават. + * T - Съкровище. + * . - Свободна позиция. + * M - Minion. + * 1-3 - Играчи отговарящи на съответните индекси. + +## Забележки + +Героите и Враговете трябва да имплементират интерфейса `Actor`. + +## Функционалности, които трябва да реализирате + + 1. Играчите трябва да могат да се движат по картата. Когато даден играч се премести, динамично се обновява картата и на останалите играчи, които се намират на картата. + + 2. Играчите трябва да могат да събират съкровища по картата. Когато даден играч вземе съкровище, то на останалите играчи трябва съкровището да изчезне от картата. + За да вземе някое съкровище, играчът трябва да се намира на мястото, където е съкровището. + + 3. Играчите трябва да могат да си пращат предмети от раниците на други играчи, като за да се случи това, те трябва да се намират на една и съща позиция. + + 4. Играчите трябва да могат да се бият както с Minion-и по картата, така и с други играчи. За да се проведе битка с Minion или друг играч, трябва участниците да се намират на една и съща позиция. Като даден Minion бъде убит, той изчезва от картата и се появява нов, на някоя свободна позиция по картата. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/food-analyzer.md b/course-projects/food-analyzer.md new file mode 100644 index 00000000..5b2faa39 --- /dev/null +++ b/course-projects/food-analyzer.md @@ -0,0 +1,92 @@ +# Food Analyzer :hamburger: + +В наши дни е особено важно да знаем какво ядем и да следим калориите, които консумираме. Нека си улесним живота като имплементираме приложение, което да ни информира за състава и енергийната стойност на хранителните продукти в менюто ни. + +Един от най-изчерпателните и достоверни източници на подобна информация е [FoodData Central](https://fdc.nal.usda.gov/), базата данни за храни и техния състав на [U.S. Department of Agriculture](https://www.usda.gov/). За наше щастие, тази информацията е достъпна и чрез публично безплатно REST API, което е документирано [тук](https://fdc.nal.usda.gov/api-guide.html). + +Ще имплементираме Food Analyzer като многонишково клиент-сървър приложение. + +## Food Analyzer Server + +- Сървърът трябва да може да обслужва множество клиенти едновременно. +- Сървърът получава команди от клиентите и връща подходящ резултат. +- Сървърът извлича необходимите му данни от гореспоменатото *RESTful API* и запазва (кешира) резултата в локалната си файлова система. + + Например, при получаване на командата `get-food raffaello treat`, сървърът прави следната *HTTP GET* заявка: https://api.nal.usda.gov/fdc/v1/foods/search?query=raffaello%20treat&requireAllWords=true&api_key=API_KEY (където API_KEY е валиден API key) и получава *HTTP response* със статус код *200* и с тяло следния *JSON*: + +```javascript +{ + "foodSearchCriteria": { + "query": "raffaello treat", + "generalSearchInput": "raffaello treat", + "pageNumber": 1, + "requireAllWords": true + }, + "totalHits": 1, + "currentPage": 1, + "totalPages": 1, + "foods": [ + { + "fdcId": 415269, + "description": "RAFFAELLO, ALMOND COCONUT TREAT", + "dataType": "Branded", + "gtinUpc": "009800146130", + "publishedDate": "2019-04-01", + "brandOwner": "Ferrero U.S.A., Incorporated", + "ingredients": "VEGETABLE OILS (PALM AND SHEANUT). DRY COCONUT, SUGAR, ALMONDS, SKIM MILK POWDER, WHEY POWDER (MILK), WHEAT FLOUR, NATURAL AND ARTIFICIAL FLAVORS, LECITHIN AS EMULSIFIER (SOY), SALT, SODIUM BICARBONATE AS LEAVENING AGENT.", + "allHighlightFields": "", + "score": 247.10071 + } + ] +} +``` + +Заявките към REST API-то изискват автентикация с API key, какъвто може да получите като се регистрирате [тук](https://fdc.nal.usda.gov/api-key-signup.html). + +От данните за продукта, ни интересува описанието му от полето `description` (`RAFFAELLO, ALMOND COCONUT TREAT`) и уникалния му идентификатор, `fdcId` (`415269`). Някои продукти, по-точно тези с `data type` `Branded`, имат също и GTIN или UPC код, `gtinUpc` (`009800146130`). + +**Бележка:** GTIN, или [Global Trade Item Number](https://en.wikipedia.org/wiki/Global_Trade_Item_Number) и UPC, или [Universal Product Code](https://en.wikipedia.org/wiki/Universal_Product_Code), са индентификатори на продукти, кодирани в баркод. С други думи, въпросният код е числото, кодирано в баркода на опаковката на продуктите. + +![UPC Barcode](images/upc-barcode.gif) + +Сървърът кешира получената информация на локалната файлова система. При получаване на заявка, сървърът първо трябва да провери дали в кеша вече съществува информация за дадения продукт, и ако е така, директно да върне тази информация, вместо да направи нова заявка към REST API-то. + +## Food Analyzer Client + +Клиентът осъществява връзка с *Food Analyzer Server* на определен порт, чете команди от стандартния вход, изпраща ги към сървъра и извежда получения резултат на стандартния изход в human-readable формат. Клиентът може да изпълнява следните команди: + +- `get-food <food_name>` - извежда информацията, описана по-горе, за даден хранителен продукт. Ако сървърът върне множество продукти с даденото име, се извежда информация за всеки от тях. Ако пък липсва информация за продукта, се извежда подходящо съобщение. +- `get-food-report <food_fdcId>` - по даден уникален идентификатор на продукт (`fdcId`) извежда име на продукта, съставки (`ingredients`), енергийна стойност (калории), съдържание на белтъчини, мазнини, въглехидрати и фибри. +- `get-food-by-barcode --code=<gtinUpc_code>|--img=<barcode_image_file>` - извежда информация за продукт по неговия баркод, *ако такава е налична в кеша на сървъра* (обърнете внимание, че REST API-то не поддържа търсене на продукт по `gtinUpc` код или баркод изображение). Задължително е да подадем един от двата параметъра: или `code`, или файл, съдържащ баркод изображение (като пълен път и име на файла на локалната файлова система на клиента). Ако са указани и двата параметъра, `img` параметърът се игнорира. + +За да реализирате търсене по баркод изображение, ще имате нужда от Java библиотека или уеб услуга, с които да конвертирате изображение на баркод към числото, което кодира. Може да ползвате open source библиотеката [ZXing "Zebra Crossing"](https://github.com/zxing/zxing) или [ZXing уеб услугата](https://zxing.org/w/decode.jspx). + +За тестови цели, може да си генерирате баркод изображения [тук](https://barcode.tec-it.com/en/UPCA), друг вариант е да потърсите в Google изображение или директно да снимате някой баркод на опаковка. + +### Пример за валидни входни данни + +```bash +get-food beef noodle soup +get-food-report 415269 +get-food-by-barcode --img=D:\Photos\BarcodeImage.jpg --code=009800146130 +``` + +Всякакви допълнителни функционалности, за които се сетите, са добре дошли. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/images/peer-to-peer.png b/course-projects/images/peer-to-peer.png new file mode 100644 index 0000000000000000000000000000000000000000..591690aac0a46de8ebf247c209ef3967efd43521 GIT binary patch literal 103374 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�IVXCM^uga@y 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 W2a4a`8<-&AkEW`gO8Ir0(EkI(zZ(Mp literal 0 HcmV?d00001 diff --git a/course-projects/images/upc-barcode.gif b/course-projects/images/upc-barcode.gif new file mode 100644 index 0000000000000000000000000000000000000000..5829cd65a2dd0b9ae3812cb676c4596e4a3f49c4 GIT binary patch literal 3422 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 literal 0 HcmV?d00001 diff --git a/course-projects/password-vault.md b/course-projects/password-vault.md new file mode 100644 index 00000000..eb216f05 --- /dev/null +++ b/course-projects/password-vault.md @@ -0,0 +1,118 @@ +# Password Vault :closed_lock_with_key: + +В днешни времена, едно от най-важните неща е да предпазваме личната си информация в Интернет. Една от фаталните грешки, която правят доста хора, е да използват една и съща парола във всички сайтове или да използват слаби пароли, включващи думи от речника, имена и т.н. Можем да подобрим своята киберсигурност като създадем приложение, което да реши всички тези проблеми. + +Нашият мениджър на пароли ще представлява client-server приложение, като сървърът ще се грижи за всички нужди на клиентите, а те само трябва да се удостоверят пред него. Клиентите ще могат да се регистрират, login-ват, logout-ват, за да докажат самоличността си, след което ще могат да си запазват супер-сигурните пароли и след това да си ги взимат/променят. + +## Server + +- Сървърът трябва да може да обслужва множество клиенти едновременно +- Сървърът получава команди от клиентите и връща подходящ отговор +- Сървърът трябва да може да проверява дали дадена парола е компрометирана и не е сигурна за ползване +- Сървърът трябва да пази паролите по сигурен начин +- Сървърът трябва да генерира надеждни пароли + +### Проверка за компрометирани пароли + +При добавяне на нова парола от потребител за даден сайт (`add-password facebook.com pesho@gmail.com P@ssw0rd`), сървърът трябва да провери дали паролата не е била компрометирана и ако е, да върне подходяща грешка. +За целта може да използвате следното [API](https://www.enzoic.com/docs-passwords-api/). +Заявките към REST API-то изискват authentication чрез API key, какъвто може да получите като се регистрирате [тук](https://www.enzoic.com/free-trial-2/). + +За по-лесно използване, заместете вашите *<api_key>* и *<api_secret>* [тук](https://repl.it/@ZdravkoGyurov/ExtrasmallReasonableFrontend#index.js) и използвайте резултата за правeне на заявки. + +Примерна *HTTP GET* заявка: +URL: +https://api.enzoic.com/passwords?**sha1**=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3&**md5**=098f6bcd4621d373cade4e832627b4f6&**sha256**=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 \ +Header: `authorization: basic base64("api_key:api_secret")` + +Примерен *HTTP response*: + +``` javascript +{ + "revealedInExposure":true, + "relativeExposureFrequency":4, + "exposureCount":2735 +} +``` + +### Хеширане и криптиране + +При регистрация, паролата на новия потребител трябва да се пази хеширана на сървъра, а всяка негова парола за даден сайт трябва да се пази криптирана, за да може при нужда да се декриптира. +Използвайте хеширащи и криптиращи алгоритми по ваш избор. + +## Client + +Клиентът трябва да има command line interface със следните команди + +#### Регистрация в системата +- `register <user> <password> <password-repeat>` +- регистрира нов потребител, като при сървъра *(във файл, съдържащ паролите на всички потребители)* се запазва паролата в хеширан вид и се създава нов файл, за съхраняване на всички пароли *(криптирани, за да може да се връщат на потребителя, но да не се запазват в чист вид)* на този потребител + +#### Вход в системата +- `login <user> <password>` +- login-ва потребител, при неактивност от една минута, потребителят трябва да бъде logout-нат автоматично + +#### Изход от системата +- `logout` +- logout-ва потребител + +#### Извличане на парола за даден сайт +- `retrieve-credentials <website> <user>` +- връща потребителското име и паролата на потребителя, с които се е регистрирал в дадения сайт + +#### Генериране на парола +- `generate-password <website> <user>` +- генерира и запазва парола на потребителя за даден сайт, като се посочва и потребителското име, с коeто ще се направи регистрацията в сайта + +#### Добавяне на парола +- `add-password <website> <user> <password>` +- добавя подадената от потребителя парола, като сървърът проверява дали тази парола е сигурна чрез REST API-то, и ако е, я запазва + +#### Премахване на парола +- `remove-password <website> <user>` +- премахва запазена парола на потребителя за даден сайт + +#### Прекратяване на връзката +- `disconnect` - прекратява връзката между клиента и сървъра + +### Пример за валидни входни данни и отговори + +``` bash +> login pesho peshopass +> Login successful + +> generate-password facebook.com pesho@gmail.com +> _rrR~S>k$[8+Ps/x2WyaFv + +> retrieve-credentials facebook.com pesho@gmail.com +> _rrR~S>k$[8+Ps/x2WyaFv + +> remove-password facebook.com pesho@gmail.com +> Password successfully removed + +> logout +> Logout successful + +> disconnect +> Disconnected +``` + +Всякакви допълнителни функционалности, за които се сетите, са добре дошли. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/splitwise.md b/course-projects/splitwise.md new file mode 100644 index 00000000..3c3e70f2 --- /dev/null +++ b/course-projects/splitwise.md @@ -0,0 +1,156 @@ +# Split(NotSo)Wise :money_with_wings: + +Напишете клиент-сървър приложение с функционалност, наподобяваща тази на [Splitwise](https://www.splitwise.com/). + +Splitwise цели улесняване на поделянето на сметки между приятели и съквартиранти и намаляване на споровете от тип "само аз купувам бира в това общежитие". + +## Условие + +Създайте клиентско конзолно приложение, което приема потребителски команди, изпраща ги за обработка на сървъра, приема отговора му и го предоставя на потребителя в четим формат. + +*Note*: Командите и output-a в условието са примерни, свободни сте да ги преименувате и форматирате. Единственото условие е те да бъдат интуитивни. За улеснение на потребителя, може да имплементирате команда help. + +### Функционални изисквания + +- Регистрация на потребител с username и password; Регистрираните потребители се пазят във файл при сървъра - той служи като база от данни. При спиране и повторно пускане, сървърът може да зареди в паметта си вече регистрираните потребители. + +- Login; +- Регистриран потребител може да: + - добавя вече регистрирани потребители във Friend List на база техния username. Например: + ```bash + $ add-friend <username> + ``` + - създава група, състояща се от няколко, вече регистрирани, потребители: + + ```bash + $ create-group <group_name> <username> <username> ... <username> + ``` + Групите се създават от един потребител, като всяка група включва трима или повече потребители. Можете да си представяте, че "приятелските" отношения са група от двама човека. + + - добавя сума, платена от него, в задълженията на: + - друг потребител от friend list-a му: + ```bash + $ split <amount> <username> <reason_for_payment> + ``` + - група, в която участва: + + ```bash + $ split-group <amount> <group_name> <reason_for_payment> + ``` + + - получава своя статус - сумите, които той дължи на приятелите си и в групите си и сумите, които дължат на него. Например: + ```bash + $ get-status + Friends: + * Pavel Petrov (pavel97): Owes you 10 LV + + Groups + * 8thDecember + - Pavel Petrov (pavel97): Owes you 25 LV + - Hristo Hristov (ico_h): Owes you 25 LV + - Harry Gerogiev (harryharry): You owe 5 LV + ``` + Може да визуализирате всички групи и приятели или само тези, при които има "неуредени сметки". + + +- Нововъведена сума се дели поравно между всички участници в групата или наполовина, ако се дели с потребител от Friend List-a. + +- Когато един потребител А дължи пари на друг потребител B, задължението може да бъде "погасено" (с подходяща команда) само от потребител B. + ```bash + $ payed <amount> <username> + ``` + Например: + ```bash + $ get-status + Friends: + * Pavel Petrov (pavel97): Owes you 10 LV + * Hristo Hristov (ico_h): You owe 5 LV + + $ payed 5 pavel97 + Pavel Petrov (pavel97) payed you 5 LV. + Current status: Owes you 5 LV + + $ get-status + Friends: + * Pavel Petrov (pavel97): Owes you 5 LV + * Hristo Hristov (ico_h): You owe 5 LV + ``` + +- Когато един потребител А дължи на потребител B сума (например 5$), но преди да ги върне на B добави друга сума, която той е платил (например 5$), тогава дължимите суми и на двамата се преизчисляват (дължимата сума на А ще стане 2.50$, B все още не дължи нищо, но има да взима 2.50$). + ```bash + $ get-status + Friends: + * Pavel Petrov (pavel97): Owes you 10 LV + * Hristo Hristov (ico_h): You owe 5 LV + + $ split 5 ico_h limes and oranges + Splitted 5 LV between you and Hristo Hristov. + Current status: You owe 2.50 LV + + $ get-status + Friends: + * Pavel Petrov (pavel97): Owes you 5 LV + * Hristo Hristov (ico_h): You owe 2.50 LV + ``` + +- При всяко влизане на потребителя в системата, той получава известия, ако негови приятели са добавяли суми или "погасявали" дългове. +Например: + ```bash + $ login alex alexslongpassword + Successful login! + No notifications to show. + ``` + или + ```bash + $ login alex alexslongpassword + Successful login! + *** Notifications *** + Friends: + Misho approved your payment 10 LV [Mixtape beers]. + + Groups: + * Roomates: + You owe Gery 20 LV [Tanya Bday Present]. + + * Family: + You owe Alex 150 LV [Surprise trip for mom and dad] + ``` +- Потребителят може да види история на плащанията, извършени от него. Тази история се пази във файл на сървъра. + +- (***Бонус***) Сървърът предоставя възможност за currency conversion. Валутата по подразбиране е български лева, като потребителят може да я смени по всяко време на изпълнение на програмата, чрез подходяща команда (например `switch-currency EUR`). Всички суми, които потребителят дължи и дължат на него към този момент, преминават в избраната валута. + + Чрез HTTP заявка до някое публично API (например https://exchangeratesapi.io/) вземете текущите стойности на валутите и обработете response-a. + +### Нефункционални изисквания + +- Сървърът може да обслужва множество потребители паралелно. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackTraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при логин на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Уточнения + +- Както може би се досещате, това не е система за банкови транзакции и плащането на съответните суми не ни интересува как се случва. + + Нека си представим, че Ана и Ива са съквартирантки. Ана плаща общежитията и на двете и записва това в приложението. После Ива ѝ дава парите, които дължи, а Ана влиза в приложението и записва, че Ива ѝ се е издължила. Ива не може сама да каже "Аз платих моята част". + +- Валидацията на потребителския вход е задължителна, т.е. покрийте всички сценарии, за които се сетите с невалиден вход - било то null, грешно форматиране, невалиден тип на данните и т.н. + +- Командите и output-a от тях са примерни. Ако не ви допадат или не ги разбирате, сте свободни да използвате други. Единствената им цел тук е да помогнат за разбирането на условието. + +- Всякакви допълнителни функционалности, за които се сетите, са добре дошли. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/spotify.md b/course-projects/spotify.md new file mode 100644 index 00000000..afcdc370 --- /dev/null +++ b/course-projects/spotify.md @@ -0,0 +1,109 @@ +# Spotify :notes: + +[`Spotify`](https://www.spotify.com/) е платформа за `stream`-ване на музика, която предоставя на потребителите достъп до милиони песни на изпълнители от цял свят. + +> `Stream`-ването е метод за предаване на данни, използван обикновено за мултимедийни файлове. При него възпроизвеждането на съдържанието върху устройството на потребителя започва още с достъпването му, без да се налага то отначало да бъде изтеглено изцяло като файл и после да се стартира в подходящ плеър. Предаването на данните протича едновременно с възпроизвеждането, затова е необходима постоянна мрежова свързаност. + +## Условие + +Създайте приложение по подобие на `Spotify`, състоящо се от две части - сървър и клиент. + +### **Spotify Server** + +Предоставя следните функционалности на клиента: +- регистриране в платформата чрез **email** и **парола** (**потребителите трябва да се съхраняват във файл**) +- login в платформата чрез **email** и **парола** +- съхраняване на набор от песни, достъпни на потребителите за слушане +- търсене на песни +- създаване на статистика на най-слушаните песни от потребителите +- създаване на плейлисти (**плейлистите трябва да се съхраняват във файлове**) +- добавяне на песни към плейлисти +- връщане на информация за даден плейлист +- `stream`-ване на песни + +### **Spotify Client** + +`Spotify` клиентът трябва да има `command line interface` със следните команди: + +```bash +register <email> <password> +login <email> <password> +disconnect +search <words> - връща всички песни, в чиито имена или имената на изпълнителите им, се среща потърсената дума (или думи) +top <number> - връща списък с *number* от най-слушаните песни в момента, сортиран в намаляващ ред +create-playlist <name_of_the_playlist> +add-song-to <name_of_the_playlist> <song> +show-playlist <name_of_the_playlist> +play <song> +stop +``` + +## Забележки: + +1. За да можете да изпълнявате песни от `Spotify` клиента, използвайте API-то `javax.sound.sampled`. +2. `javax.sound.sampled` работи само с файлове във [wav](https://en.wikipedia.org/wiki/WAV) формат, затова всички песни, които имате на сървъра, трябва да са **.wav** +3. `javax.sound.sampled` предоставя два начина за възпроизвеждане на музика - чрез `Clip` и `SourceDataLine`. `Clip` се използва когато имаме `non-real-time` музикални данни (файл), които могат да бъдат предварително заредени в паметта. +`SourceDataLine` се използва за `stream`-ване на данни, като например голям музикален файл, който не може да се зареди в паметта наведнъж, или за данни, които предварително не са известни. (за повече информация [тук](https://docs.oracle.com/javase/tutorial/sound/playing.html)) + + За целите на проекта, трябва да използвате `SourceDataLine`. + 1. За да създадем [`SourceDataLine`](https://docs.oracle.com/en/java/javase/23/docs/api/java.desktop/javax/sound/sampled/SourceDataLine.html) първо трябва да знаем конкретния формат на данните, които ще получаваме по мрежата. Това става с класа [`AudioFormat`](https://docs.oracle.com/en/java/javase/23/docs/api/java.desktop/javax/sound/sampled/AudioFormat.html). За да успеем да възпроизведем дадена песен при клиента, трябва предварително да знаем какъв е този формат. + + 2. Преди сървърът да започне да ни `stream`-ва песента, той трябва да ни даде(прати) информация за формата на данните. Класът `AudioFormat` не е `Serializable`, т.е не можем да изпратим на клиента директно обект от тип `AudioFormat`. + + 3. За да вземем формата на песента на сървъра, можем да използваме следния код: + ```java + AudioFormat audioFormat = AudioSystem.getAudioInputStream(new File(song)).getFormat(); + ``` + + 4. Данните, които са необходими на клиента, са всички полета от конструктора на `AudioFormat`. Те могат да бъдат достъпени чрез съответните `getter` методи: + ```java + AudioFormat(AudioFormat.Encoding encoding, float sampleRate, int sampleSizeInBits, int channels, int frameSize, float frameRate, boolean bigEndian) + ``` + + 5. След като сървърът е изпратил формата на данните, клиентът вече е готов да създаде съответния `SourceDataLine` обект, чрез който ще се възпроизвежда песента. + ```java + Encoding encoding = ...; + int sampleRate = ...; + ... + AudioFormat format = new AudioFormat(encoding, sampleRate, sampleSizeInBits, channels, frameSize, frameRate, bigEndian); + DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); + + SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); + dataLine.open(); + dataLine.start(); // Имайте предвид, че SourceDataLine.start() пуска нова нишка. За повече информация, може да проверите имплементацията. + ``` + 6. За да запишем данни в `SourceDataLine` обекта (данните, които искаме да възпроизведем) използваме следния метод: + ```java + dataLine.write(byte[] b, int off, int len); + ``` + + 7. За тестови цели, можем да си пуснем песен (non-real-time) със следния код: + + ```java + AudioInputStream stream = AudioSystem.getAudioInputStream(new File("<music>.wav")); + SourceDataLine dataLine = AudioSystem.getSourceDataLine(stream.getFormat()); + dataLine.open(); + dataLine.start(); + + while (true); + ``` + 4. Валидирайте по подходящ начин командите + 5. При възникване на програмна грешка, извеждайте в конзолата смислени съобщения на потребителя - не се предполага клиентът да има умения да `troubleshoot`-ва `exception`-и, затова `printStackTrace()` не е добър вариант. Хврълените `exception`-и записвайте във файл. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/todoist.md b/course-projects/todoist.md new file mode 100644 index 00000000..05743e1b --- /dev/null +++ b/course-projects/todoist.md @@ -0,0 +1,146 @@ +# Todoist :clipboard: :heavy_check_mark: + +Напишете клиент-сървър приложение с функционалност, наподобяваща тази на [Todoist](https://www.todoist.com/). + +Todoist e task manager или, иначе казано, приложение, което менажира to-do-list задачки. То цели улесняването на създаване, организиране и проследяване на прогреса на прости задачи от всекидневието или на големи проекти. Задачите може да са всекидневни: "да купя вечеря"; "да нахраня кучето", до цял проект, който да проследи създаването на дипломна работа. + +## Условие + +Създайте клиентско конзолно приложение, което приема потребителски команди, изпраща ги за обработка на сървъра, приема отговора му и го предоставя на потребителя в human-readable формат. + +*Note*: Командите и output-ът в условието са примерни, свободни сте да ги преименувате и форматирате. Единственото условие е, те да бъдат интуитивни. За улеснение на потребителя, може да имплементирате команда help. + +## Функционални изисквания + +### Задача +Една задача се състои от следните атрибути: + - **name** - име на задачата + - **date** (optional) - дата, на която искаме да изпълним задачата + - **due date** (optional) - дата, до която със сигурност трябва да изпълним задачата + - **description** (optional) - описание на задачата + +*Note*: Приемаме, че една задача се характеризира от името си и датата, ако има такава. Задачи без date отиват в така наречения Inbox - задачи, без фиксиран date. Следователно, в Inbox-а не можем да имаме повече от една задача с едно и също име. За конкретен ден, също не можем да имаме повече от една задача с едно и също име. При изпълнението на командите, ако не укажем параметъра за дата, приемаме, че задачата се очаква да бъде в Inbox-a. + +- **register** - регистрация на потребител с username и password. Регистрираните потребители се пазят във файл на сървъра - той служи като база от данни. При спиране и повторно пускане, сървърът може да зареди в паметта си вече регистрираните потребители. + +- **login** - потребителят влиза в системата + +- **add-task** - добавяне на нова задача. Ако задачата няма --date, тя бива добавена директно в Inbox-а. + ```bash + $ add-task --name=<name> --date=<date> --due-date=<due-date> --description=<description> + ``` +- **update-task** - промяна на някой от атрибутите на задача. Единственият атрибут, който не можем да променяме, е името. + ```bash + $ update-task --name=<name> --date=<date> --due-date=<due-date> --description=<description> + ``` +- **delete-task** - изтриване на задача. + ```bash + $ delete-task --name=<task_name> + $ delete-task --name=<task_name> --date=<date> + ``` + + - **get-task** - предоставя информацията за дадена задача в human-readable формат. + ```bash + $ get-task --name=<task_name> + $ get-task --name=<task_name> --date=<date> + ``` + - **list-tasks** - предоставя информацията за всички задачи от конкретен ден или от Inbox-a. Командата приема и опционален флаг completed и може да изведе и информация за всички вече завършени задачи. + ```bash + $ list-tasks + $ list-tasks --completed=true + $ list-tasks --date=<date> + ``` +- **list-dashboard** - предоставя информацията за всички задачи от днешния ден. + ```bash + $ list-dashboard + ``` +- **finish-task** - маркира конкретната задача като завършена. + ```bash + $ finish-task --name=<name> + ``` + +### Колаборация +Колаборация (или collaboration) представлява споделен проект, в който могат да се добавят задачи, които са видими за всички участници в него. Задачите в колаборацията имат още един опционален атрибут - assignee, т.е. потребителят, който ще работи по задачата. + + - **add-collaboration** - добавя нова колаборация. + ```bash + $ add-collaboration --name=<name> + ``` + - **delete-collaboration** - изтрива колаборация. Една колаборация може да бъде изтрита само от потребителя, който я е създал. Изтриването на колаборацията автоматично трябва да изтрие и всички задачи, които са част от нея. + ```bash + $ delete-collaboration --name=<name> + ``` + - **list-collaborations** - предоставя информацията всички колаборации на съответния потребител. Това включва такива, които той е създал и такива към които е добавен. + ```bash + $ list-collaborations + ``` + - **add-user** - добавя потребител към колаборацията. + ```bash + $ add-user --collaboration=<name> --user=<username> + ``` + - **assign-task** - задава assignee за дадена задача в колаборацията. + ```bash + $ assign-task --collaboration=<name> --user=<username> --task=<name> + ``` + - **list-tasks** --collaboration - предоставя информацията за всички задачи от колаборацията. + ```bash + $ list-tasks --collaboration=<name> + ``` + - **list-users --collaboration** - извежда всички потребители, които са част от колаборацията. + ```bash + $ list-users --collaboration=<name> + ``` + +### Етикет (Бонус) + +Етикетите (или labels) представляват споделен лесен начин, по който можем да групираме няколко задачи. Ако например имаме няколко различни задачи, свързани с университета, можем да им сложим етикет *university*. + +- **add-label** - добавя нов етикет, който е видим само в акаунта на потребителя, който изпълнява командата. + ```bash + $ add-label --name=<name> + ``` +- **delete-label** - изтриване на етикет. + ```bash + $ delete-label --name=<name> + ``` +- **list-labels** - предоставя информация за всички етикети, които потребителят е създал. + ```bash + $ list-labels + ``` +- **label-task** - добавя етикет на дадена задача. + ```bash + $ label-task --name=<name> --date=<date> --label=<name> + ``` + - **list-tasks --label** - предоставя информацията за всички задачи, на които е поставен даденият етикет. + ```bash + $ list-tasks --label=<name> + ``` + +## Нефункционални изисквания + +- Сървърът може да обслужва множество потребители паралелно. +- Сървърът пази информацията за потребители, задачи, колаборации по такъв начин, който му позволява след спиране или рестартиране да може да зареди тази информация отново. Помислете за подходящ формат на данни, в който може да съхранявате информацията от сървъра. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване на програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stacktraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при логин на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Уточнения + +- Валидацията на потребителския вход е задължителна, т.е. покрийте всички сценарии, за които се сетите с невалиден вход - било то null, грешно форматиране, невалиден тип на данните и т.н. +- Командите и output-ът от тях са примерни. Свободни сте да представите ваша интерпретация на командите, както и да добавите нови. Единствената им цел тук е да помогнат за разбирането на условието. +- Всякакви допълнителни функционалности, за които се сетите, са добре дошли. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/torrent.md b/course-projects/torrent.md new file mode 100644 index 00000000..72982259 --- /dev/null +++ b/course-projects/torrent.md @@ -0,0 +1,78 @@ +# Peer-to-peer file exchange (torrent сървър) :busts_in_silhouette: + +Да се имплементира опростен вариант на peer-to-peer система за обмен на файлове, която използва централен сървър за откриване на потребители и данни. + +## Условие + +Системата трябва да се състои от две части: +1. Сървър, който съхранява метаданни за наличните файлове. +2. Клиенти, които теглят файлове от други клиенти – клиентите взимат информация от сървъра за това къде (от кой клиент) даден файл може да бъде свален. + +Системата предоставя функционалност за сваляне на файлове от различни потребители. + +Всеки потребител може да сваля файл от всеки друг. Има централен сървър, който съхранява информация за потребителите и файловете, които могат да бъдат свалени от тях (файлове не се свалят и съхраняват на централния сървър). + +Сървърът трябва да може да работи с много клиенти едновременно. + +Сървърът съхранява информация за активните потребители в паметта (изберете подходяща структура от данни) – имената, адресите и портовете им (p2p обмен изисква да се знаят адресите на peer-ите); файловете, които могат да бъдат изтеглени от тях (абсолютен път). Тази информация се обновява, когато клиент регистрира файлове за изтегляне (команда *register* по-долу) и когато клиент затвори връзката със сървъра. + +Клиентите могат да се свързват един с друг (peer-to-peer communication). За целта е нужно всеки да реализира „мини сървър“ при себе си. Този мини-сървър трябва да може да обработва командата download, описана по-долу. Можете да изберете дали мини-сървърът да обработва само една заявка за изтегляне или много паралелни заявки (ако е една - докато тя бива обработвана, оставащите заявки за изтегляне към мини-сървъра трябва да чакат). + +Клиентът също така съхранява при себе си съответствие <*username* – *user* *IP:port*>. +Пример: + +``` +Pesho123 – 127.0.0.1:1234 +Gosho321 – 127.0.0.1:2314 +``` +За да получи клиентът тази информация, той регулярно (през 30 секунди) пита сървъра за регистрираните потребители и техните адреси. Данните се записват във файл в указния по-горе формат. + +### Клиент + +Клиентът изпълнява следните команди: +1. `register <user> <file1, file2, file3, …., fileN>` - позволява на клиентите да „обявят“ кои файлове са налични за сваляне от тях. Чрез параметъра username, потребителят може да зададе свое уникално име (името, с което сървърът ще асоциира съответното IP). + +2. `unregister <user> <file1, file2, file3, …., fileN>` - потребителят обявява, че от него вече не могат да се свалят файловете <file1, file2, file3, …., fileN>. + + ***Забележка***: За простота, не се интересуваме от security аспектите на решението, т.е. не е нужно да реализирате автентикация, която да гарантира, че даден потребител може да отрегистрира само файловете, които самият той е регистрирал. + +3. `list-files` – връща файловете, налични за изтегляне, и потребителите, от които могат да бъдат изтеглени. +4. `download <user> <path to file on user> <path to save>` - изтегля дадения файл от съответния потребител. + +### Сървър + +Сървърът трябва да може да обработва изброените команди по подходящ начин: +1. При получаване на `register <user> <file1, file2, file3, …., fileN>`, сървърът обновява информацията за този потребител (добавя информация, че тези файлове са налични за сваляне от съответния потребител). +2. При получаване на `unregister <user> <file1, file2, file3, …., fileN>`, обновява информацията за този потребител (съответните файлове вече не са налични за сваляне от този потребител). +3. При получаване на `list-files`, връща регистрираните в сървъра файлове във формат `<user> : <path to file>` +4. При изпълняването на `download <user> <path to file on user> <path to save>`, не се случва комуникация с централния сървър. + + **a.** Клиентът определя *IP адреса* и *порта* на потребителя, от който може да бъде изтеглен даденият файл (от локалния си mapping). + + **b.** Клиентът изпраща командата на мини-сървъра на потребителя, определен в стъпка (а) + + **c.** Мини-сървърът изпраща файла + + **d.** След като потребителят получи файла, автоматично изпълнява командата register <user> <path to saved file>. По този начин информацията в главния сървър за потребителите, притежаващи този файл, се обновява. + +Една подсказваща **диаграма**: + +![Peer-to-Peer Diagram](images/peer-to-peer.png) + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех! diff --git a/course-projects/uno.md b/course-projects/uno.md new file mode 100644 index 00000000..ae0a34e1 --- /dev/null +++ b/course-projects/uno.md @@ -0,0 +1,281 @@ +# Uno 🔴🟢🟡🔵 + +Уно е една от най-популярните игри с карти. Има една специфична особеност - правилата на играта зависят от това, с кого играете :) В Интернет пространството може да прочетете едни правила, ако пък играете в някои онлайн платформи, може правилата да са леко различни, а ако си купите карти, за да играете с приятели и прочетете упътването - правилата отново се различават. Все пак, някои от правилата са "закон" и правят играта толкова интересна. + +Едно тесте има общо 108 карти. +- общо 19 сини (карти от 0 /нула/ до 9, като от 1 до 9 се повтарят веднъж) +- общо 19 зелени (карти от 0 /нула/ до 9, като от 1 до 9 се повтарят веднъж) +- общо 19 жълти (карти от 0 /нула/ до 9, като от 1 до 9 се повтарят веднъж) +- общо 19 червени (карти от 0 /нула/ до 9, като от 1 до 9 се повтарят веднъж) +- общо 8 карти "+2" - по две от всеки цвят +- общо 8 карти "обръщане на посоката" - по две от всеки цвят +- общо 8 карти "прескачане на ход" - по две от всеки цвят +- общо 4 жокера "избери цвят" +- общо 4 жокера "+4" + +(4×19 + 3×8 + 2×4 = 108 брой карти за УНО) + +На практика, често се случва да се съберат няколко тестета и да се играе с всички карти, особено когато има повече +играчи. Ако решите да комбинирате 2 или повече тестета, просто всички карти се умножоват по съответния брой (напр. когато се вземат от две тестета по 4 карти "+4", стават общо 8). Това не е задължително в проекта. + +``` +Целта на играта УНО/UNO е да изиграеш пръв всички свои карти (преди другите играчи). + +Вариант 1: +След като изиграеш всичките си карти, получаваш точки от противниковите играчи. Точките от кръговете се събират и победител става първият играч, който успее да събере 200 точки (или 500). + +Вариант 2 (Challenge UNO): +Пак целта е да изиграеш всички свои карти, обаче този път точките на всеки играч се записват като наказателни точки за този играч (по подобие на играта на карти "Румб"). + +Вариант 3 (MJT): +Победител в игра е този, който изиграе всичките си карти преди останалите. + +В този проект се спираме на Вариант 3 (MJT). +``` + +## MJT Правила на играта + +### 1. Започване: +- всеки играч получава по 7 произволни карти +- след това тестето се поставя с лицето надолу, това наричаме "куп за теглене" +- изтегля се най-горната карта и се оставя на нов куп, него наричаме "куп за изиграни" +- първи играе произволен играч, след което играчите се редуват по часовниковата стрелка + +### 2. По време на играта +- Когато сте на ред, трябва да откриете съвпадение на карта от вашите карти с картата на върха на "куп за изиграни" - съвпадение по цифра/число, цвят или символ ("екшън карта""). +- Най-лесно ще разберете с един пример: Когато картата на купа за изхвърляне е "синя 8", играчът трябва да остави "синя" карта или "карта 8" от произволен друг цвят. +- Играчът също може да остави една екшън карта (прочетете повече за екшън картите по-надолу), например синя "прескачане на ход". + +Когато сте на ред, имате 2 варианта: +Приемете, че в ръката имате картите a1, a2, ..., an и нека A e множеството от тези карти, т.е. A := {a1,a2,...,an}. От тях обаче можете да изиграете само някои, нека те бъдат в множеството B и B e подмножество на А. +- ако |B| > 0, можете да изиграете която карта прецените (от B). След това продължава следващият по ред играч. +- ако |B| = 0, трябва да изтеглите карта. След това продължава следващият по ред играч. + +### 3. Екшън карти (жокери) +- "избери цвят" - играещият тази карта определя цвета, на който трябва да се отговори при следващия ход. + Ако се обърне в началото на играта, цветът се определя произволно. + Картата може да се изиграе без значение от предишно изиграната карта (т.е. няма нужда от съвпадение по нещо) +- "+4" - играещият тази карта определя цвета, на който трябва да се отговори при следващия ход, а следващият играч тегли 4 карти накуп и губи своя ред. + Картата може да се изиграе без значение от предишно изиграната карта (т.е. няма нужда от съвпадение по нещо) +- "+2" - следващият играч тегли 2 карти и пропуска своя ред. Картата трябва да отговаря по цвят или предишно изиграната карта да е била "+2". +- "обръщане на посоката" - картата обръща посоката на играта (ако посоката до този момент била по часовника, става обратно на часовника, или обратно). + Картата трябва да отговаря по цвят или предишно изиграната карта да е била "обръщане на посоката". +- "прескачане на ход" - следващият играч пропуска ред. + Картата трябва да отговаря по цвят или предишно изиграната карта да е била "прескачане на ход". +- няма други специални карти + +## Условие +Системата трябва да се състои от две части: +1. Сървър, който съхранява започнатите игри и участниците в тях +2. Клиенти, които могат участват в най-много една игра + +## Бонус +- ако имате имплементирани всички команди по условие и имплементирате функционалности "UNO" и "STOP UNO", описани в долната секция, ще получите бонус точки + +### Обявяване "UNO" и "STOP UNO" +С приятели: +- Думата "UNO" се обявява, когато играч е останал с една карта - при даването на предпоследната карта, преди тя да е оставена, т.е. преди да докосне "куп за изиграни". + Ако забрави да обяви "UNO" навреме - може да го направи и по-късно, ако никой от останалите играчи не го е хванал все още. +- Ако не е обявено "UNO" навреме - другите играчи имат право да го "хванат", като кажат "STOP UNO", тогава "хванатият" тегли 2 карти. + +В този проект: +- "UNO" може да се обяви тогава и само тогава, когато даден играч има точно 1 карта в ръката си. +- "STOP UNO" може да се обяви срещу играч, който има точно 1 карта в ръката си и не е обявил "UNO". Тогава "хванатият" тегли 2 карти. + +### Клиент + +### 1. Регистрация + +```bash +register --username=<username> --password=<password> +``` + +- Регистрира нов потребител в приложението с име и парола. +- Потребителят не бива автоматично вписан в акаунта. + +### 2. Вход + +```bash +login --username=<username> --password=<password> +``` + +- Вписване в акаунт с име и парола. +- Всеки потребител може да бъде вписан в <= 1 акаунт в даден момент. + +### 3. Изход от системата + +```bash +logout +``` + +- Отписване от акаунт. Операцията е валидна само ако потребителят е вписан в някой акаунт. + +### 4. Търсачка за игри + +```bash +list-games --status=<started/ended/available/all> +``` + +- Функционалност за показване на игри. +- Възможните стойности на `--status` са в множеството `{started, ended, available, all}`. Ако параметърът `--status` не е подаден, приема стойност `all`. + - `started`: показват се започналите вече игри, към които не може да се присъедини нов потребител, както и с колко играчи е всяка от тях. + - `ended`: показват се приключилите вече игри, към които не може да се присъедини нов потребител, както и с колко играчи е била всяка от тях. + - `available`: показват се незапочнатите игри, към които може да се присъедини нов потребител, както и колко от местата са заети. + - `all`: показват се всички игри + +### 5. Създаване на игра + +```bash +create-game --number-of-players=<number> --game-id=<game-id> +``` + +- Функционалност за създаване на нова игра. +- Всяка игра се характеризира уникално със своето `--game-id`. Не може да съществува повече от една игра с дадено `--game-id`, независимо от нейния статус. +- Във всяка игра могат да участват между двама и `--number-of-players` на брой играчи. Ако `--name-of-players` не е подадено, приема стойност 2. +- При създаване на нова игра, потребителят не бива автоматично вкаран като участник в нея. За това трябва да ползва команда `join`, описана по-долу. + +### 6. Присъединяване към игра + +```bash +join --game-id=<game-id> --display-name=<display-name> +``` + +- Функционалност за присъединяване към игра, определена от `--game-id`. Ако няма свободни места, потребителят получава подходяща грешка. +- С параметърът `--display-name` играчът може да избере име, с което да се визуализира в играта. Ако `--display-name` не е подадено, се ползва името от регистрацията. +- Всеки потребител може да участва в <= 1 игра в даден момент. + +### 7. Започване на игра +```bash +start +``` + +- Функционалност за стартиране на нова игра. +- Игра може да бъде стартирана само от потребителят, който я е създал, стига той да се е присъединил към играта (с `join`). В противен случай, потребителят получава подходяща грешка. +- В този момент всеки присъединил се играч получава по 7 карти. +- В започнала игра, всички играчи са равноправни + +### 8. Показване на картите в ръката +```bash +show-hand +``` + +- Функционалност за показване на картите в ръката +- всяка карта има уникално `id` + +### 9. Показване на последно изиграната карта +```bash +show-last-card +``` + +- Функционалност за показване на последно изиграната карта от предишния играч, т.е. картата на върха на "куп за изиграни" +- Ако има ефект от последната карта, потребителят на ход трябва да изпълни команда `accept-effect` и да приема съдбата си :) преди да може да изпълни команда `play` + +### 10. Преимане на съдбата +```bash +accept-effect +``` + +- ако картата е била "+2": сървърът дава 2 карти на играчът на ход и той губи редът си да играе +- ако картата е била "обръщане на посоката": сменя се редът за игра +- ако картата е била "прескачане на ход": играчът на ход губи реда си +- ако картата е била "избери цвят": играчът на ход трябва да отговори на цвета, избран от играча преди него +- ако картата е била "+4": сървърът дава 4 карти на играча на ход, и играча пропуска реда си + +### 11. Изиграване на обикновена карта +```bash +play --card-id=<card-id> +``` + +- Функционалност за изиграване на "обикновена" карта. +- Дефинираме обикновена карта така: 'Всяка карта, различна от "избери цвят" и "+4"' + +### 12. Изиграване на "избери цвят" +```bash +play-choose --card-id=<card-id> --color=<red/green/blue/yellow> +``` + +- Функционалност за изиграване на "избери цвят" карта с дадено `--card-id`. Ако не съществува карта с такова `--card-id` или пък съществува, но не е "избери цвят", се връща подходяща грешка +- С параметъра `--color` играчът на ход може да определи цветът, на който иска да отговори следващият по ред играч + +### 13. Изиграване на "+4" +```bash +play-plus-four --card-id=<card-id> --color=<color> +``` + +- Функционалност за изиграване на "избери цвят" карта с дадено `--card-id`. Ако не съществува карта с такова `--card-id` или пък съществува, но не е "избери цвят", се връща подходяща грешка +- С параметъра `--color` играчът на ход може да определи цветът, на който иска да отговори следващия играч +- следващият играч трябва да изтегли 4 карти и пропуска реда си + +### 14. История +```bash +show-played-cards +``` + +- функционалност за показване на изиграните карти, в реда на изиграването им + +### 15. Напускане на играта +```bash +leave +``` + +- функционалност за напускане на игра +- ако играчът все още не е изиграл всички карти в ръката си, те отиват на произволни позиции в "куп за теглене" + +### 16. Наблюдение +```bash +spectate +``` + +- Функционалност за наблюдение над играта +- тази функционалност може да бъде изпълнена само от играч, който е изиграл всичките си карти (преценете какво искате той да види) + +### 16. теглене +```bash +draw +``` + +- Функционалност за теглене от "куп за теглене" +- тази функционалност може да бъде изпълнена само когато играчът няма карта, която да може да изиграе + +### 17. резюме +```bash +summary --game-id=<game-id> +``` + +- Функционалност за връщане на резюме на приключила игра (какво точно ще се върне, преценете вие, например Top3, TopN-1, History, etc.) + +## Край на играта: +``` +След като N-1 от N играчи от дадена игра останат без карти, играта автоматично приключва и отива в историята. +``` + +## Някои corner case-и, възможни в играта: +- Ако картите в "куп за теглене" свършат, тогава картите в "куп за изиграни" се обръщат и играчите започват да теглят от тях. +- Когато останат само 2-ма играчи, картите "обръщане на посоката" и "прескачане на ход" правят едно и също: играчът, + който изиграе една от тези карти, отново е на ход да играе (противникът пропуска реда си). Имайки предвид това, могат да се правят интересни комбинации, напр. играч може нарочно да играе така картите си, че да запази в ръката си 4 карти "прескачане на ход", + по една за всеки цвят и да кажем, синя 8-ца, тогава ако има само един останал съперник, може да изиграе червената карта за обръщане, после зелената, после жълтата, после синята и накрая да изиграе синята 8-ца и да спечели. +- Ако се сетите за друг corner case, вие преценете какво ще бъде поведението, както казахме: правилата зависят от това с кого играете :) + +### Сървър + +Сървърът трябва да може да работи с много клиенти едновременно. + +Ако клиент загуби връзка към сървъра, докато участва в игра, това не го изхвърля от играта и след като се впише отново, той продължава играта с картите, които е имал. + +## Съобщения за грешки + +При неправилно използване на програмата, на потребителя да се извеждат подходящи съобщения за грешка. + +При възникване програмна грешка, на потребителя да се извежда само уместна за него информация. Техническа информация за самата грешка и stackтraces да се записват във файл на файловата система - няма определен формат за записване на грешката. + +Например, нерелевантно е при команда на потребител и възникнал проблем с мрежовата комуникация, да се изписва грешка от вида на "IO exception occurred: connection reset", по-подходящо би било "Unable to connect to the server. Try again later or contact administrator by providing the logs in <path_to_logs_file>". + +При възникване на програмна грешка от страна на сървъра, подходящо съобщение се изписва на конзолата и във файл, като освен това, във файла се записва допълнителна информация (например, при заявка на кой потребител е възникнала грешката, ако въобще е обвързана с потребителско взаимодействие) и stacktraces. + +## Submission + +Качете в грейдъра `.zip` архив на познатите директории `src` и `test`. Ако пакетирате допълнителни файлове (които не са .java), те трябва да са в корена на архива, на нивото на `src` и `test`. +В грейдъра няма да има автоматизирани референтни тестове. +Проектът ви трябва да е качен в грейдъра не по-късно от 18:00 в деня преди датата на защитата. + +Успех!