summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.cpp25
-rw-r--r--src/mode.cpp56
-rw-r--r--src/modes/cmode_o.cpp9
-rw-r--r--src/modes/cmode_v.cpp9
-rw-r--r--src/modules/m_customprefix.cpp12
-rw-r--r--src/modules/m_ojoin.cpp12
-rw-r--r--src/modules/m_operprefix.cpp22
7 files changed, 46 insertions, 99 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index afc569909..91aec6fa5 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -343,9 +343,8 @@ void Channel::ForceJoin(User* user, const std::string* privs, bool bursting, boo
if (mh && mh->GetPrefixRank())
{
std::string nick = user->nick;
- /* Set, and make sure that the mode handler knows this mode was now set */
- this->SetPrefix(user, mh->GetModeChar(), true);
- mh->OnModeChange(ServerInstance->FakeClient, ServerInstance->FakeClient, this, nick, true);
+ // Set the mode on the user
+ mh->OnModeChange(ServerInstance->FakeClient, NULL, this, nick, true);
}
}
}
@@ -792,29 +791,23 @@ unsigned int Channel::GetPrefixValue(User* user)
return m->second->getRank();
}
-bool Channel::SetPrefix(User* user, char prefix, bool adding)
+bool Membership::SetPrefix(ModeHandler* delta_mh, bool adding)
{
- ModeHandler* delta_mh = ServerInstance->Modes->FindMode(prefix, MODETYPE_CHANNEL);
- if (!delta_mh)
- return false;
- UserMembIter m = userlist.find(user);
- if (m == userlist.end())
- return false;
- for(unsigned int i=0; i < m->second->modes.length(); i++)
+ char prefix = delta_mh->GetModeChar();
+ for (unsigned int i = 0; i < modes.length(); i++)
{
- char mchar = m->second->modes[i];
+ char mchar = modes[i];
ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL);
if (mh && mh->GetPrefixRank() <= delta_mh->GetPrefixRank())
{
- m->second->modes =
- m->second->modes.substr(0,i) +
+ modes = modes.substr(0,i) +
(adding ? std::string(1, prefix) : "") +
- m->second->modes.substr(mchar == prefix ? i+1 : i);
+ modes.substr(mchar == prefix ? i+1 : i);
return adding != (mchar == prefix);
}
}
if (adding)
- m->second->modes += std::string(1, prefix);
+ modes.push_back(prefix);
return adding;
}
diff --git a/src/mode.cpp b/src/mode.cpp
index b76e1558f..aedc8bb85 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -195,6 +195,30 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ
}
}
+PrefixMode::PrefixMode(Module* Creator, const std::string& Name, char ModeLetter)
+ : ModeHandler(Creator, Name, ModeLetter, PARAM_ALWAYS, MODETYPE_CHANNEL, MC_PREFIX)
+{
+ list = true;
+ m_paramtype = TR_NICK;
+}
+
+ModeAction PrefixMode::OnModeChange(User* source, User*, Channel* chan, std::string& parameter, bool adding)
+{
+ User* target = ServerInstance->FindNick(parameter);
+ if (!target)
+ {
+ source->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", source->nick.c_str(), parameter.c_str());
+ return MODEACTION_DENY;
+ }
+
+ Membership* memb = chan->GetUser(target);
+ if (!memb)
+ return MODEACTION_DENY;
+
+ parameter = target->nick;
+ return (memb->SetPrefix(this, adding) ? MODEACTION_ALLOW : MODEACTION_DENY);
+}
+
ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool adding, const unsigned char modechar,
std::string &parameter, bool SkipACL)
{
@@ -295,21 +319,6 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
return MODEACTION_DENY;
}
- if (mh->GetTranslateType() == TR_NICK && !ServerInstance->FindNick(parameter))
- {
- user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameter.c_str());
- return MODEACTION_DENY;
- }
-
- if (mh->GetPrefixRank() && chan)
- {
- User* user_to_prefix = ServerInstance->FindNick(parameter);
- if (!user_to_prefix)
- return MODEACTION_DENY;
- if (!chan->SetPrefix(user_to_prefix, modechar, adding))
- return MODEACTION_DENY;
- }
-
/* Call the handler for the mode */
ModeAction ma = mh->OnModeChange(user, targetuser, chan, parameter, adding);
@@ -437,16 +446,9 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User* user,
if (pcnt)
{
- TranslateType tt = mh->GetTranslateType();
- if (tt == TR_NICK)
- {
- User* u = ServerInstance->FindNick(parameter);
- if (u)
- parameter = u->nick;
- }
output_parameters << " " << parameter;
LastParseParams.push_back(parameter);
- LastParseTranslate.push_back(tt);
+ LastParseTranslate.push_back(mh->GetTranslateType());
}
if ( (output_mode.length() + output_parameters.str().length() > 450)
@@ -827,11 +829,7 @@ void ModeHandler::RemoveMode(User* user)
void ModeHandler::RemoveMode(Channel* channel, irc::modestacker& stack)
{
- if (this->GetPrefixRank())
- {
- RemovePrefixMode(channel, stack);
- }
- else if (channel->IsModeSet(this))
+ if (channel->IsModeSet(this))
{
if (this->GetNumParams(false))
// Removing this mode requires a parameter
@@ -841,7 +839,7 @@ void ModeHandler::RemoveMode(Channel* channel, irc::modestacker& stack)
}
}
-void ModeHandler::RemovePrefixMode(Channel* chan, irc::modestacker& stack)
+void PrefixMode::RemoveMode(Channel* chan, irc::modestacker& stack)
{
const UserMembList* userlist = chan->GetUsers();
for (UserMembCIter i = userlist->begin(); i != userlist->end(); ++i)
diff --git a/src/modes/cmode_o.cpp b/src/modes/cmode_o.cpp
index d500f23b1..6e96afa67 100644
--- a/src/modes/cmode_o.cpp
+++ b/src/modes/cmode_o.cpp
@@ -28,16 +28,9 @@
#include "modules.h"
#include "builtinmodes.h"
-ModeChannelOp::ModeChannelOp() : ModeHandler(NULL, "op", 'o', PARAM_ALWAYS, MODETYPE_CHANNEL)
+ModeChannelOp::ModeChannelOp() : PrefixMode(NULL, "op", 'o')
{
- list = true;
prefix = '@';
levelrequired = OP_VALUE;
- m_paramtype = TR_NICK;
prefixrank = OP_VALUE;
}
-
-ModeAction ModeChannelOp::OnModeChange(User* source, User*, Channel* channel, std::string &parameter, bool adding)
-{
- return MODEACTION_ALLOW;
-}
diff --git a/src/modes/cmode_v.cpp b/src/modes/cmode_v.cpp
index fe62c407f..c8ce30ab1 100644
--- a/src/modes/cmode_v.cpp
+++ b/src/modes/cmode_v.cpp
@@ -28,16 +28,9 @@
#include "modules.h"
#include "builtinmodes.h"
-ModeChannelVoice::ModeChannelVoice() : ModeHandler(NULL, "voice", 'v', PARAM_ALWAYS, MODETYPE_CHANNEL)
+ModeChannelVoice::ModeChannelVoice() : PrefixMode(NULL, "voice", 'v')
{
- list = true;
prefix = '+';
levelrequired = HALFOP_VALUE;
- m_paramtype = TR_NICK;
prefixrank = VOICE_VALUE;
}
-
-ModeAction ModeChannelVoice::OnModeChange(User* source, User*, Channel* channel, std::string &parameter, bool adding)
-{
- return MODEACTION_ALLOW;
-}
diff --git a/src/modules/m_customprefix.cpp b/src/modules/m_customprefix.cpp
index bda11e8b3..f0b6d88e3 100644
--- a/src/modules/m_customprefix.cpp
+++ b/src/modules/m_customprefix.cpp
@@ -19,17 +19,16 @@
#include "inspircd.h"
-class CustomPrefixMode : public ModeHandler
+class CustomPrefixMode : public PrefixMode
{
public:
reference<ConfigTag> tag;
bool depriv;
CustomPrefixMode(Module* parent, ConfigTag* Tag)
- : ModeHandler(parent, Tag->getString("name"), 0, PARAM_ALWAYS, MODETYPE_CHANNEL), tag(Tag)
+ : PrefixMode(parent, Tag->getString("name"), 0)
+ , tag(Tag)
{
- list = true;
- m_paramtype = TR_NICK;
std::string v = tag->getString("prefix");
prefix = v.c_str()[0];
v = tag->getString("letter");
@@ -45,11 +44,6 @@ class CustomPrefixMode : public ModeHandler
return MOD_RES_ALLOW;
return MOD_RES_PASSTHRU;
}
-
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
- {
- return MODEACTION_ALLOW;
- }
};
class ModuleCustomPrefix : public Module
diff --git a/src/modules/m_ojoin.cpp b/src/modules/m_ojoin.cpp
index 54c7bfa73..0a5a57f40 100644
--- a/src/modules/m_ojoin.cpp
+++ b/src/modules/m_ojoin.cpp
@@ -84,16 +84,14 @@ class CommandOjoin : public SplitCommand
/** channel mode +Y
*/
-class NetworkPrefix : public ModeHandler
+class NetworkPrefix : public PrefixMode
{
public:
NetworkPrefix(Module* parent, char NPrefix)
- : ModeHandler(parent, "official-join", 'Y', PARAM_ALWAYS, MODETYPE_CHANNEL)
+ : PrefixMode(parent, "official-join", 'Y')
{
- list = true;
prefix = NPrefix;
levelrequired = INT_MAX;
- m_paramtype = TR_NICK;
prefixrank = NETWORK_VALUE;
}
@@ -106,12 +104,6 @@ class NetworkPrefix : public ModeHandler
return MOD_RES_PASSTHRU;
}
-
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
- {
- return MODEACTION_ALLOW;
- }
-
};
class ModuleOjoin : public Module
diff --git a/src/modules/m_operprefix.cpp b/src/modules/m_operprefix.cpp
index 23390baea..3d2a34bdb 100644
--- a/src/modules/m_operprefix.cpp
+++ b/src/modules/m_operprefix.cpp
@@ -26,32 +26,16 @@
#define OPERPREFIX_VALUE 1000000
-class OperPrefixMode : public ModeHandler
+class OperPrefixMode : public PrefixMode
{
public:
- OperPrefixMode(Module* Creator) : ModeHandler(Creator, "operprefix", 'y', PARAM_ALWAYS, MODETYPE_CHANNEL)
+ OperPrefixMode(Module* Creator) : PrefixMode(Creator, "operprefix", 'y')
{
std::string pfx = ServerInstance->Config->ConfValue("operprefix")->getString("prefix", "!");
- list = true;
prefix = pfx.empty() ? '!' : pfx[0];
- levelrequired = OPERPREFIX_VALUE;
- m_paramtype = TR_NICK;
+ levelrequired = INT_MAX;
prefixrank = OPERPREFIX_VALUE;
}
-
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
- {
- if (IS_SERVER(source) || ServerInstance->ULine(source->server))
- return MODEACTION_ALLOW;
- else
- {
- if (channel)
- source->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only servers are permitted to change channel mode '%c'", source->nick.c_str(), channel->name.c_str(), 'y');
- return MODEACTION_DENY;
- }
- }
-
- bool NeedsOper() { return true; }
};
class ModuleOperPrefixMode;