diff options
Diffstat (limited to 'modules/protocol/plexus.cpp')
-rw-r--r-- | modules/protocol/plexus.cpp | 105 |
1 files changed, 53 insertions, 52 deletions
diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index 42d282d19..1624aa28e 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -1,6 +1,6 @@ /* Plexus 3+ IRCD functions * - * (C) 2003-2012 Anope Team + * (C) 2003-2013 Anope Team * Contact us at team@anope.org * * Please read COPYING and README for further details. @@ -22,6 +22,7 @@ class PlexusProto : public IRCDProto { DefaultPseudoclientModes = "+oiU"; CanSVSNick = true; + CanSVSJoin = true; CanSetVHost = true; CanSetVIdent = true; CanSNLine = true; @@ -55,13 +56,13 @@ class PlexusProto : public IRCDProto /* If the user is internally on the channel with flags, kill them so that * the stacker will allow this. */ - UserContainer *uc = c->FindUser(user); + ChanUserContainer *uc = c->FindUser(user); if (uc != NULL) - uc->status->ClearFlags(); + uc->status.modes.clear(); BotInfo *setter = BotInfo::Find(user->nick); for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i) - if (cs.HasFlag(ModeManager::ChannelModes[i]->name)) + if (cs.modes.count(ModeManager::ChannelModes[i]->name)) c->SetMode(setter, ModeManager::ChannelModes[i], user->GetUID(), false); } } @@ -80,8 +81,8 @@ class PlexusProto : public IRCDProto void SendVhostDel(User *u) anope_override { - if (u->HasMode(UMODE_CLOAK)) - u->RemoveMode(HostServ, UMODE_CLOAK); + if (u->HasMode("CLOAK")) + u->RemoveMode(HostServ, "CLOAK"); else this->SendVhost(u, u->GetIdent(), u->chost); } @@ -154,12 +155,12 @@ class PlexusProto : public IRCDProto void SendSVSJoin(const BotInfo *source, const User *user, const Anope::string &chan, const Anope::string ¶m) anope_override { - UplinkSocket::Message(source) << "ENCAP " << user->server->GetSID() << " SVSJOIN " << user->GetUID() << " " << chan; + UplinkSocket::Message(source) << "ENCAP " << user->server->GetName() << " SVSJOIN " << user->GetUID() << " " << chan; } void SendSVSPart(const BotInfo *source, const User *user, const Anope::string &chan, const Anope::string ¶m) anope_override { - UplinkSocket::Message(source) << "ENCAP " << user->server->GetSID() << " SVSPART " << user->GetUID() << " " << chan; + UplinkSocket::Message(source) << "ENCAP " << user->server->GetName() << " SVSPART " << user->GetUID() << " " << chan; } }; @@ -184,8 +185,8 @@ struct IRCDMessageEncap : IRCDMessage if (u && nc) { u->Login(nc); - if (!Config->NoNicknameOwnership && user_na && user_na->nc == nc && user_na->nc->HasFlag(NI_UNCONFIRMED) == false) - u->SetMode(NickServ, UMODE_REGISTERED); + if (!Config->NoNicknameOwnership && user_na && user_na->nc == nc && user_na->nc->HasExt("UNCONFIRMED") == false) + u->SetMode(NickServ, "REGISTERED"); } } @@ -237,7 +238,9 @@ struct IRCDMessageServer : IRCDMessage struct IRCDMessageUID : IRCDMessage { - IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 11) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } + ServiceReference<NickServService> NSService; + + IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 11), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } /* params[0] = nick @@ -260,15 +263,27 @@ struct IRCDMessageUID : IRCDMessage if (ip == "0") ip.clear(); - User *user = new User(params[0], params[4], params[9], params[5], ip, source.GetServer(), params[10], params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[3], params[7]); - if (params[8] != "0" && params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == user->timestamp) + time_t ts; + try + { + ts = convertTo<time_t>(params[2]); + } + catch (const ConvertException &) { - NickAlias *na = NickAlias::Find(user->nick); - if (na) - user->Login(na->nc); + ts = Anope::CurTime; + } + + User *user = new User(params[0], params[4], params[9], params[5], ip, source.GetServer(), params[10], ts, params[3], params[7]); + try + { + if (NSService && params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == user->timestamp) + { + NickAlias *na = NickAlias::Find(user->nick); + if (na) + NSService->Login(user, na); + } } - else if (user && user->server->IsSynced() && NickServService) - NickServService->Validate(user); + catch (const ConvertException &) { } } }; @@ -310,30 +325,30 @@ class ProtoPlexus : public Module void AddModes() { /* Add user modes */ - ModeManager::RemoveUserMode(ModeManager::FindUserModeByName(UMODE_HIDEOPER)); - ModeManager::AddUserMode(new UserMode(UMODE_NOCTCP, 'C')); - ModeManager::AddUserMode(new UserMode(UMODE_DEAF, 'D')); - ModeManager::AddUserMode(new UserMode(UMODE_SOFTCALLERID, 'G')); - ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, 'N')); - ModeManager::AddUserMode(new UserMode(UMODE_SSL, 'S')); - ModeManager::AddUserMode(new UserMode(UMODE_WEBIRC, 'W')); - ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, 'g')); - ModeManager::AddUserMode(new UserMode(UMODE_PRIV, 'p')); - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x')); - ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, 'U')); + ModeManager::RemoveUserMode(ModeManager::FindUserModeByName("HIDEOPER")); + ModeManager::AddUserMode(new UserMode("NOCTCP", 'C')); + ModeManager::AddUserMode(new UserMode("DEAF", 'D')); + ModeManager::AddUserMode(new UserMode("SOFTCALLERID", 'G')); + ModeManager::AddUserMode(new UserMode("NETADMIN", 'N')); + ModeManager::AddUserMode(new UserMode("SSL", 'S')); + ModeManager::AddUserMode(new UserMode("WEBIRC", 'W')); + ModeManager::AddUserMode(new UserMode("CALLERID", 'g')); + ModeManager::AddUserMode(new UserMode("PRIV", 'p')); + ModeManager::AddUserMode(new UserMode("CLOAK", 'x')); + ModeManager::AddUserMode(new UserMode("PROTECTED", 'U')); /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '&', 3)); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '~', 4)); + ModeManager::AddChannelMode(new ChannelModeStatus("PROTECT", 'a', '&', 3)); + ModeManager::AddChannelMode(new ChannelModeStatus("OWNER", 'q', '~', 4)); /* Add channel modes */ - ModeManager::RemoveChannelMode(ModeManager::FindChannelModeByName(CMODE_REGISTERED)); - ModeManager::AddChannelMode(new ChannelMode(CMODE_BANDWIDTH, 'B')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOCTCP, 'C')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, 'M')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, 'N')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, 'c')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, 'z')); + ModeManager::RemoveChannelMode(ModeManager::FindChannelModeByName("REGISTERED")); + ModeManager::AddChannelMode(new ChannelMode("BANDWIDTH", 'B')); + ModeManager::AddChannelMode(new ChannelMode("NOCTCP", 'C')); + ModeManager::AddChannelMode(new ChannelMode("REGMODERATED", 'M')); + ModeManager::AddChannelMode(new ChannelMode("NONOTICE", 'N')); + ModeManager::AddChannelMode(new ChannelMode("BLOCKCOLOR", 'c')); + ModeManager::AddChannelMode(new ChannelMode("PERM", 'z')); } public: @@ -362,26 +377,12 @@ class ProtoPlexus : public Module throw ModuleException("No protocol interface for hybrid"); this->AddModes(); - - Implementation i[] = { I_OnServerSync }; - ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } ~ProtoPlexus() { ModuleManager::UnloadModule(m_hybrid, NULL); } - - void OnServerSync(Server *s) anope_override - { - if (NickServService) - for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it) - { - User *u = it->second; - if (u->server == s && !u->IsIdentified()) - NickServService->Validate(u); - } - } }; MODULE_INIT(ProtoPlexus) |