FOREACH_MOD(I_OnChangeHost,OnChangeHost(user,host));
}
strlcpy(user->dhost,host,160);
+ WriteServ(user->fd,"396 %s %s :is now your hidden host",user->nick,user->dhost);
}
/* verify that a user's ident and nickname is valid */
{
return 0;
}
- for (char* i = n; *i; i++)
+ for (char* i = (char*)n; *i; i++)
{
if ((*i >= 'A') && (*i <= '}'))
{
{
return 0;
}
- for (char* i = n; *i; i++)
+ for (char* i = (char*)n; *i; i++)
{
/* can occur anywhere in a nickname */
if ((*i >= 'A') && (*i <= '}'))
{
return lst;
}
+ bool userinvisible = (strchr(user->modes,'i'));
for (unsigned int i = 0; i < user->chans.size(); i++)
{
if (user->chans[i].channel != NULL)
cmp = std::string(user->chans[i].channel->name) + " ";
if (!strstr(lst.c_str(),cmp.c_str()))
{
- // if the channel is NOT private/secret, OR the source user is on the channel
- if (((!(user->chans[i].channel->binarymodes & CM_PRIVATE)) && (!(user->chans[i].channel->binarymodes & CM_SECRET))) || (has_channel(source,user->chans[i].channel)))
+ // if the channel is NOT private/secret, OR the source user is on the channel, AND the user is not invisible.
+ // if the user is the same as the source, shortcircuit the comparison.
+ if ((source == user) || ((((!(user->chans[i].channel->binarymodes & CM_PRIVATE)) && (!(user->chans[i].channel->binarymodes & CM_SECRET)) && (!userinvisible)) || (has_channel(source,user->chans[i].channel)))))
{
lst = lst + std::string(cmode(user,user->chans[i].channel)) + std::string(user->chans[i].channel->name) + " ";
}