summaryrefslogtreecommitdiff
path: root/src/channels.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2013-05-05 01:55:04 -0400
committerAdam <Adam@anope.org>2013-05-05 01:55:04 -0400
commit1d0bb9b26b7ad58ab0bf979ac046f4511b3bf12b (patch)
tree4486f0784bdf050fd7eb225c0cb9df352ce1f45a /src/channels.cpp
parent781defb7076ddfddf723ca08cd0a518b6657b64f (diff)
Rework the config file reader to be much more flexible and move many configuration directives to the actual modules they are used in.
Diffstat (limited to 'src/channels.cpp')
-rw-r--r--src/channels.cpp97
1 files changed, 16 insertions, 81 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 4d08661ef..5001869da 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -89,17 +89,7 @@ void Channel::Reset()
void Channel::Sync()
{
- if (!this->HasMode("PERM") && (this->users.empty() || (this->users.size() == 1 && this->ci && this->ci->bi && *this->ci->bi == this->users.begin()->second->user)))
- {
- this->Hold();
- }
- if (this->ci)
- {
- this->CheckModes();
-
- if (Me && Me->IsSynced())
- this->ci->RestoreTopic();
- }
+ FOREACH_MOD(I_OnChannelSync, OnChannelSync(this));
}
void Channel::CheckModes()
@@ -168,6 +158,8 @@ ChanUserContainer* Channel::JoinUser(User *user)
if (user->server && user->server->IsSynced())
Log(user, this, "join");
+ FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(user, this));
+
ChanUserContainer *cuc = new ChanUserContainer(user, this);
user->chans[this] = cuc;
this->users[user] = cuc;
@@ -401,16 +393,8 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A
FOREACH_RESULT(I_OnChannelModeUnset, OnChannelModeUnset(this, setter, cm->name, param));
if (enforce_mlock && MOD_RESULT != EVENT_STOP)
- {
- /* Reset modes on bots if we're supposed to */
- if (this->ci && this->ci->bi && this->ci->bi == bi)
- {
- if (ModeManager::DefaultBotModes.HasMode(cm->mchar))
- this->SetMode(bi, cm, bi->GetUID());
- }
-
this->SetCorrectModes(u, false, false);
- }
+
return;
}
@@ -790,22 +774,19 @@ void Channel::KickInternal(MessageSource &source, const Anope::string &nick, con
Anope::string chname = this->name;
- if (target->FindChannel(this))
+ ChanUserContainer *cu = target->FindChannel(this);
+ if (cu == NULL)
{
- FOREACH_MOD(I_OnUserKicked, OnUserKicked(this, target, source, reason));
- if (bi)
- this->Extend("INHABIT");
- this->DeleteUser(target);
- }
- else
Log() << "Channel::KickInternal got kick for user " << target->nick << " from " << source.GetSource() << " who isn't on channel " << this->name;
-
- /* Bots get rejoined */
- if (bi)
- {
- bi->Join(this, &ModeManager::DefaultBotModes);
- this->Shrink("INHABIT");
+ return;
}
+
+ Anope::string this_name = this->name;
+ ChannelStatus status = cu->status;
+
+ FOREACH_MOD(I_OnPreUserKicked, OnPreUserKicked(source, cu, reason));
+ this->DeleteUser(target); /* This can delete this; */
+ FOREACH_MOD(I_OnUserKicked, OnUserKicked(source, target, this_name, status, reason));
}
bool Channel::Kick(BotInfo *bi, User *u, const char *reason, ...)
@@ -873,54 +854,6 @@ void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtop
this->ci->CheckTopic();
}
-void Channel::Hold()
-{
- /** A timer used to keep the BotServ bot/ChanServ in the channel
- * after kicking the last user in a channel
- */
- class ChanServTimer : public Timer
- {
- private:
- Reference<Channel> c;
-
- public:
- /** Constructor
- * @param chan The channel
- */
- ChanServTimer(Channel *chan) : Timer(Config->CSInhabit), c(chan)
- {
- if (!ChanServ || !c)
- return;
- c->Extend("INHABIT");
- if (!c->ci || !c->ci->bi)
- ChanServ->Join(c);
- else if (!c->FindUser(c->ci->bi))
- c->ci->bi->Join(c);
- }
-
- /** Called when the delay is up
- * @param The current time
- */
- void Tick(time_t) anope_override
- {
- if (!c)
- return;
-
- c->Shrink("INHABIT");
-
- if (!c->ci || !c->ci->bi)
- {
- if (ChanServ)
- ChanServ->Part(c);
- }
- else if (c->users.size() == 1 || c->users.size() < Config->BSMinUsers)
- c->ci->bi->Part(c);
- }
- };
-
- new ChanServTimer(this);
-}
-
void Channel::SetCorrectModes(User *user, bool give_modes, bool check_noop)
{
if (user == NULL)
@@ -980,6 +913,8 @@ void Channel::SetCorrectModes(User *user, bool give_modes, bool check_noop)
}
}
}
+
+ FOREACH_MOD(I_OnSetCorrectModes, OnSetCorrectModes(user, this, u_access, give_modes));
}
bool Channel::Unban(User *u, bool full)