summaryrefslogtreecommitdiff
path: root/modules/protocol/plexus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/protocol/plexus.cpp')
-rw-r--r--modules/protocol/plexus.cpp105
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 &param) 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 &param) 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)