]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Make SAJOIN/SAPART more spanningtree friendly, they are throwbacks to the inspircd...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 8 May 2007 16:16:25 +0000 (16:16 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 8 May 2007 16:16:25 +0000 (16:16 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6911 e03df62e-2008-0410-955e-edbf42e46eb7

src/modules/m_banredirect.cpp
src/modules/m_conn_join.cpp
src/modules/m_operjoin.cpp
src/modules/m_redirect.cpp
src/modules/m_sajoin.cpp
src/modules/m_sapart.cpp

index 6150c5193141c737933a20662f2ea7c2a1290cc0..2d9deedc6a6510b4ddb8d866abb99ddae23e58c4 100644 (file)
@@ -294,7 +294,7 @@ class ModuleBanRedirect : public Module
                                                {
                                                        user->WriteServ("470 %s :You are banned from %s. You are being automatically redirected to %s", user->nick, chan->name, redir->targetchan.c_str());
                                                        nofollow = true;
-                                                       chanrec::JoinUser(Srv, user, redir->targetchan.c_str(), false, "");
+                                                       chanrec::JoinUser(Srv, user, redir->targetchan.c_str(), false, "", ServerInstance->Time(true));
                                                        nofollow = false;
                                                        return 1;
                                                }
index 75415d6a5971f45328a75e65d2ed4de3349ed06a..2cc6274a26d3f083f8beeeeeffd79b90f8e10150 100644 (file)
@@ -88,7 +88,7 @@ class ModuleConnJoin : public Module
 
                        for(std::vector<std::string>::iterator it = Joinchans.begin(); it != Joinchans.end(); it++)
                                if (ServerInstance->IsChannel(it->c_str()))
-                                       chanrec::JoinUser(ServerInstance, user, it->c_str(), false, "");
+                                       chanrec::JoinUser(ServerInstance, user, it->c_str(), false, "", ServerInstance->Time(true));
                }
 
 };
index 4308068e3e83aaa57b2a36744282d183fbfc9bc4..518eeb0098225f741d7d4e19c79825d95249ff04 100644 (file)
@@ -89,7 +89,7 @@ class ModuleOperjoin : public Module
 
                        for(std::vector<std::string>::iterator it = operChans.begin(); it != operChans.end(); it++)
                                if (ServerInstance->IsChannel(it->c_str()))
-                                       chanrec::JoinUser(ServerInstance, user, it->c_str(), false, "");
+                                       chanrec::JoinUser(ServerInstance, user, it->c_str(), false, "", ServerInstance->Time(true));
                }
 
 };
index 9cba183fe7d5f28275a1ac40fd7e7c75805b394e..e09c9b33b184294abcafa94854e7c4b5b737ffb6 100644 (file)
@@ -137,7 +137,7 @@ class ModuleRedirect : public Module
                                        }
 
                                        user->WriteServ("470 %s :%s has become full, so you are automatically being transferred to the linked channel %s", user->nick, cname, channel.c_str());
-                                       chanrec::JoinUser(ServerInstance, user, channel.c_str(), false, "");
+                                       chanrec::JoinUser(ServerInstance, user, channel.c_str(), false, "", ServerInstance->Time(true));
                                        return 1;
                                }
                        }
index ad5aef213dc49881d6d799ed19c53bdf64ccf77d..b91b1a2f00063deac016c562b373840b04543752 100644 (file)
@@ -49,27 +49,38 @@ class cmd_sajoin : public command_t
                                return CMD_FAILURE;
                        }
 
