return MODEACTION_DENY;
}
- if (mh->GetTranslateType() == TR_NICK && !ServerInstance->FindNick(parameter))
+ if (mh->GetTranslateType() == TR_NICK)
{
- user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameter.c_str());
- return MODEACTION_DENY;
+ User* prefixtarget;
+ if (IS_LOCAL(user))
+ prefixtarget = ServerInstance->FindNickOnly(parameter);
+ else
+ prefixtarget = ServerInstance->FindNick(parameter);
+
+ if (!prefixtarget)
+ {
+ user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameter.c_str());
+ return MODEACTION_DENY;
+ }
}
if (mh->GetPrefixRank() && chan)
void ModeParser::Process(const std::vector<std::string>& parameters, User *user, bool merge)
{
- std::string target = parameters[0];
+ const std::string& target = parameters[0];
Channel* targetchannel = ServerInstance->FindChan(target);
- User* targetuser = ServerInstance->FindNick(target);
+ User* targetuser = NULL;
+ if (!targetchannel)
+ {
+ if (IS_LOCAL(user))
+ targetuser = ServerInstance->FindNickOnly(target);
+ else
+ targetuser = ServerInstance->FindNick(target);
+ }
ModeType type = targetchannel ? MODETYPE_CHANNEL : MODETYPE_USER;
LastParse.clear();
/* Even if callerid mode is not set, we let them manage their ACCEPT list so that if they go +g they can
* have a list already setup. */
- std::string tok = parameters[0];
+ const std::string& tok = parameters[0];
if (tok == "*")
{
}
else if (tok[0] == '-')
{
- User* whotoremove = ServerInstance->FindNick(tok.substr(1));
+ User* whotoremove;
+ if (IS_LOCAL(user))
+ whotoremove = ServerInstance->FindNickOnly(tok.substr(1));
+ else
+ whotoremove = ServerInstance->FindNick(tok.substr(1));
+
if (whotoremove)
return (RemoveAccept(user, whotoremove) ? CMD_SUCCESS : CMD_FAILURE);
else
}
else
{
- User* whotoadd = ServerInstance->FindNick(tok[0] == '+' ? tok.substr(1) : tok);
+ const std::string target = (tok[0] == '+' ? tok.substr(1) : tok);
+ User* whotoadd;
+ if (IS_LOCAL(user))
+ whotoadd = ServerInstance->FindNickOnly(target);
+ else
+ whotoadd = ServerInstance->FindNick(target);
+
if ((whotoadd) && (whotoadd->registered == REG_ALL) && (!whotoadd->quitting) && (!IS_SERVER(whotoadd)))
return (AddAccept(user, whotoadd) ? CMD_SUCCESS : CMD_FAILURE);
else
const std::string& username = parameters[neworder ? 1 : 0];
/* Look up the user we're meant to be removing from the channel */
- target = ServerInstance->FindNick(username);
+ if (IS_LOCAL(user))
+ target = ServerInstance->FindNickOnly(username);
+ else
+ target = ServerInstance->FindNick(username);
/* And the channel we're meant to be removing them from */
channel = ServerInstance->FindChan(channame);
CmdResult Handle (const std::vector<std::string> ¶meters, User *user)
{
- User* u = ServerInstance->FindNick(parameters[0]);
+ User* u;
+ if (IS_LOCAL(user))
+ u = ServerInstance->FindNickOnly(parameters[0]);
+ else
+ u = ServerInstance->FindNick(parameters[0]);
+
Channel* c = ServerInstance->FindChan(parameters[1]);
if ((!c) || (!u) || (u->registered != REG_ALL))
for (int i = 0; i < (int)parameters.size(); i++)
{
- User *u = ServerInstance->FindNick(parameters[i]);
+ User *u = ServerInstance->FindNickOnly(parameters[i]);
if ((u) && (u->registered == REG_ALL))
{
// Anyone may query their own IP