]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_helpop.cpp
Fix the cloaking module on C++98 compilers.
[user/henk/code/inspircd.git] / src / modules / m_helpop.cpp
index a34e3ff9407889b523eee56950ff28fe0ac5d772..f1f26a5eeb9c40d7b95594bdfeaaa02bfee08f0d 100644 (file)
@@ -1,14 +1,14 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013-2015 Attila Molnar <attilamolnar@hush.com>
  *   Copyright (C) 2013, 2017-2018, 2020 Sadie Powell <sadie@witchery.services>
- *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2013, 2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
  *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
- *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2006-2007 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2006 Craig Edwards <brain@inspircd.org>
  *
  * 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
@@ -41,7 +41,22 @@ enum
 
 typedef std::vector<std::string> HelpMessage;
 
-typedef std::map<std::string, HelpMessage, irc::insensitive_swo> HelpMap;
+struct HelpTopic
+{
+       // The body of the help topic.
+       const HelpMessage body;
+
+       // The title of the help topic.
+       const std::string title;
+
+       HelpTopic(const HelpMessage& Body, const std::string& Title)
+               : body(Body)
+               , title(Title)
+       {
+       }
+};
+
+typedef std::map<std::string, HelpTopic, irc::insensitive_swo> HelpMap;
 
 class CommandHelpop : public Command
 {
@@ -69,10 +84,11 @@ class CommandHelpop : public Command
                        return CMD_FAILURE;
                }
 
-               user->WriteNumeric(RPL_HELPSTART, topic, InspIRCd::Format("*** Help for %s", topic.c_str()));
-               for (HelpMessage::const_iterator liter = titer->second.begin(); liter != titer->second.end(); ++liter)
+               const HelpTopic& entry = titer->second;
+               user->WriteNumeric(RPL_HELPSTART, topic, entry.title);
+               for (HelpMessage::const_iterator liter = entry.body.begin(); liter != entry.body.end(); ++liter)
                        user->WriteNumeric(RPL_HELPTXT, topic, *liter);
-               user->WriteNumeric(RPL_ENDOFHELP, topic, "*** End of help");
+               user->WriteNumeric(RPL_ENDOFHELP, topic, "End of /HELPOP.");
                return CMD_SUCCESS;
        }
 };
@@ -126,11 +142,18 @@ class ModuleHelpop
                                irc::sepstream linestream(value, '\n', true);
                                for (std::string line; linestream.GetToken(line); )
                                        helpmsg.push_back(line.empty() ? " " : line);
-                               newhelp[key] = helpmsg;
+
+                               // Read the help title and store the topic.
+                               const std::string title = tag->getString("title", InspIRCd::Format("*** Help for %s", key.c_str()), 1);
+                               if (!newhelp.insert(std::make_pair(key, HelpTopic(helpmsg, title))).second)
+                               {
+                                       throw ModuleException(InspIRCd::Format("<helpop> tag with duplicate key '%s' at %s",
+                                               key.c_str(), tag->getTagLocation().c_str()));
+                               }
                        }
 
                        // The number of items we can fit on a page.
-                       HelpMessage& indexmsg = newhelp["index"];
+                       HelpMessage indexmsg;
                        size_t maxcolumns = 80 / (longestkey + 2);
                        for (HelpMap::iterator iter = newhelp.begin(); iter != newhelp.end(); )
                        {
@@ -147,6 +170,7 @@ class ModuleHelpop
                                }
                                indexmsg.push_back(indexline);
                        }
+                       newhelp.insert(std::make_pair("index", HelpTopic(indexmsg, "List of help topics")));
                        cmd.help.swap(newhelp);
 
                        ConfigTag* tag = ServerInstance->Config->ConfValue("helpmsg");
@@ -161,7 +185,7 @@ class ModuleHelpop
 
                Version GetVersion() CXX11_OVERRIDE
                {
-                       return Version("Provides help to users via the HELPOP command", VF_VENDOR);
+                       return Version("Adds the /HELPOP command which allows users to view help on various topics and user mode h (helpop) which marks a server operator as being available for help.", VF_VENDOR);
                }
 };