1
0
cuberite-2a/src/CompositeChat.h

227 lines
6.9 KiB
C
Raw Normal View History

// CompositeChat.h
// Declares the cCompositeChat class used to wrap a chat message with multiple parts (text, url, cmd)
#include "Defines.h"
#include "json/json.h"
#include "Logger.h"
// tolua_begin
/** Container for a single chat message composed of multiple functional parts.
Each part corresponds roughly to the behavior supported by the client messaging:
- plain text, optionaly colorized / styled
- clickable URLs
- clickable commands (run)
- clickable commands (suggest)
Each part has a text assigned to it that can be styled. The style is specified using a string,
each character / character combination in the string specifies the style to use:
- b = bold
- i = italic
- u = underlined
- s = strikethrough
- o = obfuscated
- @X = color X (X is 0 - 9 or a - f, same as dye meta
If the protocol version doesn't support all the features, it degrades gracefully.
*/
class cCompositeChat
{
public:
// tolua_end
2016-02-05 16:45:45 -05:00
enum ePartType
{
ptText,
ptClientTranslated,
ptUrl,
ptRunCommand,
ptSuggestCommand,
ptShowAchievement,
} ;
2016-02-05 16:45:45 -05:00
class cBasePart
{
public:
ePartType m_PartType;
AString m_Text;
AString m_Style;
AString m_AdditionalStyleData;
2016-02-05 16:45:45 -05:00
cBasePart(ePartType a_PartType, const AString & a_Text, const AString & a_Style = "");
2016-02-05 16:45:45 -05:00
2014-02-17 04:15:18 -05:00
// Force a virtual destructor in descendants
virtual ~cBasePart() {}
} ;
2016-02-05 16:45:45 -05:00
class cTextPart :
public cBasePart
{
typedef cBasePart super;
public:
cTextPart(const AString & a_Text, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
class cClientTranslatedPart :
public cBasePart
{
typedef cBasePart super;
public:
AStringVector m_Parameters;
2016-02-05 16:45:45 -05:00
cClientTranslatedPart(const AString & a_TranslationID, const AStringVector & a_Parameters, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
class cUrlPart :
public cBasePart
{
typedef cBasePart super;
public:
AString m_Url;
2016-02-05 16:45:45 -05:00
cUrlPart(const AString & a_Text, const AString & a_Url, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
class cCommandPart :
public cBasePart
{
typedef cBasePart super;
public:
AString m_Command;
2016-02-05 16:45:45 -05:00
cCommandPart(ePartType a_PartType, const AString & a_Text, const AString & a_Command, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
class cRunCommandPart :
public cCommandPart
{
typedef cCommandPart super;
public:
cRunCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
class cSuggestCommandPart :
public cCommandPart
{
typedef cCommandPart super;
public:
cSuggestCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style = "");
} ;
class cShowAchievementPart :
public cBasePart
{
typedef cBasePart super;
public:
AString m_PlayerName;
cShowAchievementPart(const AString & a_PlayerName, const AString & a_Achievement, const AString & a_Style = "");
} ;
2016-02-05 16:45:45 -05:00
typedef std::vector<cBasePart *> cParts;
2016-02-05 16:45:45 -05:00
// tolua_begin
2016-02-05 16:45:45 -05:00
/** Creates a new empty chat message */
cCompositeChat(void);
2016-02-05 16:45:45 -05:00
/** Creates a new chat message and parses the text into parts.
Recognizes "http:" and "https:" links and @color-codes.
Uses ParseText() for the actual parsing. */
cCompositeChat(const AString & a_ParseText, eMessageType a_MessageType = mtCustom);
2016-02-05 16:45:45 -05:00
~cCompositeChat();
2016-02-05 16:45:45 -05:00
/** Removes all parts from the object. */
void Clear(void);
2016-02-05 16:45:45 -05:00
// tolua_end
// The following are exported in ManualBindings in order to support chaining - they return *this in Lua (#755)
2016-02-05 16:45:45 -05:00
/** Adds a plain text part, with optional style.
The default style is plain white text. */
void AddTextPart(const AString & a_Message, const AString & a_Style = "");
2016-02-05 16:45:45 -05:00
/** Adds a part that is translated client-side, with the formatting parameters and optional style. */
void AddClientTranslatedPart(const AString & a_TranslationID, const AStringVector & a_Parameters, const AString & a_Style = "");
2016-02-05 16:45:45 -05:00
// tolua_begin
2016-02-05 16:45:45 -05:00
/** Adds a part that opens an URL when clicked.
The default style is underlined light blue text. */
void AddUrlPart(const AString & a_Text, const AString & a_Url, const AString & a_Style = "u@c");
2016-02-05 16:45:45 -05:00
/** Adds a part that runs a command when clicked.
The default style is underlined light green text. */
void AddRunCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style = "u@a");
2016-02-05 16:45:45 -05:00
/** Adds a part that suggests a command (enters it into the chat message area, but doesn't send) when clicked.
The default style is underlined yellow text. */
void AddSuggestCommandPart(const AString & a_Text, const AString & a_SuggestedCommand, const AString & a_Style = "u@b");
/** Adds a part that fully formats a specified achievement using client translatable strings
Takes achievement name and player awarded to. Displays as {player} has earned the achievement {achievement_name}.
*/
void AddShowAchievementPart(const AString & a_PlayerName, const AString & a_Achievement, const AString & a_Style = "");
2016-02-05 16:45:45 -05:00
/** Parses text into various parts, adds those.
Recognizes "http:" and "https:" URLs and @color-codes. */
void ParseText(const AString & a_ParseText);
2016-02-05 16:45:45 -05:00
2014-05-20 17:49:21 -04:00
/** Sets the message type, which is indicated by prefixes added to the message when serializing
Takes optional AdditionalMessageTypeData to set m_AdditionalMessageTypeData. See said variable for more documentation.
*/
void SetMessageType(eMessageType a_MessageType, const AString & a_AdditionalMessageTypeData = "");
2016-02-05 16:45:45 -05:00
/** Adds the "underline" style to each part that is an URL. */
void UnderlineUrls(void);
2016-02-05 16:45:45 -05:00
// tolua_begin
/** Returns the message type set previously by SetMessageType(). */
eMessageType GetMessageType(void) const { return m_MessageType; }
/** Returns additional data pertaining to message type, for example, the name of a mtPrivateMsg sender */
AString GetAdditionalMessageTypeData(void) const { return m_AdditionalMessageTypeData; }
2016-02-05 16:45:45 -05:00
/** Returns the text from the parts that comprises the human-readable data.
Used for older protocols that don't support composite chat
and for console-logging. */
AString ExtractText(void) const;
AString CreateJsonString(bool a_ShouldUseChatPrefixes = true) const;
2016-02-05 16:45:45 -05:00
// tolua_end
2016-02-05 16:45:45 -05:00
const cParts & GetParts(void) const { return m_Parts; }
2016-02-05 16:45:45 -05:00
/** Converts the MessageType to a LogLevel value.
Used by the logging bindings when logging a cCompositeChat object. */
2014-08-12 11:05:04 -04:00
static cLogger::eLogLevel MessageTypeToLogLevel(eMessageType a_MessageType);
/** Adds the chat part's style (represented by the part's stylestring) into the Json object. */
void AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle) const;
2016-02-05 16:45:45 -05:00
protected:
/** All the parts that */
cParts m_Parts;
2016-02-05 16:45:45 -05:00
/** The message type, as indicated by prefixes. */
eMessageType m_MessageType;
2016-02-05 16:45:45 -05:00
/** Additional data pertaining to message type, for example, the name of a mtPrivateMsg sender */
AString m_AdditionalMessageTypeData;
2016-02-05 16:45:45 -05:00
/** Adds a_AddStyle to a_Style; overwrites the existing style if appropriate.
If the style already contains something that a_AddStyle overrides, it is erased first. */
void AddStyle(AString & a_Style, const AString & a_AddStyle);
} ; // tolua_export