From e820e1af0d01011dbe9d91d2971cc3518f7f3d42 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 28 Aug 2010 20:56:45 -0400 Subject: Properly store our clients internal channel status's and burst them if needed. Also made Flag::HasFlag use test() instead of operator[] to catch errors, and fixed an out of bounds access to a Flags bitset causing crashes on some systems. --- src/bots.cpp | 2 +- src/channels.cpp | 15 +++++++++++++-- src/init.cpp | 6 +++--- src/logger.cpp | 8 +++++--- src/modes.cpp | 6 +++--- src/operserv.cpp | 4 ++-- 6 files changed, 27 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/bots.cpp b/src/bots.cpp index e6124e135..13b21e1ce 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -183,7 +183,7 @@ void BotInfo::Join(Channel *c, bool update_ts) } if (!update_ts) ircdproto->SendJoin(this, c->name, c->creation_time); - else + else if (Me && Me->IsSynced()) { ircdproto->SendJoin(this, cc); diff --git a/src/channels.cpp b/src/channels.cpp index 55de669fd..389577f71 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -82,10 +82,21 @@ void Channel::Reset() { UserContainer *uc = *it; + Flags flags = *debug_cast *>(uc->Status); + uc->Status->ClearFlags(); + if (findbot(uc->user->nick)) - continue; + { + for (std::map::iterator mit = ModeManager::ChannelModesByChar.begin(), mit_end = ModeManager::ChannelModesByChar.end(); mit != mit_end; ++mit) + { + ChannelMode *cm = mit->second; - uc->Status->ClearFlags(); + if (flags.HasFlag(cm->Name)) + { + this->SetMode(NULL, cm, uc->user->nick, false); + } + } + } } check_modes(this); diff --git a/src/init.cpp b/src/init.cpp index 94cf37ce9..da3c30587 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -353,9 +353,6 @@ void Init(int ac, char **av) if (!Config->s_GlobalNoticer.empty()) new BotInfo(Config->s_GlobalNoticer, Config->ServiceUser, Config->ServiceHost, Config->desc_GlobalNoticer); - /* Init the log channels */ - InitLogChannels(Config); - /* Add Encryption Modules */ ModuleManager::LoadModuleList(Config->EncModuleList); @@ -437,6 +434,9 @@ void Init(int ac, char **av) rand_init(); add_entropy_userkeys(); + /* Init log channels */ + InitLogChannels(Config); + /* Load up databases */ Log() << "Loading databases..."; EventReturn MOD_RESULT; diff --git a/src/logger.cpp b/src/logger.cpp index de5e58c32..a5637d4d8 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -27,8 +27,12 @@ void InitLogChannels(ServerConfig *config) if (target[0] == '#') { Channel *c = findchan(target); + bool created = false; if (!c) + { c = new Channel(target); + created = true; + } c->SetFlag(CH_LOGCHAN); c->SetFlag(CH_PERSIST); @@ -38,9 +42,7 @@ void InitLogChannels(ServerConfig *config) if (bi->HasFlag(BI_CORE) && !c->FindUser(bi)) { - bi->Join(c); - for (unsigned j = 0; j < config->BotModeList.size(); ++j) - c->SetMode(OperServ, config->BotModeList[j], bi->nick, false); + bi->Join(c, created); } } } diff --git a/src/modes.cpp b/src/modes.cpp index da9f22bef..d3f8ddb9f 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -28,9 +28,9 @@ std::map ModeManager::ChannelModesByName; /* Number of generic modes we support */ unsigned GenericChannelModes = 0, GenericUserModes = 0; /* Default mlocked modes on */ -Flags DefMLockOn; +Flags DefMLockOn; /* Default mlocked modes off */ -Flags DefMLockOff; +Flags DefMLockOff; /* Map for default mlocked mode parameters */ std::map DefMLockParams; @@ -41,7 +41,7 @@ void SetDefaultMLock(ServerConfig *config) DefMLockOn.ClearFlags(); DefMLockOff.ClearFlags(); DefMLockParams.clear(); - Flags *ptr = NULL; + Flags *ptr = NULL; Anope::string modes, param; spacesepstream sep(config->MLock); diff --git a/src/operserv.cpp b/src/operserv.cpp index 89e84a73e..bbc38eb1a 100644 --- a/src/operserv.cpp +++ b/src/operserv.cpp @@ -18,9 +18,9 @@ std::vector News; std::vector > DefCon; bool DefConModesSet = false; /* Defcon modes mlocked on */ -Flags DefConModesOn; +Flags DefConModesOn; /* Defcon modes mlocked off */ -Flags DefConModesOff; +Flags DefConModesOff; /* Map of Modesa and Params for DefCon */ std::map DefConModesOnParams; -- cgit