11 #include <gpcm/client.h>
15 #include <atomizes.hpp>
16 #include <service/file_system.h>
18 #include <webserver/client.h>
21 const Util::Url::Variables& url_variables)
28 auto it = url_variables.find(
"pid");
29 if (it != url_variables.end())
31 player.SetProfileId(it->second);
41 response += std::to_string(player.GetScore()) +
",";
42 response += std::to_string(player.GetRank()) +
",";
43 response += std::to_string(player.GetPPH()) +
",";
44 response += std::to_string(player.GetKills()) +
",";
45 response += std::to_string(player.GetSuicides()) +
",";
46 response += std::to_string(player.GetTime()) +
",";
47 response += std::to_string(player.GetLAVsDestroyed()) +
",";
48 response += std::to_string(player.GetMAVsDestroyed()) +
",";
49 response += std::to_string(player.GetHAVsDestroyed()) +
",";
50 response += std::to_string(player.GetHelicoptersDestroyed()) +
",";
51 response += std::to_string(player.GetPlanesDestroyed()) +
",";
52 response += std::to_string(player.GetBoatsDestroyed()) +
",";
53 response += std::to_string(player.GetKillsAssualtKit()) +
",";
54 response += std::to_string(player.GetSpawnsAssualtKit()) +
",";
55 response += std::to_string(player.GetKillsSniperKit()) +
",";
56 response += std::to_string(player.GetSpawnsSniperKit()) +
",";
57 response += std::to_string(player.GetKillsSpecialOpKit()) +
",";
58 response += std::to_string(player.GetSpawnsSpecialOpKit()) +
",";
59 response += std::to_string(player.GetKillsCombatEngineerKit()) +
",";
60 response += std::to_string(player.GetSpawnsCombatEngineerKit()) +
",";
61 response += std::to_string(player.GetKillsSupportKit()) +
",";
62 response += std::to_string(player.GetSpawnsSupportKit()) +
",";
63 response += std::to_string(player.GetTeamKills()) +
",";
64 response += std::to_string(player.GetMedals()) +
",";
65 response += std::to_string(player.GetTotalTopPlayer()) +
",";
66 response += std::to_string(player.GetTotalVictories()) +
",";
67 response += std::to_string(player.GetTotalGameSessions());
69 http_response.SetStatusCode(200);
70 http_response.SetMessageBody(response);
72 this->
Send(http_response);
79 const Util::Url::Variables& url_variables)
81 atomizes::HTTPMessage http_response = this->_defaultResponseHeader();
82 Battlefield::RankPlayers rank_players;
83 std::string data =
"";
84 std::vector<int> profileids;
85 int self_profileid = -1;
87 auto it = url_variables.find(
"pid");
88 if (it != url_variables.end())
90 profileids = Util::convertProfileIdToVector(it->second);
92 if(profileids.size() >= 1)
94 self_profileid = profileids[0];
98 it = url_variables.find(
"sort");
99 if (it != url_variables.end())
101 std::string sort = it->second;
105 if(profileids.size() == 0)
109 else if(profileids.size() == 1)
118 for (
const auto& pair : rank_players)
120 if(self_profileid == pair.second.GetProfileId())
125 data += std::to_string(pair.first) +
",";
126 data += pair.second.GetUniquenick() +
",";
127 data += std::to_string(pair.second.GetRank()) +
",";
128 data += std::to_string(pair.second.GetPPH()) +
",";
129 data += std::to_string(pair.second.GetScore()) +
"\n";
132 else if(sort ==
"score")
134 if(profileids.size() == 0)
138 else if(profileids.size() == 1)
147 for (
const auto& pair : rank_players)
149 if(self_profileid == pair.second.GetProfileId())
154 data += std::to_string(pair.first) +
",";
155 data += pair.second.GetUniquenick() +
",";
156 data += std::to_string(pair.second.GetScore()) +
"\n";
159 else if(sort ==
"pph")
161 if(profileids.size() == 0)
165 else if(profileids.size() == 1)
174 for (
const auto& pair : rank_players)
176 if(self_profileid == pair.second.GetProfileId())
181 data += std::to_string(pair.first) +
",";
182 data += pair.second.GetUniquenick() +
",";
183 data += std::to_string(pair.second.GetPPH()) +
"\n";
186 else if(sort ==
"kills")
188 auto it2 = url_variables.find(
"k_filter");
189 if (it2 != url_variables.end())
191 std::string k_filter = it2->second;
193 if(k_filter ==
"assault")
195 if(profileids.size() == 0)
199 else if(profileids.size() == 1)
208 for (
const auto& pair : rank_players)
210 if(self_profileid == pair.second.GetProfileId())
215 data += std::to_string(pair.first) +
",";
216 data += pair.second.GetUniquenick() +
",";
217 data += std::to_string(pair.second.GetKillsAssualtKit()) +
"\n";
220 else if(k_filter ==
"sniper")
222 if(profileids.size() == 0)
226 else if(profileids.size() == 1)
235 for (
const auto& pair : rank_players)
237 if(self_profileid == pair.second.GetProfileId())
242 data += std::to_string(pair.first) +
",";
243 data += pair.second.GetUniquenick() +
",";
244 data += std::to_string(pair.second.GetKillsSniperKit()) +
"\n";
247 else if(k_filter ==
"specialops")
249 if(profileids.size() == 0)
253 else if(profileids.size() == 1)
262 for (
const auto& pair : rank_players)
264 if(self_profileid == pair.second.GetProfileId())
269 data += std::to_string(pair.first) +
",";
270 data += pair.second.GetUniquenick() +
",";
271 data += std::to_string(pair.second.GetKillsSpecialOpKit()) +
"\n";
274 else if(k_filter ==
"engineer")
276 if(profileids.size() == 0)
280 else if(profileids.size() == 1)
289 for (
const auto& pair : rank_players)
291 if(self_profileid == pair.second.GetProfileId())
296 data += std::to_string(pair.first) +
",";
297 data += pair.second.GetUniquenick() +
",";
298 data += std::to_string(pair.second.GetKillsCombatEngineerKit()) +
"\n";
301 else if(k_filter ==
"support")
303 if(profileids.size() == 0)
307 else if(profileids.size() == 1)
316 for (
const auto& pair : rank_players)
318 if(self_profileid == pair.second.GetProfileId())
323 data += std::to_string(pair.first) +
",";
324 data += pair.second.GetUniquenick() +
",";
325 data += std::to_string(pair.second.GetKillsSupportKit()) +
"\n";
331 if(profileids.size() == 0)
335 else if(profileids.size() == 1)
344 for (
const auto& pair : rank_players)
346 if(self_profileid == pair.second.GetProfileId())
351 data += std::to_string(pair.first) +
",";
352 data += pair.second.GetUniquenick() +
",";
353 data += std::to_string(pair.second.GetKills()) +
"\n";
357 else if(sort ==
"ratio")
359 auto it2 = url_variables.find(
"k_filter");
360 if (it2 != url_variables.end())
362 std::string k_filter = it2->second;
364 if(k_filter ==
"assault")
366 if(profileids.size() == 0)
370 else if(profileids.size() == 1)
379 for (
const auto& pair : rank_players)
381 if(self_profileid == pair.second.GetProfileId())
386 data += std::to_string(pair.first) +
",";
387 data += pair.second.GetUniquenick() +
",";
388 data += std::to_string(pair.second.GetRatioAssualtKit()) +
"\n";
391 else if(k_filter ==
"sniper")
393 if(profileids.size() == 0)
397 else if(profileids.size() == 1)
406 for (
const auto& pair : rank_players)
408 if(self_profileid == pair.second.GetProfileId())
413 data += std::to_string(pair.first) +
",";
414 data += pair.second.GetUniquenick() +
",";
415 data += std::to_string(pair.second.GetRatioSniperKit()) +
"\n";
418 else if(k_filter ==
"specialops")
420 if(profileids.size() == 0)
424 else if(profileids.size() == 1)
433 for (
const auto& pair : rank_players)
435 if(self_profileid == pair.second.GetProfileId())
440 data += std::to_string(pair.first) +
",";
441 data += pair.second.GetUniquenick() +
",";
442 data += std::to_string(pair.second.GetRatioSpecialOpKit()) +
"\n";
445 else if(k_filter ==
"engineer")
447 if(profileids.size() == 0)
451 else if(profileids.size() == 1)
460 for (
const auto& pair : rank_players)
462 if(self_profileid == pair.second.GetProfileId())
467 data += std::to_string(pair.first) +
",";
468 data += pair.second.GetUniquenick() +
",";
469 data += std::to_string(pair.second.GetRatioCombatEngineerKit()) +
"\n";
472 else if(k_filter ==
"support")
474 if(profileids.size() == 0)
478 else if(profileids.size() == 1)
487 for (
const auto& pair : rank_players)
489 if(self_profileid == pair.second.GetProfileId())
494 data += std::to_string(pair.first) +
",";
495 data += pair.second.GetUniquenick() +
",";
496 data += std::to_string(pair.second.GetRatioSupportKit()) +
"\n";
502 if(profileids.size() == 0)
506 else if(profileids.size() == 1)
515 for (
const auto& pair : rank_players)
517 if(self_profileid == pair.second.GetProfileId())
522 data += std::to_string(pair.first) +
",";
523 data += pair.second.GetUniquenick() +
",";
524 data += std::to_string(pair.second.GetRatio()) +
"\n";
528 else if(sort ==
"vehicles")
530 auto it2 = url_variables.find(
"v_filter");
531 if (it2 != url_variables.end())
533 std::string v_filter = it2->second;
535 if(v_filter ==
"light")
537 if(profileids.size() == 0)
541 else if(profileids.size() == 1)
550 for (
const auto& pair : rank_players)
552 if(self_profileid == pair.second.GetProfileId())
557 data += std::to_string(pair.first) +
",";
558 data += pair.second.GetUniquenick() +
",";
559 data += std::to_string(pair.second.GetLAVsDestroyed()) +
"\n";
562 else if(v_filter ==
"medium")
564 if(profileids.size() == 0)
568 else if(profileids.size() == 1)
577 for (
const auto& pair : rank_players)
579 if(self_profileid == pair.second.GetProfileId())
584 data += std::to_string(pair.first) +
",";
585 data += pair.second.GetUniquenick() +
",";
586 data += std::to_string(pair.second.GetMAVsDestroyed()) +
"\n";
589 else if(v_filter ==
"heavy")
591 if(profileids.size() == 0)
595 else if(profileids.size() == 1)
604 for (
const auto& pair : rank_players)
606 if(self_profileid == pair.second.GetProfileId())
611 data += std::to_string(pair.first) +
",";
612 data += pair.second.GetUniquenick() +
",";
613 data += std::to_string(pair.second.GetHAVsDestroyed()) +
"\n";
616 else if(v_filter ==
"helis")
618 if(profileids.size() == 0)
622 else if(profileids.size() == 1)
631 for (
const auto& pair : rank_players)
633 if(self_profileid == pair.second.GetProfileId())
638 data += std::to_string(pair.first) +
",";
639 data += pair.second.GetUniquenick() +
",";
640 data += std::to_string(pair.second.GetHelicoptersDestroyed()) +
"\n";
643 else if(v_filter ==
"boats")
645 if(profileids.size() == 0)
649 else if(profileids.size() == 1)
658 for (
const auto& pair : rank_players)
660 if(self_profileid == pair.second.GetProfileId())
665 data += std::to_string(pair.first) +
",";
666 data += pair.second.GetUniquenick() +
",";
667 data += std::to_string(pair.second.GetBoatsDestroyed()) +
"\n";
673 if(profileids.size() == 0)
677 else if(profileids.size() == 1)
686 for (
const auto& pair : rank_players)
688 if(self_profileid == pair.second.GetProfileId())
693 data += std::to_string(pair.first) +
",";
694 data += pair.second.GetUniquenick() +
",";
695 data += std::to_string(pair.second.GetVehiclesDestroyed()) +
"\n";
700 http_response.SetStatusCode(200);
701 http_response.SetMessageBody(data);
703 this->Send(http_response);
705 this->_LogTransaction(
"<--",
"HTTP/1.1 200 OK");
Represents a player with extended statistics.
bool queryLeaderboardRankByFriends(Battlefield::RankPlayers &rank_players, const std::vector< int > &friends)
Queries the leaderboard rank of players by their friends' profile IDs.
bool queryLeaderboardTypeByFriends(Battlefield::RankPlayers &rank_players, const std::string &type, const std::vector< int > &friends)
Queries the leaderboard rank of players by player stat type filtered by friends.
bool queryLeaderboardRatioByFriends(Battlefield::RankPlayers &rank_players, const std::vector< int > &friends, const std::string &k, const std::string &s)
Queries the leaderboard rank of players by kills-to-spawns ratio filtered by friends.
bool queryLeaderboardRankByProfileId(Battlefield::RankPlayers &rank_players, int profileid)
Queries the leaderboard rank of players by profile ID.
bool queryLeaderboardRatioByProfileid(Battlefield::RankPlayers &rank_players, int profileid, const std::string &k, const std::string &s)
Queries the leaderboard rank of players by kills-to-spawns ratio with a specified profile ID.
bool queryLeaderboardRatio(Battlefield::RankPlayers &rank_players, const std::string &k, const std::string &s, uint32_t limit=10, uint32_t offset=0)
Queries the leaderboard rank of players by kills-to-spawns ratio.
bool queryLeaderboardTypeByProfileid(Battlefield::RankPlayers &rank_players, const std::string &type, int profileid)
Queries the leaderboard rank of players by player stat type with a profile ID in the middle.
bool queryPlayerStatsByProfileId(Battlefield::Player &player)
Queries the statistics of a player by their profile ID.
bool queryLeaderboardRank(Battlefield::RankPlayers &rank_players, uint32_t limit=10, uint32_t offset=0)
Queries the leaderboard rank of players.
bool queryLeaderboardType(Battlefield::RankPlayers &rank_players, const std::string &type, uint32_t limit=10, uint32_t offset=0)
Queries the leaderboard rank of players by player stat type.
void requestStats(const atomizes::HTTPMessage &http_request, const std::string &url_base, const Util::Url::Variables &url_variables)
Handle a request for player statistics.
atomizes::HTTPMessage _defaultResponseHeader(bool isPlainText=true) const
Generate the default HTTP response header.
void Send(const atomizes::HTTPMessage &http_response) const
Send an HTTP response.
void _LogTransaction(const std::string &direction, const std::string &response) const
Log a transaction.
void requestGetPlayerInfo(const atomizes::HTTPMessage &http_request, const std::string &url_base, const Util::Url::Variables &url_variables)
Handle a request to get player information.