summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/commands/cmd_whois.cpp6
-rw-r--r--src/mode.cpp5
-rw-r--r--src/modes/umode_s.cpp101
-rw-r--r--src/modules/m_check.cpp16
-rw-r--r--src/users.cpp97
5 files changed, 122 insertions, 103 deletions
diff --git a/src/commands/cmd_whois.cpp b/src/commands/cmd_whois.cpp
index 4893c1251..116e43135 100644
--- a/src/commands/cmd_whois.cpp
+++ b/src/commands/cmd_whois.cpp
@@ -30,6 +30,7 @@ class CommandWhois : public SplitCommand
{
ChanModeReference secretmode;
ChanModeReference privatemode;
+ UserModeReference snomaskmode;
void SplitChanList(User* source, User* dest, const std::string& cl);
void DoWhois(User* user, User* dest, unsigned long signon, unsigned long idle);
@@ -42,6 +43,7 @@ class CommandWhois : public SplitCommand
: SplitCommand(parent, "WHOIS", 1)
, secretmode(parent, "secret")
, privatemode(parent, "private")
+ , snomaskmode(parent, "snomask")
{
Penalty = 2;
syntax = "<nick>{,<nick>}";
@@ -161,9 +163,9 @@ void CommandWhois::DoWhois(User* user, User* dest, unsigned long signon, unsigne
if (user == dest || user->HasPrivPermission("users/auspex"))
{
- if (dest->IsModeSet('s') != 0)
+ if (dest->IsModeSet(snomaskmode))
{
- ServerInstance->SendWhoisLine(user, dest, 379, "%s %s :is using modes +%s +%s", user->nick.c_str(), dest->nick.c_str(), dest->FormatModes(), dest->FormatNoticeMasks().c_str());
+ ServerInstance->SendWhoisLine(user, dest, 379, "%s %s :is using modes +%s %s", user->nick.c_str(), dest->nick.c_str(), dest->FormatModes(), snomaskmode->GetUserParameter(dest).c_str());
}
else
{
diff --git a/src/mode.cpp b/src/mode.cpp
index 303d292d9..8eb1020a8 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -181,7 +181,10 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ
/* Display user's current mode string */
user->WriteNumeric(RPL_UMODEIS, "%s :+%s",targetuser->nick.c_str(),targetuser->FormatModes());
if ((targetuser->IsOper()))
- user->WriteNumeric(RPL_SNOMASKIS, "%s +%s :Server notice mask", targetuser->nick.c_str(), targetuser->FormatNoticeMasks().c_str());
+ {
+ ModeHandler* snomask = FindMode('s', MODETYPE_USER);
+ user->WriteNumeric(RPL_SNOMASKIS, "%s %s :Server notice mask", targetuser->nick.c_str(), snomask->GetUserParameter(user).c_str());
+ }
return;
}
else
diff --git a/src/modes/umode_s.cpp b/src/modes/umode_s.cpp
index f5631c695..2650a31bc 100644
--- a/src/modes/umode_s.cpp
+++ b/src/modes/umode_s.cpp
@@ -40,7 +40,7 @@ ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Chan
dest->snomasks.reset();
dest->SetMode(this, true);
- parameter = dest->ProcessNoticeMasks(parameter.c_str());
+ parameter = ProcessNoticeMasks(dest, parameter.c_str());
return MODEACTION_ALLOW;
}
else
@@ -58,7 +58,7 @@ ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Chan
std::string ModeUserServerNoticeMask::GetUserParameter(User* user)
{
- std::string masks = user->FormatNoticeMasks();
+ std::string masks = FormatNoticeMasks(user);
if (masks.length())
masks = "+" + masks;
return masks;
@@ -68,3 +68,100 @@ void ModeUserServerNoticeMask::OnParameterMissing(User* user, User* dest, Channe
{
user->WriteNotice("*** The user mode +s requires a parameter (server notice mask). Please provide a parameter, e.g. '+s +*'.");
}
+
+std::string ModeUserServerNoticeMask::ProcessNoticeMasks(User* user, const char *sm)
+{
+ bool adding = true, oldadding = false;
+ const char *c = sm;
+ std::string output;
+
+ while (c && *c)
+ {
+ switch (*c)
+ {
+ case '+':
+ adding = true;
+ break;
+ case '-':
+ adding = false;
+ break;
+ case '*':
+ for (unsigned char d = 'a'; d <= 'z'; d++)
+ {
+ if (!ServerInstance->SNO->masks[d - 'a'].Description.empty())
+ {
+ if ((!user->IsNoticeMaskSet(d) && adding) || (user->IsNoticeMaskSet(d) && !adding))
+ {
+ if ((oldadding != adding) || (!output.length()))
+ output += (adding ? '+' : '-');
+
+ SetNoticeMask(user, d, adding);
+
+ output += d;
+ }
+ oldadding = adding;
+ char u = toupper(d);
+ if ((!user->IsNoticeMaskSet(u) && adding) || (user->IsNoticeMaskSet(u) && !adding))
+ {
+ if ((oldadding != adding) || (!output.length()))
+ output += (adding ? '+' : '-');
+
+ SetNoticeMask(user, u, adding);
+
+ output += u;
+ }
+ oldadding = adding;
+ }
+ }
+ break;
+ default:
+ if (isalpha(*c))
+ {
+ if ((!user->IsNoticeMaskSet(*c) && adding) || (user->IsNoticeMaskSet(*c) && !adding))
+ {
+ if ((oldadding != adding) || (!output.length()))
+ output += (adding ? '+' : '-');
+
+ SetNoticeMask(user, *c, adding);
+
+ output += *c;
+ }
+ }
+ else
+ user->WriteNumeric(ERR_UNKNOWNSNOMASK, "%s %c :is unknown snomask char to me", user->nick.c_str(), *c);
+
+ oldadding = adding;
+ break;
+ }
+
+ c++;
+ }
+
+ std::string s = this->FormatNoticeMasks(user);
+ if (s.length() == 0)
+ {
+ user->SetMode(this, false);
+ }
+
+ return output;
+}
+
+std::string ModeUserServerNoticeMask::FormatNoticeMasks(User* user)
+{
+ std::string data;
+
+ for (unsigned char n = 0; n < 64; n++)
+ {
+ if (user->snomasks[n])
+ data.push_back(n + 65);
+ }
+
+ return data;
+}
+
+void ModeUserServerNoticeMask::SetNoticeMask(User* user, unsigned char sm, bool value)
+{
+ if (!isalpha(sm))
+ return;
+ user->snomasks[sm-65] = value;
+}
diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp
index 97d747c5c..044af04ea 100644
--- a/src/modules/m_check.cpp
+++ b/src/modules/m_check.cpp
@@ -28,10 +28,24 @@
class CommandCheck : public Command
{
ChanModeReference ban;
+ UserModeReference snomaskmode;
+
+ std::string GetSnomasks(User* user)
+ {
+ std::string ret;
+ if (snomaskmode)
+ ret = snomaskmode->GetUserParameter(user);
+
+ if (ret.empty())
+ ret = "+";
+ return ret;
+ }
+
public:
CommandCheck(Module* parent)
: Command(parent,"CHECK", 1)
, ban(parent, "ban")
+ , snomaskmode(parent, "snomask")
{
flags_needed = 'o'; syntax = "<nickname>|<ip>|<hostmask>|<channel> <server>";
}
@@ -92,7 +106,7 @@ class CommandCheck : public Command
user->SendText(checkstr + " realnuh " + targuser->GetFullRealHost());
user->SendText(checkstr + " realname " + targuser->fullname);
user->SendText(checkstr + " modes +" + targuser->FormatModes());
- user->SendText(checkstr + " snomasks +" + targuser->FormatNoticeMasks());
+ user->SendText(checkstr + " snomasks " + GetSnomasks(targuser));
user->SendText(checkstr + " server " + targuser->server);
user->SendText(checkstr + " uid " + targuser->uuid);
user->SendText(checkstr + " signon " + timestring(targuser->signon));
diff --git a/src/users.cpp b/src/users.cpp
index 0dc9cea57..2f90a7970 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -31,83 +31,6 @@
already_sent_t LocalUser::already_sent_id = 0;
-std::string User::ProcessNoticeMasks(const char *sm)
-{
- bool adding = true, oldadding = false;
- const char *c = sm;
- std::string output;
-
- while (c && *c)
- {
- switch (*c)
- {
- case '+':
- adding = true;
- break;
- case '-':
- adding = false;
- break;
- case '*':
- for (unsigned char d = 'a'; d <= 'z'; d++)
- {
- if (!ServerInstance->SNO->masks[d - 'a'].Description.empty())
- {
- if ((!IsNoticeMaskSet(d) && adding) || (IsNoticeMaskSet(d) && !adding))
- {
- if ((oldadding != adding) || (!output.length()))
- output += (adding ? '+' : '-');
-
- this->SetNoticeMask(d, adding);
-
- output += d;
- }
- oldadding = adding;
- char u = toupper(d);
- if ((!IsNoticeMaskSet(u) && adding) || (IsNoticeMaskSet(u) && !adding))
- {
- if ((oldadding != adding) || (!output.length()))
- output += (adding ? '+' : '-');
-
- this->SetNoticeMask(u, adding);
-
- output += u;
- }
- oldadding = adding;
- }
- }
- break;
- default:
- if (isalpha(*c))
- {
- if ((!IsNoticeMaskSet(*c) && adding) || (IsNoticeMaskSet(*c) && !adding))
- {
- if ((oldadding != adding) || (!output.length()))
- output += (adding ? '+' : '-');
-
- this->SetNoticeMask(*c, adding);
-
- output += *c;
- }
- }
- else
- this->WriteNumeric(ERR_UNKNOWNSNOMASK, "%s %c :is unknown snomask char to me", this->nick.c_str(), *c);
-
- oldadding = adding;
- break;
- }
-
- c++;
- }
-
- std::string s = this->FormatNoticeMasks();
- if (s.length() == 0)
- {
- this->modes[UM_SNOMASK] = false;
- }
-
- return output;
-}
-
bool User::IsNoticeMaskSet(unsigned char sm)
{
if (!isalpha(sm))
@@ -115,26 +38,6 @@ bool User::IsNoticeMaskSet(unsigned char sm)
return (snomasks[sm-65]);
}
-void User::SetNoticeMask(unsigned char sm, bool value)
-{
- if (!isalpha(sm))
- return;
- snomasks[sm-65] = value;
-}
-
-std::string User::FormatNoticeMasks()
-{
- std::string data;
-
- for (unsigned char n = 0; n < 64; n++)
- {
- if (snomasks[n])
- data.push_back(n + 65);
- }
-
- return data;
-}
-
bool User::IsModeSet(unsigned char m)
{
if (!isalpha(m))