diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nickalias.cpp | 4 | ||||
-rw-r--r-- | src/nickserv.cpp | 22 |
2 files changed, 24 insertions, 2 deletions
diff --git a/src/nickalias.cpp b/src/nickalias.cpp index c31d98129..f5269cc9f 100644 --- a/src/nickalias.cpp +++ b/src/nickalias.cpp @@ -94,11 +94,11 @@ void NickAlias::OnCancel(User *) this->SetFlag(NS_HELD); this->UnsetFlag(NS_COLLIDED); + new NickServHeld(this, Config->NSReleaseTimeout); + if (ircd->svshold) ircdproto->SendSVSHold(this->nick); else - { new NickServRelease(this, Config->NSReleaseTimeout); - } } } diff --git a/src/nickserv.cpp b/src/nickserv.cpp index c88eab55f..ca5d3d48c 100644 --- a/src/nickserv.cpp +++ b/src/nickserv.cpp @@ -16,9 +16,11 @@ nickalias_map NickAliasList; nickcore_map NickCoreList; typedef std::map<Anope::string, NickServCollide *> nickservcollides_map; +typedef std::map<Anope::string, NickServHeld *> nickservheld_map; typedef std::map<Anope::string, NickServRelease *> nickservreleases_map; static nickservcollides_map NickServCollides; +static nickservheld_map NickServHelds; static nickservreleases_map NickServReleases; NickServCollide::NickServCollide(User *user, time_t delay) : Timer(delay), u(user), nick(u->nick) @@ -48,6 +50,26 @@ void NickServCollide::Tick(time_t ctime) u->Collide(na); } +NickServHeld::NickServHeld(NickAlias *n, long l) : Timer(l), na(n), nick(na->nick) +{ + nickservheld_map::iterator nit = NickServHelds.find(na->nick); + if (nit != NickServHelds.end()) + delete nit->second; + + NickServHelds[na->nick] = this; +} + +NickServHeld::~NickServHeld() +{ + NickServHelds.erase(this->nick); +} + +void NickServHeld::Tick(time_t) +{ + if (na) + na->UnsetFlag(NS_HELD); +} + NickServRelease::NickServRelease(NickAlias *na, time_t delay) : User(na->nick, Config->NSEnforcerUser, Config->NSEnforcerHost, ts6_uid_retrieve()), Timer(delay), nick(na->nick) { this->realname = "Services Enforcer"; |