diff options
author | Adam <Adam@anope.org> | 2010-06-28 10:59:40 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2010-06-28 10:59:40 -0400 |
commit | 4502038e3da0e176e194aabfd64c85544bb0aa23 (patch) | |
tree | 6b52e3b3bd0753adc7884a352e934dfbd4aae902 | |
parent | 85b07a94d7d0c54e221dbbb8333870beb47bb3ac (diff) |
Unset all known status modes when we recieve a ts older than ours, and remove split servers from their uplinks
-rw-r--r-- | src/channels.cpp | 2 | ||||
-rw-r--r-- | src/protocol/bahamut.cpp | 20 | ||||
-rw-r--r-- | src/protocol/inspircd11.cpp | 20 | ||||
-rw-r--r-- | src/protocol/inspircd12.cpp | 20 | ||||
-rw-r--r-- | src/protocol/inspircd20.cpp | 20 | ||||
-rw-r--r-- | src/protocol/ratbox.cpp | 20 | ||||
-rw-r--r-- | src/protocol/unreal32.cpp | 21 | ||||
-rw-r--r-- | src/servers.cpp | 5 |
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) |