summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-03-18 16:52:56 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-03-18 16:52:56 +0000
commit0f6de0b18372a76ebb5d6c4ba3dc9a7a7e0a7297 (patch)
treeb16e5eb6b4d97bca39472ffea21d412c13ad71e2
parent3699bdaee53896b491256d3aa694ef20cbdb0743 (diff)
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
-rw-r--r--include/channels.h2
-rw-r--r--src/channels.cpp7
-rw-r--r--src/cmd_join.cpp2
-rw-r--r--src/modules/m_banredirect.cpp2
-rw-r--r--src/modules/m_conn_join.cpp2
-rw-r--r--src/modules/m_operjoin.cpp2
-rw-r--r--src/modules/m_redirect.cpp2
-rw-r--r--src/modules/m_sajoin.cpp2
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp18
-rw-r--r--src/modules/m_spanningtree/treesocket2.cpp2
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<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, "");
}
};
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<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, "");
}
};
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<std::string> &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<std::string> &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<std::string>
{
/* 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;