/*
* 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
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
{
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;
}
};
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(); )
{
}
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");
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);
}
};