+ for (silencelist::const_iterator c = sl->begin(); c != sl->end(); c++)
+ {
+ std::string decomppattern = DecompPattern(c->second);
+ user->WriteNumeric(271, "%s %s %s", user->nick.c_str(),c->first.c_str(), decomppattern.c_str());
+ }
+ }
+ user->WriteNumeric(272, ":End of Silence List");
+
+ return CMD_SUCCESS;
+ }
+ else if (parameters.size() > 0)
+ {
+ // one or more parameters, add or delete entry from the list (only the first parameter is used)
+ std::string mask = parameters[0].substr(1);
+ char action = parameters[0][0];
+ // Default is private and notice so clients do not break
+ int pattern = CompilePattern("pn");
+
+ // if pattern supplied, use it
+ if (parameters.size() > 1) {
+ pattern = CompilePattern(parameters[1].c_str());
+ }
+
+ if (pattern == 0)
+ {
+ user->WriteNotice("Bad SILENCE pattern");
+ return CMD_INVALID;
+ }
+
+ if (!mask.length())
+ {
+ // 'SILENCE +' or 'SILENCE -', assume *!*@*
+ mask = "*!*@*";
+ }
+
+ ModeParser::CleanMask(mask);
+
+ if (action == '-')
+ {
+ std::string decomppattern = DecompPattern(pattern);
+ // fetch their silence list
+ silencelist* sl = ext.get(user);
+ // does it contain any entries and does it exist?
+ if (sl)
+ {
+ for (silencelist::iterator i = sl->begin(); i != sl->end(); i++)
+ {