X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_ison.cpp;h=3f6b1ac74c2af68bcbfd866083f5ce34378f983e;hb=be91435ccb8e05c84ecd126b5c41b74c45f4535b;hp=ebb43bdf9c88fe392dba6a4b034b6fb12494a284;hpb=f62654a6859998f9d63eb22702c572d5ebcff15c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_ison.cpp b/src/coremods/core_ison.cpp index ebb43bdf9..3f6b1ac74 100644 --- a/src/coremods/core_ison.cpp +++ b/src/coremods/core_ison.cpp @@ -22,20 +22,14 @@ /** Handle /ISON. */ -class CommandIson : public Command +class CommandIson : public SplitCommand { - /** Helper function to append a nick to an ISON reply - * @param user User doing the /ISON - * @param toadd User to append to the ISON reply - * @param reply Reply string to append the nick to - * @param pos If the reply gets too long it is sent to the user and truncated from this position - */ - static bool AddNick(User* user, User* toadd, std::string& reply, const std::string::size_type pos); - public: /** Constructor for ison. */ - CommandIson ( Module* parent) : Command(parent,"ISON", 1) { + CommandIson(Module* parent) + : SplitCommand(parent, "ISON", 1) + { syntax = " {nick}"; } /** Handle command. @@ -43,54 +37,61 @@ class CommandIson : public Command * @param user The user issuing the command * @return A value from CmdResult to indicate command success or failure. */ - CmdResult Handle(const std::vector& parameters, User *user); + CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE; }; -bool CommandIson::AddNick(User* user, User* toadd, std::string& reply, const std::string::size_type pos) +class IsonReplyBuilder : public Numeric::Builder<' ', true> { - if ((toadd) && (toadd->registered == REG_ALL)) + public: + IsonReplyBuilder(LocalUser* user) + : Numeric::Builder<' ', true>(user, RPL_ISON) { - reply.append(toadd->nick).push_back(' '); - if (reply.length() > 450) - { - user->WriteServ(reply); - reply.erase(pos); - } - return true; } - return false; -} + + void AddNick(const std::string& nickname) + { + User* const user = ServerInstance->FindNickOnly(nickname); + if ((user) && (user->registered == REG_ALL)) + Add(user->nick); + } +}; /** Handle /ISON */ -CmdResult CommandIson::Handle (const std::vector& parameters, User *user) +CmdResult CommandIson::HandleLocal(LocalUser* user, const Params& parameters) { - std::string reply = "303 " + user->nick + " :"; - const std::string::size_type pos = reply.size(); + IsonReplyBuilder reply(user); - for (std::vector::const_iterator i = parameters.begin(); i != parameters.end(); ++i) + for (std::vector::const_iterator i = parameters.begin(); i != parameters.end()-1; ++i) { const std::string& targetstr = *i; - - User* const u = ServerInstance->FindNickOnly(targetstr); - if (!AddNick(user, u, reply, pos)) - { - if ((i == parameters.end() - 1) && (targetstr.find(' ') != std::string::npos)) - { - /* Its a space seperated list of nicks (RFC1459 says to support this) - */ - irc::spacesepstream list(targetstr); - std::string item; - - while (list.GetToken(item)) - AddNick(user, ServerInstance->FindNickOnly(item), reply, pos); - } - } + reply.AddNick(targetstr); } - user->WriteServ(reply); + // Last parameter can be a space separated list + irc::spacesepstream ss(parameters.back()); + for (std::string token; ss.GetToken(token); ) + reply.AddNick(token); + + reply.Flush(); return CMD_SUCCESS; } +class CoreModIson : public Module +{ + private: + CommandIson cmd; + + public: + CoreModIson() + : cmd(this) + { + } + + Version GetVersion() CXX11_OVERRIDE + { + return Version("Provides the ISON command", VF_CORE | VF_VENDOR); + } +}; -COMMAND_INIT(CommandIson) +MODULE_INIT(CoreModIson)