summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/builtinmodes.h24
-rw-r--r--include/users.h27
-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
7 files changed, 153 insertions, 123 deletions
diff --git a/include/builtinmodes.h b/include/builtinmodes.h
index ba34a3da9..31b208d52 100644
--- a/include/builtinmodes.h
+++ b/include/builtinmodes.h
@@ -146,10 +146,32 @@ class ModeUserInvisible : public SimpleUserModeHandler
}
};
-/** User mode +n
+/** User mode +s
*/
class ModeUserServerNoticeMask : public ModeHandler
{
+ /** Create a displayable mode string for this users snomasks
+ * @param user The user whose notice masks to format
+ * @return The notice mask character sequence
+ */
+ std::string FormatNoticeMasks(User* user);
+
+ /** Process a snomask modifier string, e.g. +abc-de
+ * @param user The target user
+ * @param sm A sequence of notice mask characters
+ * @return The cleaned mode sequence which can be output,
+ * e.g. in the above example if masks c and e are not
+ * valid, this function will return +ab-d
+ */
+ std::string ProcessNoticeMasks(User* user, const char *sm);
+
+ /** Changed a specific notice mask value
+ * @param user The target user
+ * @param sm The server notice mask to change
+ * @param value An on/off value for this mask
+ */
+ void SetNoticeMask(User* user, unsigned char sm, bool value);
+
public:
ModeUserServerNoticeMask();
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
diff --git a/include/users.h b/include/users.h
index 28bf8b05b..0e660d098 100644
--- a/include/users.h
+++ b/include/users.h
@@ -400,19 +400,6 @@ class CoreExport User : public Extensible
*/
void InvalidateCache();
- /** Create a displayable mode string for this users snomasks
- * @return The notice mask character sequence
- */
- std::string FormatNoticeMasks();
-
- /** Process a snomask modifier string, e.g. +abc-de
- * @param sm A sequence of notice mask characters
- * @return The cleaned mode sequence which can be output,
- * e.g. in the above example if masks c and e are not
- * valid, this function will return +ab-d
- */
- std::string ProcessNoticeMasks(const char *sm);
-
/** Returns whether this user is currently away or not. If true,
* further information can be found in User::awaymsg and User::awaytime
* @return True if the user is away, false otherwise
@@ -431,12 +418,6 @@ class CoreExport User : public Extensible
*/
bool IsNoticeMaskSet(unsigned char sm);
- /** Changed a specific notice mask value
- * @param sm The server notice mask to change
- * @param value An on/off value for this mask
- */
- void SetNoticeMask(unsigned char sm, bool value);
-
/** Create a displayable mode string for this users umodes
* @param showparameters The mode string
*/
@@ -449,6 +430,7 @@ class CoreExport User : public Extensible
bool IsModeSet(unsigned char m);
bool IsModeSet(ModeHandler* mh);
bool IsModeSet(ModeHandler& mh) { return IsModeSet(&mh); }
+ bool IsModeSet(UserModeReference& moderef);
/** Set a specific usermode to on or off
* @param m The user mode
@@ -911,6 +893,13 @@ inline bool User::IsModeSet(ModeHandler* mh)
return (modes[m-65]);
}
+inline bool User::IsModeSet(UserModeReference& moderef)
+{
+ if (!moderef)
+ return false;
+ return IsModeSet(*moderef);
+}
+
inline void User::SetMode(ModeHandler* mh, bool value)
{
char m = mh->GetModeChar();
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))