OSDN Git Service

チャンネル機能を仮実装
[mmo/main.git] / server / Account.hpp
1 //\r
2 // Account.hpp\r
3 //\r
4 \r
5 #pragma once\r
6 \r
7 #include <string>\r
8 #include <map>\r
9 #include <list>\r
10 #include <unordered_map>\r
11 #include <stdint.h>\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
16 \r
17 typedef uint32_t UserID;\r
18 \r
19 class Account {\r
20     public:\r
21         Account(const std::string&);\r
22         ~Account();\r
23 \r
24         void LoadInitializeData(UserID user_id, std::string data);\r
25 \r
26         uint32_t GetCurrentRevision();\r
27         std::string GetUserRevisionPatch(UserID user_id, uint32_t revision);\r
28 \r
29         UserID GetUserIdFromFingerPrint(const std::string&);\r
30         std::string GetPublicKey(UserID);\r
31         UserID RegisterPublicKey(const std::string&);\r
32 \r
33         void LogIn(UserID);\r
34         void LogOut(UserID);\r
35         void LogOutAll();\r
36 \r
37                 void Remove(UserID);\r
38 \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
45 \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
51                 \r
52         void SetUserChannel(UserID, unsigned char);\r
53         unsigned char GetUserChannel(UserID) const;\r
54 \r
55         void SetUserPosition(UserID, const PlayerPosition&);\r
56         PlayerPosition GetUserPosition(UserID) const;\r
57 \r
58         std::vector<UserID> GetIDList() const;\r
59 \r
60     private:\r
61         template <class T>\r
62         void Set(UserID user_id, AccountProperty property, T value, bool revision = true)\r
63         {\r
64                         if (user_id == 0) {\r
65                                 Logger::Error(_T("Invalid session id"));\r
66                                 return;\r
67                         }\r
68 \r
69             T old_value;\r
70             if (!Get(user_id, property, &old_value) || old_value != value) {\r
71                                 boost::unique_lock<boost::recursive_mutex> lock(mutex_);\r
72 \r
73                 if (user_map_.find(user_id) == user_map_.end()) {\r
74                     user_map_[user_id] = PropertyMap();\r
75                 }\r
76 \r
77                 user_map_[user_id][property].value = network::Utils::Serialize(value);\r
78 \r
79                 if (revision) {\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
83 \r
84                     user_map_[user_id][property].revision = new_revision;\r
85                     Set(user_id, REVISION, new_revision, false);\r
86                 }\r
87             }\r
88         }\r
89 \r
90         template <class T>\r
91         bool Get(UserID user_id, AccountProperty property, T* value) const\r
92         {\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
98                     return true;\r
99                 }\r
100             }\r
101             return false;\r
102         }\r
103 \r
104         struct PropertyValue {\r
105             PropertyValue() : revision(0) {}\r
106             uint32_t revision;\r
107             std::string value;\r
108         };\r
109 \r
110         typedef std::map<AccountProperty, PropertyValue> PropertyMap;\r
111         typedef std::map<UserID, PropertyMap> UserMap;\r
112         UserMap user_map_;\r
113 \r
114         typedef std::unordered_map<std::string, UserID> FingerprintMap;\r
115         FingerprintMap fingerprint_map_;\r
116 \r
117         typedef std::map<UserID, PlayerPosition> PositionMap;\r
118         PositionMap position_map_;\r
119 \r
120         uint32_t revision_;\r
121         UserID max_user_id_;\r
122 \r
123                 boost::recursive_mutex mutex_;\r
124 };\r