2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
5 * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
6 * Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
8 * This file is part of InspIRCd. InspIRCd is free software: you can
9 * redistribute it and/or modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation, version 2.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include "builtinmodes.h"
28 ModeUserServerNoticeMask::ModeUserServerNoticeMask() : ModeHandler(NULL, "snomask", 's', PARAM_SETONLY, MODETYPE_USER)
33 ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Channel*, std::string ¶meter, bool adding)
35 /* Set the array fields */
38 /* Fix for bug #310 reported by Smartys */
39 if (!dest->IsModeSet(this))
40 dest->snomasks.reset();
42 dest->SetMode(this, true);
43 parameter = ProcessNoticeMasks(dest, parameter.c_str());
44 return MODEACTION_ALLOW;
48 if (dest->IsModeSet(this))
50 dest->SetMode(this, false);
51 return MODEACTION_ALLOW;
55 /* Allow the change */
56 return MODEACTION_DENY;
59 std::string ModeUserServerNoticeMask::GetUserParameter(User* user)
61 std::string masks = FormatNoticeMasks(user);
67 void ModeUserServerNoticeMask::OnParameterMissing(User* user, User* dest, Channel* channel)
69 user->WriteNotice("*** The user mode +s requires a parameter (server notice mask). Please provide a parameter, e.g. '+s +*'.");
72 std::string ModeUserServerNoticeMask::ProcessNoticeMasks(User* user, const char *sm)
74 bool adding = true, oldadding = false;
89 for (unsigned char d = 'a'; d <= 'z'; d++)
91 if (!ServerInstance->SNO->masks[d - 'a'].Description.empty())
93 if ((!user->IsNoticeMaskSet(d) && adding) || (user->IsNoticeMaskSet(d) && !adding))
95 if ((oldadding != adding) || (!output.length()))
96 output += (adding ? '+' : '-');
98 SetNoticeMask(user, d, adding);
104 if ((!user->IsNoticeMaskSet(u) && adding) || (user->IsNoticeMaskSet(u) && !adding))
106 if ((oldadding != adding) || (!output.length()))
107 output += (adding ? '+' : '-');
109 SetNoticeMask(user, u, adding);
120 if ((!user->IsNoticeMaskSet(*c) && adding) || (user->IsNoticeMaskSet(*c) && !adding))
122 if ((oldadding != adding) || (!output.length()))
123 output += (adding ? '+' : '-');
125 SetNoticeMask(user, *c, adding);
131 user->WriteNumeric(ERR_UNKNOWNSNOMASK, "%s %c :is unknown snomask char to me", user->nick.c_str(), *c);
140 std::string s = this->FormatNoticeMasks(user);
143 user->SetMode(this, false);
149 std::string ModeUserServerNoticeMask::FormatNoticeMasks(User* user)
153 for (unsigned char n = 0; n < 64; n++)
155 if (user->snomasks[n])
156 data.push_back(n + 65);
162 void ModeUserServerNoticeMask::SetNoticeMask(User* user, unsigned char sm, bool value)
166 user->snomasks[sm-65] = value;