* ---------------------------------------------------
*/
-/* $Core: libIRCDmode */
+/* $Core */
/* $ExtraDeps: $(RELCPPFILES) */
/* $ExtraObjects: modes/modeclasses.a */
/* $ExtraBuild: @${MAKE} -C "modes" DIRNAME="src/modes" CC="$(CC)" $(MAKEARGS) CPPFILES="$(CPPFILES)" */
#include "modes/cmode_h.h"
/* +v (channel voice) */
#include "modes/cmode_v.h"
-/* +s (server notices) */
-#include "modes/umode_s.h"
/* +w (see wallops) */
#include "modes/umode_w.h"
/* +i (invisible) */
#include "modes/umode_i.h"
/* +o (operator) */
#include "modes/umode_o.h"
-/* +n (notice mask - our implementation of snomasks) */
-#include "modes/umode_n.h"
+/* +s (server notice masks) */
+#include "modes/umode_s.h"
ModeHandler::ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly, char mprefix, char prefixrequired)
: ServerInstance(Instance), mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly), prefix(mprefix), count(0), prefixneeded(prefixrequired)
return mode;
}
+std::string ModeHandler::GetUserParameter(User* user)
+{
+ return "";
+}
+
ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool, bool)
{
return MODEACTION_DENY;
{
}
+void ModeHandler::OnParameterMissing(User* user, User* dest, Channel* channel)
+{
+}
+
bool ModeHandler::CheckTimeStamp(time_t theirs, time_t ours, const std::string&, const std::string&, Channel*)
{
return (ours < theirs);
ModeAction SimpleUserModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool servermode)
{
- /* Only opers can change other users modes */
- if (source != dest)
- return MODEACTION_DENY;
-
if (adding)
{
if (!dest->IsModeSet(this->GetModeChar()))
return;
}
- if ((targetuser == user) || (IS_OPER(user)))
+ if (targetuser == user || user->HasPrivPermission("users/auspex"))
{
/* Display user's current mode string */
user->WriteNumeric(RPL_UMODEIS, "%s :+%s",targetuser->nick.c_str(),targetuser->FormatModes());
continue;
}
- if (!IS_OPER(user))
+ if (!user->HasPrivPermission("channels/auspex"))
{
if (ServerInstance->Config->HideModeLists[mletter] && (targetchannel->GetStatus(user) < STATUS_HOP))
{
{
type = MODETYPE_USER;
mask = MASK_USER;
- if ((user != targetuser) && (!ServerInstance->ULine(user->server)))
+ if (user != targetuser && IS_LOCAL(user) && !ServerInstance->ULine(user->server))
{
user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't change mode for other users", user->nick.c_str());
return;
else
{
/* No parameter, continue to the next mode */
+ modehandlers[handler_id]->OnParameterMissing(user, targetuser, targetchannel);
continue;
}
return types;
}
-std::string ModeParser::ChanModes()
+std::string ModeParser::GiveModeList(ModeMasks m)
{
std::string type1; /* Listmodes EXCEPT those with a prefix */
std::string type2; /* Modes that take a param when adding or removing */
if ((!ServerInstance->Config->AllowHalfop) && (mode == 'h'))
continue;
- unsigned char pos = (mode-65) | MASK_CHANNEL;
+ unsigned char pos = (mode-65) | m;
/* One parameter when adding */
if (modehandlers[pos])
{
sprintf(moderemove,"-%c",this->GetModeChar());
parameters.push_back(user->nick);
parameters.push_back(moderemove);
- ServerInstance->Parser->CallHandler("MODE", parameters, user);
+ ServerInstance->Modes->Process(parameters, ServerInstance->FakeClient, false);
}
}
}
new ModeChannelOp(Instance),
new ModeChannelHalfOp(Instance),
new ModeChannelVoice(Instance),
- new ModeUserServerNotice(Instance),
new ModeUserWallops(Instance),
new ModeUserInvisible(Instance),
new ModeUserOperator(Instance),