diff options
-rw-r--r-- | include/builtinmodes.h | 24 | ||||
-rw-r--r-- | include/users.h | 27 | ||||
-rw-r--r-- | src/commands/cmd_whois.cpp | 6 | ||||
-rw-r--r-- | src/mode.cpp | 5 | ||||
-rw-r--r-- | src/modes/umode_s.cpp | 101 | ||||
-rw-r--r-- | src/modules/m_check.cpp | 16 | ||||
-rw-r--r-- | src/users.cpp | 97 |
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 ¶meter, 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)) |