From 0377d937c5d1bf20fa0c29d4a41c7fd89502ab38 Mon Sep 17 00:00:00 2001 From: danieldg Date: Wed, 2 Sep 2009 00:53:03 +0000 Subject: [PATCH] Remote user messaging fixes Add format string output to DumpText Fix PI->PushToClient prefixing issue Fix ENCAP routing to use SID rather than server name git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11658 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/inspircd.h | 6 +++ src/modules.cpp | 22 +++++++++-- src/modules/m_alltime.cpp | 9 +---- src/modules/m_callerid.cpp | 10 +---- src/modules/m_check.cpp | 2 +- src/modules/m_spanningtree/override_map.cpp | 38 ++++++------------- src/modules/m_spanningtree/postcommand.cpp | 9 ++++- .../m_spanningtree/protocolinterface.cpp | 2 +- 8 files changed, 48 insertions(+), 50 deletions(-) diff --git a/include/inspircd.h b/include/inspircd.h index 440b5f1b9..f16a1a40d 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -770,6 +770,12 @@ class CoreExport InspIRCd : public classbase */ 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/src/modules.cpp b/src/modules.cpp index 9632718ee..2e3623b4a 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -777,15 +777,28 @@ void InspIRCd::DumpText(User* user, const std::string &text) } else { - PI->PushToClient(user, ":" + text); + 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 = snprintf(line, MAXBUF, ":%s %s", Config->ServerName, LinePrefix.c_str()); + int start_pos = LinePrefix.length(); int pos = start_pos; + memcpy(line, LinePrefix.data(), pos); std::string Word; while (TextStream >> Word) { @@ -793,14 +806,15 @@ void InspIRCd::DumpText(User* user, const std::string &LinePrefix, std::stringst if (pos + len + 12 > MAXBUF) { line[pos] = '\0'; - DumpText(user, line); + DumpText(user, std::string(line)); pos = start_pos; } line[pos] = ' '; memcpy(line + pos + 1, Word.data(), len); pos += len + 1; } - DumpText(user, line); + line[pos] = '\0'; + DumpText(user, std::string(line)); } bool InspIRCd::AddResolver(Resolver* r, bool cached) diff --git a/src/modules/m_alltime.cpp b/src/modules/m_alltime.cpp index 7121ac4c7..5f7c83f3c 100644 --- a/src/modules/m_alltime.cpp +++ b/src/modules/m_alltime.cpp @@ -32,14 +32,7 @@ class CommandAlltime : public Command std::string msg = ":" + std::string(ServerInstance->Config->ServerName) + " NOTICE " + user->nick + " :System time is " + fmtdate + "(" + ConvToStr(ServerInstance->Time()) + ") on " + ServerInstance->Config->ServerName; - if (IS_LOCAL(user)) - { - user->Write(msg); - } - else - { - ServerInstance->PI->PushToClient(user, ":" + msg); - } + ServerInstance->DumpText(user, msg); /* we want this routed out! */ return CMD_SUCCESS; diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index 4c490a334..28c7f80f3 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -386,14 +386,8 @@ 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()); - if (IS_LOCAL(dest)) - { - dest->WriteNumeric(718, "%s %s %s@%s :is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", dest->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str(), user->nick.c_str()); - } - else - { - ServerInstance->PI->PushToClient(dest, std::string("::") + ServerInstance->Config->ServerName + " 718 " + dest->nick + " " + user->nick + " " + user->ident + "@" + user->dhost + " :is messaging you, and you have umode +g. Use /ACCEPT +" + user->nick + " to allow."); - } + ServerInstance->DumpText(dest, ":%s 718 %s %s %s@%s :is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", + ServerInstance->Config->ServerName, dest->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str(), user->nick.c_str()); dat->lastnotify = now; } return MOD_RES_DENY; diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp index 15f5a42b6..7f85b1869 100644 --- a/src/modules/m_check.cpp +++ b/src/modules/m_check.cpp @@ -116,7 +116,7 @@ class CommandCheck : public Command chliststr = targuser->ChannelList(targuser); std::stringstream dump(chliststr); - ServerInstance->DumpText(user,checkstr + " onchans ", dump); + ServerInstance->DumpText(user,checkstr + " onchans", dump); FOREACH_MOD_I(ServerInstance,I_OnSyncUser,OnSyncUser(targuser,creator,(void*)user)); dumpExtra(user, checkstr, targuser); diff --git a/src/modules/m_spanningtree/override_map.cpp b/src/modules/m_spanningtree/override_map.cpp index e3f103cc8..9a7f007e3 100644 --- a/src/modules/m_spanningtree/override_map.cpp +++ b/src/modules/m_spanningtree/override_map.cpp @@ -156,36 +156,20 @@ bool ModuleSpanningTree::HandleMap(const std::vector& parameters, U float avg_users = totusers * 1.0 / totservers; - // dump the whole lot to the user. - if (IS_LOCAL(user)) + ServerInstance->Logs->Log("map",DEBUG,"local"); + for (int t = 0; t < line; t++) { - ServerInstance->Logs->Log("map",DEBUG,"local"); - for (int t = 0; t < line; t++) - { - // terminate the string at maxnamew characters - names[100 * t + maxnamew] = '\0'; - user->WriteNumeric(RPL_MAP, "%s :%s %s",user->nick.c_str(),names + 100 * t, stats + 50 * t); - } - user->WriteNumeric(RPL_MAPUSERS, "%s :%d server%s and %d user%s, average %.2f users per server",user->nick.c_str(),totservers,(totservers > 1 ? "s" : ""),totusers,(totusers > 1 ? "s" : ""),avg_users); - user->WriteNumeric(RPL_ENDMAP, "%s :End of /MAP",user->nick.c_str()); + // terminate the string at maxnamew characters + names[100 * t + maxnamew] = '\0'; + ServerInstance->DumpText(user, ":%s %d %s :%s %s", ServerInstance->Config->ServerName, + RPL_MAP, user->nick.c_str(), names + 100 * t, stats + 50 * t); } - else - { - ServerInstance->Logs->Log("map", DEBUG, "remote dump lines=%d", line); + ServerInstance->DumpText(user, ":%s %d %s :%d server%s and %d user%s, average %.2f users per server", + ServerInstance->Config->ServerName, RPL_MAPUSERS, user->nick.c_str(), + totservers, (totservers > 1 ? "s" : ""), totusers, (totusers > 1 ? "s" : ""), avg_users); + ServerInstance->DumpText(user, ":%s %d %s :End of /MAP", ServerInstance->Config->ServerName, + RPL_ENDMAP, user->nick.c_str()); - // XXX: annoying that we have to use hardcoded numerics here.. - for (int t = 0; t < line; t++) - { - // terminate the string at maxnamew characters - char* name = names + 100 * t; - char* stat = stats + 50 * t; - name[maxnamew] = '\0'; - ServerInstance->PI->PushToClient(user, std::string("::") + ServerInstance->Config->ServerName + " 006 " + user->nick + " :" + name + " " + stat); - } - - ServerInstance->PI->PushToClient(user, std::string("::") + ServerInstance->Config->ServerName + " 270 " + user->nick + " :" + ConvToStr(totservers) + " server"+(totservers > 1 ? "s" : "") + " and " + ConvToStr(totusers) + " user"+(totusers > 1 ? "s" : "") + ", average " + ConvToStr(avg_users) + " users per server"); - ServerInstance->PI->PushToClient(user, std::string("::") + ServerInstance->Config->ServerName + " 007 " + user->nick + " :End of /MAP"); - } delete[] names; delete[] stats; diff --git a/src/modules/m_spanningtree/postcommand.cpp b/src/modules/m_spanningtree/postcommand.cpp index 0988fe099..d2cea154a 100644 --- a/src/modules/m_spanningtree/postcommand.cpp +++ b/src/modules/m_spanningtree/postcommand.cpp @@ -54,7 +54,14 @@ void ModuleSpanningTree::OnPostCommand(const std::string &command, const std::ve } else if (routing.type == ROUTE_TYPE_OPT_UCAST) { - params.push_back(routing.serverdest); + TreeServer* sdest = Utils->FindServer(routing.serverdest); + if (!sdest) + { + ServerInstance->Logs->Log("m_spanningtree",ERROR,"Trying to route ENCAP to nonexistant server %s", + routing.serverdest.c_str()); + return; + } + params.push_back(sdest->GetID()); params.push_back(command); sent_cmd = "ENCAP"; } diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp index 804a451ca..2e3237efd 100644 --- a/src/modules/m_spanningtree/protocolinterface.cpp +++ b/src/modules/m_spanningtree/protocolinterface.cpp @@ -114,7 +114,7 @@ void SpanningTreeProtocolInterface::PushToClient(User* target, const std::string { parameterlist p; p.push_back(target->uuid); - p.push_back(rawline); + p.push_back(":" + rawline); Utils->DoOneToOne(ServerInstance->Config->GetSID(), "PUSH", p, target->server); } -- 2.39.2