mirror of
https://github.com/anope/anope.git
synced 2026-06-30 23:26:39 +02:00
Check that channels still exist before nulling their ci pointer in channelinfos destructor
Change the persist setting on a channel to mean only that it is being enforced ircd-side
This commit is contained in:
+6
-11
@@ -30,16 +30,12 @@ struct ChanUserContainer : public Extensible
|
||||
ChanUserContainer(User *u, Channel *c) : user(u), chan(c) { }
|
||||
};
|
||||
|
||||
enum ChannelFlag
|
||||
{
|
||||
/* ChanServ is currently holding the channel */
|
||||
CH_INHABIT,
|
||||
/* Channel still exists when emptied */
|
||||
CH_PERSIST,
|
||||
/* If set the channel is syncing users (channel was just created) and it should not be deleted */
|
||||
CH_SYNCING
|
||||
};
|
||||
|
||||
/* Possible flags:
|
||||
*
|
||||
* INHABIT - ChanServ is currently holding the channel
|
||||
* PERSIST - Channel still exists when emptied (IRCd enforced)
|
||||
* SYNCING - Channel is syncing users (channel was just created) and it should not be deleted
|
||||
*/
|
||||
class CoreExport Channel : public Base, public Extensible
|
||||
{
|
||||
public:
|
||||
@@ -56,7 +52,6 @@ class CoreExport Channel : public Base, public Extensible
|
||||
Serialize::Reference<ChannelInfo> ci;
|
||||
/* When the channel was created */
|
||||
time_t creation_time;
|
||||
std::set<ChannelFlag> flags;
|
||||
|
||||
/* Users in the channel */
|
||||
typedef std::list<ChanUserContainer *> ChanUserList;
|
||||
|
||||
@@ -540,8 +540,6 @@ class CommandCSSetPersist : public Command
|
||||
if (!ci->HasExt("PERSIST"))
|
||||
{
|
||||
ci->ExtendMetadata("PERSIST");
|
||||
if (ci->c)
|
||||
ci->c->Extend("PERSIST");
|
||||
|
||||
/* Channel doesn't exist, create it */
|
||||
if (!ci->c)
|
||||
@@ -583,8 +581,6 @@ class CommandCSSetPersist : public Command
|
||||
if (ci->HasExt("PERSIST"))
|
||||
{
|
||||
ci->Shrink("PERSIST");
|
||||
if (ci->c)
|
||||
ci->c->Shrink("PERSIST");
|
||||
|
||||
/* Unset perm mode */
|
||||
if (cm)
|
||||
|
||||
@@ -184,7 +184,7 @@ class BotServCore : public Module
|
||||
void OnLeaveChannel(User *u, Channel *c) anope_override
|
||||
{
|
||||
/* Channel is persistent, it shouldn't be deleted and the service bot should stay */
|
||||
if (c->HasExt("PERSIST") || (c->ci && c->ci->HasExt("PERSIST")))
|
||||
if (c->ci && c->ci->HasExt("PERSIST"))
|
||||
return;
|
||||
|
||||
/* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly
|
||||
@@ -197,14 +197,9 @@ class BotServCore : public Module
|
||||
if (c->HasExt("INHABIT"))
|
||||
return;
|
||||
|
||||
/* This is called prior to removing the user from the channnel, so c->users.size() - 1 should be safe */
|
||||
if (c->ci && c->ci->bi && u != *c->ci->bi && c->users.size() - 1 <= Config->BSMinUsers && c->FindUser(c->ci->bi))
|
||||
{
|
||||
bool persist = c->Shrink("PERSIST");
|
||||
c->Extend("PERSIST");
|
||||
c->ci->bi->Part(c->ci->c);
|
||||
if (!persist)
|
||||
c->Shrink("PERSIST");
|
||||
}
|
||||
}
|
||||
|
||||
EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
|
||||
+3
-1
@@ -368,7 +368,9 @@ ChannelInfo::~ChannelInfo()
|
||||
{
|
||||
if (this->bi && this->c->FindUser(this->bi))
|
||||
this->bi->Part(this->c);
|
||||
this->c->ci = NULL;
|
||||
/* Parting the service bot can cause the channel to go away */
|
||||
if (this->c)
|
||||
this->c->ci = NULL;
|
||||
}
|
||||
|
||||
RegisteredChannelList->erase(this->name);
|
||||
|
||||
Reference in New Issue
Block a user