From: brain Date: Tue, 3 Oct 2006 13:46:28 +0000 (+0000) Subject: New helper class irc::stringjoiner - it pwns you. X-Git-Tag: v2.0.23~6957 X-Git-Url: https://git.netwichtig.de/gitweb/?a=commitdiff_plain;h=9716d24be9e3e567308f6d144a65eeaccd65484a;p=user%2Fhenk%2Fcode%2Finspircd.git New helper class irc::stringjoiner - it pwns you. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5403 e03df62e-2008-0410-955e-edbf42e46eb7 --- diff --git a/include/hashcomp.h b/include/hashcomp.h index f4b690caf..a99b5e76b 100644 --- a/include/hashcomp.h +++ b/include/hashcomp.h @@ -123,6 +123,29 @@ namespace irc bool operator()(const insp_inaddr &s1, const insp_inaddr &s2) const; }; + /** irc::stringjoiner joins string lists into a string, using + * the given seperator string. + */ + class stringjoiner + { + private: + std::string joined; + public: + /** Join elements of a vector, between (and including) begin and end + */ + stringjoiner(const std::string &seperator, const std::vector &sequence, int begin, int end); + /** Join elements of a deque, between (and including) begin and end + */ + stringjoiner(const std::string &seperator, const std::deque &sequence, int begin, int end); + /** Join elements of an array of char arrays, between (and including) begin and end + */ + stringjoiner(const std::string &seperator, const char** sequence, int begin, int end); + + /** Get the joined sequence + */ + std::string& GetJoined(); + }; + /** irc::modestacker stacks mode sequences into a list. * It can then reproduce this list, clamped to a maximum of MAXMODES * values per line. diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index 2acd59f91..0908e41b5 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -354,3 +354,30 @@ int irc::modestacker::GetStackedLine(std::deque &result) return n; } + +irc::stringjoiner::stringjoiner(const std::string &seperator, const std::vector &sequence, int begin, int end) +{ + for (int v = begin; v < end; v++) + joined.append(sequence[v]).append(seperator); + joined.append(sequence[end]); +} + +irc::stringjoiner::stringjoiner(const std::string &seperator, const std::deque &sequence, int begin, int end) +{ + for (int v = begin; v < end; v++) + joined.append(sequence[v]).append(seperator); + joined.append(sequence[end]); +} + +irc::stringjoiner::stringjoiner(const std::string &seperator, const char** sequence, int begin, int end) +{ + for (int v = begin; v < end; v++) + joined.append(sequence[v]).append(seperator); + joined.append(sequence[end]); +} + +std::string& irc::stringjoiner::GetJoined() +{ + return joined; +} + diff --git a/src/modules/m_remove.cpp b/src/modules/m_remove.cpp index 839530487..be4292e56 100644 --- a/src/modules/m_remove.cpp +++ b/src/modules/m_remove.cpp @@ -48,7 +48,8 @@ class RemoveBase enum ModeLevel { PEON = 0, HALFOP = 1, OP = 2, ADMIN = 3, OWNER = 4, ULINE = 5 }; /* This little function just converts a chanmode character (U ~ & @ & +) into an integer (5 4 3 2 1 0) */ - /* XXX - this could be handy in the core, so it can be used elsewhere */ + /* XXX - We should probably use the new mode prefix rank stuff + * for this instead now -- Brain */ ModeLevel chartolevel(const std::string &privs) { if(privs.empty()) @@ -180,20 +181,16 @@ class RemoveBase if ((ulevel > PEON) && (ulevel >= tlevel) && (tlevel != OWNER)) { // no you can't just go from a std::ostringstream to a std::string, Om. -nenolod - std::ostringstream reason_stream; - std::string reasonparam; + // but you can do this, nenolod -brain + + std::string reasonparam("No reason given"); /* If a reason is given, use it */ if(pcnt > 2) { - /* Use all the remaining parameters as the reason */ - for(int i = 2; i < pcnt; i++) - { - reason_stream << " " << parameters[i]; - } - - reasonparam = reason_stream.str(); - reason_stream.clear(); + /* Join params 2 ... pcnt - 1 (inclusive) into one */ + irc::stringjoiner reason_join(" ", parameters, 2, pcnt - 1); + reasonparam = reason_join.GetJoined(); } /* Build up the part reason string. */ diff --git a/src/modules/m_saquit.cpp b/src/modules/m_saquit.cpp index 54eaf7ea8..20ffdd99e 100644 --- a/src/modules/m_saquit.cpp +++ b/src/modules/m_saquit.cpp @@ -57,13 +57,9 @@ class cmd_saquit : public command_t user->WriteServ("990 %s :Cannot use an SA command on a u-lined client",user->nick); return CMD_FAILURE; } - std::string line = ""; - for (int i = 1; i < pcnt - 1; i++) - { - line = line + std::string(parameters[i]) + " "; - } - line = line + std::string(parameters[pcnt-1]); - + irc::stringjoiner reason_join(" ", parameters, 1, pcnt - 1); + std::string line = reason_join.GetJoined(); + ServerInstance->WriteOpers(std::string(user->nick)+" used SAQUIT to make "+std::string(dest->nick)+" quit with a reason of "+line); userrec::QuitUser(ServerInstance, dest, line);