-//
-// Account.hpp
-//
-
-#pragma once
-
-#include <string>
-#include <map>
-#include <list>
-#include <unordered_map>
-#include <stdint.h>
-#include "../common/database/AccountProperty.hpp"
-#include "../common/network/Utils.hpp"
-#include "../common/Logger.hpp"
-
-typedef unsigned int UserID;
-
-class Account {
- public:
- Account(const std::string&);
- ~Account();
-
- void LoadInitializeData(UserID user_id, std::string data);
-
- unsigned int GetCurrentRevision();
- std::string GetUserRevisionPatch(UserID user_id, unsigned int revision);
-
- UserID GetUserIdFromFingerPrint(const std::string&);
- std::string GetPublicKey(UserID);
- UserID RegisterPublicKey(const std::string&);
-
- void LogIn(UserID);
- void LogOut(UserID);
- void LogOutAll();
-
- std::string GetUserName(UserID) const;
- void SetUserName(UserID, const std::string&);
- std::string GetUserTrip(UserID) const;
- void SetUserTrip(UserID, const std::string&);
- std::string GetUserModelName(UserID) const;
- void SetUserModelName(UserID, const std::string&);
-
- std::string GetUserIPAddress(UserID) const;
- void SetUserIPAddress(UserID, const std::string&);
- uint16_t GetUserUDPPort(UserID) const;
- void SetUserUDPPort(UserID, uint16_t);
- uint32_t GetUserRevision(UserID) const;
-
- void SetUserPosition(UserID, const PlayerPosition&);
- PlayerPosition GetUserPosition(UserID) const;
-
- std::vector<UserID> GetIDList() const;
-
- private:
- template <class T>
- void Set(UserID user_id, AccountProperty property, T value, bool revision = true)
- {
- if (user_id == 0) {
- return;
- }
-
- T old_value;
- if (!Get(user_id, property, &old_value) || old_value != value) {
- boost::unique_lock<boost::recursive_mutex> lock(mutex_);
-
- if (user_map_.find(user_id) == user_map_.end()) {
- user_map_[user_id] = PropertyMap();
- }
-
- user_map_[user_id][property].value = network::Utils::Serialize(value);
-
- if (revision) {
- uint32_t new_revision = GetUserRevision(user_id) + 1;
- Logger::Debug("Userdata Update %d %d Revision: %d",
- user_id, property, new_revision);
-
- user_map_[user_id][property].revision = new_revision;
- Set(user_id, REVISION, new_revision, false);
- }
- }
- }
-
- template <class T>
- bool Get(UserID user_id, AccountProperty property, T* value) const
- {
- UserMap::const_iterator usermap_it;
- if ((usermap_it = user_map_.find(user_id)) != user_map_.end()) {
- PropertyMap::const_iterator property_it;
- if ((property_it = usermap_it->second.find(property)) != usermap_it->second.end()) {
- network::Utils::Deserialize(property_it->second.value, value);
- return true;
- }
- }
- return false;
- }
-
- struct PropertyValue {
- PropertyValue() : revision(0) {}
- uint32_t revision;
- std::string value;
- };
-
- typedef std::map<AccountProperty, PropertyValue> PropertyMap;
- typedef std::map<UserID, PropertyMap> UserMap;
- UserMap user_map_;
-
- typedef std::unordered_map<std::string, UserID> FingerprintMap;
- FingerprintMap fingerprint_map_;
-
- typedef std::map<UserID, PlayerPosition> PositionMap;
- PositionMap position_map_;
-
- unsigned int revision_;
- UserID max_user_id_;
-
- boost::recursive_mutex mutex_;
-};
+//\r
+// Account.hpp\r
+//\r
+\r
+#pragma once\r
+\r
+#include <string>\r
+#include <map>\r
+#include <list>\r
+#include <unordered_map>\r
+#include <stdint.h>\r
+#include "../common/database/AccountProperty.hpp"\r
+#include "../common/network/Utils.hpp"\r
+#include "../common/Logger.hpp"\r
+#include <boost/thread.hpp>\r
+\r
+typedef uint32_t UserID;\r
+\r
+class Account {\r
+ public:\r
+ Account(const std::string&);\r
+ ~Account();\r
+\r
+ void LoadInitializeData(UserID user_id, std::string data);\r
+\r
+ uint32_t GetCurrentRevision();\r
+ std::string GetUserRevisionPatch(UserID user_id, uint32_t revision);\r
+\r
+ UserID GetUserIdFromFingerPrint(const std::string&);\r
+ std::string GetPublicKey(UserID);\r
+ UserID RegisterPublicKey(const std::string&);\r
+\r
+ void LogIn(UserID);\r
+ void LogOut(UserID);\r
+ void LogOutAll();\r
+\r
+ void Remove(UserID);\r
+\r
+ std::string GetUserName(UserID) const;\r
+ void SetUserName(UserID, const std::string&);\r
+ std::string GetUserTrip(UserID) const;\r
+ void SetUserTrip(UserID, const std::string&);\r
+ std::string GetUserModelName(UserID) const;\r
+ void SetUserModelName(UserID, const std::string&);\r
+\r
+ std::string GetUserIPAddress(UserID) const;\r
+ void SetUserIPAddress(UserID, const std::string&);\r
+ uint16_t GetUserUDPPort(UserID) const;\r
+ void SetUserUDPPort(UserID, uint16_t);\r
+ uint32_t GetUserRevision(UserID) const;\r
+ \r
+ void SetUserChannel(UserID, unsigned char);\r
+ unsigned char GetUserChannel(UserID) const;\r
+\r
+ void SetUserPosition(UserID, const PlayerPosition&);\r
+ PlayerPosition GetUserPosition(UserID) const;\r
+\r
+ std::vector<UserID> GetIDList() const;\r
+\r
+ private:\r
+ template <class T>\r
+ void Set(UserID user_id, AccountProperty property, T value, bool revision = true)\r
+ {\r
+ if (user_id == 0) {\r
+ Logger::Error(_T("Invalid session id"));\r
+ return;\r
+ }\r
+\r
+ T old_value;\r
+ if (!Get(user_id, property, &old_value) || old_value != value) {\r
+ boost::unique_lock<boost::recursive_mutex> lock(mutex_);\r
+\r
+ if (user_map_.find(user_id) == user_map_.end()) {\r
+ user_map_[user_id] = PropertyMap();\r
+ }\r
+\r
+ user_map_[user_id][property].value = network::Utils::Serialize(value);\r
+\r
+ if (revision) {\r
+ uint32_t new_revision = GetUserRevision(user_id) + 1;\r
+ Logger::Debug("Userdata Update %d %d Revision: %d",\r
+ user_id, property, new_revision);\r
+\r
+ user_map_[user_id][property].revision = new_revision;\r
+ Set(user_id, REVISION, new_revision, false);\r
+ }\r
+ }\r
+ }\r
+\r
+ template <class T>\r
+ bool Get(UserID user_id, AccountProperty property, T* value) const\r
+ {\r
+ UserMap::const_iterator usermap_it;\r
+ if ((usermap_it = user_map_.find(user_id)) != user_map_.end()) {\r
+ PropertyMap::const_iterator property_it;\r
+ if ((property_it = usermap_it->second.find(property)) != usermap_it->second.end()) {\r
+ network::Utils::Deserialize(property_it->second.value, value);\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ struct PropertyValue {\r
+ PropertyValue() : revision(0) {}\r
+ uint32_t revision;\r
+ std::string value;\r
+ };\r
+\r
+ typedef std::map<AccountProperty, PropertyValue> PropertyMap;\r
+ typedef std::map<UserID, PropertyMap> UserMap;\r
+ UserMap user_map_;\r
+\r
+ typedef std::unordered_map<std::string, UserID> FingerprintMap;\r
+ FingerprintMap fingerprint_map_;\r
+\r
+ typedef std::map<UserID, PlayerPosition> PositionMap;\r
+ PositionMap position_map_;\r
+\r
+ uint32_t revision_;\r
+ UserID max_user_id_;\r
+\r
+ boost::recursive_mutex mutex_;\r
+};\r