aboutsummaryrefslogtreecommitdiffstats
path: root/src/channels.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/channels.cpp')
-rw-r--r--src/channels.cpp56
1 files changed, 6 insertions, 50 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 7df30b452..67c0b1179 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -119,42 +119,6 @@ Membership* Channel::GetUser(User* user) const
return i->second;
}
-void Channel::SetDefaultModes()
-{
- ServerInstance->Logs.Debug("CHANNELS", "Setting default modes on {}: {}", name,
- ServerInstance->Config->DefaultModes);
- irc::spacesepstream list(ServerInstance->Config->DefaultModes);
- std::string modeseq;
- std::string parameter;
-
- list.GetToken(modeseq);
-
- for (const auto modechr : modeseq)
- {
- ModeHandler* mode = ServerInstance->Modes.FindMode(modechr, MODETYPE_CHANNEL);
- if (mode)
- {
- if (mode->IsPrefixMode())
- continue;
-
- if (mode->NeedsParam(true))
- {
- // If the parameter is missing or begins with a ':' then it's invalid
- if (!list.GetToken(parameter) || parameter[0] == ':')
- continue;
- }
- else
- {
- // The mode does not take a parameter.
- parameter.clear();
- }
-
- Modes::Change modechange(mode, true, parameter);
- mode->OnModeChange(ServerInstance->FakeClient, ServerInstance->FakeClient, this, modechange);
- }
- }
-}
-
/*
* add a channel to a user, creating the record for it if needed and linking
* it to the user record
@@ -173,12 +137,10 @@ Membership* Channel::JoinUser(LocalUser* user, std::string cname, bool override,
auto* chan = ServerInstance->Channels.Find(cname);
bool created_by_local = !chan; // Flag that will be passed to ForceJoin later
- std::string privs; // Prefix mode(letter)s to give to the joining user
+ PrefixMode::Set privs; // Prefix modes to give to the joining user
if (!chan)
{
- privs = ServerInstance->Config->DefaultModes.substr(0, ServerInstance->Config->DefaultModes.find(' '));
-
// Ask the modules whether they're ok with the join, pass NULL as Channel* as the channel is yet to be created
ModResult modres;
FIRST_MOD_RESULT(OnUserPreJoin, modres, (user, nullptr, cname, privs, key, override));
@@ -186,8 +148,6 @@ Membership* Channel::JoinUser(LocalUser* user, std::string cname, bool override,
return nullptr; // A module wasn't happy with the join, abort
chan = new Channel(cname, ServerInstance->Time());
- // Set the default modes on the channel (<options:defaultmodes>)
- chan->SetDefaultModes();
}
else
{
@@ -209,7 +169,7 @@ Membership* Channel::JoinUser(LocalUser* user, std::string cname, bool override,
return chan->ForceJoin(user, &privs, false, created_by_local);
}
-Membership* Channel::ForceJoin(User* user, const std::string* privs, bool bursting, bool created_by_local)
+Membership* Channel::ForceJoin(User* user, const PrefixMode::Set* privs, bool bursting, bool created_by_local)
{
if (user->IsServer())
{
@@ -228,15 +188,11 @@ Membership* Channel::ForceJoin(User* user, const std::string* privs, bool bursti
{
// If the user was granted prefix modes (in the OnUserPreJoin hook, or they're a
// remote user and their own server set the modes), then set them internally now
- for (const auto priv : *privs)
+ for (auto* priv : *privs)
{
- PrefixMode* mh = ServerInstance->Modes.FindPrefixMode(priv);
- if (mh)
- {
- // Set the mode on the user.
- Modes::Change modechange(mh, true, user->nick);
- mh->OnModeChange(ServerInstance->FakeClient, nullptr, this, modechange);
- }
+ // Set the mode on the user.
+ Modes::Change modechange(priv, true, user->nick);
+ priv->OnModeChange(ServerInstance->FakeClient, nullptr, this, modechange);
}
}