X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=7aeaae1dcd933022ffa73eff4717842d12f2d24c;hb=9f050cf19594ce424ec50c8469d49157a6f2fe75;hp=9c3b75101de3809997941bf85506840406e75cf1;hpb=17cc3b8490692ee3a225f052425deb43a45b98db;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 9c3b75101..7aeaae1dc 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -46,8 +46,9 @@ #include "modes/umode_s.h" ModeHandler::ModeHandler(Module* Creator, const std::string& Name, char modeletter, ParamSpec Params, ModeType type) - : m_paramtype(TR_TEXT), parameters_taken(Params), mode(modeletter), prefix(0), oper(false), - list(false), m_type(type), count(0), levelrequired(HALFOP_VALUE), creator(Creator), name(Name) + : ServiceProvider(Creator, Name, type == MODETYPE_CHANNEL ? SERVICE_CMODE : SERVICE_UMODE), m_paramtype(TR_TEXT), + parameters_taken(Params), mode(modeletter), prefix(0), oper(false), + list(false), m_type(type), levelrequired(HALFOP_VALUE) { } @@ -61,7 +62,7 @@ CullResult ModeHandler::cull() ModeHandler::~ModeHandler() { if (ServerInstance && ServerInstance->Modes && ServerInstance->Modes->FindMode(mode, m_type) == this) - ServerInstance->Logs->Log("MODE", ERROR, "ERROR: Destructor for mode %c called while still registered", mode); + ServerInstance->Logs->Log("MODE", DEFAULT, "ERROR: Destructor for mode %c called while still registered", mode); } bool ModeHandler::IsListMode() @@ -74,17 +75,6 @@ unsigned int ModeHandler::GetPrefixRank() return 0; } -unsigned int ModeHandler::GetCount() -{ - return 0; -} - -void ModeHandler::ChangeCount(int modifier) -{ - count += modifier; - ServerInstance->Logs->Log("MODE", DEBUG,"Change count for mode %c is now %d", mode, count); -} - int ModeHandler::GetNumParams(bool adding) { switch (parameters_taken) @@ -99,11 +89,6 @@ int ModeHandler::GetNumParams(bool adding) return 0; } -char ModeHandler::GetModeChar() -{ - return mode; -} - std::string ModeHandler::GetUserParameter(User* user) { return ""; @@ -181,6 +166,25 @@ ModeAction SimpleChannelModeHandler::OnModeChange(User* source, User* dest, Chan return MODEACTION_DENY; } +ModeAction ParamChannelModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) +{ + if (adding && !ParamValidate(parameter)) + return MODEACTION_DENY; + std::string now = channel->GetModeParameter(this); + if (parameter == now) + return MODEACTION_DENY; + if (adding) + channel->SetModeParam(this, parameter); + else + channel->SetModeParam(this, ""); + return MODEACTION_ALLOW; +} + +bool ParamChannelModeHandler::ParamValidate(std::string& parameter) +{ + return true; +} + ModeWatcher::ModeWatcher(Module* Creator, char modeletter, ModeType type) : mode(modeletter), m_type(type), creator(Creator) { @@ -284,11 +288,23 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool unsigned int ourrank = chan->GetPrefixValue(user); if (ourrank < neededrank) { - /* Bog off */ - // TODO replace with a real search for the proper prefix - char needed = neededrank > HALFOP_VALUE ? '@' : '%'; - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c", - user->nick.c_str(), chan->name.c_str(), needed, adding ? "" : "un", modechar); + ModeHandler* neededmh = NULL; + for(char c='A'; c <= 'z'; c++) + { + ModeHandler *privmh = FindMode(c, MODETYPE_CHANNEL); + if (privmh && privmh->GetPrefixRank() >= neededrank) + { + // this mode is sufficient to allow this action + if (!neededmh || privmh->GetPrefixRank() < neededmh->GetPrefixRank()) + neededmh = privmh; + } + } + if (neededmh) + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel %s access or above to %sset channel mode %c", + user->nick.c_str(), chan->name.c_str(), neededmh->name.c_str(), adding ? "" : "un", modechar); + else + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You cannot %sset channel mode %c", + user->nick.c_str(), chan->name.c_str(), adding ? "" : "un", modechar); return MODEACTION_DENY; } } @@ -338,6 +354,15 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool 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); @@ -347,15 +372,6 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool if (ma != MODEACTION_ALLOW) return ma; - mh->ChangeCount(adding ? 1 : -1); - - if (mh->GetPrefixRank() && chan) - { - User* user_to_prefix = ServerInstance->FindNick(parameter); - if (user_to_prefix) - chan->SetPrefix(user_to_prefix, modechar, adding); - } - for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) (*watchers)->AfterMode(user, targetuser, chan, parameter, adding, type); @@ -547,13 +563,11 @@ void ModeParser::DisplayListModes(User* user, Channel* chan, std::string &mode_s bool display = true; if (!user->HasPrivPermission("channels/auspex") && ServerInstance->Config->HideModeLists[mletter] && (chan->GetPrefixValue(user) < HALFOP_VALUE)) { - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only half-operators and above may view the +%c list", + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You do not have access to view the +%c list", user->nick.c_str(), chan->name.c_str(), mletter); display = false; } - /** See below for a description of what craq this is :D - */ unsigned char handler_id = (mletter - 'A') | MASK_CHANNEL; for(ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) @@ -933,7 +947,6 @@ struct builtin_modes ModeChannelBan b; ModeChannelOp o; - // halfop is added by configreader ModeChannelVoice v; ModeUserWallops uw;