#include
#include
#include
#include
// Структура ответа
struct ResponseData {
bool Success;
std::string Response;
};
// Класс управления чатом
class SystemBase {
private:
std::unordered_map> users; // Пользователи и их роли
bool chatActive; // Состояние чата
// Вспомогательные функции для проверки ролей
bool hasRole(int user, const std::string& role) {
return users.count(user) && users[user].count(role);
}
public:
// Конструктор
SystemBase(int admin) {
users[admin].insert("ADMIN");
chatActive = true;
}
// Метод для бана пользователя
ResponseData BanUser(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "MODERATOR")) return {false, "Sender is not a moderator"};
if (!users.count(user)) return {false, "User not found"};
if (hasRole(user, "BANNED")) return {false, "User is already banned"};
users[user].insert("BANNED");
return {true, "User banned"};
}
// Метод для разбана пользователя
ResponseData UnBanUser(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "MODERATOR")) return {false, "Sender is not a moderator"};
if (!users.count(user)) return {false, "User not found"};
if (!hasRole(user, "BANNED")) return {false, "User is not banned"};
users[user].erase("BANNED");
return {true, "User unbanned"};
}
// Метод для регистрации нового пользователя
ResponseData RegisterNewUser(int sender, int newUser) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (users.count(newUser)) return {false, "User already exists"};
users[newUser].insert("USER");
return {true, "User registered"};
}
// Метод для предоставления роли модератора
ResponseData GrantModeratorRole(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!users.count(user)) return {false, "User not found"};
users[user].insert("MODERATOR");
return {true, "Moderator role granted"};
}
// Метод для предоставления роли админа
ResponseData GrantAdminRole(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!users.count(user)) return {false, "User not found"};
users[user].insert("ADMIN");
return {true, "Admin role granted"};
}
// Метод для остановки чата
ResponseData StopChat(int sender) {
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!chatActive) return {false, "Chat is already stopped"};
chatActive = false;
return {true, "Chat stopped"};
}
// Метод для возобновления чата
ResponseData ResumeChat(int sender) {
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (chatActive) return {false, "Chat is already active"};
chatActive = true;
return {true, "Chat resumed"};
}
};
У вас есть приложение, а в нем пользователи. У каждого пользователя есть свой уникальный id.
Приложение - обычный мессенджер, а ваш класс будет управлять чатом. Взаимодействие с классом
будет следующее, он извне получает запросы об изменении состояния чата(добавление
пользователя, новые сообщения, бан пользователей и т.п.). У каждого из этих запросов есть
отправитель, конкретный пользователь со своим id. Дело в том, что в чатах обычно есть роли
пользователей, поэтому, скажем, удалять сообщения других людей могут только модераторы, а
добавлять в чат новых людей могут только админы.
Список ролей у пользователей:
Роль Описание
ADMIN
Может регистрировать новых пользователей, давать роль админа или
модератора другим пользователям, а также полностью останавливать чат
MODERATOR
Может банить пользователей, создавать других модераторов, а также полностью
редактировать все сообщения
BANNED
Не может ничего, предполагается, что ни ADMIN, ни MODERATOR не станут
BANNED
USER Может писать сообщения, а также редактировать сообщения, но только свои
Более того, любые запросы к пользователю, котрого еще нет в чате, также невозможны(Например,
нельзя забанить того, кого нет в чате). Также нельзя повторять запросы, если они не имеют
смысла(например, остановить остановленный чат или же забанить того, кто уже забанен)
Как можете видеть, один и тот же пользователь в праве иметь несколько ролей сразу. Например,
ADMIN, MODERATOR, USER.
Итак, у каждого запроса есть отправитель.
Также на каждый запрос ваш класс должен возвращать ответ в следующем виде:
struct ResposeData {
bool Success;
std::string Response;
};
Где Success -- выполнил ли класс запрос. Response -- комментарий класса об ошибке, если Success
равен false
Итак, вас попросили написать класс со следующими методами. Везде sender, это отправитель
запроса. В конструкторе единственный аргумент, id самого первого админа.
class SystemBase {
public:
SystemBase(int admin);
ResposeData BanUser(int sender, int user);
ResposeData UnBanUser(int sender, int user);
ResposeData RegisterNewUser(int sender, int newUser);
ResposeData GrantModeratorRole(int sender, int user);
ResposeData GrantAdminRole(int sender, int user);
ResposeData StopChat(int sender);
ResposeData ResumeChat(int sender);
};
При этом, если запрос некорректен, например, метод GrantAdminRole вызван от sender, который
сам не является админом, то такой метод в ResponseData должен иметь Success = false,
комментарий не важен.
Можете помочь