feat(Core/Chat): Provide a fully-formed protocol for addons to intera… (#19305)
* feat(Core/Chat): Provide a fully-formed protocol for addons to interact with GM commands * Send success/fail state, allow interleaving, and indicate end of output. Add framework for supporting non-human-readable output in commands. * cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/508c9d2fc1b20dc2cb40df533e823e1dfe2becc3) This PR implements a well-formed protocol for addons to communicate with the server, outlined below: - All communication happens over the addon channel (`LANG_ADDON` in terms of the core, `CHAT_MSG_ADDON`/`SendAddonMessage` for the client). The prefix used for all messages is `AzerothCore` (in client terms - in core terms, every message starts with `AzerothCore\t`). - In each message, the first character is the opcode. The following four characters are a unique identifier for the invocation in question, and will be echoed back by the server in every message related to that invocation. Following is the message body, if any. - The following opcodes are supported: - Client to server: - `p` - Ping request. The core will always respond by ACKing with the passed identifier. No body. - `i` or `h` - Command invocation. The message body is the command text without prefix. `i` requests machine-readable output, `h` requests human-readable. - Server to client: - `a` - ACK. The first message sent in response to any invocation (before any output). No body. - `m` - Message. Sent once per line of output the server generates. Body = output line. - `o` - OK. Indicates that the command finished processing with no errors. No body. - `f` - Failed. Indicates that command processing is done, but there was an error. No body. Expected overhead is minimal, and this integrates seamlessly with existing command scripts (no changes necessary). PS: There's also a client-side addon library that exposes this protocol in a developer-friendly way over at https://github.com/azerothcore/LibAzerothCore-1.0 --------- Co-authored-by: Treeston <14020072+Treeston@users.noreply.github.com>
This commit is contained in:
@@ -168,4 +168,24 @@ private:
|
||||
Print* m_print;
|
||||
};
|
||||
|
||||
class AC_GAME_API AddonChannelCommandHandler : public ChatHandler
|
||||
{
|
||||
public:
|
||||
using ChatHandler::ChatHandler;
|
||||
bool ParseCommands(std::string_view str) override;
|
||||
void SendSysMessage(std::string_view str, bool escapeCharacters) override;
|
||||
using ChatHandler::SendSysMessage;
|
||||
bool IsHumanReadable() const override { return humanReadable; }
|
||||
|
||||
private:
|
||||
void Send(std::string const& msg);
|
||||
void SendAck();
|
||||
void SendOK();
|
||||
void SendFailed();
|
||||
|
||||
std::string echo;
|
||||
bool hadAck = false;
|
||||
bool humanReadable = false;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user