X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fcommands.h;h=a1a44daf53580c47bf09a2e4cf65508f892a60cc;hb=80e81e3b81b779901fd9d67f8ae030ee30c0bcec;hp=0eb90efb8cb331624530bbb7a1930431d2ff88fc;hpb=cd712c40e1b352c05e7ae0f72e0a5e84cdf64323;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h index 0eb90efb8..a1a44daf5 100644 --- a/src/modules/m_spanningtree/commands.h +++ b/src/modules/m_spanningtree/commands.h @@ -1,60 +1,438 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * 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 program is free but copyrighted software; see - * the file COPYING for details. + * 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 + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ -#ifndef __COMMANDS_H__ -#define __COMMANDS_H__ + +#pragma once + +#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); - void NoticeUser(User* user, const std::string &msg); + CommandRSQuit(Module* Creator); + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; +}; + +class CommandMap : public Command +{ + public: + CommandMap(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 CommandSVSJoin : public ServerCommand { public: - CommandSVSJoin(Module* Creator) : Command(Creator, "SVSJOIN", 2) { flags_needed = 'o'; } - 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 CommandSVSPart : public Command + +class CommandSVSPart : public ServerCommand { public: - CommandSVSPart(Module* Creator) : Command(Creator, "SVSPART", 2) { flags_needed = 'o'; } - 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 CommandSVSNick : public Command + +class CommandSVSNick : public ServerCommand { public: - CommandSVSNick(Module* Creator) : Command(Creator, "SVSNICK", 2) { flags_needed = 'o'; } - CmdResult Handle (const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters); + CommandSVSNick(Module* Creator) : ServerCommand(Creator, "SVSNICK", 3) { } + CmdResult Handle(User* user, Params& params) CXX11_OVERRIDE; + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE; }; -#endif +class CommandMetadata : public ServerCommand +{ + public: + 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 CommandUID : public ServerOnlyServerCommand +{ + public: + CommandUID(Module* Creator) : ServerOnlyServerCommand(Creator, "UID", 10) { } + CmdResult HandleServer(TreeServer* server, CommandBase::Params& params); + + class Builder : public CmdBuilder + { + public: + Builder(User* user); + }; +}; + +class CommandOpertype : public UserOnlyServerCommand +{ + public: + 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 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 + */ + static const time_t SavedTimestamp = 100; + + CommandSave(Module* Creator) : ServerCommand(Creator, "SAVE", 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; +}; + +class SpanningTree::CommandServer : public ServerOnlyServerCommand +{ + static void HandleExtra(TreeServer* newserver, Params& params); + + public: + 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 CommandSQuit : public ServerOnlyServerCommand +{ + public: + CommandSQuit(Module* Creator) : ServerOnlyServerCommand(Creator, "SQUIT", 2) { } + CmdResult HandleServer(TreeServer* server, Params& parameters); +}; + +class CommandSNONotice : public ServerCommand +{ + public: + CommandSNONotice(Module* Creator) : ServerCommand(Creator, "SNONOTICE", 2) { } + CmdResult Handle(User* user, Params& parameters) CXX11_OVERRIDE; +}; + +class CommandEndBurst : public ServerOnlyServerCommand +{ + public: + CommandEndBurst(Module* Creator) : ServerOnlyServerCommand(Creator, "ENDBURST") { } + CmdResult HandleServer(TreeServer* server, Params& parameters); +}; + +class CommandSInfo : public ServerOnlyServerCommand +{ + public: + 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: + CommandSVSJoin svsjoin; + CommandSVSPart svspart; + CommandSVSNick svsnick; + CommandMetadata metadata; + 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); +};