X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules%2Fircv3_replies.h;h=a974773681d8ac006439264755dfb84151687e2a;hb=HEAD;hp=fc7a7dac9eb95a6a52b8536f976de0f6c3f24417;hpb=8fe455f1dad5c7e3f6f7f638b0243cffedf322a3;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules/ircv3_replies.h b/include/modules/ircv3_replies.h index fc7a7dac9..a97477368 100644 --- a/include/modules/ircv3_replies.h +++ b/include/modules/ircv3_replies.h @@ -1,7 +1,7 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2019 Peter Powell + * Copyright (C) 2019-2021 Sadie Powell * * 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 @@ -16,9 +16,6 @@ * along with this program. If not, see . */ -// IMPORTANT: The contents of this file are experimental and are not presently -// covered by the InspIRCd API stability guarantee. - #pragma once @@ -28,6 +25,7 @@ namespace IRCv3 { namespace Replies { + class CapReference; class Reply; class Fail; class Note; @@ -35,16 +33,45 @@ namespace IRCv3 } } +/** Reference to the inspircd.org/standard-replies cap. */ +class IRCv3::Replies::CapReference + : public Cap::Reference +{ + public: + CapReference(Module* mod) + : Cap::Reference(mod, "inspircd.org/standard-replies") + { + } +}; + /** Base class for standard replies. */ class IRCv3::Replies::Reply { private: /** The name of the command for this reply. */ - std::string cmd; + const std::string cmd; /** The event provider for this reply. */ ClientProtocol::EventProvider evprov; + /** Wraps a message in an event and sends it to a user. + * @param user The user to send the message to. + * @param msg The message to send to the user. + */ + void SendInternal(LocalUser* user, ClientProtocol::Message& msg) + { + ClientProtocol::Event ev(evprov, msg); + user->Send(ev); + } + + void SendNoticeInternal(LocalUser* user, Command* command, const std::string& description) + { + if (command) + user->WriteNotice(InspIRCd::Format("*** %s: %s", command->name.c_str(), description.c_str())); + else + user->WriteNotice(InspIRCd::Format("*** %s", description.c_str())); + } + protected: /** Initializes a new instance of the Reply class. * @param Creator The module which created this instance. @@ -66,29 +93,165 @@ class IRCv3::Replies::Reply */ void Send(LocalUser* user, Command* command, const std::string& code, const std::string& description) { - ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->ServerName); - msg.PushParamRef(command->name); + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); + msg.PushParam(code); + msg.PushParam(description); + SendInternal(user, msg); + } + + template + void Send(LocalUser* user, Command* command, const std::string& code, const T1& p1, const std::string& description) + { + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); msg.PushParam(code); + msg.PushParam(ConvToStr(p1)); msg.PushParam(description); + SendInternal(user, msg); + } - ClientProtocol::Event ev(evprov, msg); - user->Send(ev); + template + void Send(LocalUser* user, Command* command, const std::string& code, const T1& p1, const T2& p2, + const std::string& description) + { + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); + msg.PushParam(code); + msg.PushParam(ConvToStr(p1)); + msg.PushParam(ConvToStr(p2)); + msg.PushParam(description); + SendInternal(user, msg); + } + + template + void Send(LocalUser* user, Command* command, const std::string& code, const T1& p1, const T2& p2, + const T3& p3, const std::string& description) + { + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); + msg.PushParam(code); + msg.PushParam(ConvToStr(p1)); + msg.PushParam(ConvToStr(p2)); + msg.PushParam(ConvToStr(p3)); + msg.PushParam(description); + SendInternal(user, msg); + } + + template + void Send(LocalUser* user, Command* command, const std::string& code, const T1& p1, const T2& p2, + const T3& p3, const T4& p4, const std::string& description) + { + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); + msg.PushParam(code); + msg.PushParam(ConvToStr(p1)); + msg.PushParam(ConvToStr(p2)); + msg.PushParam(ConvToStr(p3)); + msg.PushParam(ConvToStr(p4)); + msg.PushParam(description); + SendInternal(user, msg); + } + + template + void Send(LocalUser* user, Command* command, const std::string& code, const T1& p1, const T2& p2, + const T3& p3, const T4& p4, const T5& p5, const std::string& description) + { + ClientProtocol::Message msg(cmd.c_str(), ServerInstance->Config->GetServerName()); + if (command) + msg.PushParamRef(command->name); + else + msg.PushParam("*"); + msg.PushParam(code); + msg.PushParam(ConvToStr(p1)); + msg.PushParam(ConvToStr(p2)); + msg.PushParam(ConvToStr(p3)); + msg.PushParam(ConvToStr(p4)); + msg.PushParam(ConvToStr(p5)); + msg.PushParam(description); + SendInternal(user, msg); } /** * Sends a standard reply to the specified user if they have the specified cap - * or a notice if they do not.s + * or a notice if they do not. * @param user The user to send the reply to. * @param command The command that the reply relates to. * @param code A machine readable code for this reply. * @param description A human readable description of this reply. */ - void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, const std::string& description) + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const std::string& description) { if (cap.get(user)) Send(user, command, code, description); else - user->WriteNotice(InspIRCd::Format("*** %s: %s", command->name.c_str(), description.c_str())); + SendNoticeInternal(user, command, description); + } + + template + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const T1& p1, const std::string& description) + { + if (cap.get(user)) + Send(user, command, code, p1, description); + else + SendNoticeInternal(user, command, description); + } + + template + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const T1& p1, const T2& p2, const std::string& description) + { + if (cap.get(user)) + Send(user, command, code, p1, p2, description); + else + SendNoticeInternal(user, command, description); + } + + template + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const T1& p1, const T2& p2, const T3& p3, const std::string& description) + { + if (cap.get(user)) + Send(user, command, code, p1, p2, p3, description); + else + SendNoticeInternal(user, command, description); + } + + template + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const T1& p1, const T2& p2, const T3& p3, const T4& p4, const std::string& description) + { + if (cap.get(user)) + Send(user, command, code, p1, p2, p3, p4, description); + else + SendNoticeInternal(user, command, description); + } + + template + void SendIfCap(LocalUser* user, const Cap::Capability& cap, Command* command, const std::string& code, + const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const std::string& description) + { + if (cap.get(user)) + Send(user, command, code, p1, p2, p3, p4, p5, description); + else + SendNoticeInternal(user, command, description); } };