This commit is contained in:
Aaron Kimbre 2025-01-07 09:13:24 -06:00
parent 72ae55981b
commit d77a1a92bf
8 changed files with 508 additions and 18 deletions

View File

@ -4,6 +4,7 @@ set(DCHATSERVER_SOURCES
"PlayerContainer.cpp"
"ChatWebAPI.cpp"
"JSONUtils.cpp"
"CSRCommandHandler.cpp"
)
add_executable(ChatServer "ChatServer.cpp")

View File

@ -0,0 +1,353 @@
#include "CSRCommandHandler.h"
#include "eCSRCommand.h"
#include "eHTTPStatusCode.h"
#include "JSONUtils.h"
#include "magic_enum.hpp"
#include "json.hpp"
void CSRCommandHandler::HandleCSRCommand(HTTPReply& reply, const json& data) {
auto check = JSONUtils::CheckRequiredData(data, { "command" });
if (!check.empty()) {
reply.status = eHTTPStatusCode::BAD_REQUEST;
reply.message = check;
} else {
// get command from json
std::string command_string = data["command"];
// upper
std::transform(command_string.begin(), command_string.end(), command_string.begin(), ::toupper);
eCSRCommand command = magic_enum::enum_cast<eCSRCommand>(command_string).value_or(eCSRCommand::INVALID);
switch (command) {
case eCSRCommand::QUERY_SERVER_STATUS:
QueryServerStatus(reply, data);
break;
case eCSRCommand::QUERY_CHARACTER_LOCATION:
QueryCharacterLocation(reply, data);
break;
case eCSRCommand::QUERY_CHARACTER_ONLINE_STATUS:
QueryCharacterOnlineStatus(reply, data);
break;
case eCSRCommand::INVENTORY_ADD_ITEM:
InventoryAddItem(reply, data);
break;
case eCSRCommand::INVENTORY_DELETE_ITEM:
InventoryDeleteItem(reply, data);
break;
case eCSRCommand::MODERATE_MUTE_ACCOUNT:
ModerateMuteAccount(reply, data);
break;
case eCSRCommand::MODERATE_BAN_ACCOUNT:
ModerateBanAccount(reply, data);
break;
case eCSRCommand::MODERATE_EDUCATE_CHARACTER:
ModerateEducateCharacter(reply, data);
break;
case eCSRCommand::MODERATE_KICK_CHARACTER:
ModerateKickCharacter(reply, data);
break;
case eCSRCommand::MODERATE_WARN_CHARACTER:
ModerateWarnCharacter(reply, data);
break;
case eCSRCommand::MODERATE_RENAME_CHARACTER:
ModerateRenameCharacter(reply, data);
break;
case eCSRCommand::MODERATE_DELETE_CHARACTER_FRIEND:
ModerateDeleteCharacterFriend(reply, data);
break;
case eCSRCommand::MODERATE_KILL_CHARACTER:
ModerateKillCharacter(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_HEALTH:
UpdateCharacterHealth(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_ARMOR:
UpdateCharacterArmor(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_IMAGINATION:
UpdateCharacterImagination(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_MAX_HEALTH:
UpdateCharacterMaxHealth(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_MAX_ARMOR:
UpdateCharacterMaxArmor(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_MAX_IMAGINATION:
UpdateCharacterMaxImagination(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_CURRENCY:
UpdateCharacterCurrency(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_REPUTATION:
UpdateCharacterReputation(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_LEGO_SCORE:
UpdateCharacterLegoScore(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_EMOTES:
UpdateCharacterEmotes(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_ADD_ACHIEVEMENT:
UpdateCharacterAddAchievement(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_COMPLETE_ACHIEVEMENT:
UpdateCharacterCompleteAchievement(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_REMOVE_ACHIEVEMENT:
UpdateCharacterRemoveAchievement(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_POSITION_OFFLINE:
UpdateCharacterPositionOffline(reply, data);
break;
case eCSRCommand::UPDATE_CHARACTER_INV_SLOT_AMOUNT:
UpdateCharacterInvSlotAmount(reply, data);
break;
case eCSRCommand::UTILITY_SAVE_CHARACTER:
UtilitySaveCharacter(reply, data);
break;
case eCSRCommand::UTILITY_SEND_MAIL:
UtilitySendMail(reply, data);
break;
case eCSRCommand::UTILITY_GIVE_ITEM_TO_ALL_PLAYERS_ONLINE:
UtilityGiveItemToAllPlayersOnline(reply, data);
break;
case eCSRCommand::METRICS_CONFIGURE:
MetricsConfigure(reply, data);
break;
case eCSRCommand::DISABLE_ZONE:
DisableZone(reply, data);
break;
case eCSRCommand::INIT_DONATION_AMOUNT:
InitDonationAmount(reply, data);
break;
case eCSRCommand::KILL_SERVERS_COUNTDOWN:
KillServersCountdown(reply, data);
break;
case eCSRCommand::DISABLE_FAQ:
DisableFAQ(reply, data);
break;
case eCSRCommand::THROTTLEQUEUE:
ThrottleQueue(reply, data);
break;
case eCSRCommand::GATEGM_ACCESS:
GateGMAccess(reply, data);
break;
case eCSRCommand::RECONNECT_CRISP:
ReconnectCrisp(reply, data);
break;
case eCSRCommand::MODERATE_KICK_ACCOUNT:
ModerateKickAccount(reply, data);
break;
case eCSRCommand::TOGGLE_CRISP_SERVER:
ToggleCrispServer(reply, data);
break;
case eCSRCommand::QUICK_DRAIN_SERVER:
QuickDrainServer(reply, data);
break;
case eCSRCommand::QUICK_DRAIN_SERVER_RENEW:
QuickDrainServerRenew(reply, data);
break;
case eCSRCommand::REPLICATE_CHARACTER:
ReplicateCharacter(reply, data);
break;
case eCSRCommand::GET_SERVER_STATUS:
GetServerStatus(reply);
break;
case eCSRCommand::RELOAD_SERVER_INIS:
ReloadServerINIs(reply);
break;
case eCSRCommand::INVALID:
default:
reply.status = eHTTPStatusCode::BAD_REQUEST;
reply.message = "{\"error\":\"Invalid Command\"}";
break;
}
}
}
void CSRCommandHandler::QueryServerStatus(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::QueryCharacterLocation(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::QueryCharacterOnlineStatus(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::InventoryAddItem(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::InventoryDeleteItem(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateMuteAccount(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateBanAccount(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateEducateCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateKickCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateWarnCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateRenameCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateDeleteCharacterFriend(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateKillCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterHealth(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterArmor(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterImagination(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterMaxHealth(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterMaxArmor(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterMaxImagination(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterCurrency(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterReputation(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterLegoScore(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterEmotes(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterAddAchievement(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterCompleteAchievement(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterRemoveAchievement(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterPositionOffline(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UpdateCharacterInvSlotAmount(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UtilitySaveCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UtilitySendMail(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::UtilityGiveItemToAllPlayersOnline(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::MetricsConfigure(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::DisableZone(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::InitDonationAmount(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::KillServersCountdown(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::DisableFAQ(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ThrottleQueue(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::GateGMAccess(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ReconnectCrisp(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ModerateKickAccount(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ToggleCrispServer(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::QuickDrainServer(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::QuickDrainServerRenew(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ReplicateCharacter(HTTPReply& reply, const json& data) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::GetServerStatus(HTTPReply& reply) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}
void CSRCommandHandler::ReloadServerINIs(HTTPReply& reply) {
reply.status = eHTTPStatusCode::NOT_IMPLEMENTED;
reply.message = "{\"error\":\"Not Implemented\"}";
}

View File

@ -0,0 +1,62 @@
#ifndef __CSR_COMMAND_HANDLER__H__
#define __CSR_COMMAND_HANDLER__H__
#include <optional>
#include "json_fwd.hpp"
using json = nlohmann::json;
struct HTTPReply;
namespace CSRCommandHandler {
void HandleCSRCommand(HTTPReply& reply, const json& data);
void QueryServerStatus(HTTPReply& reply, const json& data);
void QueryCharacterLocation(HTTPReply& reply, const json& data);
void QueryCharacterOnlineStatus(HTTPReply& reply, const json& data);
void InventoryAddItem(HTTPReply& reply, const json& data);
void InventoryDeleteItem(HTTPReply& reply, const json& data);
void ModerateMuteAccount(HTTPReply& reply, const json& data);
void ModerateBanAccount(HTTPReply& reply, const json& data);
void ModerateEducateCharacter(HTTPReply& reply, const json& data);
void ModerateKickCharacter(HTTPReply& reply, const json& data);
void ModerateWarnCharacter(HTTPReply& reply, const json& data);
void ModerateRenameCharacter(HTTPReply& reply, const json& data);
void ModerateDeleteCharacterFriend(HTTPReply& reply, const json& data);
void ModerateKillCharacter(HTTPReply& reply, const json& data);
void UpdateCharacterHealth(HTTPReply& reply, const json& data);
void UpdateCharacterArmor(HTTPReply& reply, const json& data);
void UpdateCharacterImagination(HTTPReply& reply, const json& data);
void UpdateCharacterMaxHealth(HTTPReply& reply, const json& data);
void UpdateCharacterMaxArmor(HTTPReply& reply, const json& data);
void UpdateCharacterMaxImagination(HTTPReply& reply, const json& data);
void UpdateCharacterCurrency(HTTPReply& reply, const json& data);
void UpdateCharacterReputation(HTTPReply& reply, const json& data);
void UpdateCharacterLegoScore(HTTPReply& reply, const json& data);
void UpdateCharacterEmotes(HTTPReply& reply, const json& data);
void UpdateCharacterAddAchievement(HTTPReply& reply, const json& data);
void UpdateCharacterCompleteAchievement(HTTPReply& reply, const json& data);
void UpdateCharacterRemoveAchievement(HTTPReply& reply, const json& data);
void UpdateCharacterPositionOffline(HTTPReply& reply, const json& data);
void UpdateCharacterInvSlotAmount(HTTPReply& reply, const json& data);
void UtilitySaveCharacter(HTTPReply& reply, const json& data);
void UtilitySendMail(HTTPReply& reply, const json& data);
void UtilityGiveItemToAllPlayersOnline(HTTPReply& reply, const json& data);
void MetricsConfigure(HTTPReply& reply, const json& data);
void DisableZone(HTTPReply& reply, const json& data);
void InitDonationAmount(HTTPReply& reply, const json& data);
void KillServersCountdown(HTTPReply& reply, const json& data);
void DisableFAQ(HTTPReply& reply, const json& data);
void ThrottleQueue(HTTPReply& reply, const json& data);
void GateGMAccess(HTTPReply& reply, const json& data);
void ReconnectCrisp(HTTPReply& reply, const json& data);
void ModerateKickAccount(HTTPReply& reply, const json& data);
void ToggleCrispServer(HTTPReply& reply, const json& data);
void QuickDrainServer(HTTPReply& reply, const json& data);
void QuickDrainServerRenew(HTTPReply& reply, const json& data);
void ReplicateCharacter(HTTPReply& reply, const json& data);
void GetServerStatus(HTTPReply& reply);
void ReloadServerINIs(HTTPReply& reply);
};
#endif // !__CSR_COMMAND_HANDLER__H__

View File

@ -15,6 +15,8 @@
#include "magic_enum.hpp"
#include "ChatPackets.h"
#include "StringifiedEnum.h"
#include "eCSRCommand.h"
#include "CSRCommandHandler.h"
#ifdef DARKFLAME_PLATFORM_WIN32
#pragma push_macro("DELETE")
@ -31,20 +33,6 @@ namespace {
const char* json_content_type = "Content-Type: application/json\r\n";
}
struct HTTPReply {
eHTTPStatusCode status = eHTTPStatusCode::NOT_FOUND;
std::string message = "{\"error\":\"Not Found\"}";
};
bool CheckValidJSON(std::optional<json> data, HTTPReply& reply) {
if (!data) {
reply.status = eHTTPStatusCode::BAD_REQUEST;
reply.message = "{\"error\":\"Invalid JSON\"}";
return false;
}
return true;
}
void HandlePlayersRequest(HTTPReply& reply) {
const json data = Game::playerContainer;
reply.status = data.empty() ? eHTTPStatusCode::NO_CONTENT : eHTTPStatusCode::OK;
@ -78,7 +66,7 @@ void HandleGET(HTTPReply& reply, const ChatWebAPI::eRoute& route , const std::st
}
void HandleAnnounceRequest(HTTPReply& reply, const std::optional<json>& data) {
if (!CheckValidJSON(data, reply)) return;
if (!JSONUtils::Validate(data, reply)) return;
const auto& good_data = data.value();
auto check = JSONUtils::CheckRequiredData(good_data, { "title", "message" });
@ -97,13 +85,28 @@ void HandleAnnounceRequest(HTTPReply& reply, const std::optional<json>& data) {
}
}
void HandleCSRCommandRequest(HTTPReply& reply, const std::optional<json>& data) {
if (!JSONUtils::Validate(data, reply)) return;
const auto& good_data = data.value();
auto check = JSONUtils::CheckRequiredData(good_data, { "command" });
if (!check.empty()) {
reply.status = eHTTPStatusCode::BAD_REQUEST;
reply.message = check;
} else {
CSRCommandHandler::HandleCSRCommand(reply, good_data);
}
}
void HandlePOST(HTTPReply& reply, const ChatWebAPI::eRoute& route , const std::string& body) {
auto data = GeneralUtils::TryParse<json>(body);
switch (route) {
case ChatWebAPI::eRoute::ANNOUNCE:{
case ChatWebAPI::eRoute::ANNOUNCE:
HandleAnnounceRequest(reply, data.value());
break;
}
case ChatWebAPI::eRoute::CSR:
HandleCSRCommandRequest(reply, data.value());
break;
case ChatWebAPI::eRoute::INVALID:
default:
HandleInvalidRoute(reply);
@ -134,7 +137,6 @@ void HandleHTTPMessage(mg_connection* connection, const mg_http_message* http_ms
std::transform(uri.begin(), uri.end(), uri.begin(), ::toupper);
// convert uri string to route enum
ChatWebAPI::eRoute route = magic_enum::enum_cast<ChatWebAPI::eRoute>(uri).value_or(ChatWebAPI::eRoute::INVALID);
// convert body from cstring to std string
std::string body(http_msg->body.buf, http_msg->body.len);

View File

@ -17,6 +17,7 @@ public:
TEAMS,
// POST
ANNOUNCE,
CSR,
// INVALID
INVALID
};

View File

@ -1,6 +1,7 @@
#include "JSONUtils.h"
#include "json.hpp"
#include "eHTTPStatusCode.h"
using json = nlohmann::json;
@ -56,3 +57,12 @@ std::string JSONUtils::CheckRequiredData(const json& data, const std::vector<std
}
return check["error"].empty() ? "" : check.dump();
}
bool JSONUtils::Validate(const std::optional<json>& data, HTTPReply& reply) {
if (!data) {
reply.status = eHTTPStatusCode::BAD_REQUEST;
reply.message = "{\"error\":\"Invalid JSON\"}";
return false;
}
return true;
}

View File

@ -3,6 +3,12 @@
#include "json_fwd.hpp"
#include "PlayerContainer.h"
#include "eHTTPStatusCode.h"
struct HTTPReply {
eHTTPStatusCode status = eHTTPStatusCode::NOT_FOUND;
std::string message = "{\"error\":\"Not Found\"}";
};
void to_json(nlohmann::json& data, const PlayerData& playerData);
void to_json(nlohmann::json& data, const PlayerContainer& playerContainer);
@ -12,6 +18,7 @@ void to_json(nlohmann::json& data, const TeamData& teamData);
namespace JSONUtils {
// check required data for reqeust
std::string CheckRequiredData(const nlohmann::json& data, const std::vector<std::string>& requiredData);
bool Validate(const std::optional<nlohmann::json>& data, HTTPReply& reply);
}
#endif // __JSONUTILS_H__

View File

@ -0,0 +1,54 @@
#ifndef __ECSRCOMMAND__H__
#define __ECSRCOMMAND__H__
enum class eCSRCommand {
QUERY_SERVER_STATUS,
QUERY_CHARACTER_LOCATION,
QUERY_CHARACTER_ONLINE_STATUS,
INVENTORY_ADD_ITEM,
INVENTORY_DELETE_ITEM,
MODERATE_MUTE_ACCOUNT,
MODERATE_BAN_ACCOUNT,
MODERATE_EDUCATE_CHARACTER,
MODERATE_KICK_CHARACTER,
MODERATE_WARN_CHARACTER,
MODERATE_RENAME_CHARACTER,
MODERATE_DELETE_CHARACTER_FRIEND,
MODERATE_KILL_CHARACTER,
UPDATE_CHARACTER_HEALTH,
UPDATE_CHARACTER_ARMOR,
UPDATE_CHARACTER_IMAGINATION,
UPDATE_CHARACTER_MAX_HEALTH,
UPDATE_CHARACTER_MAX_ARMOR,
UPDATE_CHARACTER_MAX_IMAGINATION,
UPDATE_CHARACTER_CURRENCY,
UPDATE_CHARACTER_REPUTATION,
UPDATE_CHARACTER_LEGO_SCORE,
UPDATE_CHARACTER_EMOTES,
UPDATE_CHARACTER_ADD_ACHIEVEMENT,
UPDATE_CHARACTER_COMPLETE_ACHIEVEMENT,
UPDATE_CHARACTER_REMOVE_ACHIEVEMENT,
UPDATE_CHARACTER_POSITION_OFFLINE,
UPDATE_CHARACTER_INV_SLOT_AMOUNT,
UTILITY_SAVE_CHARACTER,
UTILITY_SEND_MAIL,
UTILITY_GIVE_ITEM_TO_ALL_PLAYERS_ONLINE,
METRICS_CONFIGURE,
DISABLE_ZONE,
INIT_DONATION_AMOUNT,
KILL_SERVERS_COUNTDOWN,
DISABLE_FAQ,
THROTTLEQUEUE,
GATEGM_ACCESS,
RECONNECT_CRISP,
MODERATE_KICK_ACCOUNT,
TOGGLE_CRISP_SERVER,
QUICK_DRAIN_SERVER,
QUICK_DRAIN_SERVER_RENEW,
REPLICATE_CHARACTER,
GET_SERVER_STATUS,
RELOAD_SERVER_INIS,
INVALID
};
#endif // !__ECSRCOMMAND__H__