]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FilePlayerDAO.cpp
Consolidated IArmorDAO, IWeaponDAO, FileArmorDAO, and FileWeaponDAO into IItemDAO...
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FilePlayerDAO.cpp
CommitLineData
ce4e8c42 1#include <GameServ/DataLayer/File/FilePlayerDAO.h>\r
2using GameServ::DataLayer::File::FilePlayerDAO;\r
e0306362 3#include <GameServ/DataLayer/File/FileItemDAO.h>\r
4using GameServ::DataLayer::File::FileItemDAO;\r
c7b7180e 5\r
ce4e8c42 6#include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r
7using GameServ::GameLayer::GameObjects::PlayerGO;\r
8\r
9#include <GameServ/DataLayer/DataLayerExceptions.h>\r
10using GameServ::DataLayer::Exceptions::ResourceException;\r
11using GameServ::DataLayer::Exceptions::DataLayerException;\r
12\r
f4f0d89d 13#include <GameServ/DataLayer/File/FileId.h>\r
14using 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
20using boost::shared_ptr;\r
e0306362 21using boost::shared_static_cast;\r
ce4e8c42 22using boost::format;\r
23using boost::str;\r
24using boost::algorithm::to_upper;\r
cb255541 25using boost::algorithm::to_lower;\r
ce4e8c42 26using boost::lexical_cast;\r
9c917833 27using boost::bad_lexical_cast;\r
ce4e8c42 28#include <boost/tokenizer.hpp>\r
29typedef 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 33using namespace boost::posix_time;\r
c7b7180e 34\r
35#include <time.h>\r
36\r
ce4e8c42 37#include <string>\r
38using std::string;\r
39\r
40#include <fstream>\r
41using std::ifstream;\r
42using std::getline;\r
f4f0d89d 43using std::ofstream;\r
44using std::endl;\r
ce4e8c42 45\r
f4f0d89d 46#include <map>\r
47using std::map;\r
ce4e8c42 48\r
49FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r
50{\r
51 Initialize(GetPlayerFilePath());\r
52}\r
53\r
54FilePlayerDAO::FilePlayerDAO(const string &filename)\r
55{\r
56 Initialize(filename);\r
57}\r
58\r
59FilePlayerDAO::~FilePlayerDAO()\r
60{\r
61}\r
62\r
63void FilePlayerDAO::Initialize(const string &filename)\r
64{\r
65 mFilename = filename;\r
f4f0d89d 66 LoadPlayerCache();\r
67}\r
68\r
cb255541 69void 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 93void 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
111string FilePlayerDAO::GetPlayerFilePath() const\r
112{\r
113 return mFilename;\r
114}\r
115\r
116shared_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
142shared_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 214string 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 226void 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 247int 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 262void 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
283void 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 310bool 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
319list<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}