diff options
-rw-r--r-- | include/inspircd.h | 19 | ||||
-rw-r--r-- | include/users.h | 28 | ||||
-rw-r--r-- | make/template/main.mk | 2 | ||||
-rw-r--r-- | src/commands/cmd_modules.cpp | 6 | ||||
-rw-r--r-- | src/commands/cmd_wallops.cpp | 24 | ||||
-rw-r--r-- | src/modules.cpp | 48 | ||||
-rw-r--r-- | src/modules/m_alltime.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_callerid.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_check.cpp | 64 | ||||
-rw-r--r-- | src/modules/m_globalload.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_spanningtree/override_map.cpp | 6 | ||||
-rw-r--r-- | src/users.cpp | 55 |
12 files changed, 99 insertions, 159 deletions
diff --git a/include/inspircd.h b/include/inspircd.h index 9f7d07f5d..f185104ae 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -714,25 +714,6 @@ class CoreExport InspIRCd */ void RehashServer(); - /** Dump text to a user target, splitting it appropriately to fit - * @param User the user to dump the text to - * @param LinePrefix text to prefix each complete line with - * @param TextStream the text to send to the user - */ - void DumpText(User* user, const std::string &LinePrefix, std::stringstream &TextStream); - - /** Dump text to a user target (local or remote) - * @param user the user to dump the text to - * @param text the full line of text - */ - void DumpText(User* user, const std::string &text); - - /** Dump text to a user target (local or remote) - * @param user the user to dump the text to - * @param format the printf format string for the text to send - */ - void DumpText(User* user, const char* format, ...) CUSTOM_PRINTF(3, 4); - /** Check if the given nickmask matches too many users, send errors to the given user * @param nick A nickmask to match against * @param user A user to send error text to diff --git a/include/users.h b/include/users.h index 42d04696a..5153ebdd4 100644 --- a/include/users.h +++ b/include/users.h @@ -666,23 +666,26 @@ class CoreExport User : public StreamSocket */ void UnOper(); - /** Write text to this user, appending CR/LF. + /** Write text to this user, appending CR/LF. Works on local users only. * @param text A std::string to send to the user */ void Write(const std::string &text); /** Write text to this user, appending CR/LF. + * Works on local users only. * @param text The format string for text to send to the user * @param ... POD-type format arguments */ void Write(const char *text, ...) CUSTOM_PRINTF(2, 3); /** Write text to this user, appending CR/LF and prepending :server.name + * Works on local users only. * @param text A std::string to send to the user */ void WriteServ(const std::string& text); /** Write text to this user, appending CR/LF and prepending :server.name + * Works on local users only. * @param text The format string for text to send to the user * @param ... POD-type format arguments */ @@ -742,18 +745,19 @@ class CoreExport User : public StreamSocket */ void WriteCommonQuit(const std::string &normal_text, const std::string &oper_text); - /** Write a WALLOPS message from this user to all local opers. - * If this user is not opered, the function will return without doing anything. - * @param text The format string to send in the WALLOPS message - * @param ... Format arguments + /** Dump text to a user target, splitting it appropriately to fit + * @param LinePrefix text to prefix each complete line with + * @param TextStream the text to send to the user + */ + void SendText(const std::string &LinePrefix, std::stringstream &TextStream); + + /** Write to the user, routing the line if the user is remote. */ - void WriteWallOps(const char* text, ...) CUSTOM_PRINTF(2, 3); + void SendText(const std::string& line); - /** Write a WALLOPS message from this user to all local opers. - * If this user is not opered, the function will return without doing anything. - * @param text The text to send in the WALLOPS message + /** Write to the user, routing the line if the user is remote. */ - void WriteWallOps(const std::string &text); + void SendText(const char* text, ...) CUSTOM_PRINTF(2, 3); /** Return true if the user shares at least one channel with another user * @param other The other user to compare the channel list against @@ -849,10 +853,6 @@ class CoreExport User : public StreamSocket */ void IncreasePenalty(int increase); - /** Decreases a user's command penalty by a set amount. - */ - void DecreasePenalty(int decrease); - void OnDataReady(); void OnError(BufferedSocketError error); diff --git a/make/template/main.mk b/make/template/main.mk index 953c6bf4e..fa59f6519 100644 --- a/make/template/main.mk +++ b/make/template/main.mk @@ -105,7 +105,7 @@ debug-header: @echo "* This will take a *long* time. *" @echo "* Please be aware that this build *" @echo "* will consume a very large amount *" - @echo "* of disk space (150MB+), and can *" + @echo "* of disk space (~350MB), and may *" @echo "* run slower. Use the debug build *" @echo "* for module development or if you *" @echo "* are experiencing problems. *" diff --git a/src/commands/cmd_modules.cpp b/src/commands/cmd_modules.cpp index 5f7dabdbf..64ff81b81 100644 --- a/src/commands/cmd_modules.cpp +++ b/src/commands/cmd_modules.cpp @@ -58,16 +58,16 @@ CmdResult CommandModules::Handle (const std::vector<std::string>&, User *user) if (!(V.Flags & mult)) flags[pos] = '-'; - ServerInstance->DumpText(user, ":%s 702 %s :%p %s %s :%s - %s", ServerInstance->Config->ServerName.c_str(), + user->SendText(":%s 702 %s :%p %s %s :%s - %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), (void*)m, module_names[i].c_str(), flags.c_str(), V.description.c_str(), V.version.c_str()); } else { - ServerInstance->DumpText(user, ":%s 702 %s :%s %s", ServerInstance->Config->ServerName.c_str(), + user->SendText(":%s 702 %s :%s %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), module_names[i].c_str(), V.description.c_str()); } } - ServerInstance->DumpText(user, ":%s 703 %s :End of MODULES list", ServerInstance->Config->ServerName.c_str(), user->nick.c_str()); + user->SendText(":%s 703 %s :End of MODULES list", ServerInstance->Config->ServerName.c_str(), user->nick.c_str()); return CMD_SUCCESS; } diff --git a/src/commands/cmd_wallops.cpp b/src/commands/cmd_wallops.cpp index 7894419c1..52d28e987 100644 --- a/src/commands/cmd_wallops.cpp +++ b/src/commands/cmd_wallops.cpp @@ -13,14 +13,6 @@ #include "inspircd.h" -#ifndef __CMD_WALLOPS_H__ -#define __CMD_WALLOPS_H__ - -// include the common header files - -#include "users.h" -#include "channels.h" - /** Handle /WALLOPS. These command handlers can be reloaded by the core, * and handle basic RFC1459 commands. Commands within modules work * the same way, however, they can be fully unloaded, where these @@ -41,14 +33,18 @@ class CommandWallops : public Command CmdResult Handle(const std::vector<std::string>& parameters, User *user); }; -#endif - - - - CmdResult CommandWallops::Handle (const std::vector<std::string>& parameters, User *user) { - user->WriteWallOps(std::string(parameters[0])); + std::string wallop("WALLOPS :"); + wallop.append(parameters[0]); + + for (std::vector<User*>::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); i++) + { + User* t = *i; + if (t->IsModeSet('w')) + user->WriteTo(t,wallop); + } + FOREACH_MOD(I_OnWallops,OnWallops(user,parameters[0])); return CMD_SUCCESS; } diff --git a/src/modules.cpp b/src/modules.cpp index 7e4e0ec68..eb76897a2 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -784,54 +784,6 @@ void InspIRCd::SendMode(const std::vector<std::string>& parameters, User *user) this->Modes->Process(parameters, user); } -void InspIRCd::DumpText(User* user, const std::string &text) -{ - if (IS_LOCAL(user)) - { - user->Write(text); - } - else - { - PI->PushToClient(user, text); - } -} - -void InspIRCd::DumpText(User* user, const char *text, ...) -{ - va_list argsPtr; - char line[MAXBUF]; - - va_start(argsPtr, text); - vsnprintf(line, MAXBUF, text, argsPtr); - va_end(argsPtr); - - DumpText(user, std::string(line)); -} - -void InspIRCd::DumpText(User* user, 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 Word; - while (TextStream >> Word) - { - int len = Word.length(); - if (pos + len + 12 > MAXBUF) - { - line[pos] = '\0'; - DumpText(user, std::string(line)); - pos = start_pos; - } - line[pos] = ' '; - memcpy(line + pos + 1, Word.data(), len); - pos += len + 1; - } - line[pos] = '\0'; - DumpText(user, std::string(line)); -} - bool InspIRCd::AddResolver(Resolver* r, bool cached) { if (!cached) diff --git a/src/modules/m_alltime.cpp b/src/modules/m_alltime.cpp index b8174c7a6..cfd95d014 100644 --- a/src/modules/m_alltime.cpp +++ b/src/modules/m_alltime.cpp @@ -32,7 +32,7 @@ class CommandAlltime : public Command std::string msg = ":" + std::string(ServerInstance->Config->ServerName.c_str()) + " NOTICE " + user->nick + " :System time is " + fmtdate + "(" + ConvToStr(ServerInstance->Time()) + ") on " + ServerInstance->Config->ServerName; - ServerInstance->DumpText(user, msg); + user->SendText(msg); /* we want this routed out! */ return CMD_SUCCESS; diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index 4a89f9948..c7ec7a4db 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -389,7 +389,7 @@ public: if (now > (dat->lastnotify + (time_t)notify_cooldown)) { user->WriteNumeric(717, "%s %s :has been informed that you messaged them.", user->nick.c_str(), dest->nick.c_str()); - ServerInstance->DumpText(dest, ":%s 718 %s %s %s@%s :is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", + dest->SendText(":%s 718 %s %s %s@%s :is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", ServerInstance->Config->ServerName.c_str(), dest->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str(), user->nick.c_str()); dat->lastnotify = now; } diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp index 4b960e18b..0b222ba89 100644 --- a/src/modules/m_check.cpp +++ b/src/modules/m_check.cpp @@ -41,12 +41,12 @@ class CommandCheck : public Command ExtensionItem* item = i->first; std::string value = item->serialize(FORMAT_USER, ext, i->second); if (!value.empty()) - ServerInstance->DumpText(user, checkstr + " meta:" + item->key + " " + value); + user->SendText(checkstr + " meta:" + item->key + " " + value); else if (!item->key.empty()) dumpkeys << " " << item->key; } if (!dumpkeys.str().empty()) - ServerInstance->DumpText(user,checkstr + " metadata", dumpkeys); + user->SendText(checkstr + " metadata", dumpkeys); } CmdResult Handle (const std::vector<std::string> ¶meters, User *user) @@ -71,47 +71,47 @@ class CommandCheck : public Command * :server.name 304 target :CHECK END */ - ServerInstance->DumpText(user, checkstr + " START " + parameters[0]); + user->SendText(checkstr + " START " + parameters[0]); if (targuser) { /* /check on a user */ - ServerInstance->DumpText(user, checkstr + " nuh " + targuser->GetFullHost()); - ServerInstance->DumpText(user, checkstr + " realnuh " + targuser->GetFullRealHost()); - ServerInstance->DumpText(user, checkstr + " realname " + targuser->fullname); - ServerInstance->DumpText(user, checkstr + " modes +" + targuser->FormatModes()); - ServerInstance->DumpText(user, checkstr + " snomasks +" + targuser->FormatNoticeMasks()); - ServerInstance->DumpText(user, checkstr + " server " + targuser->server); - ServerInstance->DumpText(user, checkstr + " uid " + targuser->uuid); - ServerInstance->DumpText(user, checkstr + " signon " + timestring(targuser->signon)); - ServerInstance->DumpText(user, checkstr + " nickts " + timestring(targuser->age)); + user->SendText(checkstr + " nuh " + targuser->GetFullHost()); + user->SendText(checkstr + " realnuh " + targuser->GetFullRealHost()); + user->SendText(checkstr + " realname " + targuser->fullname); + user->SendText(checkstr + " modes +" + targuser->FormatModes()); + user->SendText(checkstr + " snomasks +" + targuser->FormatNoticeMasks()); + user->SendText(checkstr + " server " + targuser->server); + user->SendText(checkstr + " uid " + targuser->uuid); + user->SendText(checkstr + " signon " + timestring(targuser->signon)); + user->SendText(checkstr + " nickts " + timestring(targuser->age)); if (IS_LOCAL(targuser)) - ServerInstance->DumpText(user, checkstr + " lastmsg " + timestring(targuser->idle_lastmsg)); + user->SendText(checkstr + " lastmsg " + timestring(targuser->idle_lastmsg)); if (IS_AWAY(targuser)) { /* user is away */ - ServerInstance->DumpText(user, checkstr + " awaytime " + timestring(targuser->awaytime)); - ServerInstance->DumpText(user, checkstr + " awaymsg " + targuser->awaymsg); + user->SendText(checkstr + " awaytime " + timestring(targuser->awaytime)); + user->SendText(checkstr + " awaymsg " + targuser->awaymsg); } if (IS_OPER(targuser)) { /* user is an oper of type ____ */ - ServerInstance->DumpText(user, checkstr + " opertype " + irc::Spacify(targuser->oper.c_str())); + user->SendText(checkstr + " opertype " + irc::Spacify(targuser->oper.c_str())); } if (IS_LOCAL(targuser)) { - ServerInstance->DumpText(user, checkstr + " clientaddr " + irc::sockets::satouser(&targuser->client_sa)); - ServerInstance->DumpText(user, checkstr + " serveraddr " + irc::sockets::satouser(&targuser->server_sa)); + user->SendText(checkstr + " clientaddr " + irc::sockets::satouser(&targuser->client_sa)); + user->SendText(checkstr + " serveraddr " + irc::sockets::satouser(&targuser->server_sa)); std::string classname = targuser->GetClass()->name; if (!classname.empty()) - ServerInstance->DumpText(user, checkstr + " connectclass " + classname); + user->SendText(checkstr + " connectclass " + classname); } else - ServerInstance->DumpText(user, checkstr + " onip " + targuser->GetIPString()); + user->SendText(checkstr + " onip " + targuser->GetIPString()); for (UCListIter i = targuser->chans.begin(); i != targuser->chans.end(); i++) { @@ -121,25 +121,25 @@ class CommandCheck : public Command std::stringstream dump(chliststr); - ServerInstance->DumpText(user,checkstr + " onchans", dump); + user->SendText(checkstr + " onchans", dump); dumpExt(user, checkstr, targuser); } else if (targchan) { /* /check on a channel */ - ServerInstance->DumpText(user, checkstr + " timestamp " + timestring(targchan->age)); + user->SendText(checkstr + " timestamp " + timestring(targchan->age)); if (targchan->topic[0] != 0) { /* there is a topic, assume topic related information exists */ - ServerInstance->DumpText(user, checkstr + " topic " + targchan->topic); - ServerInstance->DumpText(user, checkstr + " topic_setby " + targchan->setby); - ServerInstance->DumpText(user, checkstr + " topic_setat " + timestring(targchan->topicset)); + user->SendText(checkstr + " topic " + targchan->topic); + user->SendText(checkstr + " topic_setby " + targchan->setby); + user->SendText(checkstr + " topic_setat " + timestring(targchan->topicset)); } - ServerInstance->DumpText(user, checkstr + " modes " + targchan->ChanModes(true)); - ServerInstance->DumpText(user, checkstr + " membercount " + ConvToStr(targchan->GetUserCounter())); + user->SendText(checkstr + " modes " + targchan->ChanModes(true)); + user->SendText(checkstr + " membercount " + ConvToStr(targchan->GetUserCounter())); /* now the ugly bit, spool current members of a channel. :| */ @@ -153,7 +153,7 @@ class CommandCheck : public Command * Unlike Asuka, I define a clone as coming from the same host. --w00t */ snprintf(tmpbuf, MAXBUF, "%-3lu %s%s (%s@%s) %s ", ServerInstance->Users->GlobalCloneCount(i->first), targchan->GetAllPrefixChars(i->first), i->first->nick.c_str(), i->first->ident.c_str(), i->first->dhost.c_str(), i->first->fullname.c_str()); - ServerInstance->DumpText(user, checkstr + " member " + tmpbuf); + user->SendText(checkstr + " member " + tmpbuf); } dumpExt(user, checkstr, targchan); @@ -169,20 +169,20 @@ class CommandCheck : public Command if (InspIRCd::Match(a->second->host, parameters[0], ascii_case_insensitive_map) || InspIRCd::Match(a->second->dhost, parameters[0], ascii_case_insensitive_map)) { /* host or vhost matches mask */ - ServerInstance->DumpText(user, checkstr + " match " + ConvToStr(++x) + " " + a->second->GetFullRealHost()); + user->SendText(checkstr + " match " + ConvToStr(++x) + " " + a->second->GetFullRealHost()); } /* IP address */ else if (InspIRCd::MatchCIDR(a->second->GetIPString(), parameters[0])) { /* same IP. */ - ServerInstance->DumpText(user, checkstr + " match " + ConvToStr(++x) + " " + a->second->GetFullRealHost()); + user->SendText(checkstr + " match " + ConvToStr(++x) + " " + a->second->GetFullRealHost()); } } - ServerInstance->DumpText(user, checkstr + " matches " + ConvToStr(x)); + user->SendText(checkstr + " matches " + ConvToStr(x)); } - ServerInstance->DumpText(user, checkstr + " END " + parameters[0]); + user->SendText(checkstr + " END " + parameters[0]); return CMD_SUCCESS; } diff --git a/src/modules/m_globalload.cpp b/src/modules/m_globalload.cpp index 50032919a..86b535f4e 100644 --- a/src/modules/m_globalload.cpp +++ b/src/modules/m_globalload.cpp @@ -76,7 +76,7 @@ class CommandGunloadmodule : public Command if (m && ServerInstance->Modules->Unload(m)) { ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBALLY UNLOADED BY '%s'",parameters[0].c_str(), user->nick.c_str()); - ServerInstance->DumpText(user, ":%s 973 %s %s :Module successfully unloaded.", + user->SendText(":%s 973 %s %s :Module successfully unloaded.", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), parameters[0].c_str()); } else diff --git a/src/modules/m_spanningtree/override_map.cpp b/src/modules/m_spanningtree/override_map.cpp index 7d09d939f..7c9247a06 100644 --- a/src/modules/m_spanningtree/override_map.cpp +++ b/src/modules/m_spanningtree/override_map.cpp @@ -170,13 +170,13 @@ bool ModuleSpanningTree::HandleMap(const std::vector<std::string>& parameters, U { // terminate the string at maxnamew characters names[100 * t + maxnamew] = '\0'; - ServerInstance->DumpText(user, ":%s %d %s :%s %s", ServerInstance->Config->ServerName.c_str(), + user->SendText(":%s %d %s :%s %s", ServerInstance->Config->ServerName.c_str(), RPL_MAP, user->nick.c_str(), names + 100 * t, stats + 50 * t); } - ServerInstance->DumpText(user, ":%s %d %s :%d server%s and %d user%s, average %.2f users per server", + user->SendText(":%s %d %s :%d server%s and %d user%s, average %.2f users per server", ServerInstance->Config->ServerName.c_str(), RPL_MAPUSERS, user->nick.c_str(), line, (line > 1 ? "s" : ""), totusers, (totusers > 1 ? "s" : ""), avg_users); - ServerInstance->DumpText(user, ":%s %d %s :End of /MAP", ServerInstance->Config->ServerName.c_str(), + user->SendText(":%s %d %s :End of /MAP", ServerInstance->Config->ServerName.c_str(), RPL_ENDMAP, user->nick.c_str()); delete[] names; diff --git a/src/users.cpp b/src/users.cpp index 616592495..2db223edb 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1341,32 +1341,48 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op } } -void User::WriteWallOps(const std::string &text) +void User::SendText(const std::string& line) { - std::string wallop("WALLOPS :"); - wallop.append(text); - - for (std::vector<User*>::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); i++) - { - User* t = *i; - if (t->IsModeSet('w')) - this->WriteTo(t,wallop); - } + if (IS_LOCAL(this)) + Write(line); + else if (!IS_SERVER(this)) + ServerInstance->PI->PushToClient(this, line); } -void User::WriteWallOps(const char* text, ...) +void User::SendText(const char *text, ...) { - if (!IS_LOCAL(this)) - return; - - char textbuffer[MAXBUF]; va_list argsPtr; + char line[MAXBUF]; va_start(argsPtr, text); - vsnprintf(textbuffer, MAXBUF, text, argsPtr); + vsnprintf(line, MAXBUF, text, argsPtr); va_end(argsPtr); - this->WriteWallOps(std::string(textbuffer)); + SendText(std::string(line)); +} + +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 Word; + while (TextStream >> Word) + { + int len = Word.length(); + if (pos + len + 12 > MAXBUF) + { + line[pos] = '\0'; + SendText(std::string(line)); + pos = start_pos; + } + line[pos] = ' '; + memcpy(line + pos + 1, Word.data(), len); + pos += len + 1; + } + line[pos] = '\0'; + SendText(std::string(line)); } /* return 0 or 1 depending if users u and u2 share one or more common channels @@ -1755,11 +1771,6 @@ void User::IncreasePenalty(int increase) this->Penalty += increase; } -void User::DecreasePenalty(int decrease) -{ - this->Penalty -= decrease; -} - void FakeUser::SetFakeServer(std::string name) { this->nick = name; |