- 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++)
- {
- // search through for the item
- const std::string& listitem = i->first;
- if ((irc::equals(listitem, mask)) && (i->second == pattern))
- {
- sl->erase(i);
- user->WriteNumeric(950, user->nick, InspIRCd::Format("Removed %s %s from silence list", mask.c_str(), decomppattern.c_str()));
- if (!sl->size())
- {
- ext.unset(user);
- }
- return CMD_SUCCESS;
- }
- }
- }
- user->WriteNumeric(952, user->nick, InspIRCd::Format("%s %s does not exist on your silence list", mask.c_str(), decomppattern.c_str()));
- }
- else if (action == '+')
+ // The value was well formed.
+ set(user, list);
+ }
+
+ std::string ToInternal(const Extensible* container, void* item) const CXX11_OVERRIDE
+ {
+ SilenceList* list = static_cast<SilenceList*>(item);
+ std::string buf;
+ for (SilenceList::const_iterator iter = list->begin(); iter != list->end(); ++iter)
+ {
+ if (iter != list->begin())
+ buf.push_back(' ');
+
+ buf.append(iter->mask);
+ buf.push_back(' ');
+ buf.append(SilenceEntry::BitsToFlags(iter->flags));
+ }
+ return buf;
+ }
+};
+
+class SilenceMessage : public ClientProtocol::Message
+{
+ public:
+ SilenceMessage(const std::string& mask, const std::string& flags)
+ : ClientProtocol::Message("SILENCE")
+ {
+ PushParam(mask);
+ PushParam(flags);
+ }
+};
+
+class CommandSilence : public SplitCommand
+{
+ private:
+ ClientProtocol::EventProvider msgprov;
+
+ CmdResult AddSilence(LocalUser* user, const std::string& mask, uint32_t flags)
+ {
+ SilenceList* list = ext.get(user);
+ if (list && list->size() > ext.maxsilence)
+ {
+ user->WriteNumeric(ERR_SILELISTFULL, mask, SilenceEntry::BitsToFlags(flags), "Your SILENCE list is full");
+ return CMD_FAILURE;
+ }
+ else if (!list)
+ {
+ // There is no list; create it.
+ list = new SilenceList();
+ ext.set(user, list);
+ }
+
+ if (!list->insert(SilenceEntry(flags, mask)).second)
+ {
+ user->WriteNumeric(ERR_SILENCE, mask, SilenceEntry::BitsToFlags(flags), "The SILENCE entry you specified already exists");
+ return CMD_FAILURE;
+ }
+
+ SilenceMessage msg("+" + mask, SilenceEntry::BitsToFlags(flags));
+ user->Send(msgprov, msg);
+ return CMD_SUCCESS;
+ }
+
+ CmdResult RemoveSilence(LocalUser* user, const std::string& mask, uint32_t flags)
+ {
+ SilenceList* list = ext.get(user);
+ if (list)
+ {
+ for (SilenceList::iterator iter = list->begin(); iter != list->end(); ++iter)