Advertisement
i1last

future code, homework, 4.1.2. BizzareChat

May 16th, 2024 (edited)
54
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.81 KB | None | 0 0
  1. #include <string>
  2. #include <unordered_map>
  3. #include <unordered_set>
  4.  
  5. class AccessControl {
  6.     std::unordered_set<std::string> KnownRoles;
  7.     std::unordered_map<std::string, std::unordered_set<int>> GrantedRoles;
  8.     bool RoleExists(const std::string& roleName) const {
  9.         return KnownRoles.count(roleName);
  10.     }
  11. public:
  12.     bool HasRole(int id, const std::string& roleName) const {
  13.         if (!RoleExists(roleName)) {
  14.             return false;
  15.         }
  16.         auto& usersList = GrantedRoles.find(roleName)->second;
  17.         return usersList.count(id) == 1;
  18.     }
  19.  
  20.     bool GrantRole(int id, const std::string& roleName) {
  21.         if (!RoleExists(roleName)) {
  22.             return false;
  23.         }
  24.         GrantedRoles[roleName].insert(id);
  25.         return true;
  26.     }
  27.     bool RemoveRole(int id, const std::string& roleName) {
  28.         if (!RoleExists(roleName)) {
  29.             return false;
  30.         }
  31.         auto& roleInfo = GrantedRoles[roleName];
  32.         auto iter = roleInfo.find(id);
  33.         if (iter == roleInfo.end()) {
  34.             return false;
  35.         }
  36.         roleInfo.erase(iter);
  37.         return true;
  38.     }
  39.  
  40.     void RegisterRole(const std::string& roleName) {
  41.         KnownRoles.insert(roleName);
  42.         GrantedRoles.insert({roleName, {}});
  43.     }
  44. };
  45.  
  46. class Pausable {
  47.     bool Paused = false;
  48. public:
  49.     bool IsPaused() const {
  50.         return Paused;
  51.     }
  52.     void Pause() {
  53.         Paused = true;
  54.     }
  55.     void UnPause() {
  56.         Paused = false;
  57.     }
  58. };
  59.  
  60. struct ResposeData {
  61.     bool Success;
  62.     std::string Response;
  63. };
  64.  
  65. ResposeData MakeSuccessResponse() {
  66.     return {true, ""};
  67. }
  68.  
  69. ResposeData MakeFailedResponse(const std::string& response) {
  70.     return {false, response};
  71. }
  72.  
  73.  
  74. class SystemBase : public AccessControl, public Pausable {
  75.     const std::string ADMIN_ROLE = "admin";
  76.     const std::string USER_ROLE = "user";
  77.     const std::string MODERATOR_ROLE = "moderator";
  78.     const std::string BANNED_ROLE = "banned";
  79. public:
  80.     SystemBase(int admin) {
  81.         RegisterRole(ADMIN_ROLE);
  82.         RegisterRole(USER_ROLE);
  83.         RegisterRole(MODERATOR_ROLE);
  84.         RegisterRole(BANNED_ROLE);
  85.         GrantRole(admin, ADMIN_ROLE);
  86.     }
  87.  
  88.     ResposeData BanUser(int sender, int user)  {
  89.         if (!HasRole(sender, MODERATOR_ROLE)) {
  90.             return MakeFailedResponse("only moderator can ban");
  91.         }
  92.         if (!HasRole(user, USER_ROLE)) {
  93.             return MakeFailedResponse("not registered");
  94.         }
  95.         if (HasRole(user, BANNED_ROLE)) {
  96.             return MakeFailedResponse("already banned");
  97.         }
  98.         GrantRole(user, BANNED_ROLE);
  99.         return MakeSuccessResponse();
  100.     }
  101.     ResposeData UnBanUser(int sender, int user)  {
  102.         if (!HasRole(sender, MODERATOR_ROLE)) {
  103.             return MakeFailedResponse("only moderator can unban");
  104.         }
  105.         if (!HasRole(user, USER_ROLE)) {
  106.             return MakeFailedResponse("not registered");
  107.         }
  108.         if (!HasRole(user, BANNED_ROLE)) {
  109.             return MakeFailedResponse("already unbanned");
  110.         }
  111.         RemoveRole(user, BANNED_ROLE);
  112.         return MakeSuccessResponse();
  113.     }
  114.     ResposeData RegisterNewUser(int sender, int newUser) {
  115.         if (!HasRole(sender, ADMIN_ROLE)) {
  116.             return MakeFailedResponse("only admin can register");
  117.         }
  118.         if (HasRole(newUser, USER_ROLE)) { // Пользователь уже зареган
  119.             return MakeFailedResponse("already registered");
  120.         }
  121.         GrantRole(newUser, USER_ROLE);
  122.         return MakeSuccessResponse();
  123.     }
  124.     ResposeData GrantModeratorRole(int sender, int user) {
  125.         if (!HasRole(sender, ADMIN_ROLE) && !HasRole(sender, MODERATOR_ROLE)) {
  126.             return MakeFailedResponse("only admin or moderator can grant moderator role");
  127.         }
  128.         GrantRole(user, MODERATOR_ROLE);
  129.         return MakeSuccessResponse();
  130.     }
  131.     ResposeData GrantAdminRole(int sender, int user) {
  132.         if (!HasRole(sender, ADMIN_ROLE)) {
  133.             return MakeFailedResponse("only admin can grant admin role");
  134.         }
  135.         GrantRole(user, ADMIN_ROLE);
  136.         return MakeSuccessResponse();
  137.     }
  138.  
  139.     ResposeData StopChat(int sender) {
  140.         if (IsPaused()) {
  141.             return MakeFailedResponse("already stopped");
  142.         }
  143.         if (!HasRole(sender, ADMIN_ROLE)) {
  144.             return MakeFailedResponse("only admin can stop chat");
  145.         }
  146.         Pause();
  147.         return MakeSuccessResponse();
  148.     }
  149.     ResposeData ResumeChat(int sender) {
  150.         if (!IsPaused()) {
  151.             return MakeFailedResponse("already unpaused");
  152.         }
  153.         if (!HasRole(sender, ADMIN_ROLE)) {
  154.             return MakeFailedResponse("only admin");
  155.         }
  156.         UnPause();
  157.         return MakeSuccessResponse();
  158.     }
  159. };
Advertisement
Comments
  • i1last
    1 year
    Comment was deleted
Add Comment
Please, Sign In to add comment
Advertisement