From b94820efc988f2f02201ef16954d5c5df78724cb Mon Sep 17 00:00:00 2001 From: Relintai Date: Wed, 4 Aug 2021 19:03:53 +0200 Subject: [PATCH] Added a new UserManager class. --- modules/users/user_manager.cpp | 116 +++++++++++++++++++++++++++++++++ modules/users/user_manager.h | 38 +++++++++++ 2 files changed, 154 insertions(+) create mode 100644 modules/users/user_manager.cpp create mode 100644 modules/users/user_manager.h diff --git a/modules/users/user_manager.cpp b/modules/users/user_manager.cpp new file mode 100644 index 0000000..2c7d7bf --- /dev/null +++ b/modules/users/user_manager.cpp @@ -0,0 +1,116 @@ +#include "user_manager.h" + +void UserManager::add_user(User *user) { + if (!user) { + printf("UserManager::add_user: ERROR, user is null!\n"); + return; + } + + std::lock_guard lock(_mutex); + + _users.push_back(user); + + for (int i = 0; i < user->sessions.size(); ++i) { + _sessions[user->sessions[i]] = user; + } +} +void UserManager::remove_user(User *user) { + if (!user) { + printf("UserManager::remove_user: ERROR, user is null!\n"); + return; + } + + std::lock_guard lock(_mutex); + + for (int i = 0; i < user->sessions.size(); ++i) { + _sessions.erase(user->sessions[i]); + } + + for (int i = 0; i < _users.size(); ++i) { + if (_users[i] == user) { + _users[i] = _users[_users.size() - 1]; + _users.pop_back(); + return; + } + } +} +void UserManager::logout_user(User *user) { + if (!user) { + printf("UserManager::logout_user: ERROR, user is null!\n"); + return; + } + + std::lock_guard lock(_mutex); + + for (int i = 0; i < user->sessions.size(); ++i) { + _sessions.erase(user->sessions[i]); + } + + user->sessions.clear(); +} + +User *UserManager::get_user_for_session(const std::string &session_id) { + User *u = _sessions[session_id]; + + if (!u) { + printf("UserManager::get_user_for_session: ERROR, user is null! sessid:%s\n", session_id.c_str()); + } + + return u; +} +User *UserManager::get_user_with_id(const int user_id) { + for (int i = 0; i < _users.size(); ++i) { + + User *u = _users[i]; + + if (!u) { + printf("UserManager::get_user_with_id: ERROR, user (%d) is null!\n", user_id); + return u; + } + + if (u->id == user_id) { + return u; + } + } + + printf("UserManager::get_user_with_id: ERROR, user (%d) not found!\n", user_id); + + return nullptr; +} + +void UserManager::logout_all() { + for (int i = 0; i < _users.size(); ++i) { + logout_user(_users[i]); + } +} + +void UserManager::clear() { + std::lock_guard lock(_mutex); + + for (int i = 0; i < _users.size(); ++i) { + delete _users[i]; + } + + _sessions.clear(); + _users.clear(); +} + +UserManager *UserManager::get_singleton() { + return _self; +} + +UserManager::UserManager() : + Object() { + + if (_self) { + printf("UserManager::UserManager(): Error! self is not null!/n"); + } + + _self = this; +} + +UserManager::~UserManager() { + clear(); +} + +UserManager *UserManager::_self = nullptr; \ No newline at end of file diff --git a/modules/users/user_manager.h b/modules/users/user_manager.h new file mode 100644 index 0000000..2a36b63 --- /dev/null +++ b/modules/users/user_manager.h @@ -0,0 +1,38 @@ +#ifndef USER_MANAGER_H +#define USER_MANAGER_H + +#include "core/object.h" + +#include +#include +#include +#include + +#include "user.h" + +class UserManager : public Object { +public: + void add_user(User *user); + void remove_user(User *user); + void logout_user(User *user); + + User *get_user_for_session(const std::string &session_id); + User *get_user_with_id(const int user_id); + + void logout_all(); + void clear(); + + static UserManager* get_singleton(); + + UserManager(); + ~UserManager(); + + std::map _sessions; + std::vector _users; + std::mutex _mutex; + +protected: + static UserManager* _self; +}; + +#endif \ No newline at end of file