From 0f6de0b18372a76ebb5d6c4ba3dc9a7a7e0a7297 Mon Sep 17 00:00:00 2001 From: brain Date: Sun, 18 Mar 2007 16:52:56 +0000 Subject: [PATCH] set the TS of a channel in JoinUser, not after the entire FJOIN, this is safer and may fix the odd desync here and there git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6690 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/channels.h | 2 +- src/channels.cpp | 7 +++++-- src/cmd_join.cpp | 2 +- src/modules/m_banredirect.cpp | 2 +- src/modules/m_conn_join.cpp | 2 +- src/modules/m_operjoin.cpp | 2 +- src/modules/m_redirect.cpp | 2 +- src/modules/m_sajoin.cpp | 2 +- src/modules/m_spanningtree/treesocket1.cpp | 18 ++++-------------- src/modules/m_spanningtree/treesocket2.cpp | 2 +- 10 files changed, 17 insertions(+), 24 deletions(-) diff --git a/include/channels.h b/include/channels.h index 7daab2167..305ff9974 100644 --- a/include/channels.h +++ b/include/channels.h @@ -352,7 +352,7 @@ class chanrec : public Extensible * been created if the channel did not exist before the user was joined to it. * If the user could not be joined to a channel, the return value may be NULL. */ - static chanrec* JoinUser(InspIRCd* ServerInstance, userrec *user, const char* cn, bool override, const char* key = ""); + static chanrec* JoinUser(InspIRCd* ServerInstance, userrec *user, const char* cn, bool override, const char* key, time_t TS = 0); /** Write to a channel, from a user, using va_args for text * @param user User whos details to prefix the line with diff --git a/src/channels.cpp b/src/channels.cpp index 366169dd6..ce7cbb45c 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -176,7 +176,7 @@ CUList* chanrec::GetVoicedUsers() * add a channel to a user, creating the record for it if needed and linking * it to the user record */ -chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bool override, const char* key) +chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bool override, const char* key, time_t TS) { if (!user || !cn) return NULL; @@ -192,6 +192,9 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo if (!Ptr) { + if ((!IS_LOCAL(user)) && (!TS)) + Instance->Log(DEBUG,"*** BUG *** chanrec::JoinUser called for REMOTE user '%s' on channel '%s' but no TS given!", user->nick, cn); + privs = "@"; if (IS_LOCAL(user) && override == false) @@ -212,7 +215,7 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo if (IS_LOCAL(user)) Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1; - Ptr->created = Instance->Time(); + Ptr->created = TS ? TS : Instance->Time(); *Ptr->topic = 0; *Ptr->setby = 0; Ptr->topicset = 0; diff --git a/src/cmd_join.cpp b/src/cmd_join.cpp index aa2f537a5..8c24c7bcb 100644 --- a/src/cmd_join.cpp +++ b/src/cmd_join.cpp @@ -42,7 +42,7 @@ CmdResult cmd_join::Handle (const char** parameters, int pcnt, userrec *user) if (ServerInstance->IsChannel(parameters[0])) { - chanrec::JoinUser(ServerInstance, user, parameters[0], false); + chanrec::JoinUser(ServerInstance, user, parameters[0], false, ""); return CMD_SUCCESS; } } diff --git a/src/modules/m_banredirect.cpp b/src/modules/m_banredirect.cpp index 88d4872ce..1564cef57 100644 --- a/src/modules/m_banredirect.cpp +++ b/src/modules/m_banredirect.cpp @@ -285,7 +285,7 @@ class ModuleBanRedirect : public Module else { user->WriteServ("470 %s :You are banned from %s. You are being automatically redirected to %s", user->nick, chan->name, redir->targetchan.c_str()); - chanrec::JoinUser(Srv, user, redir->targetchan.c_str(), false); + chanrec::JoinUser(Srv, user, redir->targetchan.c_str(), false, ""); return 1; } } diff --git a/src/modules/m_conn_join.cpp b/src/modules/m_conn_join.cpp index 9a7fdca7a..75415d6a5 100644 --- a/src/modules/m_conn_join.cpp +++ b/src/modules/m_conn_join.cpp @@ -88,7 +88,7 @@ class ModuleConnJoin : public Module for(std::vector::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, ""); } }; diff --git a/src/modules/m_operjoin.cpp b/src/modules/m_operjoin.cpp index 09ddb47b9..4308068e3 100644 --- a/src/modules/m_operjoin.cpp +++ b/src/modules/m_operjoin.cpp @@ -89,7 +89,7 @@ class ModuleOperjoin : public Module for(std::vector::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, ""); } }; diff --git a/src/modules/m_redirect.cpp b/src/modules/m_redirect.cpp index cf0174cc6..9cba183fe 100644 --- a/src/modules/m_redirect.cpp +++ b/src/modules/m_redirect.cpp @@ -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, ""); return 1; } } diff --git a/src/modules/m_sajoin.cpp b/src/modules/m_sajoin.cpp index caf3dc6d2..a2c710ec3 100644 --- a/src/modules/m_sajoin.cpp +++ b/src/modules/m_sajoin.cpp @@ -49,7 +49,7 @@ class cmd_sajoin : public command_t return CMD_FAILURE; } - chanrec::JoinUser(ServerInstance, dest, parameters[1], true); + 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]); diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index f0fd0e1ef..008f0c98a 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -756,7 +756,10 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p /* Finally, we can actually place the user into the channel. * We're sure its right. Final answer, phone a friend. */ - chanrec::JoinUser(this->Instance, who, channel.c_str(), true, ""); + if (created) + chanrec::JoinUser(this->Instance, who, channel.c_str(), true, "", TS); + else + chanrec::JoinUser(this->Instance, who, channel.c_str(), true, ""); /* Have we already queued up MAXMODES modes with parameters * (+qaohv) ready to be sent to the server? */ @@ -838,19 +841,6 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p for (unsigned int f = 2; f < modectr; f++) free(mode_users[f]); } - /* if we newly created the channel, set it's TS properly. */ - if (created) - { - /* find created channel .. */ - chan = this->Instance->FindChan(channel); - if (chan) - /* w00t said this shouldnt be needed but it is. - * This isnt strictly true, as chan can be NULL - * if a nick collision has occured and therefore - * the channel was never created. - */ - chan->age = TS; - } /* All done. That wasnt so bad was it, you can wipe * the sweat from your forehead now. :-) */ diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp index e4d53c8ef..72c439ebe 100644 --- a/src/modules/m_spanningtree/treesocket2.cpp +++ b/src/modules/m_spanningtree/treesocket2.cpp @@ -335,7 +335,7 @@ bool TreeSocket::ServiceJoin(const std::string &prefix, std::deque { /* only join if it's local, otherwise just pass it on! */ if (IS_LOCAL(u)) - chanrec::JoinUser(this->Instance, u, params[1].c_str(), false); + chanrec::JoinUser(this->Instance, u, params[1].c_str(), false, "", Instance->Time()); Utils->DoOneToAllButSender(prefix,"SVSJOIN",params,prefix); } return true; -- 2.39.5