10 #include <unordered_map>
\r
12 #include "../common/database/AccountProperty.hpp"
\r
13 #include "../common/network/Utils.hpp"
\r
14 #include "../common/Logger.hpp"
\r
15 #include <boost/thread.hpp>
\r
17 typedef uint32_t UserID;
\r
21 Account(const std::string&);
\r
24 void LoadInitializeData(UserID user_id, std::string data);
\r
26 uint32_t GetCurrentRevision();
\r
27 std::string GetUserRevisionPatch(UserID user_id, uint32_t revision);
\r
29 UserID GetUserIdFromFingerPrint(const std::string&);
\r
30 std::string GetPublicKey(UserID);
\r
31 UserID RegisterPublicKey(const std::string&);
\r
34 void LogOut(UserID);
\r
37 void Remove(UserID);
\r
39 std::string GetUserName(UserID) const;
\r
40 void SetUserName(UserID, const std::string&);
\r
41 std::string GetUserTrip(UserID) const;
\r
42 void SetUserTrip(UserID, const std::string&);
\r
43 std::string GetUserModelName(UserID) const;
\r
44 void SetUserModelName(UserID, const std::string&);
\r
46 std::string GetUserIPAddress(UserID) const;
\r
47 void SetUserIPAddress(UserID, const std::string&);
\r
48 uint16_t GetUserUDPPort(UserID) const;
\r
49 void SetUserUDPPort(UserID, uint16_t);
\r
50 uint32_t GetUserRevision(UserID) const;
\r
52 void SetUserChannel(UserID, unsigned char);
\r
53 unsigned char GetUserChannel(UserID) const;
\r
55 void SetUserPosition(UserID, const PlayerPosition&);
\r
56 PlayerPosition GetUserPosition(UserID) const;
\r
58 std::vector<UserID> GetIDList() const;
\r
62 void Set(UserID user_id, AccountProperty property, T value, bool revision = true)
\r
65 Logger::Error(_T("Invalid session id"));
\r
70 if (!Get(user_id, property, &old_value) || old_value != value) {
\r
71 boost::unique_lock<boost::recursive_mutex> lock(mutex_);
\r
73 if (user_map_.find(user_id) == user_map_.end()) {
\r
74 user_map_[user_id] = PropertyMap();
\r
77 user_map_[user_id][property].value = network::Utils::Serialize(value);
\r
80 uint32_t new_revision = GetUserRevision(user_id) + 1;
\r
81 Logger::Debug("Userdata Update %d %d Revision: %d",
\r
82 user_id, property, new_revision);
\r
84 user_map_[user_id][property].revision = new_revision;
\r
85 Set(user_id, REVISION, new_revision, false);
\r
91 bool Get(UserID user_id, AccountProperty property, T* value) const
\r
93 UserMap::const_iterator usermap_it;
\r
94 if ((usermap_it = user_map_.find(user_id)) != user_map_.end()) {
\r
95 PropertyMap::const_iterator property_it;
\r
96 if ((property_it = usermap_it->second.find(property)) != usermap_it->second.end()) {
\r
97 network::Utils::Deserialize(property_it->second.value, value);
\r
104 struct PropertyValue {
\r
105 PropertyValue() : revision(0) {}
\r
110 typedef std::map<AccountProperty, PropertyValue> PropertyMap;
\r
111 typedef std::map<UserID, PropertyMap> UserMap;
\r
114 typedef std::unordered_map<std::string, UserID> FingerprintMap;
\r
115 FingerprintMap fingerprint_map_;
\r
117 typedef std::map<UserID, PlayerPosition> PositionMap;
\r
118 PositionMap position_map_;
\r
120 uint32_t revision_;
\r
121 UserID max_user_id_;
\r
123 boost::recursive_mutex mutex_;
\r