summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/channels.cpp2
-rw-r--r--src/protocol/bahamut.cpp20
-rw-r--r--src/protocol/inspircd11.cpp20
-rw-r--r--src/protocol/inspircd12.cpp20
-rw-r--r--src/protocol/inspircd20.cpp20
-rw-r--r--src/protocol/ratbox.cpp20
-rw-r--r--src/protocol/unreal32.cpp21
-rw-r--r--src/servers.cpp5
8 files changed, 83 insertions, 45 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index a90aa5a03..e58655f58 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -1201,8 +1201,6 @@ void do_part(const char *source, int ac, const char **av)
if (!c)
Alog(LOG_DEBUG) << "Recieved PART from " << user->nick << " for nonexistant channel " << buf;
- Alog(LOG_DEBUG) << source << " leaves " << buf;
-
if (user->FindChannel(c))
{
FOREACH_MOD(I_OnPrePartChannel, OnPrePartChannel(user, c));
diff --git a/src/protocol/bahamut.cpp b/src/protocol/bahamut.cpp
index dc2790ac5..685dd52cd 100644
--- a/src/protocol/bahamut.cpp
+++ b/src/protocol/bahamut.cpp
@@ -322,15 +322,21 @@ int anope_event_sjoin(const char *source, int ac, const char **av)
c->creation_time = ts;
/* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/protocol/inspircd11.cpp b/src/protocol/inspircd11.cpp
index 0512b02ff..1b822bbf8 100644
--- a/src/protocol/inspircd11.cpp
+++ b/src/protocol/inspircd11.cpp
@@ -436,15 +436,21 @@ int anope_event_fjoin(const char *source, int ac, const char **av)
c->creation_time = ts;
/* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/protocol/inspircd12.cpp b/src/protocol/inspircd12.cpp
index 1746bdc57..504bdfc60 100644
--- a/src/protocol/inspircd12.cpp
+++ b/src/protocol/inspircd12.cpp
@@ -490,15 +490,21 @@ int anope_event_fjoin(const char *source, int ac, const char **av)
c->creation_time = ts;
/* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/protocol/inspircd20.cpp b/src/protocol/inspircd20.cpp
index 262eab645..9b1d57789 100644
--- a/src/protocol/inspircd20.cpp
+++ b/src/protocol/inspircd20.cpp
@@ -484,15 +484,21 @@ int anope_event_fjoin(const char *source, int ac, const char **av)
c->creation_time = ts;
/* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/protocol/ratbox.cpp b/src/protocol/ratbox.cpp
index 9285411c8..e1cb9ce46 100644
--- a/src/protocol/ratbox.cpp
+++ b/src/protocol/ratbox.cpp
@@ -319,15 +319,21 @@ int anope_event_sjoin(const char *source, int ac, const char **av)
c->creation_time = ts;
/* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/protocol/unreal32.cpp b/src/protocol/unreal32.cpp
index dff0421d2..cb4194ac7 100644
--- a/src/protocol/unreal32.cpp
+++ b/src/protocol/unreal32.cpp
@@ -1035,16 +1035,21 @@ int anope_event_sjoin(const char *source, int ac, const char **av)
{
c->creation_time = ts;
- /* Remove status from all of our users */
- for (CUserList::iterator it = c->users.begin(); it != c->users.end(); ++it)
+ for (std::list<Mode *>::const_iterator it =ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
{
- UserContainer *uc = *it;
+ Mode *m = *it;
- c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick);
- c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick);
- c->RemoveMode(NULL, CMODE_OP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick);
- c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick);
+ if (m->Type != MODE_STATUS)
+ continue;
+
+ ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
+
+ for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
+ {
+ UserContainer *uc = *uit;
+
+ c->RemoveMode(NULL, cm, uc->user->nick);
+ }
}
if (c->ci)
{
diff --git a/src/servers.cpp b/src/servers.cpp
index 4ab8db197..b5c7e4f7a 100644
--- a/src/servers.cpp
+++ b/src/servers.cpp
@@ -115,6 +115,11 @@ Server::~Server()
Alog(LOG_DEBUG) << "Finished removing all users for " << GetName();
}
+ if (UplinkServer)
+ {
+ UplinkServer->DelLink(this);
+ }
+
if (Links)
{
for (std::list<Server *>::iterator it = Links->begin(), it_end = Links->end(); it != it_end; ++it)