Strip quotes from chat forwards (bug 5986, r=psychonic).
This commit is contained in:
parent
977bf4d583
commit
ba99d0154b
@ -57,7 +57,7 @@ ChatTriggers g_ChatTriggers;
|
|||||||
bool g_bSupressSilentFails = false;
|
bool g_bSupressSilentFails = false;
|
||||||
|
|
||||||
ChatTriggers::ChatTriggers() : m_pSayCmd(NULL), m_bWillProcessInPost(false),
|
ChatTriggers::ChatTriggers() : m_pSayCmd(NULL), m_bWillProcessInPost(false),
|
||||||
m_ReplyTo(SM_REPLY_CONSOLE)
|
m_ReplyTo(SM_REPLY_CONSOLE), m_ArgSBackup(NULL)
|
||||||
{
|
{
|
||||||
m_PubTrigger = sm_strdup("!");
|
m_PubTrigger = sm_strdup("!");
|
||||||
m_PrivTrigger = sm_strdup("/");
|
m_PrivTrigger = sm_strdup("/");
|
||||||
@ -76,6 +76,8 @@ ChatTriggers::~ChatTriggers()
|
|||||||
m_PubTrigger = NULL;
|
m_PubTrigger = NULL;
|
||||||
delete [] m_PrivTrigger;
|
delete [] m_PrivTrigger;
|
||||||
m_PrivTrigger = NULL;
|
m_PrivTrigger = NULL;
|
||||||
|
delete [] m_ArgSBackup;
|
||||||
|
m_ArgSBackup = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigResult ChatTriggers::OnSourceModConfigChanged(const char *key,
|
ConfigResult ChatTriggers::OnSourceModConfigChanged(const char *key,
|
||||||
@ -219,7 +221,52 @@ void ChatTriggers::OnSayCommand_Pre()
|
|||||||
/* Save these off for post hook as the command data returned from the engine in older engine versions
|
/* Save these off for post hook as the command data returned from the engine in older engine versions
|
||||||
* can be NULL, despite the data still being there and valid. */
|
* can be NULL, despite the data still being there and valid. */
|
||||||
m_Arg0Backup = command.Arg(0);
|
m_Arg0Backup = command.Arg(0);
|
||||||
m_ArgSBackup = command.ArgS();
|
|
||||||
|
/* Handle quoted string sets */
|
||||||
|
bool is_quoted = false;
|
||||||
|
size_t len = strlen(args);
|
||||||
|
|
||||||
|
/* The engine does not display empty say commands.
|
||||||
|
* So to prevent forwarding it, let's block it. */
|
||||||
|
if (len == 0)
|
||||||
|
{
|
||||||
|
RETURN_META(MRES_SUPERCEDE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The first pair of quotes are stripped from client say commands, but not console ones.
|
||||||
|
* We do not want the forwards to differ from what is displayed.
|
||||||
|
* So only strip the first pair of quotes from client say commands. */
|
||||||
|
if (client != 0 && args[0] == '"' && args[len-1] == '"')
|
||||||
|
{
|
||||||
|
/* The server normally won't display empty say commands, but in this case it does.
|
||||||
|
* I don't think it's desired so let's block it. */
|
||||||
|
if (len <= 2)
|
||||||
|
{
|
||||||
|
RETURN_META(MRES_SUPERCEDE);
|
||||||
|
}
|
||||||
|
|
||||||
|
args++;
|
||||||
|
len--;
|
||||||
|
is_quoted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Some? engines strip the last quote when printing the string to chat.
|
||||||
|
* This results in having a double-quoted message passed to the OnClientSayCommand ("message") forward,
|
||||||
|
* but losing the last quote in the OnClientSayCommand_Post ("message) forward.
|
||||||
|
* To compensate this, we copy the args into our own buffer where the engine won't mess with
|
||||||
|
* and strip the quotes. */
|
||||||
|
delete [] m_ArgSBackup;
|
||||||
|
m_ArgSBackup = new char[CCommand::MaxCommandLength()+1];
|
||||||
|
memcpy(m_ArgSBackup, args, len+1);
|
||||||
|
|
||||||
|
/* Strip the quotes from the argument */
|
||||||
|
if (is_quoted)
|
||||||
|
{
|
||||||
|
if (m_ArgSBackup[len-1] == '"')
|
||||||
|
{
|
||||||
|
m_ArgSBackup[--len] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The server console cannot do this */
|
/* The server console cannot do this */
|
||||||
if (client == 0)
|
if (client == 0)
|
||||||
@ -259,14 +306,6 @@ void ChatTriggers::OnSayCommand_Pre()
|
|||||||
RETURN_META(MRES_SUPERCEDE);
|
RETURN_META(MRES_SUPERCEDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle quoted string sets */
|
|
||||||
bool is_quoted = false;
|
|
||||||
if (args[0] == '"')
|
|
||||||
{
|
|
||||||
args++;
|
|
||||||
is_quoted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if SOURCE_ENGINE == SE_EPISODEONE
|
#if SOURCE_ENGINE == SE_EPISODEONE
|
||||||
if (m_bIsINS && strcmp(m_Arg0Backup, "say2") == 0 && strlen(args) >= 4)
|
if (m_bIsINS && strcmp(m_Arg0Backup, "say2") == 0 && strlen(args) >= 4)
|
||||||
{
|
{
|
||||||
@ -293,7 +332,7 @@ void ChatTriggers::OnSayCommand_Pre()
|
|||||||
/**
|
/**
|
||||||
* Test if this is actually a command!
|
* Test if this is actually a command!
|
||||||
*/
|
*/
|
||||||
if (is_trigger && PreProcessTrigger(PEntityOfEntIndex(client), args, is_quoted))
|
if (is_trigger && PreProcessTrigger(PEntityOfEntIndex(client), args))
|
||||||
{
|
{
|
||||||
m_bIsChatTrigger = true;
|
m_bIsChatTrigger = true;
|
||||||
|
|
||||||
@ -354,7 +393,7 @@ void ChatTriggers::OnSayCommand_Post()
|
|||||||
m_bWasFloodedMessage = false;
|
m_bWasFloodedMessage = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted)
|
bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args)
|
||||||
{
|
{
|
||||||
/* Extract a command. This is kind of sloppy. */
|
/* Extract a command. This is kind of sloppy. */
|
||||||
char cmd_buf[64];
|
char cmd_buf[64];
|
||||||
@ -401,7 +440,7 @@ bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* See if we need to do extra string manipulation */
|
/* See if we need to do extra string manipulation */
|
||||||
if (is_quoted || prepended)
|
if (prepended)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@ -412,15 +451,6 @@ bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_
|
|||||||
} else {
|
} else {
|
||||||
len = strncopy(m_ToExecute, args, sizeof(m_ToExecute));
|
len = strncopy(m_ToExecute, args, sizeof(m_ToExecute));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we need to strip a quote */
|
|
||||||
if (is_quoted)
|
|
||||||
{
|
|
||||||
if (m_ToExecute[len-1] == '"')
|
|
||||||
{
|
|
||||||
m_ToExecute[--len] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
strncopy(m_ToExecute, args, sizeof(m_ToExecute));
|
strncopy(m_ToExecute, args, sizeof(m_ToExecute));
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ public:
|
|||||||
bool IsChatTrigger();
|
bool IsChatTrigger();
|
||||||
bool WasFloodedMessage();
|
bool WasFloodedMessage();
|
||||||
private:
|
private:
|
||||||
bool PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted);
|
bool PreProcessTrigger(edict_t *pEdict, const char *args);
|
||||||
bool ClientIsFlooding(int client);
|
bool ClientIsFlooding(int client);
|
||||||
cell_t CallOnClientSayCommand(int client);
|
cell_t CallOnClientSayCommand(int client);
|
||||||
private:
|
private:
|
||||||
@ -92,7 +92,7 @@ private:
|
|||||||
unsigned int m_ReplyTo;
|
unsigned int m_ReplyTo;
|
||||||
char m_ToExecute[300];
|
char m_ToExecute[300];
|
||||||
const char *m_Arg0Backup;
|
const char *m_Arg0Backup;
|
||||||
const char *m_ArgSBackup;
|
char *m_ArgSBackup;
|
||||||
IForward *m_pShouldFloodBlock;
|
IForward *m_pShouldFloodBlock;
|
||||||
IForward *m_pDidFloodBlock;
|
IForward *m_pDidFloodBlock;
|
||||||
IForward *m_pOnClientSayCmd;
|
IForward *m_pOnClientSayCmd;
|
||||||
|
Loading…
Reference in New Issue
Block a user