diff options
-rw-r--r-- | docs/conf/helpop-full.conf.example | 7 | ||||
-rw-r--r-- | docs/conf/helpop.conf.example | 2 | ||||
-rw-r--r-- | docs/conf/inspircd.conf.example | 5 | ||||
-rw-r--r-- | docs/conf/modules.conf.example | 37 | ||||
-rw-r--r-- | docs/conf/rules.txt.example | 3 | ||||
-rw-r--r-- | src/commands/cmd_rules.cpp | 77 | ||||
-rw-r--r-- | src/configreader.cpp | 4 | ||||
-rw-r--r-- | src/modules/m_showfile.cpp | 175 | ||||
-rw-r--r-- | src/modules/m_spanningtree/compat.cpp | 4 |
9 files changed, 220 insertions, 94 deletions
diff --git a/docs/conf/helpop-full.conf.example b/docs/conf/helpop-full.conf.example index bddb5846a..a6d3c7cd1 100644 --- a/docs/conf/helpop-full.conf.example +++ b/docs/conf/helpop-full.conf.example @@ -34,7 +34,7 @@ UNINVITE AWAY DCCALLOW SILENCE ACCEPT MKPASSWD VHOST TITLE SETNAME WHOIS WHOWAS ISON USERHOST WATCH -LIST NAMES WHO MOTD RULES +LIST NAMES WHO MOTD ADMIN MAP LINKS LUSERS TIME STATS VERSION INFO MODULES COMMANDS SSLINFO @@ -264,11 +264,6 @@ Show the message of the day for [server]. Messages of the day often contain important server rules and notices and should be read prior to using a server."> -<helpop key="rules" value="/RULES - -Show the rules file for the local server. This is similar in effect to -except that these are not sent automatically on connect."> - <helpop key="oper" value="/OPER [login] [password] Attempts to authenticate a user as an IRC operator. diff --git a/docs/conf/helpop.conf.example b/docs/conf/helpop.conf.example index 2c5102fcc..5f33b6d88 100644 --- a/docs/conf/helpop.conf.example +++ b/docs/conf/helpop.conf.example @@ -37,7 +37,7 @@ UNINVITE AWAY DCCALLOW SILENCE ACCEPT MKPASSWD VHOST TITLE WHOIS WHOWAS ISON USERHOST WATCH -LIST NAMES WHO MOTD RULES +LIST NAMES WHO MOTD ADMIN MAP LINKS LUSERS TIME STATS VERSION INFO MODULES COMMANDS SSLINFO diff --git a/docs/conf/inspircd.conf.example b/docs/conf/inspircd.conf.example index 8a498577a..fd7973f39 100644 --- a/docs/conf/inspircd.conf.example +++ b/docs/conf/inspircd.conf.example @@ -450,13 +450,12 @@ # Files block - contains files whose contents are used by the ircd # # motd - displayed on connect and when a user executes /MOTD -# rules - displayed when the user executes /RULES # Modules can also define their own files -<files motd="examples/motd.txt.example" rules="examples/rules.txt.example"> +<files motd="examples/motd.txt.example"> # Example of an executable file include. Note this will be read on rehash, # not when the command is run. -#<execfiles rules="wget -O - http://www.example.com/rules.txt"> +#<execfiles motd="wget -O - http://www.example.com/motd.txt"> #-#-#-#-#-#-#-#-#-#-#-# MAXIMUM CHANNELS -#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # # diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index f8bb7a87d..7cce36cbe 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -1643,6 +1643,43 @@ #<module name="m_serverban.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# Showfile: Provides support for showing a text file to users when # +# they enter a command. # +# This module adds one command for each <showfile> tag that shows the # +# given file to the user as a series of messages or numerics. # +#<module name="m_showfile.so"> # +# # +#-#-#-#-#-#-#-#-#-#-# SHOWFILE CONFIGURATION -#-#-#-#-#-#-#-#-#-#-#-#-# +# # +# name - The name of the command which displays this file. This is # +# the only mandatory setting, all others are optional. # +# file - The text file to be shown to the user. # +# By default same as the command name. # +# method - How should the file be shown? # +# * numeric: Send contents using a numeric # +# (similiar to /MOTD; the default). # +# * notice: Send contents as a series of notices. # +# * msg: Send contents as a series of private messages. # +# colors - If true, color codes (\c, \b, \u, etc.) will be processed # +# and sent as ANSI colors. If false (default) the file will # +# be displayed as-is. # +# # +# When using the method "numeric", the following extra settings are # +# available: # +# # +# introtext - Introductory line, "Showing <name>" by default. # +# intronumeric - Numeric used for the introductory line. # +# numeric - Numeric used for sending the text itself. # +# endtext - Ending line, "End of <name>" by default. # +# endnumeric - Numeric used for the ending line. # +# # +#<showfile name="RULES" +# file="rules.txt" +# colors="true" +# introtext="Server rules:" +# endtext="End of server rules."> + +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Show Whois module: Adds the +W usermode which allows opers # to see when they are whois'ed (can be annoying). # This module is oper-only. diff --git a/docs/conf/rules.txt.example b/docs/conf/rules.txt.example deleted file mode 100644 index e51f0afd9..000000000 --- a/docs/conf/rules.txt.example +++ /dev/null @@ -1,3 +0,0 @@ -This is the InspIRCd rules file. - -Place any network or server rules here :) diff --git a/src/commands/cmd_rules.cpp b/src/commands/cmd_rules.cpp deleted file mode 100644 index 76ee0061b..000000000 --- a/src/commands/cmd_rules.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * InspIRCd -- Internet Relay Chat Daemon - * - * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org> - * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net> - * - * 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 <http://www.gnu.org/licenses/>. - */ - - -#include "inspircd.h" - -/** Handle /RULES. These command handlers can be reloaded by the core, - * and handle basic RFC1459 commands. Commands within modules work - * the same way, however, they can be fully unloaded, where these - * may not. - */ -class CommandRules : public Command -{ - public: - /** Constructor for rules. - */ - CommandRules ( Module* parent) : Command(parent,"RULES",0,0) { syntax = "[<servername>]"; } - /** Handle command. - * @param parameters The parameters to the comamnd - * @param pcnt The number of parameters passed to teh command - * @param user The user issuing the command - * @return A value from CmdResult to indicate command success or failure. - */ - CmdResult Handle(const std::vector<std::string>& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters) - { - if (parameters.size() > 0) - return ROUTE_UNICAST(parameters[0]); - return ROUTE_LOCALONLY; - } -}; - -CmdResult CommandRules::Handle (const std::vector<std::string>& parameters, User *user) -{ - if (parameters.size() > 0 && parameters[0] != ServerInstance->Config->ServerName) - return CMD_SUCCESS; - - ConfigTag* tag = NULL; - LocalUser* localuser = IS_LOCAL(user); - if (localuser) - tag = localuser->GetClass()->config; - std::string rules_name = tag->getString("rules", "rules"); - ConfigFileCache::iterator rules = ServerInstance->Config->Files.find(rules_name); - if (rules == ServerInstance->Config->Files.end()) - { - user->SendText(":%s %03d %s :RULES file is missing.", - ServerInstance->Config->ServerName.c_str(), ERR_NORULES, user->nick.c_str()); - return CMD_SUCCESS; - } - user->SendText(":%s %03d %s :%s server rules:", ServerInstance->Config->ServerName.c_str(), - RPL_RULESTART, user->nick.c_str(), ServerInstance->Config->ServerName.c_str()); - - for (file_cache::iterator i = rules->second.begin(); i != rules->second.end(); i++) - user->SendText(":%s %03d %s :- %s", ServerInstance->Config->ServerName.c_str(), RPL_RULES, user->nick.c_str(),i->c_str()); - - user->SendText(":%s %03d %s :End of RULES command.", ServerInstance->Config->ServerName.c_str(), RPL_RULESEND, user->nick.c_str()); - - return CMD_SUCCESS; -} - -COMMAND_INIT(CommandRules) diff --git a/src/configreader.cpp b/src/configreader.cpp index 341414e0d..b1cc746df 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -641,10 +641,6 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) ConfigFileCache::iterator file = this->Files.find(tag->getString("motd", "motd")); if (file != this->Files.end()) InspIRCd::ProcessColors(file->second); - - file = this->Files.find(tag->getString("rules", "rules")); - if (file != this->Files.end()) - InspIRCd::ProcessColors(file->second); } /* No old configuration -> initial boot, nothing more to do here */ diff --git a/src/modules/m_showfile.cpp b/src/modules/m_showfile.cpp new file mode 100644 index 000000000..0f5d3ed1a --- /dev/null +++ b/src/modules/m_showfile.cpp @@ -0,0 +1,175 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ + + +#include "inspircd.h" + +class CommandShowFile : public Command +{ + enum Method + { + SF_MSG, + SF_NOTICE, + SF_NUMERIC + }; + + std::string introtext; + std::string endtext; + unsigned int intronumeric; + unsigned int textnumeric; + unsigned int endnumeric; + file_cache contents; + Method method; + + public: + CommandShowFile(Module* parent, const std::string& cmdname) + : Command(parent, cmdname) + { + } + + CmdResult Handle(const std::vector<std::string>& parameters, User* user) CXX11_OVERRIDE + { + const std::string& sn = ServerInstance->Config->ServerName; + if (method == SF_NUMERIC) + { + if (!introtext.empty()) + user->SendText(":%s %03d %s :%s %s", sn.c_str(), intronumeric, user->nick.c_str(), sn.c_str(), introtext.c_str()); + + for (file_cache::const_iterator i = contents.begin(); i != contents.end(); ++i) + user->SendText(":%s %03d %s :- %s", sn.c_str(), textnumeric, user->nick.c_str(), i->c_str()); + + user->SendText(":%s %03d %s :%s", sn.c_str(), endnumeric, user->nick.c_str(), endtext.c_str()); + } + else + { + const char* msgcmd = (method == SF_MSG ? "PRIVMSG" : "NOTICE"); + std::string header = InspIRCd::Format(":%s %s %s :", sn.c_str(), msgcmd, user->nick.c_str()); + for (file_cache::const_iterator i = contents.begin(); i != contents.end(); ++i) + user->SendText(header + *i); + } + return CMD_SUCCESS; + } + + void UpdateSettings(ConfigTag* tag, const std::vector<std::string>& filecontents) + { + introtext = tag->getString("introtext", "Showing " + name); + endtext = tag->getString("endtext", "End of " + name); + intronumeric = tag->getInt("intronumeric", RPL_RULESTART, 0, 999); + textnumeric = tag->getInt("numeric", RPL_RULES, 0, 999); + endnumeric = tag->getInt("endnumeric", RPL_RULESEND, 0, 999); + std::string smethod = tag->getString("method"); + + method = SF_NUMERIC; + if (smethod == "msg") + method = SF_MSG; + else if (smethod == "notice") + method = SF_NOTICE; + + contents = filecontents; + if (tag->getBool("colors")) + InspIRCd::ProcessColors(contents); + } +}; + +class ModuleShowFile : public Module +{ + std::vector<CommandShowFile*> cmds; + + void ReadTag(ConfigTag* tag, std::vector<CommandShowFile*>& newcmds) + { + std::string cmdname = tag->getString("name"); + if (cmdname.empty()) + throw ModuleException("Empty value for 'name'"); + + std::transform(cmdname.begin(), cmdname.end(), cmdname.begin(), ::toupper); + + const std::string file = tag->getString("file", cmdname); + if (file.empty()) + throw ModuleException("Empty value for 'file'"); + FileReader reader(file); + + CommandShowFile* sfcmd; + Command* handler = ServerInstance->Parser->GetHandler(cmdname); + if (handler) + { + // Command exists, check if it is ours + if (handler->creator != this) + throw ModuleException("Command " + cmdname + " already exists"); + + // This is our command, make sure we don't have the same entry twice + sfcmd = static_cast<CommandShowFile*>(handler); + if (std::find(newcmds.begin(), newcmds.end(), sfcmd) != newcmds.end()) + throw ModuleException("Command " + cmdname + " is already used in a <showfile> tag"); + } + else + { + // Command doesn't exist, create it + sfcmd = new CommandShowFile(this, cmdname); + ServerInstance->Modules->AddService(*sfcmd); + } + + sfcmd->UpdateSettings(tag, reader.GetVector()); + newcmds.push_back(sfcmd); + } + + static void DelAll(const std::vector<CommandShowFile*>& list) + { + for (std::vector<CommandShowFile*>::const_iterator i = list.begin(); i != list.end(); ++i) + delete *i; + } + + public: + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE + { + std::vector<CommandShowFile*> newcmds; + + ConfigTagList tags = ServerInstance->Config->ConfTags("showfile"); + for (ConfigIter i = tags.first; i != tags.second; ++i) + { + ConfigTag* tag = i->second; + try + { + ReadTag(tag, newcmds); + } + catch (CoreException& ex) + { + ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Error: " + ex.GetReason() + " at " + tag->getTagLocation()); + } + } + + // Remove all commands that were removed from the config + std::vector<CommandShowFile*> removed(cmds.size()); + std::sort(newcmds.begin(), newcmds.end()); + std::set_difference(cmds.begin(), cmds.end(), newcmds.begin(), newcmds.end(), removed.begin()); + + DelAll(removed); + cmds.swap(newcmds); + } + + ~ModuleShowFile() + { + DelAll(cmds); + } + + Version GetVersion() CXX11_OVERRIDE + { + return Version("Provides support for showing text files to users", VF_VENDOR); + } +}; + +MODULE_INIT(ModuleShowFile) diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index f3d6ac66a..1d573b8b4 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -293,6 +293,10 @@ bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, std: params.insert(params.begin()+1, cmd); cmd = "ENCAP"; } + else if (cmd == "RULES") + { + return false; + } return true; // Passthru } |