Спроектируйте и реализуйте мессенджер для получения и обработки сообщений от клиента.
Кроме основного задания, выберите из списка дополнительные требования.
У каждого требования есть определённая сложность, от которой зависит количество баллов.
Необходимо выбрать такое количество заданий, чтобы общая сумма баллов была больше или равна 4
.
Выбор заданий никак не ограничен: можно выбрать все простые или одно среднее и два простых, или одно продвинутое, или решить все.
Для запуска серверной части нужно запустить модуль server.py. Для запуска клиента - модуль client.py.
Можно запустить любое количество клиентов. Соединение клиента с сервером происходит автоматически.
Команды набираются в консоли. Параметры команд обозначены угловыми скобками <...>
.
Опциональные команды обозначены квадратными скобками [...]
.
/auth - регистрация нового пользователя
/login - авторизация зарегистрированного пользователя
/exit - отключение от сервера
/unread - показать все не прочитанные сообщения с момента последнего отключения от сервера
/status - показать статус пользователя: адреса соединений, количество приватных сообщения,
администрирование приватных чатов, участие в приватных чатах и инвайт-ключи к ним
/send <message> - отправка сообщения в общий чат
/private <user_login> <message> - отправка приватного сообщения пользователю с именем user_login
/create <chat name> - создание приватного чата с именем chat name
/send_chat <chat name> <message> - отправка сообщения message в приватный чат с именем chat name
/invite <user login> <chat name> - приглашение пользователя с именем user login в приватный чат chat name
/join <chat name> [invite-key] - запрос на получение инвайта для присоединения к чату
(команда без параметра invite-key) или присоединение к приватному чату при имеющемся инвайт-ключе
Реализовать сервис, который обрабатывает поступающие запросы от клиентов;
Условия и требования:
- Подключенный клиент добавляется в "общий" чат, где находятся ранее подключенные клиенты;
- После подключения новому клиенту доступные последние N (по умолчанию 20) сообщений из общего чата;
- Повторно подключенный клиент имеет возможность просмотреть все ранее непрочитанные сообщения до момента последнего опроса (как из общего чата, так и приватные);
- По умолчанию сервер стартует на локальном хосте (127.0.0.1) и на 8000 порту (иметь возможность задавать любой);
- Можно не проектировать БД: информацию хранить в памяти и/или десериализовать/сериализировать в файл (формат на выбор) и восстанавливать при старте сервера;
Список возможных методов для взаимодействия (можно изменять)
- Подключиться к общему чату
POST /connect
- Получить статус и информацию о чатах
GET /status
- Отправить сообщение в общий чат или определенному пользователю в приватный чат
POST /send
Реализовать приложение, который умеет подключаться к серверу и обмениваться сообщениями;
Условия и требования:
- После подключения клиент может отправлять сообщения в "общий" чат;
- Возможность отправки сообщения в приватном чате (1-to-1) любому участнику из общего чата;
- Разрабатывать UI не надо: можно выводить информацию в консоль или использовать лог-файлы;
- (1 балл) Период жизни доставленных сообщений — 1 час (по умолчанию).
- (1 балл) Клиент может отправлять не более 20 (по умолчанию) сообщений в общий чат в течение определенного периода - 1 час (по умолчанию). В конце каждого периода лимит обнуляется;
- (1 балл) Возможность комментировать сообщения;
- (2 балла) Возможность создавать сообщения с заранее указанным временем отправки; созданные, но неотправленные сообщения можно отменить;
- (2 балла) Возможность пожаловаться на пользователя. При достижении лимита в 3 предупреждения, пользователь становится "забанен" - невозможность отправки сообщений в течение 4 часов (по умолчанию);
- (3 балла) Возможность отправлять файлы различного формата (объёмом не более 5Мб, по умолчанию).
- (3 балла) Пользователь может подключиться с двух и более клиентов одновременно. Состояния должны синхронизироваться между клиентами.
- (3 балла) Возможность создавать кастомные приватные чаты и приглашать в него других пользователей. Неприглашенный пользователь может "войти" в такой чат только по сгенерированной ссылке и после подтверждения владельцем чата.
- **(5 баллов) Реализовать кастомную реализацию для взаимодействия по протоколу
http
(можно использоватьasyncio.streams
);
- Описать документацию по разработанному API: вызов по команде/флагу для консольного приложения или эндпойнт для http-сервиса.
- Используйте концепции ООП.
- Используйте аннотацию типов.
- Предусмотрите обработку исключительных ситуаций.
- Приведите стиль кода в соответствие pep8, flake8, mypy.
- Логируйте результаты действий.
- Покройте написанный код тестами.
- Можно использовать внешние библиотеки, но не фреймворки (описать в requirements.txt).