-                       chanrec::JoinUser(ServerInstance, dest, parameters[1], true, "");
-
-                       /* Fix for dotslasher and w00t - if the join didnt succeed, return CMD_FAILURE so that it doesnt propogate */
-                       chanrec* n = ServerInstance->FindChan(parameters[1]);
-                       if (n)
+                       /* For local users, we send the JoinUser which may create a channel and set its TS.
+                        * For non-local users, we just return CMD_SUCCESS, knowing this will propogate it where it needs to be
+                        * and then that server will generate the users JOIN or FJOIN instead.
+                        */
+                       if (IS_LOCAL(dest))
                        {
-                               if (n->HasUser(dest))
+                               chanrec::JoinUser(ServerInstance, dest, parameters[1], true, "", ServerInstance->Time(true));
+                               /* Fix for dotslasher and w00t - if the join didnt succeed, return CMD_FAILURE so that it doesnt propogate */
+                               chanrec* n = ServerInstance->FindChan(parameters[1]);
+                               if (n)
                                {
-                                       ServerInstance->WriteOpers("*** "+std::string(user->nick)+" used SAJOIN to make "+std::string(dest->nick)+" join "+parameters[1]);
-                                       return CMD_SUCCESS;
+                                       if (n->HasUser(dest))
+                                       {
+                                               ServerInstance->WriteOpers("*** "+std::string(user->nick)+" used SAJOIN to make "+std::string(dest->nick)+" join "+parameters[1]);
+                                               return CMD_SUCCESS;
+                                       }
+                                       else
+                                       {
+                                               user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Could not join "+std::string(dest->nick)+" to "+parameters[1]+" (User is probably banned, or blocking modes)");
+                                               return CMD_FAILURE;
+                                       }
                                }
                                else
                                {
-                                       user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Could not join "+std::string(dest->nick)+" to "+parameters[1]+" (User is probably banned, or blocking modes)");
+                                       user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Could not join "+std::string(dest->nick)+" to "+parameters[1]);
                                        return CMD_FAILURE;
                                }
                        }
                        else
                        {
-                               user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Could not join "+std::string(dest->nick)+" to "+parameters[1]);
-                               return CMD_FAILURE;
+                               ServerInstance->WriteOpers("*** "+std::string(user->nick)+" sent remote SAJOIN to make "+std::string(dest->nick)+" join "+parameters[1]);
+                               return CMD_SUCCESS;
                        }
                }
                else
index b341b4c283f00c7e3713f9c8a54f57b816435860..01df5c1be8a05500c4290805cee36448756beb79 100644 (file)
@@ -43,27 +43,38 @@ class cmd_sapart : public command_t
                                return CMD_FAILURE;
                        }
 
-                       if (!channel->PartUser(dest, dest->nick))
-                               delete channel;
-                       chanrec* n = ServerInstance->FindChan(parameters[1]);
-                       if (!n)
+                       /* For local clients, directly part them generating a PART message. For remote clients,
+                        * just return CMD_SUCCESS knowing the protocol module will route the SAPART to the users
+                        * local server and that will generate the PART instead
+                        */
+                       if (IS_LOCAL(dest))
                        {
-                               ServerInstance->WriteOpers("*** "+std::string(user->nick)+" used SAPART to make "+dest->nick+" part "+parameters[1]);
-                               return CMD_SUCCESS;
-                       }
-                       else
-                       {
-                               if (!n->HasUser(dest))
+                               if (!channel->PartUser(dest, dest->nick))
+                                       delete channel;
+                               chanrec* n = ServerInstance->FindChan(parameters[1]);
+                               if (!n)
                                {
                                        ServerInstance->WriteOpers("*** "+std::string(user->nick)+" used SAPART to make "+dest->nick+" part "+parameters[1]);
                                        return CMD_SUCCESS;
                                }
                                else
                                {
-                                       user->WriteServ("NOTICE %s :*** Unable to make %s part %s",user->nick, dest->nick, parameters[1]);
-                                       return CMD_FAILURE;
+                                       if (!n->HasUser(dest))
+                                       {
+                                               ServerInstance->WriteOpers("*** "+std::string(user->nick)+" used SAPART to make "+dest->nick+" part "+parameters[1]);
+                                               return CMD_SUCCESS;
+                                       }
+                                       else
+                                       {
+                                               user->WriteServ("NOTICE %s :*** Unable to make %s part %s",user->nick, dest->nick, parameters[1]);
+                                               return CMD_FAILURE;
+                                       }
                                }
                        }
+                       else
+                       {
+                               ServerInstance->WriteOpers("*** "+std::string(user->nick)+" sent remote SAPART to make "+dest->nick+" part "+parameters[1]);
+                       }
 
                        return CMD_SUCCESS;
                }