From 1626437cbf963b16ce44ef6cc829957fd3a7e2ff Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Fri, 12 Apr 2013 16:40:16 +0200 Subject: m_spanningtree Introduce IJOIN and RESYNC When a local user joins an existing channel, instead of an FJOIN, send an IJOIN with the channel name being the first parameter. If the joining user received prefix modes, append the channel TS and the prefix mode letters as the second and third parameters. When receiving an IJOIN, first check if the target channel exists. If it does not exist, ignore the join (that is, do not create the channel) and send a RESYNC back to the source. If the channel does exist then join the user, and in case any prefix modes were sent (found in the 3rd parameter), compare the TS of the channel to the TS in the IJOIN (2nd parameter). If the timestamps match, set the modes on the user, otherwise ignore the modes. Outgoing IJOINs to 1202 protocol servers are converted to FJOINs, but the channel mode parameter is left empty ("+"). --- src/modules/m_spanningtree/main.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 77ef6a0fd..7282baac9 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -47,8 +47,8 @@ ModuleSpanningTree::ModuleSpanningTree() SpanningTreeCommands::SpanningTreeCommands(ModuleSpanningTree* module) : rconnect(module, module->Utils), rsquit(module, module->Utils), svsjoin(module), svspart(module), svsnick(module), metadata(module), - uid(module), opertype(module), fjoin(module), fmode(module), ftopic(module), - fhost(module), fident(module), fname(module) + uid(module), opertype(module), fjoin(module), ijoin(module), resync(module), + fmode(module), ftopic(module), fhost(module), fident(module), fname(module) { } @@ -63,6 +63,8 @@ void ModuleSpanningTree::init() ServerInstance->Modules->AddService(commands->uid); ServerInstance->Modules->AddService(commands->opertype); ServerInstance->Modules->AddService(commands->fjoin); + ServerInstance->Modules->AddService(commands->ijoin); + ServerInstance->Modules->AddService(commands->resync); ServerInstance->Modules->AddService(commands->fmode); ServerInstance->Modules->AddService(commands->ftopic); ServerInstance->Modules->AddService(commands->fhost); @@ -551,20 +553,29 @@ void ModuleSpanningTree::OnUserConnect(LocalUser* user) Utils->TreeRoot->UserCount++; } -void ModuleSpanningTree::OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) +void ModuleSpanningTree::OnUserJoin(Membership* memb, bool sync, bool created_by_local, CUList& excepts) { // Only do this for local users if (IS_LOCAL(memb->user)) { parameterlist params; - // set up their permissions and the channel TS with FJOIN. - // All users are FJOINed now, because a module may specify - // new joining permissions for the user. params.push_back(memb->chan->name); - params.push_back(ConvToStr(memb->chan->age)); - params.push_back(std::string("+") + memb->chan->ChanModes(true)); - params.push_back(memb->modes+","+memb->user->uuid); - Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FJOIN",params); + if (created_by_local) + { + params.push_back(ConvToStr(memb->chan->age)); + params.push_back(std::string("+") + memb->chan->ChanModes(true)); + params.push_back(memb->modes+","+memb->user->uuid); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FJOIN",params); + } + else + { + if (!memb->modes.empty()) + { + params.push_back(ConvToStr(memb->chan->age)); + params.push_back(memb->modes); + } + Utils->DoOneToMany(memb->user->uuid, "IJOIN", params); + } } } -- cgit v1.3.1-10-gc9f91