diff --git a/dChatServer/ChatWeb.cpp b/dChatServer/ChatWeb.cpp index f432d632..7e1566b6 100644 --- a/dChatServer/ChatWeb.cpp +++ b/dChatServer/ChatWeb.cpp @@ -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()); - break; + case eChatChannel::LOCAL: + break; + case eChatChannel::TEAM: + data["teamID"] = chatMessage.teamID; + break; + case eChatChannel::PRIVATE_CHAT: + data["receiver"] = chatMessage.receiver; + break; + default: + // do nothing + break; } - Game::web.SendWSMessage(event, data); + Game::web.SendWSMessage("chat", data); } } diff --git a/dNet/ChatPackets.cpp b/dNet/ChatPackets.cpp index ce1a91c9..5d2026f8 100644 --- a/dNet/ChatPackets.cpp +++ b/dNet/ChatPackets.cpp @@ -11,98 +11,82 @@ #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); - 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); -} - -void FindPlayerRequest::Serialize(RakNet::BitStream& bitStream) { - BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::WHO); - bitStream.Write(this->requestor); - bitStream.Write(this->playerName); -} - -void FindPlayerRequest::Deserialize(RakNet::BitStream& inStream) { - inStream.Read(this->requestor); - inStream.Read(this->playerName); -} - -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(0); - bitStream.Write(chatChannel); - - bitStream.Write(message.size()); - bitStream.Write(LUWString(senderName)); - - bitStream.Write(playerObjectID); - bitStream.Write(0); - bitStream.Write(0); - - for (uint32_t i = 0; i < message.size(); ++i) { - bitStream.Write(message[i]); - } - bitStream.Write(0); - SEND_PACKET_BROADCAST; -} - -void ChatPackets::SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) { - CBITSTREAM; - BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GENERAL_CHAT_MESSAGE); - - bitStream.Write(0); - bitStream.Write(4); - - bitStream.Write(message.size()); - bitStream.Write(LUWString("", 33)); - - bitStream.Write(0); - bitStream.Write(0); - bitStream.Write(0); - - for (uint32_t i = 0; i < message.size(); ++i) { - bitStream.Write(message[i]); +namespace ChatPackets { + void ShowAllRequest::Serialize(RakNet::BitStream& bitStream) const { + bitStream.Write(this->requestor); + bitStream.Write(this->displayZoneData); + bitStream.Write(this->displayIndividualPlayers); } - bitStream.Write(0); - - //This is so Wincent's announcement works: - if (sysAddr != UNASSIGNED_SYSTEM_ADDRESS) { - SEND_PACKET; - return; + 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; } - SEND_PACKET_BROADCAST; -} + void FindPlayerRequest::Serialize(RakNet::BitStream& bitStream) const { + bitStream.Write(this->requestor); + bitStream.Write(this->playerName); + } -void ChatPackets::SendMessageFail(const SystemAddress& sysAddr) { - //0x00 - "Chat is currently disabled." - //0x01 - "Upgrade to a full LEGO Universe Membership to chat with other players." + bool FindPlayerRequest::Deserialize(RakNet::BitStream& inStream) { + VALIDATE_READ(inStream.Read(this->requestor)); + VALIDATE_READ(inStream.Read(this->playerName)); + return true; + } - CBITSTREAM; - BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, MessageType::Client::SEND_CANNED_TEXT); - bitStream.Write(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 ChatMessage::Serialize(RakNet::BitStream& bitStream) const { + bitStream.Write(0);// senderID + bitStream.Write(chatChannel); -void ChatPackets::Announcement::Send() { - CBITSTREAM; - BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GM_ANNOUNCE); - bitStream.Write(title.size()); - bitStream.Write(title); - bitStream.Write(message.size()); - bitStream.Write(message); - SEND_PACKET_BROADCAST; + bitStream.Write(message.GetAsString().size()); + bitStream.Write(LUWString(senderName)); + + bitStream.Write(playerObjectID); // senderID + bitStream.Write(0); // sourceID + bitStream.Write(responseCode); + bitStream.Write(message) + + } + + void SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) { + CBITSTREAM; + BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, MessageType::Chat::GENERAL_CHAT_MESSAGE); + + bitStream.Write(0); + bitStream.Write(4); + + bitStream.Write(message.size()); + bitStream.Write(LUWString("", 33)); + + bitStream.Write(0); + bitStream.Write(0); + bitStream.Write(0); + + for (uint32_t i = 0; i < message.size(); ++i) { + bitStream.Write(message[i]); + } + + bitStream.Write(0); + + //This is so Wincent's announcement works: + if (sysAddr != UNASSIGNED_SYSTEM_ADDRESS) { + SEND_PACKET; + return; + } + + SEND_PACKET_BROADCAST; + } + + void MessageFailure::Serialize(RakNet::BitStream& bitStream) const { + bitStream.Write(this->cannedText); + } + + void Announcement::Serialize(RakNet::BitStream& bitStream) const { + bitStream.Write(title.size()); + bitStream.Write(title); + bitStream.Write(message.size()); + bitStream.Write(message); + } } diff --git a/dNet/ChatPackets.h b/dNet/ChatPackets.h index 0f70c8e2..83cdd6ba 100644 --- a/dNet/ChatPackets.h +++ b/dNet/ChatPackets.h @@ -10,33 +10,60 @@ struct SystemAddress; #include #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 diff --git a/dWeb/Web.cpp b/dWeb/Web.cpp index 266ad7a6..0578b89f 100644 --- a/dWeb/Web.cpp +++ b/dWeb/Web.cpp @@ -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(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,8 +225,9 @@ void Web::RegisterWSSubscription(const std::string& subscription) { } Web::Web() { - mg_log_set(MG_LL_NONE); - mg_mgr_init(&mgr); // Initialize event manager + mg_log_set_fn(DLOG, NULL); // Redirect logs to our logger + mg_log_set(MG_LL_DEBUG); + mg_mgr_init(&mgr); // Initialize event manager } Web::~Web() {