From 2ee0f834487cfe4b6bd9424ca2715685a8db16e4 Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Sat, 15 Apr 2017 15:17:53 +0500 Subject: 2017-04-15 --- NetworkClient.cpp | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 NetworkClient.cpp (limited to 'NetworkClient.cpp') diff --git a/NetworkClient.cpp b/NetworkClient.cpp new file mode 100644 index 0000000..e8ba7ca --- /dev/null +++ b/NetworkClient.cpp @@ -0,0 +1,91 @@ +#include "NetworkClient.hpp" +#include "PacketParser.hpp" +#include "PacketBuilder.hpp" +#include "json.h" +#include + +ServerInfo NetworkClient::ServerPing(std::string address, unsigned short port) { + ServerInfo info; + Network network(address, port); + Packet packet_handshake = PacketBuilder::CHandshaking0x00(316, address, port, 1); + network.SendPacket(packet_handshake); + Packet packet_request(0); + network.SendPacket(packet_request); + Packet packet_response = network.ReceivePacket(); + PacketParser::Parse(packet_response, Login); + //std::string json = static_cast(packet_response_parsed.GetFieldById(0))->GetValue(); + std::string json = packet_response.GetField(0).GetString(); + try { + nlohmann::json j = nlohmann::json::parse(json); + info.protocol = j["version"]["protocol"].get(); + info.version = j["version"]["name"].get(); + info.players_max = j["players"]["max"].get(); + info.players_online = j["players"]["online"].get(); + info.description = j["description"]["text"].get(); + for (auto t:j["description"]["extra"]) { + info.description += t["text"].get(); + } + if (!j["favicon"].is_null()) + info.favicon = j["favicon"].get(); + info.json = json; + for (auto t:j["players"]["sample"]) { + std::pair player; + player.first = t["id"].get(); + player.second = t["name"].get(); + info.players.push_back(player); + } + } catch (const nlohmann::detail::exception e) { + std::cerr << "Parsed json is not valid (" << e.id << "): " << e.what() << std::endl; + } + //Ping + Packet packet_ping(0x01); + Field payload; + payload.SetLong(771235); + packet_ping.AddField(payload); + std::chrono::high_resolution_clock clock; + auto t1 = clock.now(); + network.SendPacket(packet_ping); + Packet pong = network.ReceivePacket(); + auto t2 = clock.now(); + pong.ParseField(Long); + if (pong.GetField(0).GetLong() == 771235) { + std::chrono::duration pingTime = t2 - t1; + info.ping = pingTime.count(); + } + return info; +} + +NetworkClient::NetworkClient(std::string address, unsigned short port, std::string username) : m_network(address, port) { + m_network.SendHandshake(username); +} + +NetworkClient::~NetworkClient() { + +} + +Packet NetworkClient::GetPacket() { + if (m_received.size()<1) + return Packet(-1); + Packet packet = m_received.front(); + m_received.pop(); + return packet; +} + +void NetworkClient::AddPacketToQueue(Packet packet) { + m_toSend.push(packet); +} + +void NetworkClient::Update() { + if (m_toSend.size()>0){ + m_network.SendPacket(m_toSend.front()); + m_toSend.pop(); + } + Packet received = m_network.ReceivePacket(); + if (received.GetId()==0x1F){ + PacketParser::Parse(received); + Packet response = PacketBuilder::CPlay0x0B(received.GetField(0).GetVarInt()); + m_network.SendPacket(response); + return; + } + m_received.push(received); +} -- cgit v1.2.3