summaryrefslogtreecommitdiff
path: root/src/mode.cpp
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2019-01-10 10:27:19 +0000
committerPeter Powell <petpow@saberuk.com>2019-01-10 10:42:31 +0000
commit00a11bd0b50b2f2b72b568b7e08b941d05436426 (patch)
treece076bdf968afb1e01a9481f0bcbacb2756dcb56 /src/mode.cpp
parentbe91435ccb8e05c84ecd126b5c41b74c45f4535b (diff)
Improve the error messages given when creating a mode.
Diffstat (limited to 'src/mode.cpp')
-rw-r--r--src/mode.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/mode.cpp b/src/mode.cpp
index 0bb97cc9e..5793b4e66 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -587,7 +587,8 @@ ModeHandler::Id ModeParser::AllocateModeId(ModeType mt)
void ModeParser::AddMode(ModeHandler* mh)
{
if (!ModeParser::IsModeChar(mh->GetModeChar()))
- throw ModuleException("Invalid letter for mode " + mh->name);
+ throw ModuleException(InspIRCd::Format("Mode letter for %s is invalid: %c",
+ mh->name.c_str(), mh->GetModeChar()));
/* A mode prefix of ',' is not acceptable, it would fuck up server to server.
* A mode prefix of ':' will fuck up both server to server, and client to server.
@@ -597,15 +598,19 @@ void ModeParser::AddMode(ModeHandler* mh)
if (pm)
{
if ((pm->GetPrefix() > 126) || (pm->GetPrefix() == ',') || (pm->GetPrefix() == ':') || (pm->GetPrefix() == '#'))
- throw ModuleException("Invalid prefix for mode " + mh->name);
+ throw ModuleException(InspIRCd::Format("Mode prefix for %s is invalid: %c",
+ mh->name.c_str(), pm->GetPrefix()));
- if (FindPrefix(pm->GetPrefix()))
- throw ModuleException("Prefix already exists for mode " + mh->name);
+ PrefixMode* otherpm = FindPrefix(pm->GetPrefix());
+ if (otherpm)
+ throw ModuleException(InspIRCd::Format("Mode prefix for %s already by used by %s from %s: %c",
+ mh->name.c_str(), otherpm->name.c_str(), otherpm->creator->ModuleSourceFile.c_str(), pm->GetPrefix()));
}
ModeHandler*& slot = modehandlers[mh->GetModeType()][mh->GetModeChar()-65];
if (slot)
- throw ModuleException("Letter is already in use for mode " + mh->name);
+ throw ModuleException(InspIRCd::Format("Mode letter for %s already by used by %s from %s: %c",
+ mh->name.c_str(), slot->name.c_str(), slot->creator->ModuleSourceFile.c_str(), mh->GetModeChar()));
// The mode needs an id if it is either a user mode, a simple mode (flag) or a parameter mode.
// Otherwise (for listmodes and prefix modes) the id remains MODEID_MAX, which is invalid.
@@ -613,8 +618,13 @@ void ModeParser::AddMode(ModeHandler* mh)
if ((mh->GetModeType() == MODETYPE_USER) || (mh->IsParameterMode()) || (!mh->IsListMode()))
modeid = AllocateModeId(mh->GetModeType());
- if (!modehandlersbyname[mh->GetModeType()].insert(std::make_pair(mh->name, mh)).second)
- throw ModuleException("Mode name already in use: " + mh->name);
+ std::pair<ModeHandlerMap::iterator, bool> res = modehandlersbyname[mh->GetModeType()].insert(std::make_pair(mh->name, mh));
+ if (!res.second)
+ {
+ ModeHandler* othermh = res.first->second;
+ throw ModuleException(InspIRCd::Format("Mode name %s already used by %c from %s",
+ mh->name.c_str(), othermh->GetModeChar(), othermh->creator->ModuleSourceFile.c_str()));
+ }
// Everything is fine, add the mode