X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=7437e8a209f83baea1e3345608785616883e1732;hb=5fbb5a0b2c5c08f76f99bd03b51bce2164feade3;hp=fd4afbcef7a643b7bd061ed07ca240ba266e63bc;hpb=6bc4db5e922dd49a46684c9b4e417cac36a71942;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index fd4afbcef..7437e8a20 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -340,7 +340,7 @@ void User::Oper(OperInfo* info) LocalUser* l = IS_LOCAL(this); std::string vhost = oper->getConfig("vhost"); if (!vhost.empty()) - l->ChangeDisplayedHost(vhost.c_str()); + l->ChangeDisplayedHost(vhost); std::string opClass = oper->getConfig("class"); if (!opClass.empty()) l->SetClass(opClass); @@ -348,7 +348,7 @@ void User::Oper(OperInfo* info) ServerInstance->SNO->WriteToSnoMask('o',"%s (%s@%s) is now an IRC operator of type %s (using oper '%s')", nick.c_str(), ident.c_str(), host.c_str(), oper->name.c_str(), opername.c_str()); - this->WriteNumeric(RPL_YOUAREOPER, ":You are now %s %s", strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->name.c_str()); + this->WriteNumeric(RPL_YOUAREOPER, InspIRCd::Format("You are now %s %s", strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->name.c_str())); ServerInstance->Logs->Log("OPER", LOG_DEFAULT, "%s opered as type: %s", GetFullRealHost().c_str(), oper->name.c_str()); ServerInstance->Users->all_opers.push_back(this); @@ -524,12 +524,12 @@ void LocalUser::FullConnect() if (quitting) return; - this->WriteNumeric(RPL_WELCOME, ":Welcome to the %s IRC Network %s", ServerInstance->Config->Network.c_str(), GetFullRealHost().c_str()); - this->WriteNumeric(RPL_YOURHOSTIS, ":Your host is %s, running version %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH); - this->WriteNumeric(RPL_SERVERCREATED, ":This server was created %s %s", __TIME__, __DATE__); + this->WriteNumeric(RPL_WELCOME, InspIRCd::Format("Welcome to the %s IRC Network %s", ServerInstance->Config->Network.c_str(), GetFullRealHost().c_str())); + this->WriteNumeric(RPL_YOURHOSTIS, InspIRCd::Format("Your host is %s, running version %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH)); + this->WriteNumeric(RPL_SERVERCREATED, InspIRCd::Format("This server was created %s %s", __TIME__, __DATE__)); const std::string& modelist = ServerInstance->Modes->GetModeListFor004Numeric(); - this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH, modelist.c_str()); + this->WriteNumeric(RPL_SERVERVERSION, ServerInstance->Config->ServerName, INSPIRCD_BRANCH, modelist); ServerInstance->ISupport.SendTo(this); @@ -615,7 +615,7 @@ bool User::ChangeNick(const std::string& newnick, time_t newts) { /* force the camper to their UUID, and ask them to re-send a NICK. */ InUse->WriteFrom(InUse, "NICK %s", InUse->uuid.c_str()); - InUse->WriteNumeric(ERR_NICKNAMEINUSE, "%s :Nickname overruled.", InUse->nick.c_str()); + InUse->WriteNumeric(ERR_NICKNAMEINUSE, InUse->nick, "Nickname overruled."); InUse->registered &= ~REG_NICK; InUse->ChangeNick(InUse->uuid); @@ -623,7 +623,7 @@ bool User::ChangeNick(const std::string& newnick, time_t newts) else { /* No camping, tell the incoming user to stop trying to change nick ;p */ - this->WriteNumeric(ERR_NICKNAMEINUSE, "%s :Nickname is already in use.", newnick.c_str()); + this->WriteNumeric(ERR_NICKNAMEINUSE, newnick, "Nickname is already in use."); return false; } } @@ -786,25 +786,33 @@ void User::WriteCommand(const char* command, const std::string& text) this->WriteServ(command + (this->registered & REG_NICK ? " " + this->nick : " *") + " " + text); } -void User::WriteNumeric(unsigned int numeric, const char* text, ...) +namespace { - std::string textbuffer; - VAFORMAT(textbuffer, text, text); - this->WriteNumeric(numeric, textbuffer); + std::string BuildNumeric(const std::string& source, User* targetuser, unsigned int num, const std::vector& params) + { + const char* const target = (targetuser->registered & REG_NICK ? targetuser->nick.c_str() : "*"); + std::string raw = InspIRCd::Format(":%s %03u %s", source.c_str(), num, target); + if (!params.empty()) + { + for (std::vector::const_iterator i = params.begin(); i != params.end()-1; ++i) + raw.append(1, ' ').append(*i); + raw.append(" :").append(params.back()); + } + return raw; + } } -void User::WriteNumeric(unsigned int numeric, const std::string &text) +void User::WriteNumeric(const Numeric::Numeric& numeric) { ModResult MOD_RESULT; - FIRST_MOD_RESULT(OnNumeric, MOD_RESULT, (this, numeric, text)); + FIRST_MOD_RESULT(OnNumeric, MOD_RESULT, (this, numeric)); if (MOD_RESULT == MOD_RES_DENY) return; - const std::string message = InspIRCd::Format(":%s %03u %s %s", ServerInstance->Config->ServerName.c_str(), - numeric, this->registered & REG_NICK ? this->nick.c_str() : "*", text.c_str()); - this->Write(message); + const std::string& servername = (numeric.GetServer() ? numeric.GetServer()->GetName() : ServerInstance->Config->ServerName); + this->Write(BuildNumeric(servername, this, numeric.GetNumeric(), numeric.GetParams())); } void User::WriteFrom(User *user, const std::string &text) @@ -823,6 +831,16 @@ void User::WriteFrom(User *user, const char* text, ...) this->WriteFrom(user, textbuffer); } +void User::WriteRemoteNotice(const std::string& text) +{ + ServerInstance->PI->SendUserNotice(this, text); +} + +void LocalUser::WriteRemoteNotice(const std::string& text) +{ + WriteNotice(text); +} + namespace { class WriteCommonRawHandler : public User::ForEachNeighborHandler @@ -930,21 +948,9 @@ void User::SendText(const char *text, ...) SendText(line); } -void User::SendText(const std::string& linePrefix, std::stringstream& textStream) +void User::WriteRemoteNumeric(const Numeric::Numeric& numeric) { - std::string line; - std::string word; - while (textStream >> word) - { - size_t lineLength = linePrefix.length() + line.length() + word.length() + 3; // "\s\n\r" - if (lineLength > ServerInstance->Config->Limits.MaxLine) - { - SendText(linePrefix + line); - line.clear(); - } - line += " " + word; - } - SendText(linePrefix + line); + WriteNumeric(numeric); } /* return 0 or 1 depending if users u and u2 share one or more common channels @@ -1010,7 +1016,7 @@ bool User::ChangeDisplayedHost(const std::string& shost) this->InvalidateCache(); if (IS_LOCAL(this)) - this->WriteNumeric(RPL_YOURDISPLAYEDHOST, "%s :is now your displayed host", this->dhost.c_str()); + this->WriteNumeric(RPL_YOURDISPLAYEDHOST, this->dhost, "is now your displayed host"); return true; }