1
0
mirror of https://github.com/anope/anope.git synced 2026-06-26 20:56:39 +02:00
Files
anope/src/nickalias.cpp
T

146 lines
3.3 KiB
C++

#include "services.h"
#include "modules.h"
NickRequest::NickRequest(const Anope::string &nickname)
{
if (nickname.empty())
throw CoreException("Empty nick passed to NickRequest constructor");
this->requested = this->lastmail = 0;
this->nick = nickname;
NickRequestList[this->nick] = this;
}
NickRequest::~NickRequest()
{
FOREACH_MOD(I_OnDelNickRequest, OnDelNickRequest(this));
NickRequestList.erase(this->nick);
}
/** Default constructor
* @param nick The nick
* @param nickcore The nickcofe for this nick
*/
NickAlias::NickAlias(const Anope::string &nickname, NickCore *nickcore)
{
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 = 0;
this->nick = nickname;
this->nc = nickcore;
this->nc->aliases.push_back(this);
NickAliasList[this->nick] = this;
for (std::list<std::pair<Anope::string, Anope::string> >::iterator it = Config->Opers.begin(), it_end = Config->Opers.end(); it != it_end; ++it)
{
if (this->nc->ot)
break;
if (!this->nick.equals_ci(it->first))
continue;
for (std::list<OperType *>::iterator tit = Config->MyOperTypes.begin(), tit_end = Config->MyOperTypes.end(); tit != tit_end; ++tit)
{
OperType *ot = *tit;
if (ot->GetName().equals_ci(it->second))
{
Log() << "Tied oper " << this->nc->display << " to type " << ot->GetName();
this->nc->ot = ot;
break;
}
}
}
}
/** Default destructor
*/
NickAlias::~NickAlias()
{
FOREACH_MOD(I_OnDelNick, OnDelNick(this));
/* Second thing to do: look for an user using the alias
* being deleted, and make appropriate changes */
User *u = finduser(this->nick);
if (u && u->Account())
{
ircdproto->SendAccountLogout(u, u->Account());
u->RemoveMode(NickServ, UMODE_REGISTERED);
ircdproto->SendUnregisteredNick(u);
u->Logout();
}
/* 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);
}
}
}