summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nickalias.cpp4
-rw-r--r--src/nickserv.cpp22
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";