anope- supernets anope source code & configuration |
git clone git://git.acid.vegas/anope.git |
Log | Files | Refs | Archive | README |
nickalias.cpp (5380B)
1 /* 2 * 3 * (C) 2003-2022 Anope Team 4 * Contact us at team@anope.org 5 * 6 * Please read COPYING and README for further details. 7 * 8 * Based on the original code of Epona by Lara. 9 * Based on the original code of Services by Andy Church. 10 */ 11 12 #include "services.h" 13 #include "account.h" 14 #include "modules.h" 15 #include "opertype.h" 16 #include "protocol.h" 17 #include "users.h" 18 #include "servers.h" 19 #include "config.h" 20 21 Serialize::Checker<nickalias_map> NickAliasList("NickAlias"); 22 23 NickAlias::NickAlias(const Anope::string &nickname, NickCore* nickcore) : Serializable("NickAlias") 24 { 25 if (nickname.empty()) 26 throw CoreException("Empty nick passed to NickAlias constructor"); 27 else if (!nickcore) 28 throw CoreException("Empty nickcore passed to NickAlias constructor"); 29 30 this->time_registered = this->last_seen = Anope::CurTime; 31 this->nick = nickname; 32 this->nc = nickcore; 33 nickcore->aliases->push_back(this); 34 35 size_t old = NickAliasList->size(); 36 (*NickAliasList)[this->nick] = this; 37 if (old == NickAliasList->size()) 38 Log(LOG_DEBUG) << "Duplicate nick " << nickname << " in nickalias table"; 39 40 if (this->nc->o == NULL) 41 { 42 Oper *o = Oper::Find(this->nick); 43 if (o == NULL) 44 o = Oper::Find(this->nc->display); 45 nickcore->o = o; 46 if (this->nc->o != NULL) 47 Log() << "Tied oper " << this->nc->display << " to type " << this->nc->o->ot->GetName(); 48 } 49 } 50 51 NickAlias::~NickAlias() 52 { 53 FOREACH_MOD(OnDelNick, (this)); 54 55 UnsetExtensibles(); 56 57 /* Accept nicks that have no core, because of database load functions */ 58 if (this->nc) 59 { 60 /* Next: see if our core is still useful. */ 61 std::vector<NickAlias *>::iterator it = std::find(this->nc->aliases->begin(), this->nc->aliases->end(), this); 62 if (it != this->nc->aliases->end()) 63 this->nc->aliases->erase(it); 64 if (this->nc->aliases->empty()) 65 { 66 delete this->nc; 67 this->nc = NULL; 68 } 69 else 70 { 71 /* Display updating stuff */ 72 if (this->nick.equals_ci(this->nc->display)) 73 this->nc->SetDisplay(this->nc->aliases->front()); 74 } 75 } 76 77 /* Remove us from the aliases list */ 78 NickAliasList->erase(this->nick); 79 } 80 81 void NickAlias::SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created) 82 { 83 this->vhost_ident = ident; 84 this->vhost_host = host; 85 this->vhost_creator = creator; 86 this->vhost_created = created; 87 } 88 89 void NickAlias::RemoveVhost() 90 { 91 this->vhost_ident.clear(); 92 this->vhost_host.clear(); 93 this->vhost_creator.clear(); 94 this->vhost_created = 0; 95 } 96 97 bool NickAlias::HasVhost() const 98 { 99 return !this->vhost_host.empty(); 100 } 101 102 const Anope::string &NickAlias::GetVhostIdent() const 103 { 104 return this->vhost_ident; 105 } 106 107 const Anope::string &NickAlias::GetVhostHost() const 108 { 109 return this->vhost_host; 110 } 111 112 const Anope::string &NickAlias::GetVhostCreator() const 113 { 114 return this->vhost_creator; 115 } 116 117 time_t NickAlias::GetVhostCreated() const 118 { 119 return this->vhost_created; 120 } 121 122 NickAlias *NickAlias::Find(const Anope::string &nick) 123 { 124 nickalias_map::const_iterator it = NickAliasList->find(nick); 125 if (it != NickAliasList->end()) 126 { 127 it->second->QueueUpdate(); 128 return it->second; 129 } 130 131 return NULL; 132 } 133 134 void NickAlias::Serialize(Serialize::Data &data) const 135 { 136 data["nick"] << this->nick; 137 data["last_quit"] << this->last_quit; 138 data["last_realname"] << this->last_realname; 139 data["last_usermask"] << this->last_usermask; 140 data["last_realhost"] << this->last_realhost; 141 data.SetType("time_registered", Serialize::Data::DT_INT); data["time_registered"] << this->time_registered; 142 data.SetType("last_seen", Serialize::Data::DT_INT); data["last_seen"] << this->last_seen; 143 data["nc"] << this->nc->display; 144 145 if (this->HasVhost()) 146 { 147 data["vhost_ident"] << this->GetVhostIdent(); 148 data["vhost_host"] << this->GetVhostHost(); 149 data["vhost_creator"] << this->GetVhostCreator(); 150 data["vhost_time"] << this->GetVhostCreated(); 151 } 152 153 Extensible::ExtensibleSerialize(this, this, data); 154 } 155 156 Serializable* NickAlias::Unserialize(Serializable *obj, Serialize::Data &data) 157 { 158 Anope::string snc, snick; 159 160 data["nc"] >> snc; 161 data["nick"] >> snick; 162 163 NickCore *core = NickCore::Find(snc); 164 if (core == NULL) 165 return NULL; 166 167 NickAlias *na; 168 if (obj) 169 na = anope_dynamic_static_cast<NickAlias *>(obj); 170 else 171 na = new NickAlias(snick, core); 172 173 if (na->nc != core) 174 { 175 std::vector<NickAlias *>::iterator it = std::find(na->nc->aliases->begin(), na->nc->aliases->end(), na); 176 if (it != na->nc->aliases->end()) 177 na->nc->aliases->erase(it); 178 179 if (na->nc->aliases->empty()) 180 delete na->nc; 181 else if (na->nick.equals_ci(na->nc->display)) 182 na->nc->SetDisplay(na->nc->aliases->front()); 183 184 na->nc = core; 185 core->aliases->push_back(na); 186 } 187 188 data["last_quit"] >> na->last_quit; 189 data["last_realname"] >> na->last_realname; 190 data["last_usermask"] >> na->last_usermask; 191 data["last_realhost"] >> na->last_realhost; 192 data["time_registered"] >> na->time_registered; 193 data["last_seen"] >> na->last_seen; 194 195 Anope::string vhost_ident, vhost_host, vhost_creator; 196 time_t vhost_time; 197 198 data["vhost_ident"] >> vhost_ident; 199 data["vhost_host"] >> vhost_host; 200 data["vhost_creator"] >> vhost_creator; 201 data["vhost_time"] >> vhost_time; 202 203 na->SetVhost(vhost_ident, vhost_host, vhost_creator, vhost_time); 204 205 Extensible::ExtensibleUnserialize(na, na, data); 206 207 /* compat */ 208 bool b; 209 b = false; 210 data["extensible:NO_EXPIRE"] >> b; 211 if (b) 212 na->Extend<bool>("NS_NO_EXPIRE"); 213 /* end compat */ 214 215 return na; 216 }