This commit is contained in:
Aaron Kimbre 2025-02-20 14:44:54 -06:00
parent 72d1b434ed
commit 5ad0b3e74a
4 changed files with 144 additions and 128 deletions

View File

@ -134,9 +134,6 @@ namespace ChatWeb {
});
// WebSocket subscriptions
Game::web.RegisterWSSubscription("chat_local");
Game::web.RegisterWSSubscription("chat_team");
Game::web.RegisterWSSubscription("chat_private");
Game::web.RegisterWSSubscription("chat");
Game::web.RegisterWSSubscription("player");
Game::web.RegisterWSSubscription("team");
@ -156,24 +153,20 @@ namespace ChatWeb {
data["channel"] = magic_enum::enum_name(chatMessage.channel);
std::string event = "chat"; // generic catch all
switch (chatMessage.channel) {
case eChatChannel::LOCAL:
event = "chat_local";
break;
case eChatChannel::TEAM:
event = "chat_team";
data["teamID"] = chatMessage.teamID;
break;
case eChatChannel::PRIVATE_CHAT:
data["receiver"] = chatMessage.receiver;
event = "chat_private";
break;
default:
LOG_DEBUG("Unhandled Chat channel [%s] in websocket send", StringifiedEnum::ToString(chatMessage.channel).data());
// do nothing
break;
}
Game::web.SendWSMessage(event, data);
Game::web.SendWSMessage("chat", data);
}
}

View File

@ -11,53 +11,46 @@
#include "dServer.h"
#include "eConnectionType.h"
#include "MessageType/Chat.h"
void ShowAllRequest::Serialize(RakNet::BitStream& bitStream) {
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::SHOW_ALL);
namespace ChatPackets {
void ShowAllRequest::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write(this->requestor);
bitStream.Write(this->displayZoneData);
bitStream.Write(this->displayIndividualPlayers);
}
}
void ShowAllRequest::Deserialize(RakNet::BitStream& inStream) {
inStream.Read(this->requestor);
inStream.Read(this->displayZoneData);
inStream.Read(this->displayIndividualPlayers);
}
bool ShowAllRequest::Deserialize(RakNet::BitStream& inStream) {
VALIDATE_READ(inStream.Read(this->requestor));
VALIDATE_READ(inStream.Read(this->displayZoneData));
VALIDATE_READ(inStream.Read(this->displayIndividualPlayers));
return true;
}
void FindPlayerRequest::Serialize(RakNet::BitStream& bitStream) {
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::WHO);
void FindPlayerRequest::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write(this->requestor);
bitStream.Write(this->playerName);
}
}
void FindPlayerRequest::Deserialize(RakNet::BitStream& inStream) {
inStream.Read(this->requestor);
inStream.Read(this->playerName);
}
bool FindPlayerRequest::Deserialize(RakNet::BitStream& inStream) {
VALIDATE_READ(inStream.Read(this->requestor));
VALIDATE_READ(inStream.Read(this->playerName));
return true;
}
void ChatPackets::SendChatMessage(const SystemAddress& sysAddr, char chatChannel, const std::string& senderName, LWOOBJID playerObjectID, bool senderMythran, const std::u16string& message) {
CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GENERAL_CHAT_MESSAGE);
bitStream.Write<uint64_t>(0);
void ChatMessage::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write<uint64_t>(0);// senderID
bitStream.Write(chatChannel);
bitStream.Write<uint32_t>(message.size());
bitStream.Write<uint32_t>(message.GetAsString().size());
bitStream.Write(LUWString(senderName));
bitStream.Write(playerObjectID);
bitStream.Write<uint16_t>(0);
bitStream.Write<char>(0);
bitStream.Write(playerObjectID); // senderID
bitStream.Write<uint16_t>(0); // sourceID
bitStream.Write(responseCode);
bitStream.Write(message)
for (uint32_t i = 0; i < message.size(); ++i) {
bitStream.Write<uint16_t>(message[i]);
}
bitStream.Write<uint16_t>(0);
SEND_PACKET_BROADCAST;
}
void ChatPackets::SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) {
void SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) {
CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GENERAL_CHAT_MESSAGE);
@ -84,25 +77,16 @@ void ChatPackets::SendSystemMessage(const SystemAddress& sysAddr, const std::u16
}
SEND_PACKET_BROADCAST;
}
}
void ChatPackets::SendMessageFail(const SystemAddress& sysAddr) {
//0x00 - "Chat is currently disabled."
//0x01 - "Upgrade to a full LEGO Universe Membership to chat with other players."
void MessageFailure::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write(this->cannedText);
}
CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, MessageType::Client::SEND_CANNED_TEXT);
bitStream.Write<uint8_t>(0); //response type, options above ^
//docs say there's a wstring here-- no idea what it's for, or if it's even needed so leaving it as is for now.
SEND_PACKET;
}
void ChatPackets::Announcement::Send() {
CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GM_ANNOUNCE);
void Announcement::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write<uint32_t>(title.size());
bitStream.Write(title);
bitStream.Write<uint32_t>(message.size());
bitStream.Write(message);
SEND_PACKET_BROADCAST;
}
}

