YouDunIt/modules/you_done_it/ydi_networking.h

95 lines
3 KiB
C++

#pragma once
#include <core/object/class_db.h>
#include <core/object/object.h>
#include <zmq.h>
#include <string>
#include <string_view>
#include <zmq.hpp>
#include <zmq_addon.hpp>
class NetworkData : Object {
GDCLASS(NetworkData, Object);
static void _bind_methods();
public:
enum MessageType {
MSG_NONE = 0u,
// connection management messages
MSG_CONNECT = 1u,
MSG_OK,
MSG_NOK,
MSG_HEART,
MSG_BEAT,
// gameplay messages
MSG_REVEAL,
// end of messages
MSG_INVALID
};
enum ClueID {
CLUE_FIRST,
CLUE_SECOND,
CLUE_MAX
};
enum ConnectionStatus {
CONNECTION_DISCONNECTED,
CONNECTION_CONNECTED,
CONNECTION_AUTHENTICATED
};
enum NOKReason {
NOK_UNAUTHENTICATED, //!< message sender is not known by recipient.
NOK_UNKNOWN_MSG, //!< message type is not valid now or ever for recipient.
NOK_OUT_OF_CONTEXT, //!< this means a received message type is not valid in the recipient's current state, but COULD otherwise be valid.
NOK_MALFORMED_ARGUMENTS, //!< message type is valid but arguments could not be interpreted.
NOK_INVALID_REASON //!< this means the value could not be parsed as a NOKReason, not that the reason is an invalid message. Use UNKNOWN_MSG for that.
};
};
namespace ydi {
int to_int(zmq::message_t const &msg, int failure = 0);
NetworkData::MessageType to_message_type(zmq::message_t const &msg);
NetworkData::NOKReason to_nok_reason(zmq::message_t const &msg);
NetworkData::ClueID to_clue_id(zmq::message_t const &msg);
void print_message_contents(zmq::multipart_t const &mpart);
void extend_multipart(zmq::multipart_t &mpart, NetworkData::MessageType type);
void extend_multipart(zmq::multipart_t &mpart, NetworkData::ClueID id);
void extend_multipart(zmq::multipart_t &mpart, std::string const &string);
void extend_multipart(zmq::multipart_t &mpart, std::string_view const &strv);
void extend_multipart(zmq::multipart_t &mpart, char const *cstr);
void extend_multipart(zmq::multipart_t &mpart, int const &arg);
void extend_multipart(zmq::multipart_t &mpart, zmq::multipart_t const &right);
void extend_multipart(zmq::multipart_t &mpart);
void extend_multipart(zmq::multipart_t &mpart, std::pair<zmq::multipart_t::iterator, zmq::multipart_t::iterator> range);
void extend_multipart(zmq::multipart_t &mpart, std::pair<zmq::multipart_t::const_iterator, zmq::multipart_t::const_iterator> range);
template <typename TArg>
void extend_multipart_r(zmq::multipart_t &mpart, TArg const &arg) {
extend_multipart(mpart, arg);
}
template <typename TArg, typename... TArgs>
void extend_multipart_r(zmq::multipart_t &mpart, TArg const &arg, TArgs const &...args) {
extend_multipart(mpart, arg);
extend_multipart_r(mpart, args...);
}
template <typename TArg>
zmq::multipart_t multipart(TArg const &arg) {
zmq::multipart_t mpart{};
extend_multipart(mpart, arg);
return mpart;
}
template <typename TArg, typename... TArgs>
zmq::multipart_t multipart(TArg const &arg, TArgs const &...args) {
zmq::multipart_t mpart{ multipart(arg) };
extend_multipart_r(mpart, args...);
return mpart;
}
} //namespace ydi