summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-11-11 06:03:40 +0000
committerAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-11-11 06:03:40 +0000
commit0bd3141407c7701beed90b8e560a07126db64f25 (patch)
treee2d9b09ad4a319824348b36c629249d6517fc6d1 /src
parentb9190ebc16253254cb649faae76119eec3e14b8e (diff)
Made DefCon not use a ChannelInfo structure for saving its modes & params, it was ugly
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2640 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src')
-rw-r--r--src/core/os_defcon.c41
-rw-r--r--src/operserv.c42
2 files changed, 58 insertions, 25 deletions
diff --git a/src/core/os_defcon.c b/src/core/os_defcon.c
index f2d2cf8ec..81d25624f 100644
--- a/src/core/os_defcon.c
+++ b/src/core/os_defcon.c
@@ -184,7 +184,7 @@ class OSDEFCON : public Module
{
ChannelMode *cm = ModeManager::FindChannelModeByName(Name);
- if (CheckDefCon(DEFCON_FORCE_CHAN_MODES) && cm && DefConModesCI.HasMLock(Name, false))
+ if (CheckDefCon(DEFCON_FORCE_CHAN_MODES) && cm && DefConModesOff.HasFlag(Name))
{
c->RemoveMode(Name);
ircdproto->SendMode(findbot(s_OperServ), c->name, "-%c", cm->ModeChar);
@@ -195,16 +195,19 @@ class OSDEFCON : public Module
{
ChannelMode *cm = ModeManager::FindChannelModeByName(Name);
- if (CheckDefCon(DEFCON_FORCE_CHAN_MODES) && cm && DefConModesCI.HasMLock(Name, true))
+ if (CheckDefCon(DEFCON_FORCE_CHAN_MODES) && cm && DefConModesOn.HasFlag(Name))
{
std::string param;
- DefConModesCI.GetParam(Name, &param);
-
+ GetDefConParam(Name, &param);
+
c->SetMode(Name);
std::string buf = "+" + std::string(&cm->ModeChar);
if (!param.empty())
+ {
buf += " " + param;
+ c->SetParam(Name, param);
+ }
ircdproto->SendMode(findbot(s_OperServ), c->name, buf.c_str());
}
}
@@ -421,7 +424,8 @@ void defconParseModeString(const char *str)
spacesepstream ss(str);
- DefConModesCI.ClearMLock();
+ DefConModesOn.ClearFlags();
+ DefConModesOff.ClearFlags();
ss.GetToken(modes);
/* Loop while there are modes to set */
@@ -451,8 +455,8 @@ void defconParseModeString(const char *str)
}
else if (add)
{
- DefConModesCI.SetMLock(cm->Name, true);
- DefConModesCI.RemoveMLock(cm->Name, false);
+ DefConModesOn.SetFlag(cm->Name);
+ DefConModesOff.UnsetFlag(cm->Name);
if (cm->Type == MODE_PARAM)
{
@@ -467,22 +471,18 @@ void defconParseModeString(const char *str)
if (!cmp->IsValid(param.c_str()))
continue;
- DefConModesCI.SetParam(cmp->Name, param);
+ SetDefConParam(cmp->Name, param);
}
}
else
{
- DefConModesCI.RemoveMLock(cm->Name, true);
-
- if (DefConModesCI.HasMLock(cm->Name, true))
+ if (DefConModesOn.HasFlag(cm->Name))
{
- DefConModesCI.RemoveMLock(cm->Name, true);
+ DefConModesOn.UnsetFlag(cm->Name);
if (cm->Type == MODE_PARAM)
{
- cmp = static_cast<ChannelModeParam *>(cm);
-
- DefConModesCI.UnsetParam(cmp->Name);
+ UnsetDefConParam(cm->Name);
}
}
}
@@ -492,10 +492,11 @@ void defconParseModeString(const char *str)
if ((cm = ModeManager::FindChannelModeByName(CMODE_REDIRECT)))
{
/* We can't mlock +L if +l is not mlocked as well. */
- if (DefConModesCI.HasMLock(cm->Name, true) && !DefConModesCI.HasMLock(CMODE_LIMIT, true))
+ if (DefConModesOn.HasFlag(cm->Name) && !DefConModesOn.HasFlag(CMODE_LIMIT))
{
- DefConModesCI.RemoveMLock(CMODE_REDIRECT, true);
- DefConModesCI.UnsetParam(CMODE_REDIRECT);
+ DefConModesOn.UnsetFlag(CMODE_REDIRECT);
+
+ //DefConModesCI.UnsetParam(CMODE_REDIRECT);
alog("DefConChanModes must lock mode +l as well to lock mode +L");
}
}
@@ -504,9 +505,9 @@ void defconParseModeString(const char *str)
/* So check if we need there is a NOKNOCK MODE and that we need INVITEONLY */
if (ircd->knock_needs_i && (cm = ModeManager::FindChannelModeByName(CMODE_NOKNOCK)))
{
- if (DefConModesCI.HasMLock(cm->Name, true) && !DefConModesCI.HasMLock(CMODE_INVITE, true))
+ if (DefConModesOn.HasFlag(cm->Name) && !DefConModesOn.HasFlag(CMODE_INVITE))
{
- DefConModesCI.RemoveMLock(CMODE_NOKNOCK, true);
+ DefConModesOn.UnsetFlag(CMODE_NOKNOCK);
alog("DefConChanModes must lock mode +i as well to lock mode +K");
}
}
diff --git a/src/operserv.c b/src/operserv.c
index 0c78ea707..4acedbbd9 100644
--- a/src/operserv.c
+++ b/src/operserv.c
@@ -36,12 +36,44 @@ std::vector<NewsItem *> News;
std::vector<std::bitset<32> > DefCon;
int DefConModesSet = 0;
-ChannelInfo DefConModesCI; /* ChannelInfo containg params for locked modes
- * during DefCon; I would've done this nicer if i
- * could, but all damn mode functions require a
- * ChannelInfo struct! --gdex
- */
+/* Defcon modes mlocked on */
+Flags<ChannelModeName> DefConModesOn;
+/* Defcon modes mlocked off */
+Flags<ChannelModeName> DefConModesOff;
+/* Map of Modesa and Params for DefCon */
+std::map<ChannelModeName, std::string> DefConModesOnParams;
+
+bool SetDefConParam(ChannelModeName Name, std::string &buf)
+{
+ return DefConModesOnParams.insert(std::make_pair(Name, buf)).second;
+}
+bool GetDefConParam(ChannelModeName Name, std::string *buf)
+{
+ std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name);
+
+ buf->clear();
+
+ if (it != DefConModesOnParams.end())
+ {
+ *buf = it->second;
+ return true;
+ }
+
+ return false;
+}
+
+void UnsetDefConParam(ChannelModeName Name)
+{
+ std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name);
+
+ if (it != DefConModesOnParams.end())
+ {
+ DefConModesOnParams.erase(it);
+ }
+}
+
+/*************************************************************************/
void moduleAddOperServCmds();
/*************************************************************************/