View File

@ -10,33 +10,60 @@ struct SystemAddress;
#include <string>
#include "dCommonVars.h"
#include "BitStreamUtils.h"
struct ShowAllRequest{
LWOOBJID requestor = LWOOBJID_EMPTY;
bool displayZoneData = true;
bool displayIndividualPlayers = true;
void Serialize(RakNet::BitStream& bitStream);
void Deserialize(RakNet::BitStream& inStream);
};
struct FindPlayerRequest{
LWOOBJID requestor = LWOOBJID_EMPTY;
LUWString playerName;
void Serialize(RakNet::BitStream& bitStream);
void Deserialize(RakNet::BitStream& inStream);
enum class eCannedText : uint8_t {
CHAT_DISABLED = 0,
F2P_CHAT_DISABLED = 1
};
namespace ChatPackets {
struct ShowAllRequest : public LUBitStream {
LWOOBJID requestor = LWOOBJID_EMPTY;
bool displayZoneData = true;
bool displayIndividualPlayers = true;
struct Announcement {
std::string title;
std::string message;
void Send();
ShowAllRequest() : LUBitStream(eConnectionType::CHAT, MessageType::Chat::WHO) {};
virtual void Serialize(RakNet::BitStream& bitStream) const override;
virtual bool Deserialize(RakNet::BitStream& inStream) override;
};
void SendChatMessage(const SystemAddress& sysAddr, char chatChannel, const std::string& senderName, LWOOBJID playerObjectID, bool senderMythran, const std::u16string& message);
void SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, bool broadcast = false);
void SendMessageFail(const SystemAddress& sysAddr);
struct FindPlayerRequest : public LUBitStream {
LWOOBJID requestor = LWOOBJID_EMPTY;
LUWString playerName;
FindPlayerRequest() : LUBitStream(eConnectionType::CHAT, MessageType::Chat::WHO) {};
virtual void Serialize(RakNet::BitStream& bitStream) const override;
virtual bool Deserialize(RakNet::BitStream& inStream) override;
};
struct Announcement : public LUBitStream {
std::string title;
std::string message;
Announcement() : LUBitStream(eConnectionType::CHAT, MessageType::Chat::GM_ANNOUNCE) {};
virtual void Serialize(RakNet::BitStream& bitStream) const override;
};
struct ChatMessage : public LUBitStream {
char chatChannel;
std::string senderName;
LWOOBJID playerObjectID;
bool senderMythran;
eChatMessageResponseCode responseCode = eChatMessageResponseCode::SENT;
LUWString message;
virtual void Serialize(RakNet::BitStream& bitStream) const override;
virtual bool Deserialize(RakNet::BitStream& inStream) override;
};
// Should be in client packets since it is a client connection type, but whatever
struct MessageFailure : public LUBitStream {
eCannedText cannedText = eCannedText::CHAT_DISABLED;
MessageFailure() : LUBitStream(eConnectionType::CLIENT, MessageType::Chat::SEND_CANNED_TEXT) {};
virtual void Serialize(RakNet::BitStream& bitStream) const override;
};
};
#endif // CHATPACKETS_H

View File

@ -169,6 +169,17 @@ void HandleMessages(mg_connection* connection, int message, void* message_data)
}
}
// Redirect logs to our logger
static void DLOG(char ch, void *param) {
static char buf[256];
static size_t len;
if (ch != '\n') buf[len++] = ch; // we provide the newline in our logger
if (ch == '\n' || len >= sizeof(buf)) {
LOG_DEBUG("%.*s", static_cast<int>(len), buf);
len = 0;
}
}
void Web::RegisterHTTPRoute(HTTPRoute route) {
if (!Game::web.enabled) {
LOG_DEBUG("Failed to register HTTP route %s: web server not enabled", route.path.c_str());
@ -214,7 +225,8 @@ void Web::RegisterWSSubscription(const std::string& subscription) {
}
Web::Web() {
mg_log_set(MG_LL_NONE);
mg_log_set_fn(DLOG, NULL); // Redirect logs to our logger
mg_log_set(MG_LL_DEBUG);
mg_mgr_init(&mgr); // Initialize event manager
}