]>
Commit | Line | Data |
---|---|---|
ce4e8c42 | 1 | #include <GameServ/DataLayer/File/FilePlayerDAO.h>\r |
2 | using GameServ::DataLayer::File::FilePlayerDAO;\r | |
e0306362 | 3 | #include <GameServ/DataLayer/File/FileItemDAO.h>\r |
4 | using GameServ::DataLayer::File::FileItemDAO;\r | |
c7b7180e | 5 | \r |
ce4e8c42 | 6 | #include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r |
7 | using GameServ::GameLayer::GameObjects::PlayerGO;\r | |
8 | \r | |
9 | #include <GameServ/DataLayer/DataLayerExceptions.h>\r | |
10 | using GameServ::DataLayer::Exceptions::ResourceException;\r | |
11 | using GameServ::DataLayer::Exceptions::DataLayerException;\r | |
12 | \r | |
f4f0d89d | 13 | #include <GameServ/DataLayer/File/FileId.h>\r |
14 | using GameServ::DataLayer::File::FileId;\r | |
15 | \r | |
cce88913 | 16 | #include <boost/smart_ptr/shared_ptr.hpp>\r |
ce4e8c42 | 17 | #include <boost/format.hpp>\r |
18 | #include <boost/algorithm/string.hpp>\r | |
19 | #include <boost/lexical_cast.hpp>\r | |
20 | using boost::shared_ptr;\r | |
e0306362 | 21 | using boost::shared_static_cast;\r |
ce4e8c42 | 22 | using boost::format;\r |
23 | using boost::str;\r | |
24 | using boost::algorithm::to_upper;\r | |
cb255541 | 25 | using boost::algorithm::to_lower;\r |
ce4e8c42 | 26 | using boost::lexical_cast;\r |
9c917833 | 27 | using boost::bad_lexical_cast;\r |
ce4e8c42 | 28 | #include <boost/tokenizer.hpp>\r |
29 | typedef boost::tokenizer<boost::char_separator<char> > \r | |
30 | tokenizer;\r | |
31 | \r | |
c7b7180e | 32 | #include <boost/date_time/posix_time/posix_time.hpp>\r |
9c917833 | 33 | using namespace boost::posix_time;\r |
c7b7180e | 34 | \r |
35 | #include <time.h>\r | |
36 | \r | |
ce4e8c42 | 37 | #include <string>\r |
38 | using std::string;\r | |
39 | \r | |
40 | #include <fstream>\r | |
41 | using std::ifstream;\r | |
42 | using std::getline;\r | |
f4f0d89d | 43 | using std::ofstream;\r |
44 | using std::endl;\r | |
ce4e8c42 | 45 | \r |
f4f0d89d | 46 | #include <map>\r |
47 | using std::map;\r | |
ce4e8c42 | 48 | \r |
49 | FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r | |
50 | {\r | |
51 | Initialize(GetPlayerFilePath());\r | |
52 | }\r | |
53 | \r | |
54 | FilePlayerDAO::FilePlayerDAO(const string &filename)\r | |
55 | {\r | |
56 | Initialize(filename);\r | |
57 | }\r | |
58 | \r | |
59 | FilePlayerDAO::~FilePlayerDAO()\r | |
60 | {\r | |
61 | }\r | |
62 | \r | |
63 | void FilePlayerDAO::Initialize(const string &filename)\r | |
64 | {\r | |
65 | mFilename = filename;\r | |
f4f0d89d | 66 | LoadPlayerCache();\r |
67 | }\r | |
68 | \r | |
cb255541 | 69 | void FilePlayerDAO::LoadPlayerCache(void)\r |
f4f0d89d | 70 | {\r |
71 | assert(!mFilename.empty());\r | |
72 | spPlayerCache.clear();\r | |
73 | ifstream infile;\r | |
74 | infile.open(mFilename.c_str());\r | |
75 | if (infile.fail())\r | |
76 | {\r | |
77 | throw DataLayerException(str(format("Unable to open %1% for loading Players") % mFilename),\r | |
78 | __FILE__, __LINE__);\r | |
79 | }\r | |
80 | while (!infile.eof())\r | |
81 | {\r | |
82 | string line;\r | |
83 | shared_ptr<PlayerGO> spPlayer;\r | |
84 | getline(infile, line);\r | |
85 | spPlayer = CreatePlayerFromLine(line);\r | |
cb255541 | 86 | string id = spPlayer->Id();\r |
87 | to_lower(id);\r | |
88 | spPlayerCache[id] = spPlayer;\r | |
f4f0d89d | 89 | }\r |
90 | infile.close();\r | |
91 | }\r | |
92 | \r | |
cb255541 | 93 | void FilePlayerDAO::WritePlayerCache(void) const\r |
f4f0d89d | 94 | {\r |
95 | ofstream outfile;\r | |
96 | outfile.open(mFilename.c_str());\r | |
97 | if (outfile.fail())\r | |
98 | {\r | |
99 | throw DataLayerException(str(format("Unable to open %1% for writing Players") % mFilename),\r | |
100 | __FILE__, __LINE__);\r | |
101 | }\r | |
102 | \r | |
103 | map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r | |
104 | for (iter = spPlayerCache.begin(); iter != spPlayerCache.end(); iter++)\r | |
105 | {\r | |
106 | outfile << CreateLineFromPlayer(iter->second) << endl;\r | |
107 | }\r | |
108 | outfile.close();\r | |
ce4e8c42 | 109 | }\r |
110 | \r | |
111 | string FilePlayerDAO::GetPlayerFilePath() const\r | |
112 | {\r | |
113 | return mFilename;\r | |
114 | }\r | |
115 | \r | |
116 | shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const\r | |
117 | {\r | |
118 | string line;\r | |
119 | ifstream infile;\r | |
120 | infile.open(GetPlayerFilePath().c_str());\r | |
121 | \r | |
122 | if (infile.fail())\r | |
123 | {\r | |
124 | throw ResourceException(str(format("Unable to open file %1%") % GetPlayerFilePath()), __FILE__, __LINE__);\r | |
125 | }\r | |
126 | \r | |
cb255541 | 127 | string id = Id;\r |
128 | to_lower(id);\r | |
ce4e8c42 | 129 | while (getline(infile, line))\r |
130 | {\r | |
131 | shared_ptr<PlayerGO> spPlayer = CreatePlayerFromLine(line);\r | |
cb255541 | 132 | \r |
133 | // No need to convert the playerId to lowercase here, because it should already be lowercase\r | |
134 | if (spPlayer->Id() == id)\r | |
ce4e8c42 | 135 | {\r |
136 | return spPlayer;\r | |
137 | }\r | |
138 | }\r | |
139 | return shared_ptr<PlayerGO>();\r | |
140 | }\r | |
141 | \r | |
142 | shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) const\r | |
143 | {\r | |
f4f0d89d | 144 | assert(!line.empty());\r |
ce4e8c42 | 145 | shared_ptr<PlayerGO> spPlayer;\r |
146 | spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r | |
2a8a990d | 147 | boost::char_separator<char> sep(" ", 0, boost::keep_empty_tokens);\r |
ce4e8c42 | 148 | tokenizer tokens(line, sep);\r |
149 | tokenizer::iterator tok_iter = tokens.begin();\r | |
150 | \r | |
f4f0d89d | 151 | spPlayer->Name((*tok_iter));\r |
152 | spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r | |
153 | tok_iter++;\r | |
2a8a990d | 154 | spPlayer->Level(lexical_cast<int>((*tok_iter)));\r |
155 | tok_iter++;\r | |
156 | spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r | |
157 | tok_iter++;\r | |
158 | spPlayer->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r | |
159 | tok_iter++;\r | |
160 | spPlayer->Bank(lexical_cast<unsigned long int>((*tok_iter)));\r | |
161 | tok_iter++;\r | |
162 | spPlayer->Health(lexical_cast<int>((*tok_iter)));\r | |
163 | tok_iter++;\r | |
164 | spPlayer->MaxHealth(lexical_cast<int>((*tok_iter)));\r | |
165 | tok_iter++;\r | |
166 | spPlayer->Strength(lexical_cast<int>((*tok_iter)));\r | |
167 | tok_iter++;\r | |
168 | spPlayer->Defense(lexical_cast<int>((*tok_iter)));\r | |
169 | tok_iter++;\r | |
170 | spPlayer->ForestFights(lexical_cast<int>((*tok_iter)));\r | |
171 | tok_iter++;\r | |
172 | spPlayer->PlayerFights(lexical_cast<int>((*tok_iter)));\r | |
173 | tok_iter++;\r | |
174 | int flags = lexical_cast<int>((*tok_iter));\r | |
175 | SetFlags(spPlayer, flags);\r | |
176 | tok_iter++;\r | |
177 | spPlayer->Password((*tok_iter));\r | |
ce4e8c42 | 178 | \r |
c7b7180e | 179 | \r |
180 | tok_iter++;\r | |
9c917833 | 181 | try\r |
182 | {\r | |
183 | unsigned long int intlast = lexical_cast<unsigned long int>((*tok_iter));\r | |
184 | time_t t = (time_t)intlast;\r | |
185 | spPlayer->LastLogin(from_time_t(t));\r | |
186 | }\r | |
187 | catch (bad_lexical_cast)\r | |
188 | {\r | |
189 | spPlayer->LastLogin(from_iso_string((*tok_iter)));\r | |
190 | }\r | |
c7b7180e | 191 | \r |
192 | \r | |
193 | // Weapon\r | |
194 | tok_iter++;\r | |
e0306362 | 195 | FileItemDAO idao;\r |
196 | string weaponid = FileId::CreateItemId((*tok_iter));\r | |
197 | spPlayer->Weapon(boost::shared_static_cast<WeaponGO>(idao.GetById(weaponid)));\r | |
c7b7180e | 198 | \r |
199 | // Armor\r | |
200 | tok_iter++;\r | |
e0306362 | 201 | string armorid = FileId::CreateItemId((*tok_iter));\r |
202 | spPlayer->Armor(boost::shared_static_cast<ArmorGO>(idao.GetById(armorid)));\r | |
eec695cf | 203 | \r |
9c917833 | 204 | tok_iter++;\r |
205 | while (tok_iter != tokens.end())\r | |
206 | {\r | |
207 | // Load all the items into the player's inventory\r | |
208 | tok_iter++;\r | |
209 | }\r | |
c7b7180e | 210 | \r |
ce4e8c42 | 211 | return spPlayer;\r |
212 | }\r | |
213 | \r | |
f4f0d89d | 214 | string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r |
215 | {\r | |
216 | string line;\r | |
eec695cf | 217 | // TODO: Add weapons, armor, and items\r |
9c917833 | 218 | line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13% %14%") % \r |
f4f0d89d | 219 | spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r |
220 | spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r | |
221 | spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r | |
9c917833 | 222 | GetFlags(spPlayer) % spPlayer->Password() % (to_iso_string(spPlayer->LastLogin())));\r |
f4f0d89d | 223 | return line;\r |
224 | }\r | |
225 | \r | |
2a8a990d | 226 | void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r |
227 | {\r | |
cb255541 | 228 | if ((flags & 0x00000001) == 0x00000001)\r |
229 | {\r | |
230 | spPlayer->FoughtMaster(true);\r | |
231 | }\r | |
232 | else\r | |
233 | {\r | |
234 | spPlayer->FoughtMaster(false);\r | |
235 | }\r | |
236 | \r | |
237 | if ((flags & 0x00000002) == 0x00000002)\r | |
238 | {\r | |
239 | spPlayer->Alive(true);\r | |
240 | }\r | |
241 | else\r | |
242 | {\r | |
243 | spPlayer->Alive(false);\r | |
244 | }\r | |
f4f0d89d | 245 | }\r |
ce4e8c42 | 246 | \r |
f4f0d89d | 247 | int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r |
248 | {\r | |
cb255541 | 249 | int flags = 0;\r |
250 | \r | |
251 | if (spPlayer->FoughtMaster())\r | |
252 | {\r | |
253 | flags |= 0x00000001;\r | |
254 | }\r | |
255 | if (spPlayer->Alive())\r | |
256 | {\r | |
257 | flags |= 0x00000002;\r | |
258 | }\r | |
f4f0d89d | 259 | return 0;\r |
2a8a990d | 260 | }\r |
ce4e8c42 | 261 | \r |
f21affc9 | 262 | void FilePlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)\r |
263 | {\r | |
f4f0d89d | 264 | assert(spPlayer != 0);\r |
265 | assert(!spPlayer->Id().empty());\r | |
266 | assert(!spPlayer->Name().empty());\r | |
267 | \r | |
eec695cf | 268 | // TODO: Lock the file\r |
f4f0d89d | 269 | if (IdExists(spPlayer->Id()))\r |
270 | {\r | |
cb255541 | 271 | string id = spPlayer->Id();\r |
272 | to_lower(id);\r | |
273 | spPlayerCache[id] = spPlayer;\r | |
eec695cf | 274 | WritePlayerCache();\r |
f4f0d89d | 275 | }\r |
276 | else\r | |
277 | {\r | |
278 | throw DataLayerException(str(format("Unable to Update Player %1%: Player does not exist") % \r | |
279 | spPlayer->Name()), __FILE__, __LINE__);\r | |
280 | }\r | |
f21affc9 | 281 | }\r |
282 | \r | |
283 | void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)\r | |
284 | {\r | |
f4f0d89d | 285 | assert(spPlayer != 0);\r |
286 | assert(!spPlayer->Name().empty());\r | |
eec695cf | 287 | // TODO: Lock the file\r |
f4f0d89d | 288 | if (!IdExists(FileId::CreatePlayerId(spPlayer->Name())))\r |
289 | {\r | |
290 | spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r | |
cb255541 | 291 | string id = spPlayer->Id();\r |
292 | to_lower(id);\r | |
293 | spPlayerCache[id] = spPlayer;\r | |
eec695cf | 294 | ofstream outfile;\r |
295 | outfile.open(mFilename.c_str(), std::ios::app);\r | |
296 | if (outfile.fail())\r | |
297 | {\r | |
298 | throw ResourceException(str(format("Unable to open %1% for appending.") % mFilename), __FILE__, __LINE__);\r | |
299 | }\r | |
300 | outfile << CreateLineFromPlayer(spPlayer) << endl;\r | |
301 | outfile.close();\r | |
f4f0d89d | 302 | }\r |
303 | else\r | |
304 | {\r | |
305 | throw DataLayerException(str(format("Unable to Insert Player %1%: Player exists") %\r | |
306 | spPlayer->Name()), __FILE__, __LINE__);\r | |
307 | }\r | |
f21affc9 | 308 | }\r |
ce4e8c42 | 309 | \r |
f21affc9 | 310 | bool FilePlayerDAO::IdExists(const string &Id) const\r |
311 | {\r | |
f4f0d89d | 312 | map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r |
cb255541 | 313 | string id = Id;\r |
314 | to_lower(id);\r | |
315 | iter = spPlayerCache.find(id);\r | |
f4f0d89d | 316 | return (iter != spPlayerCache.end());\r |
f21affc9 | 317 | }\r |
318 | \r | |
319 | list<string> FilePlayerDAO::GetIdsByName(const string &Name) const\r | |
320 | {\r | |
f4f0d89d | 321 | list<string> ids;\r |
322 | if (IdExists(FileId::CreatePlayerId(Name)))\r | |
323 | {\r | |
324 | ids.push_back(FileId::CreatePlayerId(Name));\r | |
325 | }\r | |
326 | return ids;\r | |
f21affc9 | 327 | } |