- if (action == '-')
- {
- // fetch their silence list
- silencelist* sl;
- user->GetExt("silence_list", sl);
- // 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
- irc::string listitem = i->first.c_str();
- if (listitem == mask && i->second == pattern)
- {
- sl->erase(i);
- user->WriteNumeric(950, "%s %s :Removed %s %s from silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str());
- if (!sl->size())
- {
- delete sl;
- user->Shrink("silence_list");
- }
- return CMD_SUCCESS;
- }
- }
- }
- user->WriteNumeric(952, "%s %s :%s %s does not exist on your silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str());
- }
- else if (action == '+')
- {
- // fetch the user's current silence list
- silencelist* sl;
- user->GetExt("silence_list", sl);
- // what, they dont have one??? WE'RE ALL GONNA DIE! ...no, we just create an empty one.
- if (!sl)
- {
- sl = new silencelist;
- user->Extend("silence_list", sl);
- }
- if (sl->size() > maxsilence)
- {
- user->WriteNumeric(952, "%s %s :Your silence list is full",user->nick.c_str(), user->nick.c_str());
- return CMD_FAILURE;
- }
- for (silencelist::iterator n = sl->begin(); n != sl->end(); n++)
- {
- irc::string listitem = n->first.c_str();
- if (listitem == mask && n->second == pattern)
- {
- user->WriteNumeric(952, "%s %s :%s %s is already on your silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str());
- return CMD_FAILURE;
- }
- }
- if (((pattern & SILENCE_EXCLUDE) > 0))
- {
- sl->push_front(silenceset(mask,pattern));
- }
- else
- {
- sl->push_back(silenceset(mask,pattern));
- }
- user->WriteNumeric(951, "%s %s :Added %s %s to silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str());
- return CMD_SUCCESS;
- }
- }
- return CMD_LOCALONLY;
+ // Matches a CTCP targeted at a user ("C").
+ SF_CTCP_USER = 4096,
+
+ // Matches an invite to a channel ("i").
+ SF_INVITE = 8192,
+
+ // The default if no flags have been specified.
+ SF_DEFAULT = SF_NOTICE_CHANNEL | SF_NOTICE_USER | SF_PRIVMSG_CHANNEL | SF_PRIVMSG_USER | SF_TAGMSG_CHANNEL |
+ SF_TAGMSG_USER | SF_CTCP_CHANNEL | SF_CTCP_USER | SF_INVITE
+ };
+
+ // The flags that this mask is silenced for.
+ uint32_t flags;
+
+ // The mask which is silenced (e.g. *!*@example.com).
+ std::string mask;
+
+ SilenceEntry(uint32_t Flags, const std::string& Mask)
+ : flags(Flags)
+ , mask(Mask)
+ {