mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-14 15:57:13 +00:00
A world server passed every routed packet on to the chat server under whatever message ID it carried. It now passes on the messages a client sends, and SHOW_ALL only for the level the showall command needs. The message ID is read as the full 32 bit number, the packet has to be long enough to hold a chat packet and the sender needs a character. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
68 lines
2.5 KiB
C++
68 lines
2.5 KiB
C++
#ifndef __CHATROUTING__H__
|
|
#define __CHATROUTING__H__
|
|
|
|
#include <cstdint>
|
|
#include <optional>
|
|
|
|
#include "MessageType/Chat.h"
|
|
#include "eGameMasterLevel.h"
|
|
|
|
namespace ChatRouting {
|
|
// A routed packet is the world header, the size of the chat packet and then the chat packet itself.
|
|
// The chat packet's message ID sits at this offset and its contents start after its own header.
|
|
constexpr uint32_t MessageIdOffset = 14;
|
|
constexpr uint32_t ContentOffset = 23;
|
|
|
|
/**
|
|
* The chat messages a client sends through a world server, with the GM level each one needs.
|
|
* Every other chat message only ever comes from a server, so it has no level and is not routed.
|
|
*/
|
|
constexpr std::optional<eGameMasterLevel> GetRequiredGMLevel(const MessageType::Chat messageId) {
|
|
switch (messageId) {
|
|
case MessageType::Chat::GENERAL_CHAT_MESSAGE:
|
|
case MessageType::Chat::PRIVATE_CHAT_MESSAGE:
|
|
case MessageType::Chat::USER_CHANNEL_CHAT_MESSAGE:
|
|
case MessageType::Chat::ADD_FRIEND_REQUEST:
|
|
case MessageType::Chat::ADD_FRIEND_RESPONSE:
|
|
case MessageType::Chat::REMOVE_FRIEND:
|
|
case MessageType::Chat::GET_FRIENDS_LIST:
|
|
case MessageType::Chat::ADD_IGNORE:
|
|
case MessageType::Chat::REMOVE_IGNORE:
|
|
case MessageType::Chat::GET_IGNORE_LIST:
|
|
case MessageType::Chat::TEAM_MISSED_INVITE_CHECK:
|
|
case MessageType::Chat::TEAM_INVITE:
|
|
case MessageType::Chat::TEAM_INVITE_RESPONSE:
|
|
case MessageType::Chat::TEAM_KICK:
|
|
case MessageType::Chat::TEAM_LEAVE:
|
|
case MessageType::Chat::TEAM_SET_LOOT:
|
|
case MessageType::Chat::TEAM_SET_LEADER:
|
|
case MessageType::Chat::TEAM_GET_STATUS:
|
|
case MessageType::Chat::GUILD_CREATE:
|
|
case MessageType::Chat::GUILD_INVITE:
|
|
case MessageType::Chat::GUILD_INVITE_RESPONSE:
|
|
case MessageType::Chat::GUILD_LEAVE:
|
|
case MessageType::Chat::GUILD_KICK:
|
|
case MessageType::Chat::GUILD_GET_STATUS:
|
|
case MessageType::Chat::GUILD_GET_ALL:
|
|
case MessageType::Chat::MAIL:
|
|
case MessageType::Chat::REQUEST_MINIMUM_CHAT_MODE:
|
|
case MessageType::Chat::REQUEST_MINIMUM_CHAT_MODE_PRIVATE:
|
|
case MessageType::Chat::WHO:
|
|
return eGameMasterLevel::CIVILIAN;
|
|
// The same level the showall chat command needs
|
|
case MessageType::Chat::SHOW_ALL:
|
|
case MessageType::Chat::GM_CLOSE_PRIVATE_CHAT_WINDOW:
|
|
return eGameMasterLevel::JUNIOR_MODERATOR;
|
|
default:
|
|
return std::nullopt;
|
|
}
|
|
}
|
|
|
|
constexpr bool CanRoute(const MessageType::Chat messageId, const eGameMasterLevel senderLevel) {
|
|
const auto requiredLevel = GetRequiredGMLevel(messageId);
|
|
return requiredLevel && senderLevel >= *requiredLevel;
|
|
}
|
|
}
|
|
|
|
#endif //!__CHATROUTING__H__
|