YAPOG  0.0.1
Yet Another Pokemon Online Game
ClientSession.cpp
Go to the documentation of this file.
1 #include <boost/exception/all.hpp>
2 
7 
9 #include "Account/PlayerData.hpp"
10 #include "World/Map/Player.hpp"
11 #include "World/World.hpp"
12 #include "World/Map/Map.hpp"
13 
14 namespace yse
15 {
17  : OnDisconnected ()
18  , isConnected_ (true)
19  , packetHandler_ ()
20  , socket_ ()
22  , user_ ()
23  {
24  }
25 
27  {
28  }
29 
31  {
32  AddRelay (&user_);
33  user_.SetParent (this);
34 
42  }
43 
45  {
46  while (!networkHandler_.IsEmpty ())
47  {
49 
51  "Packet: " + yap::StringHelper::ToString (
52  static_cast<int> (packet->GetType ())));
53 
54  try
55  {
56  if (!HandlePacket (*packet))
57  YAPOG_THROW("Wrong packet received.");
58  }
59  catch (const yap::Exception& ex)
60  {
61  ex.GetMessage (std::cout) << std::endl;
62  }
63  }
64  }
65 
67  {
68  return user_;
69  }
70 
72  {
74  }
75 
77  {
78  return socket_;
79  }
80 
82  yap::DatabaseManager* databaseManager)
83  {
84  databaseManager_ = databaseManager;
85  }
86 
88  {
89  user_.ServerTick (dt);
90  }
91 
93  {
94  return packetHandler_.HandlePacket (packet);
95  }
96 
98  {
99  if (!IsConnected ())
100  return false;
101 
102  return socket_.Send (packet);
103  }
104 
106  {
107  packetHandler_.AddRelay (relay);
108  }
109 
111  {
112  relay->SetParent (nullptr);
113 
114  packetHandler_.RemoveRelay (relay);
115  }
116 
118  {
119  YAPOG_THROW("Unallowed to set parent for ClientSession.");
120  }
121 
123  {
124  return isConnected_;
125  }
126 
128  {
129  isConnected_ = false;
130 
131  socket_.Disconnect ();
132 
134 
136  }
137 
139  {
140  yap::String login (packet.ReadString ());
141  yap::String password (packet.ReadString ());
142 
143  try
144  {
145  if (user_.Login (login, password, socket_.GetRemoteAddress ()))
146  {
147  yap::Packet loginValidationPacket;
148  loginValidationPacket.CreateFromType (
150  SendPacket (loginValidationPacket);
151 
152  yap::Packet primaryDataPacket;
153  primaryDataPacket.CreateFromType (
155 
157  primaryDataPacket,
159 
160  SendPacket (primaryDataPacket);
161  }
162 
164  "Client logged: `" + login + "'.");
165  }
166  catch (const yap::Exception& e)
167  {
168  e.GetMessage (std::cerr);
169 
170  yap::Packet loginErrorPacket;
171  loginErrorPacket.CreateFromType (
173 
174  SendPacket (loginErrorPacket);
175  }
176  catch (boost::exception& ex)
177  {
178  std::cout << boost::diagnostic_information (ex) << std::endl;
179 
180  yap::Packet loginErrorPacket;
181  loginErrorPacket.CreateFromType (
183 
184  SendPacket (loginErrorPacket);
185  }
186  }
187 
189  {
190  yap::String login (packet.ReadString ());
191  yap::String password (packet.ReadString ());
192  yap::String email (packet.ReadString ());
193 
194  try
195  {
196  if (user_.Register (login, password, email, socket_.GetRemoteAddress ()))
197  {
198  yap::Packet registrationValidationPacket;
199  registrationValidationPacket.CreateFromType (
201  SendPacket (registrationValidationPacket);
202 
203  yap::Packet primaryDataPacket;
204  primaryDataPacket.CreateFromType (
206 
208  primaryDataPacket,
210 
211  SendPacket (primaryDataPacket);
212 
214  "New account created: `" + login + "'.");
215  }
216  else
217  {
218  yap::Packet registrationErrorPacket;
219  registrationErrorPacket.CreateFromType (
221 
222  SendPacket (registrationErrorPacket);
223  }
224  }
225  catch (const yap::Exception& e)
226  {
227  e.GetMessage (std::cerr);
228 
229  yap::Packet registrationErrorPacket;
230  registrationErrorPacket.CreateFromType (
232 
233  SendPacket (registrationErrorPacket);
234  }
235  catch (boost::exception& ex)
236  {
237  std::cout << boost::diagnostic_information (ex) << std::endl;
238 
239  yap::Packet registrationErrorPacket;
240  registrationErrorPacket.CreateFromType (
242 
243  SendPacket (registrationErrorPacket);
244  }
245  }
246 
248  {
249  // Copy some data to prepare update of the database
250  yap::Vector2 currentPosition = user_.GetPlayer ().GetPosition ();
251  user_.GetAccount ().GetPlayerData ().SetPosition (currentPosition);
252 
253  yap::ID mapID = user_.GetMap ().GetID ();
254  user_.GetAccount ().GetPlayerData ().SetMapID (mapID);
255 
256  // Save the player data in the database
258 
260  user_.GetLogin () +
261  "'s player data have been save.");
262 
264  "Client disconnected: `" +
265  user_.GetLogin () +
266  "'.");
267 
268  Disconnect ();
269  }
270 
272  yap::IPacket& packet,
273  const yap::ObjectFactory& objectFactory)
274  {
275  const auto& types = objectFactory.GetTypes ();
276 
277  packet.Write (static_cast<yap::UInt64> (types.Count ()));
278 
279  for (const auto& it : types)
280  {
281  packet.Write (it.first);
282  packet.Write (it.second);
283  }
284  }
285 } // namespace yse