#pragma once #include "websocket_server_connection.h" #include "../json/json.h" #include #include #include namespace EQ { namespace Net { enum WebsocketSubscriptionEvent : int { SubscriptionEventNone, SubscriptionEventLog, SubscriptionEventMax }; struct WebsocketLoginStatus { bool logged_in; std::string account_name; uint32 account_id; int status; }; class WebsocketException : public std::exception { public: WebsocketException(const std::string &msg) : _msg(msg.empty() ? "Unknown Error" : msg) { } ~WebsocketException() throw() {} virtual char const *what() const throw() { return _msg.c_str(); } private: const std::string _msg; }; class WebsocketServer { public: typedef std::function MethodHandler; typedef std::function LoginHandler; WebsocketServer(const std::string &addr, int port); ~WebsocketServer(); void SetMethodHandler(const std::string& method, MethodHandler handler, int required_status); void SetLoginHandler(LoginHandler handler); void DispatchEvent(WebsocketSubscriptionEvent evt, Json::Value data = Json::Value(), int required_status = 0); private: void ReleaseConnection(WebsocketServerConnection *connection); Json::Value HandleRequest(WebsocketServerConnection *connection, const std::string& method, const Json::Value ¶ms); Json::Value Login(WebsocketServerConnection *connection, const Json::Value ¶ms); Json::Value Subscribe(WebsocketServerConnection *connection, const Json::Value ¶ms); Json::Value Unsubscribe(WebsocketServerConnection *connection, const Json::Value ¶ms); void DoSubscribe(WebsocketServerConnection *connection, WebsocketSubscriptionEvent sub); void DoUnsubscribe(WebsocketServerConnection *connection, WebsocketSubscriptionEvent sub); bool IsSubscribed(WebsocketServerConnection *connection, WebsocketSubscriptionEvent sub); void UnsubscribeAll(WebsocketServerConnection *connection); struct Impl; std::unique_ptr _impl; friend class WebsocketServerConnection; }; } }