X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fcommands.h;h=a1a44daf53580c47bf09a2e4cf65508f892a60cc;hb=80e81e3b81b779901fd9d67f8ae030ee30c0bcec;hp=1bca635644d1f7d575994e25e2be87c20298d0db;hpb=9c2e2ef9d24c348f42261d32f424ad04865b19ef;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h index 1bca63564..a1a44daf5 100644 --- a/src/modules/m_spanningtree/commands.h +++ b/src/modules/m_spanningtree/commands.h @@ -1,7 +1,11 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2013, 2018-2019 Sadie Powell + * Copyright (C) 2012-2016 Attila Molnar + * Copyright (C) 2012 Robby * Copyright (C) 2010 Daniel De Graaf + * Copyright (C) 2010 Craig Edwards * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -19,122 +23,388 @@ #pragma once -#include "main.h" +#include "servercommand.h" +#include "commandbuilder.h" +#include "remoteuser.h" +#include "modules/away.h" + +namespace SpanningTree +{ + class CommandAway; + class CommandNick; + class CommandPing; + class CommandPong; + class CommandServer; +} + +using SpanningTree::CommandAway; +using SpanningTree::CommandNick; +using SpanningTree::CommandPing; +using SpanningTree::CommandPong; +using SpanningTree::CommandServer; /** Handle /RCONNECT */ class CommandRConnect : public Command { - SpanningTreeUtilities* Utils; /* Utility class */ public: - CommandRConnect (Module* Callback, SpanningTreeUtilities* Util); - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandRConnect(Module* Creator); + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; class CommandRSQuit : public Command { - SpanningTreeUtilities* Utils; /* Utility class */ public: - CommandRSQuit(Module* Callback, SpanningTreeUtilities* Util); - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandRSQuit(Module* Creator); + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -class CommandSVSJoin : public Command +class CommandMap : public Command { public: - CommandSVSJoin(Module* Creator) : Command(Creator, "SVSJOIN", 2) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandMap(Module* Creator); + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -class CommandSVSPart : public Command + +class CommandSVSJoin : public ServerCommand { public: - CommandSVSPart(Module* Creator) : Command(Creator, "SVSPART", 2) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandSVSJoin(Module* Creator) : ServerCommand(Creator, "SVSJOIN", 2) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -class CommandSVSNick : public Command + +class CommandSVSPart : public ServerCommand { public: - CommandSVSNick(Module* Creator) : Command(Creator, "SVSNICK", 3) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandSVSPart(Module* Creator) : ServerCommand(Creator, "SVSPART", 2) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -class CommandMetadata : public Command + +class CommandSVSNick : public ServerCommand { public: - CommandMetadata(Module* Creator) : Command(Creator, "METADATA", 2) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandSVSNick(Module* Creator) : ServerCommand(Creator, "SVSNICK", 3) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -class CommandUID : public Command + +class CommandMetadata : public ServerCommand { public: - CommandUID(Module* Creator) : Command(Creator, "UID", 10) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandMetadata(Module* Creator) : ServerCommand(Creator, "METADATA", 2) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + + class Builder : public CmdBuilder + { + public: + Builder(User* user, const std::string& key, const std::string& val); + Builder(Channel* chan, const std::string& key, const std::string& val); + Builder(const std::string& key, const std::string& val); + }; }; -class CommandOpertype : public Command + +class CommandUID : public ServerOnlyServerCommand { public: - CommandOpertype(Module* Creator) : Command(Creator, "OPERTYPE", 1) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandUID(Module* Creator) : ServerOnlyServerCommand(Creator, "UID", 10) { } + CmdResult HandleServer(TreeServer* server, CommandBase::Params& params); + + class Builder : public CmdBuilder + { + public: + Builder(User* user); + }; }; -class CommandFJoin : public Command + +class CommandOpertype : public UserOnlyServerCommand { public: - CommandFJoin(Module* Creator) : Command(Creator, "FJOIN", 3) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandOpertype(Module* Creator) : UserOnlyServerCommand(Creator, "OPERTYPE", 1) { } + CmdResult HandleRemote(RemoteUser* user, Params& params); + + class Builder : public CmdBuilder + { + public: + Builder(User* user); + }; +}; + +class TreeSocket; +class FwdFJoinBuilder; +class CommandFJoin : public ServerCommand +{ /** Remove all modes from a channel, including statusmodes (+qaovh etc), simplemodes, parameter modes. - * This does not update the timestamp of the target channel, this must be done seperately. + * This does not update the timestamp of the target channel, this must be done separately. + */ + static void RemoveStatus(Channel* c); + + /** + * Lowers the TS on the given channel: removes all modes, unsets all extensions, + * clears the topic and removes all pending invites. + * @param chan The target channel whose TS to lower + * @param TS The new TS to set + * @param newname The new name of the channel; must be the same or a case change of the current name + */ + static void LowerTS(Channel* chan, time_t TS, const std::string& newname); + void ProcessModeUUIDPair(const std::string& item, TreeServer* sourceserver, Channel* chan, Modes::ChangeList* modechangelist, FwdFJoinBuilder& fwdfjoin); + public: + CommandFJoin(Module* Creator) : ServerCommand(Creator, "FJOIN", 3) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_LOCALONLY; } + + class Builder : public CmdBuilder + { + /** Maximum possible Membership::Id length in decimal digits, used for determining whether a user will fit into + * a message or not + */ + static const size_t membid_max_digits = 20; + static const size_t maxline = 510; + std::string::size_type pos; + + protected: + void add(Membership* memb, std::string::const_iterator mbegin, std::string::const_iterator mend); + bool has_room(std::string::size_type nummodes) const; + + public: + Builder(Channel* chan, TreeServer* source = Utils->TreeRoot); + void add(Membership* memb) + { + add(memb, memb->modes.begin(), memb->modes.end()); + } + + bool has_room(Membership* memb) const + { + return has_room(memb->modes.size()); + } + + void clear(); + const std::string& finalize(); + }; +}; + +class CommandFMode : public ServerCommand +{ + public: + CommandFMode(Module* Creator) : ServerCommand(Creator, "FMODE", 3) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; +}; + +class CommandFTopic : public ServerCommand +{ + public: + CommandFTopic(Module* Creator) : ServerCommand(Creator, "FTOPIC", 4, 5) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + + class Builder : public CmdBuilder + { + public: + Builder(Channel* chan); + Builder(User* user, Channel* chan); + }; +}; + +class CommandFHost : public UserOnlyServerCommand +{ + public: + CommandFHost(Module* Creator) : UserOnlyServerCommand(Creator, "FHOST", 1) { } + CmdResult HandleRemote(RemoteUser* user, Params& params); +}; + +class CommandFIdent : public UserOnlyServerCommand +{ + public: + CommandFIdent(Module* Creator) : UserOnlyServerCommand(Creator, "FIDENT", 1) { } + CmdResult HandleRemote(RemoteUser* user, Params& params); +}; + +class CommandFName : public UserOnlyServerCommand +{ + public: + CommandFName(Module* Creator) : UserOnlyServerCommand(Creator, "FNAME", 1) { } + CmdResult HandleRemote(RemoteUser* user, Params& params); +}; + +class CommandIJoin : public UserOnlyServerCommand +{ + public: + CommandIJoin(Module* Creator) : UserOnlyServerCommand(Creator, "IJOIN", 2) { } + CmdResult HandleRemote(RemoteUser* user, Params& params); +}; + +class CommandResync : public ServerOnlyServerCommand +{ + public: + CommandResync(Module* Creator) : ServerOnlyServerCommand(Creator, "RESYNC", 1) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_LOCALONLY; } +}; + +class SpanningTree::CommandAway : public UserOnlyServerCommand +{ + private: + Away::EventProvider awayevprov; + + public: + CommandAway(Module* Creator) + : UserOnlyServerCommand(Creator, "AWAY", 0, 2) + , awayevprov(Creator) + { + } + CmdResult HandleRemote(::RemoteUser* user, Params& parameters); + + class Builder : public CmdBuilder + { + public: + Builder(User* user); + }; +}; + +class XLine; +class CommandAddLine : public ServerCommand +{ + public: + CommandAddLine(Module* Creator) : ServerCommand(Creator, "ADDLINE", 6, 6) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; + + class Builder : public CmdBuilder + { + public: + Builder(XLine* xline, User* user = ServerInstance->FakeClient); + }; +}; + +class CommandDelLine : public ServerCommand +{ + public: + CommandDelLine(Module* Creator) : ServerCommand(Creator, "DELLINE", 2, 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; +}; + +class CommandEncap : public ServerCommand +{ + public: + CommandEncap(Module* Creator) : ServerCommand(Creator, "ENCAP", 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; +}; + +class CommandIdle : public UserOnlyServerCommand +{ + public: + CommandIdle(Module* Creator) : UserOnlyServerCommand(Creator, "IDLE", 1) { } + CmdResult HandleRemote(RemoteUser* user, Params& parameters); + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_UNICAST(parameters[0]); } +}; + +class SpanningTree::CommandNick : public UserOnlyServerCommand +{ + public: + CommandNick(Module* Creator) : UserOnlyServerCommand(Creator, "NICK", 2) { } + CmdResult HandleRemote(::RemoteUser* user, Params& parameters); +}; + +class SpanningTree::CommandPing : public ServerCommand +{ + public: + CommandPing(Module* Creator) : ServerCommand(Creator, "PING", 1) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_UNICAST(parameters[0]); } +}; + +class SpanningTree::CommandPong : public ServerOnlyServerCommand +{ + public: + CommandPong(Module* Creator) : ServerOnlyServerCommand(Creator, "PONG", 1) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_UNICAST(parameters[0]); } +}; + +class DllExport CommandSave : public ServerCommand +{ + public: + /** Timestamp of the uuid nick of all users who collided and got their nick changed to uuid */ - void RemoveStatus(User* source, parameterlist ¶ms); + static const time_t SavedTimestamp = 100; + + CommandSave(Module* Creator) : ServerCommand(Creator, "SAVE", 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; }; -class CommandFMode : public Command + +class SpanningTree::CommandServer : public ServerOnlyServerCommand { + static void HandleExtra(TreeServer* newserver, Params& params); + public: - CommandFMode(Module* Creator) : Command(Creator, "FMODE", 3) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandServer(Module* Creator) : ServerOnlyServerCommand(Creator, "SERVER", 3) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); + + class Builder : public CmdBuilder + { + void push_property(const char* key, const std::string& val) + { + push(key).push_raw('=').push_raw(val); + } + public: + Builder(TreeServer* server); + }; }; -class CommandFTopic : public Command + +class CommandSQuit : public ServerOnlyServerCommand { public: - CommandFTopic(Module* Creator) : Command(Creator, "FTOPIC", 4) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandSQuit(Module* Creator) : ServerOnlyServerCommand(Creator, "SQUIT", 2) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); }; -class CommandFHost : public Command + +class CommandSNONotice : public ServerCommand { public: - CommandFHost(Module* Creator) : Command(Creator, "FHOST", 1) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandSNONotice(Module* Creator) : ServerCommand(Creator, "SNONOTICE", 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; }; -class CommandFIdent : public Command + +class CommandEndBurst : public ServerOnlyServerCommand { public: - CommandFIdent(Module* Creator) : Command(Creator, "FIDENT", 1) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandEndBurst(Module* Creator) : ServerOnlyServerCommand(Creator, "ENDBURST") { } + CmdResult HandleServer(TreeServer* server, Params& parameters); }; -class CommandFName : public Command + +class CommandSInfo : public ServerOnlyServerCommand { public: - CommandFName(Module* Creator) : Command(Creator, "FNAME", 1) { flags_needed = FLAG_SERVERONLY; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } + CommandSInfo(Module* Creator) : ServerOnlyServerCommand(Creator, "SINFO", 2) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); + + class Builder : public CmdBuilder + { + public: + Builder(TreeServer* server, const char* type, const std::string& value); + }; +}; + +class CommandNum : public ServerOnlyServerCommand +{ + public: + CommandNum(Module* Creator) : ServerOnlyServerCommand(Creator, "NUM", 3) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; + + class Builder : public CmdBuilder + { + public: + Builder(SpanningTree::RemoteUser* target, const Numeric::Numeric& numeric); + }; }; class SpanningTreeCommands { public: - CommandRConnect rconnect; - CommandRSQuit rsquit; CommandSVSJoin svsjoin; CommandSVSPart svspart; CommandSVSNick svsnick; @@ -142,10 +412,27 @@ class SpanningTreeCommands CommandUID uid; CommandOpertype opertype; CommandFJoin fjoin; + CommandIJoin ijoin; + CommandResync resync; CommandFMode fmode; CommandFTopic ftopic; CommandFHost fhost; CommandFIdent fident; CommandFName fname; + SpanningTree::CommandAway away; + CommandAddLine addline; + CommandDelLine delline; + CommandEncap encap; + CommandIdle idle; + SpanningTree::CommandNick nick; + SpanningTree::CommandPing ping; + SpanningTree::CommandPong pong; + CommandSave save; + SpanningTree::CommandServer server; + CommandSQuit squit; + CommandSNONotice snonotice; + CommandEndBurst endburst; + CommandSInfo sinfo; + CommandNum num; SpanningTreeCommands(ModuleSpanningTree* module); };