summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.c66
-rw-r--r--src/chanserv.c19
-rw-r--r--src/core/cs_set.c28
-rw-r--r--src/core/os_defcon.c8
-rw-r--r--src/regchannel.cpp75
5 files changed, 95 insertions, 101 deletions
diff --git a/src/channels.c b/src/channels.c
index ef5e225f6..e6ee45430 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -137,7 +137,7 @@ bool Channel::HasMode(ChannelModeName Name)
* Set a mode on a channel
* @param Name The mode name
*/
-void Channel::SetMode(ChannelModeName Name)
+void Channel::SetMode(ChannelModeName Name, const std::string param)
{
modes[Name] = true;
@@ -147,6 +147,18 @@ void Channel::SetMode(ChannelModeName Name)
ci->SetFlag(CI_PERSIST);
}
+ if (!param.empty())
+ {
+ /* They could be resetting the mode to change its params */
+ std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
+ if (it != Params.end())
+ {
+ Params.erase(it);
+ }
+
+ Params.insert(std::make_pair(Name, param));
+ }
+
FOREACH_MOD(I_OnChannelModeSet, OnChannelModeSet(this, Name));
}
@@ -154,13 +166,13 @@ void Channel::SetMode(ChannelModeName Name)
* Set a mode on a channel
* @param Mode The mode
*/
-void Channel::SetMode(char Mode)
+void Channel::SetMode(char Mode, const std::string param)
{
ChannelMode *cm;
if ((cm = ModeManager::FindChannelModeByChar(Mode)))
{
- SetMode(cm->Name);
+ SetMode(cm->Name, param);
}
}
@@ -181,6 +193,12 @@ void Channel::RemoveMode(ChannelModeName Name)
delete this;
}
+ std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
+ if (it != Params.end())
+ {
+ Params.erase(it);
+ }
+
FOREACH_MOD(I_OnChannelModeUnset, OnChannelModeUnset(this, Name));
}
@@ -198,29 +216,6 @@ void Channel::RemoveMode(char Mode)
}
}
-/** Set a channel mode param on the channel
- * @param Name The mode
- * @param param The param
- * @param true on success
- */
-bool Channel::SetParam(ChannelModeName Name, std::string &Value)
-{
- return Params.insert(std::make_pair(Name, Value)).second;
-}
-
-/** Unset a param from the channel
- * @param Name The mode
- */
-void Channel::UnsetParam(ChannelModeName Name)
-{
- std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
-
- if (it != Params.end())
- {
- Params.erase(it);
- }
-}
-
/** Get a param from the channel
* @param Name The mode
* @param Target a string to put the param into
@@ -677,14 +672,6 @@ void chan_set_modes(const char *source, Channel *chan, int ac, const char **av,
}
else
{
- if (check >= 0)
- {
- if (add)
- chan->SetMode(mode);
- else
- chan->RemoveMode(mode);
- }
-
if (cm->Type == MODE_PARAM)
{
cmp = static_cast<ChannelModeParam *>(cm);
@@ -701,18 +688,19 @@ void chan_set_modes(const char *source, Channel *chan, int ac, const char **av,
av++;
}
- if (*av && !cmp->IsValid(*av))
+ if (!cmp->IsValid(*av))
continue;
if (add)
{
std::string Param = *av;
- chan->SetParam(cmp->Name, Param);
+ chan->SetMode(mode, Param);
}
else
- chan->UnsetParam(cmp->Name);
+ {
+ chan->RemoveMode(mode);
+ }
}
-
- if (check < 0)
+ else
{
if (add)
chan->SetMode(mode);
diff --git a/src/chanserv.c b/src/chanserv.c
index 6413e468b..19ab774f1 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -483,27 +483,27 @@ void load_cs_dbase()
{
std::ostringstream limit;
limit << tmp32;
- ci->SetParam(CMODE_LIMIT, limit.str());
+ ci->SetMLock(CMODE_LIMIT, true, limit.str());
}
SAFE(read_string(&s, f));
if (s)
{
- ci->SetParam(CMODE_KEY, std::string(s));
+ ci->SetMLock(CMODE_KEY, true, std::string(s));
delete [] s;
}
SAFE(read_string(&s, f));
if (s)
{
- ci->SetParam(CMODE_FLOOD, std::string(s));
+ ci->SetMLock(CMODE_FLOOD, true, std::string(s));
delete [] s;
}
SAFE(read_string(&s, f));
if (s)
{
- ci->SetParam(CMODE_REDIRECT, std::string(s));
+ ci->SetMLock(CMODE_REDIRECT, true, std::string(s));
delete [] s;
}
@@ -836,7 +836,7 @@ void check_modes(Channel * c)
cm = it->second;
/* If this channel does not have the mode and the mode is mlocked */
- if (!c->HasMode(cm->Name) && ci->HasMLock(cm->Name, true))
+ if (cm->Type == MODE_REGULAR && !c->HasMode(cm->Name) && ci->HasMLock(cm->Name, true))
{
modebuf += it->first;
c->SetMode(cm->Name);
@@ -853,18 +853,19 @@ void check_modes(Channel * c)
}
}
}
- /* If this is a param mode and its mlocked and is set negative */
- else if (cm->Type == MODE_PARAM && c->HasMode(cm->Name) && ci->HasMLock(cm->Name, true))
+ /* If this is a param mode and its mlocked, check to ensure it is set and set to the correct value */
+ else if (cm->Type == MODE_PARAM && ci->HasMLock(cm->Name, true))
{
cmp = static_cast<ChannelModeParam *>(cm);
c->GetParam(cmp->Name, &param);
ci->GetParam(cmp->Name, &ciparam);
- if (!param.empty() && !ciparam.empty() && param != ciparam)
+ /* If the channel doesnt have the mode, or it does and it isn't set correctly */
+ if (!c->HasMode(cm->Name) || (!param.empty() && !ciparam.empty() && param != ciparam))
{
modebuf += it->first;
- c->SetParam(cmp->Name, ciparam);
+ c->SetMode(cmp->Name, ciparam);
argbuf += " " + ciparam;
}
diff --git a/src/core/cs_set.c b/src/core/cs_set.c
index b70a528f3..54c397c52 100644
--- a/src/core/cs_set.c
+++ b/src/core/cs_set.c
@@ -208,6 +208,8 @@ class CommandCSSet : public Command
}
else if (add)
{
+ ci->RemoveMLock(cm->Name);
+
if (cm->Type == MODE_PARAM)
{
cmp = static_cast<ChannelModeParam *>(cm);
@@ -218,27 +220,16 @@ class CommandCSSet : public Command
if (!cmp->IsValid(param.c_str()))
continue;
- ci->SetParam(cmp->Name, param);
+ ci->SetMLock(cmp->Name, true, param);
+ }
+ else
+ {
+ ci->SetMLock(cm->Name, true);
}
-
- ci->SetMLock(cm->Name, true);
- ci->RemoveMLock(cm->Name, false);
}
else
{
ci->SetMLock(cm->Name, false);
-
- if (ci->HasMLock(cm->Name, true))
- {
- ci->RemoveMLock(cm->Name, true);
-
- if (cm->Type == MODE_PARAM)
- {
- cmp = static_cast<ChannelModeParam *>(cm);
-
- ci->UnsetParam(cmp->Name);
- }
- }
}
}
else
@@ -249,8 +240,7 @@ class CommandCSSet : public Command
/* We can't mlock +L if +l is not mlocked as well. */
if (ci->HasMLock(CMODE_REDIRECT, true) && !ci->HasMLock(CMODE_LIMIT, true))
{
- ci->RemoveMLock(CMODE_REDIRECT, true);
- ci->UnsetParam(CMODE_REDIRECT);
+ ci->RemoveMLock(CMODE_REDIRECT);
notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_L_REQUIRED);
}
}
@@ -260,7 +250,7 @@ class CommandCSSet : public Command
if (ModeManager::FindChannelModeByName(CMODE_NOKNOCK) && ircd->knock_needs_i) {
if (ci->HasMLock(CMODE_NOKNOCK, true) && !ci->HasMLock(CMODE_INVITE, true))
{
- ci->RemoveMLock(CMODE_NOKNOCK, true);
+ ci->RemoveMLock(CMODE_NOKNOCK);
notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_K_REQUIRED);
}
}
diff --git a/src/core/os_defcon.c b/src/core/os_defcon.c
index fdcecc525..044eb54ac 100644
--- a/src/core/os_defcon.c
+++ b/src/core/os_defcon.c
@@ -200,14 +200,15 @@ class OSDEFCON : public Module
std::string param;
GetDefConParam(Name, &param);
- c->SetMode(Name);
-
std::string buf = "+" + std::string(&cm->ModeChar);
if (!param.empty())
{
buf += " " + param;
- c->SetParam(Name, param);
+ c->SetMode(Name, param);
}
+ else
+ c->SetMode(Name);
+
ircdproto->SendMode(findbot(s_OperServ), c->name, buf.c_str());
}
}
@@ -496,7 +497,6 @@ void defconParseModeString(const char *str)
{
DefConModesOn.UnsetFlag(CMODE_REDIRECT);
- //DefConModesCI.UnsetParam(CMODE_REDIRECT);
alog("DefConChanModes must lock mode +l as well to lock mode +L");
}
}
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index 6bf2c64fe..4d1e1cf7d 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -416,29 +416,67 @@ const bool ChannelInfo::HasMLock(ChannelModeName Name, bool status)
/** Set a mlock
* @param Name The mode
* @param status True for mlock on, false for mlock off
+ * @param param The param to use for this mode, if required
+ * @return true on success, false on failure (module blocking)
*/
-void ChannelInfo::SetMLock(ChannelModeName Name, bool status)
+bool ChannelInfo::SetMLock(ChannelModeName Name, bool status, const std::string param)
{
size_t value = Name;
+ if (!status && !param.empty())
+ throw CoreException("Was told to mlock a mode negatively with a param?");
+
+ EventReturn MOD_RESULT;
+ FOREACH_MOD(I_OnMLock, OnMLock(Name, status, param));
+ if (MOD_RESULT == EVENT_STOP)
+ return false;
+
+ /* First, remove this everywhere */
+ mlock_on[value] = false;
+ mlock_off[value] = false;
+
+ std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
+ if (it != Params.end())
+ {
+ Params.erase(it);
+ }
+
if (status)
mlock_on[value] = true;
else
mlock_off[value] = true;
+
+ if (status && !param.empty())
+ {
+ Params.insert(std::make_pair(Name, param));
+ }
+
+ return true;
}
/** Remove a mlock
* @param Name The mode
- * @param status True for mlock on, false for mlock off
+ * @return true on success, false on failure (module blocking)
*/
-void ChannelInfo::RemoveMLock(ChannelModeName Name, bool status)
+bool ChannelInfo::RemoveMLock(ChannelModeName Name)
{
size_t value = Name;
- if (status)
- mlock_on[value] = false;
- else
- mlock_off[value] = false;
+ EventReturn MOD_RESULT;
+ FOREACH_MOD(I_OnUnMLock, OnUnMLock(Name));
+ if (MOD_RESULT == EVENT_STOP)
+ return false;
+
+ mlock_on[value] = false;
+ mlock_off[value] = false;
+
+ std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
+ if (it != Params.end())
+ {
+ Params.erase(it);
+ }
+
+ return true;
}
/** Clear all mlocks on the channel
@@ -461,29 +499,6 @@ const size_t ChannelInfo::GetMLockCount(bool status) const
return mlock_off.count();
}
-/** Set a channel mode param on the channel
- * @param Name The mode
- * @param param The param
- * @param true on success
- */
-bool ChannelInfo::SetParam(ChannelModeName Name, std::string Value)
-{
- return Params.insert(std::make_pair(Name, Value)).second;
-}
-
-/** Unset a param from the channel
- * @param Name The mode
- */
-void ChannelInfo::UnsetParam(ChannelModeName Name)
-{
- std::map<ChannelModeName, std::string>::iterator it = Params.find(Name);
-
- if (it != Params.end())
- {
- Params.erase(it);
- }
-}
-
/** Get a param from the channel
* @param Name The mode
* @param Target a string to put the param into