summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modes/cmode_b.h2
-rw-r--r--include/modes/cmode_h.h2
-rw-r--r--include/modes/cmode_k.h2
-rw-r--r--include/modes/cmode_o.h2
-rw-r--r--include/modes/cmode_v.h2
-rw-r--r--src/modes/cmode_b.cpp25
-rw-r--r--src/modes/cmode_h.cpp26
-rw-r--r--src/modes/cmode_k.cpp24
-rw-r--r--src/modes/cmode_o.cpp27
-rw-r--r--src/modes/cmode_v.cpp26
10 files changed, 137 insertions, 1 deletions
diff --git a/include/modes/cmode_b.h b/include/modes/cmode_b.h
index eea061751..f024a3b3d 100644
--- a/include/modes/cmode_b.h
+++ b/include/modes/cmode_b.h
@@ -16,5 +16,7 @@ class ModeChannelBan : public ModeHandler
std::string& DelBan(userrec *user,std::string& dest,chanrec *chan,int status);
void DisplayList(userrec* user, chanrec* channel);
ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string &parameter);
+ void RemoveMode(userrec* user);
+ void RemoveMode(chanrec* channel);
};
diff --git a/include/modes/cmode_h.h b/include/modes/cmode_h.h
index 277d89625..d71896a1e 100644
--- a/include/modes/cmode_h.h
+++ b/include/modes/cmode_h.h
@@ -15,5 +15,7 @@ class ModeChannelHalfOp : public ModeHandler
std::string DelHalfOp(userrec *user,const char *dest,chanrec *chan,int status);
ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string &parameter);
unsigned int GetPrefixRank();
+ void RemoveMode(chanrec* channel);
+ void RemoveMode(userrec* user);
};
diff --git a/include/modes/cmode_k.h b/include/modes/cmode_k.h
index 4c52e6443..64d30cb73 100644
--- a/include/modes/cmode_k.h
+++ b/include/modes/cmode_k.h
@@ -11,4 +11,6 @@ class ModeChannelKey : public ModeHandler
ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding);
ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string &parameter);
bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel);
+ void RemoveMode(chanrec* channel);
+ void RemoveMode(userrec* user);
};
diff --git a/include/modes/cmode_o.h b/include/modes/cmode_o.h
index 3fe097ec3..5690221e0 100644
--- a/include/modes/cmode_o.h
+++ b/include/modes/cmode_o.h
@@ -15,5 +15,7 @@ class ModeChannelOp : public ModeHandler
std::string DelOp(userrec *user,const char *dest,chanrec *chan,int status);
ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string &parameter);
unsigned int GetPrefixRank();
+ void RemoveMode(chanrec* channel);
+ void RemoveMode(userrec* user);
};
diff --git a/include/modes/cmode_v.h b/include/modes/cmode_v.h
index b7e9b800e..ef90a3781 100644
--- a/include/modes/cmode_v.h
+++ b/include/modes/cmode_v.h
@@ -15,5 +15,7 @@ class ModeChannelVoice : public ModeHandler
std::string DelVoice(userrec *user,const char *dest,chanrec *chan,int status);
ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string &parameter);
unsigned int GetPrefixRank();
+ void RemoveMode(userrec* user);
+ void RemoveMode(chanrec* channel);
};
diff --git a/src/modes/cmode_b.cpp b/src/modes/cmode_b.cpp
index 546bcb30f..9e2c777f0 100644
--- a/src/modes/cmode_b.cpp
+++ b/src/modes/cmode_b.cpp
@@ -37,6 +37,31 @@ ModeAction ModeChannelBan::OnModeChange(userrec* source, userrec* dest, chanrec*
return MODEACTION_ALLOW;
}
+void ModeChannelBan::RemoveMode(chanrec* channel)
+{
+ BanList copy;
+ char moderemove[MAXBUF];
+ userrec* n = new userrec(ServerInstance);
+ n->SetFd(FD_MAGIC_NUMBER);
+
+ for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
+ {
+ copy.push_back(*i);
+ }
+ for (BanList::iterator i = copy.begin(); i != copy.end(); i++)
+ {
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ const char* parameters[] = { channel->name, moderemove, i->data };
+ ServerInstance->SendMode(parameters, 3, n);
+ }
+
+ delete n;
+}
+
+void ModeChannelBan::RemoveMode(userrec* user)
+{
+}
+
void ModeChannelBan::DisplayList(userrec* user, chanrec* channel)
{
/* Display the channel banlist */
diff --git a/src/modes/cmode_h.cpp b/src/modes/cmode_h.cpp
index 9197cbd72..667402ace 100644
--- a/src/modes/cmode_h.cpp
+++ b/src/modes/cmode_h.cpp
@@ -32,6 +32,32 @@ ModePair ModeChannelHalfOp::ModeSet(userrec* source, userrec* dest, chanrec* cha
return std::make_pair(false, parameter);
}
+void ModeChannelHalfOp::RemoveMode(chanrec* channel)
+{
+ CUList* list = channel->GetHalfoppedUsers();
+ CUList copy;
+ char moderemove[MAXBUF];
+ userrec* n = new userrec(ServerInstance);
+ n->SetFd(FD_MAGIC_NUMBER);
+
+ for (CUList::iterator i = list->begin(); i != list->end(); i++)
+ {
+ userrec* n = i->second;
+ copy.insert(std::make_pair(n,n));
+ }
+ for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
+ {
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ const char* parameters[] = { channel->name, moderemove, i->second->nick };
+ ServerInstance->SendMode(parameters, 3, n);
+ }
+ delete n;
+}
+
+void ModeChannelHalfOp::RemoveMode(userrec* user)
+{
+}
+
ModeAction ModeChannelHalfOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
{
/* If halfops are not enabled in the conf, we don't execute
diff --git a/src/modes/cmode_k.cpp b/src/modes/cmode_k.cpp
index 4f95f3ad1..b32ad5c2b 100644
--- a/src/modes/cmode_k.cpp
+++ b/src/modes/cmode_k.cpp
@@ -18,7 +18,29 @@ ModePair ModeChannelKey::ModeSet(userrec* source, userrec* dest, chanrec* channe
{
return std::make_pair(false, parameter);
}
-}
+}
+
+void ModeChannelKey::RemoveMode(chanrec* channel)
+{
+ char moderemove[MAXBUF];
+ const char* parameters[] = { channel->name, moderemove, channel->key };
+
+ if (channel->IsModeSet(this->GetModeChar()))
+ {
+ userrec* n = new userrec(ServerInstance);
+
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ n->SetFd(FD_MAGIC_NUMBER);
+
+ ServerInstance->SendMode(parameters, 3, n);
+
+ delete n;
+ }
+}
+
+void ModeChannelKey::RemoveMode(userrec* user)
+{
+}
bool ModeChannelKey::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel)
{
diff --git a/src/modes/cmode_o.cpp b/src/modes/cmode_o.cpp
index 85eb08c38..b9fb0208b 100644
--- a/src/modes/cmode_o.cpp
+++ b/src/modes/cmode_o.cpp
@@ -32,6 +32,33 @@ ModePair ModeChannelOp::ModeSet(userrec* source, userrec* dest, chanrec* channel
return std::make_pair(false, parameter);
}
+
+void ModeChannelOp::RemoveMode(chanrec* channel)
+{
+ CUList* list = channel->GetOppedUsers();
+ CUList copy;
+ char moderemove[MAXBUF];
+ userrec* n = new userrec(ServerInstance);
+ n->SetFd(FD_MAGIC_NUMBER);
+
+ for (CUList::iterator i = list->begin(); i != list->end(); i++)
+ {
+ userrec* n = i->second;
+ copy.insert(std::make_pair(n,n));
+ }
+ for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
+ {
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ const char* parameters[] = { channel->name, moderemove, i->second->nick };
+ ServerInstance->SendMode(parameters, 3, n);
+ }
+ delete n;
+}
+
+void ModeChannelOp::RemoveMode(userrec* user)
+{
+}
+
ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
{
int status = channel->GetStatus(source);
diff --git a/src/modes/cmode_v.cpp b/src/modes/cmode_v.cpp
index 50b74cef7..9fd5df7bd 100644
--- a/src/modes/cmode_v.cpp
+++ b/src/modes/cmode_v.cpp
@@ -32,6 +32,32 @@ ModePair ModeChannelVoice::ModeSet(userrec* source, userrec* dest, chanrec* chan
return std::make_pair(false, parameter);
}
+void ModeChannelVoice::RemoveMode(chanrec* channel)
+{
+ CUList* list = channel->GetVoicedUsers();
+ CUList copy;
+ char moderemove[MAXBUF];
+ userrec* n = new userrec(ServerInstance);
+ n->SetFd(FD_MAGIC_NUMBER);
+
+ for (CUList::iterator i = list->begin(); i != list->end(); i++)
+ {
+ userrec* n = i->second;
+ copy.insert(std::make_pair(n,n));
+ }
+ for (CUList::iterator i = copy.begin(); i != copy.end(); i++)
+ {
+ sprintf(moderemove,"-%c",this->GetModeChar());
+ const char* parameters[] = { channel->name, moderemove, i->second->nick };
+ ServerInstance->SendMode(parameters, 3, n);
+ }
+ delete n;
+}
+
+void ModeChannelVoice::RemoveMode(userrec* user)
+{
+}
+
ModeAction ModeChannelVoice::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
{
int status = channel->GetStatus(source);