]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules/ircv3_replies.h
Update copyright headers.
[user/henk/code/inspircd.git] / include / modules / ircv3_replies.h
index f87b267a2f6870094597b7b5df5698b6586d7cf9..a974773681d8ac006439264755dfb84151687e2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2019-2021 Sadie Powell <sadie@witchery.services>
  *
  * 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
@@ -25,6 +25,7 @@ namespace IRCv3
 {
        namespace Replies
        {
+               class CapReference;
                class Reply;
                class Fail;
                class Note;
@@ -32,6 +33,17 @@ 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
 {
@@ -52,6 +64,14 @@ class IRCv3::Replies::Reply
                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.
@@ -73,8 +93,11 @@ 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);
@@ -83,8 +106,11 @@ class IRCv3::Replies::Reply
        template<typename T1>
        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->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(ConvToStr(p1));
                msg.PushParam(description);
@@ -95,8 +121,11 @@ class IRCv3::Replies::Reply
        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->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(ConvToStr(p1));
                msg.PushParam(ConvToStr(p2));
@@ -108,8 +137,11 @@ class IRCv3::Replies::Reply
        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->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(ConvToStr(p1));
                msg.PushParam(ConvToStr(p2));
@@ -122,8 +154,11 @@ class IRCv3::Replies::Reply
        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->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(ConvToStr(p1));
                msg.PushParam(ConvToStr(p2));
@@ -137,8 +172,11 @@ class IRCv3::Replies::Reply
        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->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(ConvToStr(p1));
                msg.PushParam(ConvToStr(p2));
@@ -163,7 +201,57 @@ class IRCv3::Replies::Reply
                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<typename T1>
+       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<typename T1, typename T2>
+       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<typename T1, typename T2, typename T3>
+       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<typename T1, typename T2, typename T3, typename T4>
+       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<typename T1, typename T2, typename T3, typename T4, typename T5>
+       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);
        }
 };