summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2013-05-08 20:26:45 -0400
committerAdam <Adam@anope.org>2013-05-08 20:26:45 -0400
commit735e234c2c7a984b01295f86045545ed8d9838ce (patch)
tree87d7cce721eaa7a34d71b17c73f317750d87caef /src
parent735f0ba6cf5602396bc2cabd6ceca0e92a0edd00 (diff)
Fixed some issues and desyncs with creating empty permanent channels on startup & dropping empty channels
Diffstat (limited to 'src')
-rw-r--r--src/channels.cpp40
-rw-r--r--src/regchannel.cpp9
-rw-r--r--src/servers.cpp18
3 files changed, 40 insertions, 27 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 52303fa46..bc32781de 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -78,13 +78,10 @@ void Channel::Reset()
this->SetMode(NULL, ModeManager::FindChannelModeByName(f.Modes()[i]), uc->user->GetUID(), false);
}
- this->CheckModes();
-
for (ChanUserList::const_iterator it = this->users.begin(), it_end = this->users.end(); it != it_end; ++it)
this->SetCorrectModes(it->second->user, true, false);
- if (this->ci && Me && Me->IsSynced())
- this->ci->RestoreTopic();
+ this->Sync();
}
void Channel::Sync()
@@ -153,6 +150,25 @@ void Channel::CheckModes()
}
}
+bool Channel::CheckDelete()
+{
+ /* Channel is persistent, it shouldn't be deleted and the service bot should stay */
+ if (this->HasExt("PERSIST") || (this->ci && this->ci->HasExt("PERSIST")))
+ return false;
+
+ /* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly
+ * We also don't part the bot here either, if necessary we will part it after the sync
+ */
+ if (this->HasExt("SYNCING"))
+ return false;
+
+ /* Additionally, do not delete this channel if ChanServ/a BotServ bot is inhabiting it */
+ if (this->HasExt("INHABIT"))
+ return false;
+
+ return this->users.empty();
+}
+
ChanUserContainer* Channel::JoinUser(User *user)
{
if (user->server && user->server->IsSynced())
@@ -190,21 +206,7 @@ void Channel::DeleteUser(User *user)
Log(LOG_DEBUG) << "Channel::DeleteUser() tried to delete nonexistant channel " << this->name << " from " << user->nick << "'s channel list";
delete cu;
- /* Channel is persistent, it shouldn't be deleted and the service bot should stay */
- if (this->HasExt("PERSIST") || (this->ci && this->ci->HasExt("PERSIST")))
- return;
-
- /* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly
- * We also don't part the bot here either, if necessary we will part it after the sync
- */
- if (this->HasExt("SYNCING"))
- return;
-
- /* Additionally, do not delete this channel if ChanServ/a BotServ bot is inhabiting it */
- if (this->HasExt("INHABIT"))
- return;
-
- if (this->users.empty())
+ if (this->CheckDelete())
delete this;
}
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index 12655533b..38246f5dd 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -361,9 +361,16 @@ ChannelInfo::~ChannelInfo()
{
if (this->bi && this->c->FindUser(this->bi))
this->bi->Part(this->c);
+
/* Parting the service bot can cause the channel to go away */
+
if (this->c)
- this->c->ci = NULL;
+ {
+ if (this->c && this->c->CheckDelete())
+ delete this->c;
+
+ this->c = NULL;
+ }
}
RegisteredChannelList->erase(this->name);
diff --git a/src/servers.cpp b/src/servers.cpp
index 6c017f08e..0c1019216 100644
--- a/src/servers.cpp
+++ b/src/servers.cpp
@@ -254,35 +254,39 @@ void Server::Sync(bool sync_links)
{
bool created;
ci->c = Channel::FindOrCreate(ci->name, created, ci->time_registered);
+
if (ModeManager::FindChannelModeByName("PERM") != NULL)
{
- ci->c->SetMode(NULL, "PERM");
if (created)
IRCD->SendChannel(ci->c);
+ ci->c->SetMode(NULL, "PERM");
}
else
{
if (!ci->bi)
ci->WhoSends()->Assign(NULL, ci);
if (ci->c->FindUser(ci->bi) == NULL)
- ci->bi->Join(ci->c);
+ {
+ ChannelStatus status(Config->GetModule("botserv")->Get<const Anope::string>("botmodes"));
+ ci->bi->Join(ci->c, &status);
+ }
}
}
}
FOREACH_MOD(I_OnPreUplinkSync, OnPreUplinkSync(this));
- IRCD->SendEOB();
- Me->Sync(false);
-
- FOREACH_MOD(I_OnUplinkSync, OnUplinkSync(this));
-
for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it)
{
Channel *c = it->second;
c->Sync();
}
+ IRCD->SendEOB();
+ Me->Sync(false);
+
+ FOREACH_MOD(I_OnUplinkSync, OnUplinkSync(this));
+
if (!Anope::NoFork && Anope::AtTerm())
{
Log(LOG_TERMINAL) << "Successfully linked, launching into background...";