From 34fa5627de0a0431ca76f34445c680a76a9a7dc5 Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Sun, 1 Sep 2013 14:25:15 +0200 Subject: Create a base class for prefix modes Move Channel::SetPrefix() into Membership --- src/channels.cpp | 25 +++++++------------ src/mode.cpp | 56 ++++++++++++++++++++---------------------- src/modes/cmode_o.cpp | 9 +------ src/modes/cmode_v.cpp | 9 +------ src/modules/m_customprefix.cpp | 12 +++------ src/modules/m_ojoin.cpp | 12 ++------- src/modules/m_operprefix.cpp | 22 +++-------------- 7 files changed, 46 insertions(+), 99 deletions(-) (limited to 'src') 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 ¶meter, 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& 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 ¶meter, 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 ¶meter, 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 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 ¶meter, 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 ¶meter, 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 ¶meter, 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; -- cgit v1.2.3