X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=cd5aa247ec23bd399f25dfa9ecabf7941f113d8d;hb=7c340cba11b16d3c4a95c274c22f1617ac4711f2;hp=6be64fe1df81e082ae6c642a9252bf05817149eb;hpb=deb6822302cb9009adc3450dd405817cc0dae9cd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index 6be64fe1d..cd5aa247e 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -985,8 +985,6 @@ void User::FullConnect() this->registered = REG_ALL; - ServerInstance->PI->Introduce(this); - FOREACH_MOD(I_OnPostConnect,OnPostConnect(this)); ServerInstance->SNO->WriteToSnoMask('c',"Client connecting on port %d: %s!%s@%s [%s] [%s]", @@ -1197,27 +1195,12 @@ bool User::SetClientIP(const char* sip) return irc::sockets::aptosa(sip, 0, &client_sa); } -/** NOTE: We cannot pass a const reference to this method. - * The string is changed by the workings of the method, - * so that if we pass const ref, we end up copying it to - * something we can change anyway. Makes sense to just let - * the compiler do that copy for us. - */ -void User::Write(std::string text) +void User::Write(const std::string& text) { if (!ServerInstance->SE->BoundsCheckFd(this)) return; - try - { - ServerInstance->Logs->Log("USEROUTPUT", DEBUG,"C[%d] O %s", this->GetFd(), text.c_str()); - text.append("\r\n"); - } - catch (...) - { - ServerInstance->Logs->Log("USEROUTPUT", DEBUG,"Exception in User::Write() std::string::append"); - return; - } + ServerInstance->Logs->Log("USEROUTPUT", DEBUG,"C[%d] O %s", this->GetFd(), text.c_str()); if (this->GetIOHook()) { @@ -1227,6 +1210,7 @@ void User::Write(std::string text) try { this->GetIOHook()->OnRawSocketWrite(this->fd, text.data(), text.length()); + this->GetIOHook()->OnRawSocketWrite(this->fd, "\r\n", 2); } catch (CoreException& modexcept) { @@ -1236,8 +1220,9 @@ void User::Write(std::string text) else { this->AddWriteBuf(text); + this->AddWriteBuf("\r\n"); } - ServerInstance->stats->statsSent += text.length(); + ServerInstance->stats->statsSent += text.length() + 2; this->ServerInstance->SE->WantWrite(this); } @@ -1257,10 +1242,7 @@ void User::Write(const char *text, ...) void User::WriteServ(const std::string& text) { - char textbuffer[MAXBUF]; - - snprintf(textbuffer,MAXBUF,":%s %s",ServerInstance->Config->ServerName,text.c_str()); - this->Write(std::string(textbuffer)); + this->Write(":%s %s",ServerInstance->Config->ServerName,text.c_str()); } /** WriteServ() @@ -1567,6 +1549,52 @@ bool User::ChangeName(const char* gecos) return true; } +void User::DoHostCycle(const std::string &quitline) +{ + char buffer[MAXBUF]; + + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnHostCycle, OnHostCycle(this)); + + if (!ServerInstance->Config->CycleHosts || MOD_RESULT) + return; + + uniq_id++; + + if (!already_sent) + InitializeAlreadySent(ServerInstance->SE); + + for (UCListIter v = this->chans.begin(); v != this->chans.end(); v++) + { + Channel* c = v->first; + snprintf(buffer, MAXBUF, ":%s JOIN %s", GetFullHost().c_str(), c->name.c_str()); + std::string joinline(buffer); + std::string modeline = this->ServerInstance->Modes->ModeString(this, c); + if (modeline.length() > 0) + { + snprintf(buffer, MAXBUF, ":%s MODE %s +%s", GetFullHost().c_str(), c->name.c_str(), modeline.c_str()); + modeline = buffer; + } + + CUList *ulist = c->GetUsers(); + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + { + User* u = i->first; + if (u == this || !IS_LOCAL(u)) + continue; + + if (already_sent[i->first->fd] != uniq_id) + { + u->Write(quitline); + already_sent[i->first->fd] = uniq_id; + } + u->Write(joinline); + if (modeline.length() > 0) + u->Write(modeline); + } + } +} + bool User::ChangeDisplayedHost(const char* shost) { if (dhost == shost) @@ -1582,27 +1610,14 @@ bool User::ChangeDisplayedHost(const char* shost) FOREACH_MOD(I_OnChangeHost, OnChangeHost(this,shost)); - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnHostCycle, OnHostCycle(this)); - - if (this->ServerInstance->Config->CycleHosts && !MOD_RESULT) - this->WriteCommonExcept("QUIT :Changing hosts"); + std::string quitstr = ":" + GetFullHost() + " QUIT :Changing host"; /* Fix by Om: User::dhost is 65 long, this was truncating some long hosts */ this->dhost.assign(shost, 0, 64); this->InvalidateCache(); - if (this->ServerInstance->Config->CycleHosts && !MOD_RESULT) - { - for (UCListIter i = this->chans.begin(); i != this->chans.end(); i++) - { - i->first->WriteAllExceptSender(this, false, 0, "JOIN %s", i->first->name.c_str()); - std::string n = this->ServerInstance->Modes->ModeString(this, i->first); - if (n.length() > 0) - i->first->WriteAllExceptSender(this, true, 0, "MODE %s +%s", i->first->name.c_str(), n.c_str()); - } - } + this->DoHostCycle(quitstr); if (IS_LOCAL(this)) this->WriteNumeric(RPL_YOURDISPLAYEDHOST, "%s %s :is now your displayed host",this->nick.c_str(),this->dhost.c_str()); @@ -1615,26 +1630,13 @@ bool User::ChangeIdent(const char* newident) if (this->ident == newident) return true; - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnHostCycle, OnHostCycle(this)); - - if (this->ServerInstance->Config->CycleHosts && !MOD_RESULT) - this->WriteCommonExcept("%s","QUIT :Changing ident"); + std::string quitstr = ":" + GetFullHost() + " QUIT :Changing ident"; this->ident.assign(newident, 0, ServerInstance->Config->Limits.IdentMax + 1); this->InvalidateCache(); - if (this->ServerInstance->Config->CycleHosts && !MOD_RESULT) - { - for (UCListIter i = this->chans.begin(); i != this->chans.end(); i++) - { - i->first->WriteAllExceptSender(this, false, 0, "JOIN %s", i->first->name.c_str()); - std::string n = this->ServerInstance->Modes->ModeString(this, i->first); - if (n.length() > 0) - i->first->WriteAllExceptSender(this, true, 0, "MODE %s +%s", i->first->name.c_str(), n.c_str()); - } - } + this->DoHostCycle(quitstr); return true; }