void User::InvalidateCache()
{
/* Invalidate cache */
+ cachedip.clear();
cached_fullhost.clear();
cached_hostip.clear();
cached_makehost.clear();
bool User::SetClientIP(const char* sip, bool recheck_eline)
{
- cachedip.clear();
- cached_hostip.clear();
+ this->InvalidateCache();
return irc::sockets::aptosa(sip, 0, client_sa);
}
void User::SendText(const std::string &LinePrefix, std::stringstream &TextStream)
{
- char line[MAXBUF];
- int start_pos = LinePrefix.length();
- int pos = start_pos;
- memcpy(line, LinePrefix.data(), pos);
+ std::string line;
std::string Word;
while (TextStream >> Word)
{
- int len = Word.length();
- if (pos + len + 12 > MAXBUF)
+ size_t lineLength = LinePrefix.length() + line.length() + Word.length() + 13;
+ if (lineLength > MAXBUF)
{
- line[pos] = '\0';
- SendText(std::string(line));
- pos = start_pos;
+ SendText(LinePrefix + line);
+ line.clear();
}
- line[pos] = ' ';
- memcpy(line + pos + 1, Word.data(), len);
- pos += len + 1;
+ line += " " + Word;
}
- line[pos] = '\0';
- SendText(std::string(line));
+ SendText(LinePrefix + line);
}
/* return 0 or 1 depending if users u and u2 share one or more common channels
FOREACH_MOD(I_OnBuildNeighborList,OnBuildNeighborList(this, include_c, exceptions));
+ // Users shouldn't see themselves quitting when host cycling
+ exceptions.erase(this);
for (std::map<User*,bool>::iterator i = exceptions.begin(); i != exceptions.end(); ++i)
{
LocalUser* u = IS_LOCAL(i->first);