blob: c31d981293ee8e961a387ed0ddd6bd3fb8ab9e72 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#include "services.h"
#include "modules.h"
/** Default constructor
* @param nick The nick
* @param nickcore The nickcofe for this nick
*/
NickAlias::NickAlias(const Anope::string &nickname, NickCore *nickcore) : Flags<NickNameFlag, NS_END>(NickNameFlagStrings)
{
if (nickname.empty())
throw CoreException("Empty nick passed to NickAlias constructor");
else if (!nickcore)
throw CoreException("Empty nickcore passed to NickAlias constructor");
this->time_registered = this->last_seen = Anope::CurTime;
this->nick = nickname;
this->nc = nickcore;
this->nc->aliases.push_back(this);
NickAliasList[this->nick] = this;
if (this->nc->o == NULL)
{
Oper *o = Oper::Find(this->nick);
if (o == NULL)
o = Oper::Find(this->nc->display);
this->nc->o = o;
if (this->nc->o != NULL)
Log() << "Tied oper " << this->nc->display << " to type " << this->nc->o->ot->GetName();
}
}
/** Default destructor
*/
NickAlias::~NickAlias()
{
FOREACH_MOD(I_OnDelNick, OnDelNick(this));
/* Accept nicks that have no core, because of database load functions */
if (this->nc)
{
/* Next: see if our core is still useful. */
std::list<NickAlias *>::iterator it = std::find(this->nc->aliases.begin(), this->nc->aliases.end(), this);
if (it != this->nc->aliases.end())
this->nc->aliases.erase(it);
if (this->nc->aliases.empty())
{
delete this->nc;
this->nc = NULL;
}
else
{
/* Display updating stuff */
if (this->nick.equals_ci(this->nc->display))
change_core_display(this->nc);
}
}
/* Remove us from the aliases list */
NickAliasList.erase(this->nick);
}
/** Release a nick from being held. This can be called from the core (ns_release)
* or from a timer used when forcing clients off of nicks. Note that if this is called
* from a timer, ircd->svshold is NEVER true
*/
void NickAlias::Release()
{
if (this->HasFlag(NS_HELD))
{
if (ircd->svshold)
ircdproto->SendSVSHoldDel(this->nick);
else
{
User *u = finduser(this->nick);
if (u && u->server == Me)
{
delete u;
}
}
this->UnsetFlag(NS_HELD);
}
}
/** Called when a user gets off this nick
* See the comment in users.cpp for User::Collide()
* @param u The user
*/
void NickAlias::OnCancel(User *)
{
if (this->HasFlag(NS_COLLIDED))
{
this->SetFlag(NS_HELD);
this->UnsetFlag(NS_COLLIDED);
if (ircd->svshold)
ircdproto->SendSVSHold(this->nick);
else
{
new NickServRelease(this, Config->NSReleaseTimeout);
}
}
}
|