sword_game/include/Client.h

59 lines
1.3 KiB
C++

#pragma once
#include "Packet.h"
#include <boost/asio.hpp>
#include <string>
using boost::asio::ip::tcp;
class BaseClient {
public:
BaseClient(boost::asio::io_context &io_context, const std::string &host,
const std::string &port);
virtual ~BaseClient() = default;
void SendPacket(PacketID id, const void *payload = nullptr,
size_t payloadSize = 0);
bool ReceiveHeader(PacketHeader &header);
template <typename T> bool ReceivePayload(T &payload) {
try {
boost::asio::read(socket_, boost::asio::buffer(&payload, sizeof(T)));
return true;
} catch (...) {
return false;
}
}
bool Login(const std::string &nickname);
virtual void Run() = 0;
protected:
tcp::socket socket_;
uint32_t currentLevel_ = 0;
uint64_t currentGold_ = 0;
std::string nickname_;
void HandleUpgradeResult();
void HandleSellResult();
};
class InteractiveClient : public BaseClient {
public:
using BaseClient::BaseClient;
void Run() override;
};
class ScenarioClient : public BaseClient {
public:
ScenarioClient(boost::asio::io_context &io_context, const std::string &host,
const std::string &port, const std::string &scenarioFile)
: BaseClient(io_context, host, port), scenarioFile_(scenarioFile) {}
void Run() override;
private:
std::string scenarioFile_;
};