#pragma once #include "Domain/Serializers/IncomingMessageFactoryInterface.h" #include "../ThirdParty/json.hpp" #include "Domain/ValueObjects/Vector3.h" using namespace L2Bot::Domain; using json = nlohmann::json; class JsonIncomingMessageFactory : public Serializers::IncomingMessageFactoryInterface { public: JsonIncomingMessageFactory() = default; virtual ~JsonIncomingMessageFactory() = default; const Serializers::IncomingMessage CreateMessage(std::wstring data) const override { try { auto jsonObject = json::parse(data); const auto type = jsonObject["Type"].get(); return CreateConcreteMessage(type, jsonObject["Content"]); } catch (json::exception& e) { return Serializers::IncomingMessage(); } } private: const Serializers::IncomingMessage CreateConcreteMessage(const std::string& type, const json& jsonObject) const { if (type == "Invalidate") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::invalidate }; } else if (type == "Move") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::move, std::make_shared( jsonObject["X"].get(), jsonObject["Y"].get(), jsonObject["Z"].get() ) }; } else if (type == "AcquireTarget") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::acquireTarget, std::make_shared(jsonObject.get()) }; } else if (type == "Attack") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::attack, std::make_shared(jsonObject.get()) }; } else if (type == "Pickup") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::pickup, std::make_shared(jsonObject.get()) }; } else if (type == "UseSkill") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::useSkill, std::make_shared(jsonObject.get()) }; } else if (type == "UseItem") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::useItem, std::make_shared(jsonObject.get()) }; } else if (type == "ToggleSoulshot") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::toggleSoulshot, std::make_shared(jsonObject.get()) }; } else if (type == "Sit") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::sit }; } else if (type == "Stand") { return Serializers::IncomingMessage { Serializers::IncomingMessage::Type::stand }; } return Serializers::IncomingMessage(); } };