Allow a statusmsg to have multiple statuses and pick the lowest.

This is pretty much useless but other implementations support it
so we have to also support it for compatibility.
This commit is contained in:
Sadie Powell 2021-02-25 06:47:34 +00:00
parent 5860247c3b
commit 61225fa14f
3 changed files with 33 additions and 10 deletions

View File

@ -114,6 +114,7 @@ enum
ERR_TOOMANYCHANNELS = 405,
ERR_WASNOSUCHNICK = 406,
ERR_NOSUCHSERVICE = 408, // From RFC 2812.
ERR_NORECIPIENT = 411,
ERR_NOTEXTTOSEND = 412,
ERR_UNKNOWNCOMMAND = 421,
ERR_NOMOTD = 422,

View File

@ -298,15 +298,26 @@ class CommandMessage : public Command
if (parameters[0][0] == '$')
return HandleServerTarget(user, parameters);
// If the message begins with a status character then look it up.
// If the message begins with one or more status characters then look them up.
const char* target = parameters[0].c_str();
PrefixMode* pmh = ServerInstance->Modes->FindPrefix(target[0]);
if (pmh)
target++;
PrefixMode* targetpfx = NULL;
for (PrefixMode* pfx; (pfx = ServerInstance->Modes->FindPrefix(target[0])); ++target)
{
// We want the lowest ranked prefix specified.
if (!targetpfx || pfx->GetPrefixRank() < targetpfx->GetPrefixRank())
targetpfx = pfx;
}
if (!target[0])
{
// The target consisted solely of prefix modes.
user->WriteNumeric(ERR_NORECIPIENT, "No recipient given");
return CMD_FAILURE;
}
// The target is a channel name.
if (*target == '#')
return HandleChannelTarget(user, parameters, target, pmh);
return HandleChannelTarget(user, parameters, target, targetpfx);
// The target is a nickname.
return HandleUserTarget(user, parameters);

View File

@ -234,15 +234,26 @@ class CommandTagMsg : public Command
if (parameters[0][0] == '$')
return HandleServerTarget(user, parameters);
// If the message begins with a status character then look it up.
// If the message begins with one or more status characters then look them up.
const char* target = parameters[0].c_str();
PrefixMode* pmh = ServerInstance->Modes->FindPrefix(target[0]);
if (pmh)
target++;
PrefixMode* targetpfx = NULL;
for (PrefixMode* pfx; (pfx = ServerInstance->Modes->FindPrefix(target[0])); ++target)
{
// We want the lowest ranked prefix specified.
if (!targetpfx || pfx->GetPrefixRank() < targetpfx->GetPrefixRank())
targetpfx = pfx;
}
if (!target[0])
{
// The target consisted solely of prefix modes.
user->WriteNumeric(ERR_NORECIPIENT, "No recipient given");
return CMD_FAILURE;
}
// The target is a channel name.
if (*target == '#')
return HandleChannelTarget(user, parameters, target, pmh);
return HandleChannelTarget(user, parameters, target, targetpfx);
// The target is a nickname.
return HandleUserTarget(user, parameters);