mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-14 15:41:30 +00:00
* Start rewrite, add vcpkg * Simple vcpkg manifest, will almost certainly need tweaking * Remove cmake ext we wont be using anymore * Update vcpkg to no longer be from 2022, update cmake lists (wip) * Add finds to the toplevel cmakelists * WIP, luabind and perlbind build. Common only partially builds. * Fix common build. * shared_memory compiles * client files compile * Tests and more cmake version updates * World, had to swap out zlib-ng for now because it wasn't playing nicely along side the zlib install. May revisit. * UCS compiles now too! * queryserv and eqlaunch * loginserver works * Zone works but is messy, tomorrow futher cleanup! * Cleanup main file * remove old zlibng, remove perlwrap, remove hc * More cleanup * vcpkg baseline set for CI * Remove pkg-config, it's the suggested way to use luajit with vcpkg but it causes issues with CI and might be a pain point for windows users * Actually add file * Set perlbind include dir * Perl link got lost * PERL_SET_INTERP causes an issue on newer versions of perl on windows because a symbol is not properly exported in their API, change the lines so it's basically what it used to be * Remove static unix linking, we dont do automated released anymore and this was tightly coupled to that. Can explore this again if we decide to change that. * Remove unused submodules, set cmake policy for boost * Fix some cereal includes * Improve some boilerplate, I'd still like to do better about getting linker stuff set. * Going through and cleaning up the build. * Fix world, separate out data_buckets. * add fixes for other servers * fix zone * Fix client files, loginserver and tests * Newer versions of libmariadb default to tls forced on, return to the default of not forcing that. auto_login were breaking on linux builds loginserver wasn't setting proper openssl compile flag * Move set out of a giant cpp file include. * Convert show * convert find * Add uuid to unix builds * Remove some cpp includes. * Restructure to remove more things. * change db update manifest to header change build yml * Move world CLI include cpps to cmake. * Move zone cli out of source and into cmake * Sidecar stuff wont directly include cpp files now too. * Fix uuid-dev missing on linux runner * Reorg common cmake file * Some cleanup * Fix libsodium support (oops). Fix perl support (more oops) * Change doc --------- Co-authored-by: KimLS <KimLS@peqtgc.com>
155 lines
3.9 KiB
C++
155 lines
3.9 KiB
C++
#include "websocket_server_connection.h"
|
|
#include "websocket_server.h"
|
|
#include "../timer.h"
|
|
#include "../util/uuid.h"
|
|
#include <sstream>
|
|
#include <fmt/format.h>
|
|
#include <fmt/ranges.h>
|
|
|
|
struct EQ::Net::WebsocketServerConnection::Impl {
|
|
WebsocketServer *parent;
|
|
std::shared_ptr<TCPConnection> connection;
|
|
std::shared_ptr<websocket_connection> ws_connection;
|
|
std::string id;
|
|
bool authorized;
|
|
std::string account_name;
|
|
uint32 account_id;
|
|
int status;
|
|
};
|
|
|
|
EQ::Net::WebsocketServerConnection::WebsocketServerConnection(WebsocketServer *parent,
|
|
std::shared_ptr<TCPConnection> connection,
|
|
std::shared_ptr<websocket_connection> ws_connection)
|
|
{
|
|
_impl = std::make_unique<Impl>();
|
|
_impl->parent = parent;
|
|
_impl->connection = connection;
|
|
_impl->id = EQ::Util::UUID::Generate().ToString();
|
|
_impl->authorized = false;
|
|
_impl->account_id = 0;
|
|
_impl->status = 0;
|
|
_impl->ws_connection = ws_connection;
|
|
_impl->ws_connection->set_message_handler(std::bind(&WebsocketServerConnection::OnMessage, this, std::placeholders::_1, std::placeholders::_2));
|
|
_impl->ws_connection->start();
|
|
|
|
connection->OnDisconnect([this](EQ::Net::TCPConnection *connection) {
|
|
_impl->parent->ReleaseConnection(this);
|
|
});
|
|
|
|
connection->OnRead([this](EQ::Net::TCPConnection *c, const unsigned char *buffer, size_t buffer_size) {
|
|
_impl->ws_connection->read_all((const char*)buffer, buffer_size);
|
|
});
|
|
|
|
connection->Start();
|
|
}
|
|
|
|
EQ::Net::WebsocketServerConnection::~WebsocketServerConnection()
|
|
{
|
|
}
|
|
|
|
std::string EQ::Net::WebsocketServerConnection::GetID() const
|
|
{
|
|
return _impl->id;
|
|
}
|
|
|
|
bool EQ::Net::WebsocketServerConnection::IsAuthorized() const
|
|
{
|
|
return _impl->authorized;
|
|
}
|
|
|
|
std::string EQ::Net::WebsocketServerConnection::GetAccountName() const
|
|
{
|
|
return _impl->account_name;
|
|
}
|
|
|
|
uint32 EQ::Net::WebsocketServerConnection::GetAccountID() const
|
|
{
|
|
return _impl->account_id;
|
|
}
|
|
|
|
int EQ::Net::WebsocketServerConnection::GetStatus() const
|
|
{
|
|
return _impl->status;
|
|
}
|
|
|
|
std::string EQ::Net::WebsocketServerConnection::RemoteIP() const
|
|
{
|
|
return _impl->connection->RemoteIP();
|
|
}
|
|
|
|
int EQ::Net::WebsocketServerConnection::RemotePort() const
|
|
{
|
|
return _impl->connection->RemotePort();
|
|
}
|
|
|
|
std::shared_ptr<EQ::Net::websocket_connection> EQ::Net::WebsocketServerConnection::GetWebsocketConnection()
|
|
{
|
|
return _impl->ws_connection;
|
|
}
|
|
|
|
std::shared_ptr<EQ::Net::TCPConnection> EQ::Net::WebsocketServerConnection::GetTCPConnection()
|
|
{
|
|
return _impl->connection;
|
|
}
|
|
|
|
void EQ::Net::WebsocketServerConnection::OnMessage(websocketpp::connection_hdl hdl, websocket_message_ptr msg)
|
|
{
|
|
BenchTimer timer;
|
|
timer.reset();
|
|
|
|
if (msg->get_opcode() == websocketpp::frame::opcode::text) {
|
|
try {
|
|
auto &payload = msg->get_payload();
|
|
|
|
std::stringstream ss(payload);
|
|
Json::Value root;
|
|
|
|
ss >> root;
|
|
|
|
auto method = root["method"].asString();
|
|
auto params = root["params"];
|
|
std::string id = "";
|
|
|
|
auto idNode = root["id"];
|
|
if (!idNode.isNull() && idNode.isString()) {
|
|
id = idNode.asString();
|
|
}
|
|
|
|
Json::Value response;
|
|
response["type"] = "method";
|
|
response["data"] = _impl->parent->HandleRequest(this, method, params);
|
|
response["method"] = method;
|
|
if(id != "") {
|
|
response["id"] = id;
|
|
}
|
|
|
|
SendResponse(response, timer.elapsed());
|
|
}
|
|
catch (std::exception &ex) {
|
|
Json::Value error;
|
|
error["type"] = "method";
|
|
error["error"] = fmt::format("{0}", ex.what());
|
|
SendResponse(error, timer.elapsed());
|
|
}
|
|
}
|
|
}
|
|
|
|
void EQ::Net::WebsocketServerConnection::SendResponse(const Json::Value &response, double time_elapsed)
|
|
{
|
|
Json::Value root = response;
|
|
root["execution_time"] = std::to_string(time_elapsed);
|
|
|
|
std::stringstream payload;
|
|
payload << root;
|
|
|
|
_impl->ws_connection->send(payload.str());
|
|
}
|
|
|
|
void EQ::Net::WebsocketServerConnection::SetAuthorized(bool v, const std::string account_name, uint32 account_id, int status)
|
|
{
|
|
_impl->authorized = v;
|
|
_impl->account_name = account_name;
|
|
_impl->account_id = account_id;
|
|
_impl->status = status;
|
|
}
|