X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=5d1c12b136c1979863d90af3dc4e0b46ce64bee9;hb=f0debf907a36846e3b48767e9797880135a4583b;hp=915afd8b8157becaeaec827590d1e5c9b3682f7b;hpb=28dcc1f9e017152f03b0d9bfbcc494260b015a0a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index 915afd8b8..5d1c12b13 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -51,7 +51,7 @@ const char* User::FormatModes(bool showparameters) if (mh && IsModeSet(mh)) { data.push_back(n + 65); - if (showparameters && mh->GetNumParams(true)) + if (showparameters && mh->NeedsParam(true)) { std::string p = mh->GetUserParameter(this); if (p.length()) @@ -64,12 +64,14 @@ const char* User::FormatModes(bool showparameters) } User::User(const std::string& uid, Server* srv, int type) - : uuid(uid), server(srv), usertype(type) + : age(ServerInstance->Time()) + , signon(0) + , uuid(uid) + , server(srv) + , registered(REG_NONE) + , quitting(false) + , usertype(type) { - age = ServerInstance->Time(); - signon = 0; - registered = 0; - quitting = false; client_sa.sa.sa_family = AF_UNSPEC; ServerInstance->Logs->Log("USERS", LOG_DEBUG, "New UUID for user: %s", uuid.c_str()); @@ -83,14 +85,24 @@ User::User(const std::string& uid, Server* srv, int type) } LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr) - : User(ServerInstance->UIDGen.GetUID(), ServerInstance->FakeClient->server, USERTYPE_LOCAL), eh(this), - bytes_in(0), bytes_out(0), cmds_in(0), cmds_out(0), nping(0), CommandFloodPenalty(0), - already_sent(0) -{ - exempt = quitting_sendq = false; - idle_lastmsg = 0; + : User(ServerInstance->UIDGen.GetUID(), ServerInstance->FakeClient->server, USERTYPE_LOCAL) + , eh(this) + , bytes_in(0) + , bytes_out(0) + , cmds_in(0) + , cmds_out(0) + , quitting_sendq(false) + , lastping(true) + , exempt(false) + , nping(0) + , idle_lastmsg(0) + , CommandFloodPenalty(0) + , already_sent(0) +{ + signon = ServerInstance->Time(); + // The user's default nick is their UUID + nick = uuid; ident = "unknown"; - lastping = 0; eh.SetFd(myfd); memcpy(&client_sa, client, sizeof(irc::sockets::sockaddrs)); memcpy(&server_sa, servaddr, sizeof(irc::sockets::sockaddrs)); @@ -141,19 +153,20 @@ const std::string& User::GetFullRealHost() return this->cached_fullrealhost; } -bool User::HasModePermission(unsigned char, ModeType) +bool User::HasModePermission(const ModeHandler* mh) const { return true; } -bool LocalUser::HasModePermission(unsigned char mode, ModeType type) +bool LocalUser::HasModePermission(const ModeHandler* mh) const { if (!this->IsOper()) return false; + const unsigned char mode = mh->GetModeChar(); if (mode < 'A' || mode > ('A' + 64)) return false; - return ((type == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')]; + return ((mh->GetModeType() == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')]; } /* @@ -340,7 +353,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 +361,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 +537,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 +628,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 +636,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; } } @@ -802,25 +815,17 @@ namespace } } -void User::WriteNumeric(unsigned int numeric, const char* text, ...) -{ - std::string textbuffer; - VAFORMAT(textbuffer, text, text); - this->WriteNumeric(numeric, textbuffer); -} - -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) @@ -839,6 +844,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 @@ -925,42 +940,9 @@ void User::ForEachNeighbor(ForEachNeighborHandler& handler, bool include_self) } } -void LocalUser::SendText(const std::string& line) +void User::WriteRemoteNumeric(const Numeric::Numeric& numeric) { - Write(line); -} - -void RemoteUser::SendText(const std::string& line) -{ - ServerInstance->PI->PushToClient(this, line); -} - -void FakeUser::SendText(const std::string& line) -{ -} - -void User::SendText(const char *text, ...) -{ - std::string line; - VAFORMAT(line, text, text); - SendText(line); -} - -void User::SendText(const std::string& linePrefix, std::stringstream& textStream) -{ - 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 @@ -1026,7 +1008,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; }