* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- * E-mail:
- * <brain@chatspike.net>
- * <Craig@chatspike.net>
- *
- * Written by Craig Edwards, Craig McLure, and others.
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
-using namespace std;
-
#include <stdio.h>
#include <string>
#include <vector>
/* $ModDesc: Provides support for the /SILENCE command */
/* Improved drop-in replacement for the /SILENCE command
- * syntax: /SILENCE [+|-]<mask> <p|c|i|n|a|x> as in <private|channel|invites|notices|all|exclude>
+ * syntax: /SILENCE [+|-]<mask> <p|c|i|n|t|a|x> as in <privatemessage|channelmessage|invites|privatenotice|channelnotice|all|exclude>
*
* example that blocks all except private messages
* /SILENCE +*!*@* a
static int SILENCE_CHANNEL = 0x0002; /* c channel messages */
static int SILENCE_INVITE = 0x0004; /* i invites */
static int SILENCE_NOTICE = 0x0008; /* n notices */
-static int SILENCE_ALL = 0x0010; /* a all, (pcin) */
-static int SILENCE_EXCLUDE = 0x0020; /* x exclude this pattern */
+static int SILENCE_CNOTICE = 0x0010; /* t channel notices */
+static int SILENCE_ALL = 0x0020; /* a all, (pcint) */
+static int SILENCE_EXCLUDE = 0x0040; /* x exclude this pattern */
class cmd_silence : public command_t
cmd_silence (InspIRCd* Instance) : command_t(Instance,"SILENCE", 0, 0)
{
this->source = "m_silence_ext.so";
- syntax = "{[+|-]<mask> <p|c|i|n|a|x>}";
+ syntax = "{[+|-]<mask> <p|c|i|n|t|a|x>}";
}
CmdResult Handle (const char** parameters, int pcnt, userrec *user)
int CompilePattern(const char* pattern)
{
int p = 0;
- for (uint n = 0; n < strlen(pattern); n++)
+ for (const char* n = pattern; *n; n++)
{
- switch (pattern[n])
+ switch (*n)
{
case 'p':
p |= SILENCE_PRIVATE;
case 'n':
p |= SILENCE_NOTICE;
break;
+ case 't':
+ p |= SILENCE_CNOTICE;
+ break;
case 'a':
p |= SILENCE_ALL;
break;
/* turn the mask into a nice human readable format */
std::string DecompPattern (const int pattern)
{
- std::string out = "";
+ std::string out;
if ((pattern & SILENCE_PRIVATE) > 0)
- out += ",private";
+ out += ",privatemessages";
if ((pattern & SILENCE_CHANNEL) > 0)
- out += ",channel";
+ out += ",channelmessages";
if ((pattern & SILENCE_INVITE) > 0)
out += ",invites";
if ((pattern & SILENCE_NOTICE) > 0)
- out += ",notices";
+ out += ",privatenotices";
+ if ((pattern & SILENCE_CNOTICE) > 0)
+ out += ",channelnotices";
if ((pattern & SILENCE_ALL) > 0)
out = ",all";
if ((pattern & SILENCE_EXCLUDE) > 0)
void Implements(char* List)
{
- List[I_OnUserQuit] = List[I_On005Numeric] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = List[I_OnUserPreInvite] = 1;
+ List[I_OnBuildExemptList] = List[I_OnUserQuit] = List[I_On005Numeric] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = List[I_OnUserPreInvite] = 1;
}
- virtual void OnUserQuit(userrec* user, const std::string &reason)
+ virtual void OnUserQuit(userrec* user, const std::string &reason, const std::string &oper_message)
{
// when the user quits tidy up any silence list they might have just to keep things tidy
silencelist* sl;
output = output + " ESILENCE SILENCE=999";
}
+ virtual void OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list)
+ {
+ int public_silence = (message_type == MSG_PRIVMSG ? SILENCE_CHANNEL : SILENCE_CNOTICE);
+ CUList *ulist;
+ switch (status)
+ {
+ case '@':
+ ulist = chan->GetOppedUsers();
+ break;
+ case '%':
+ ulist = chan->GetHalfoppedUsers();
+ break;
+ case '+':
+ ulist = chan->GetVoicedUsers();
+ break;
+ default:
+ ulist = chan->GetUsers();
+ break;
+ }
+
+ for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
+ {
+ if (IS_LOCAL(i->second))
+ {
+ if (MatchPattern(i->second, sender, public_silence) == 1)
+ {
+ exempt_list[i->second] = i->second;
+ }
+ }
+ }
+ }
virtual int PreText(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list, int silence_type)
{
+ if (!IS_LOCAL(user))
+ return 0;
+
if (target_type == TYPE_USER)
{
return MatchPattern((userrec*)dest, user, silence_type);
chanrec* chan = (chanrec*)dest;
if (chan)
{
- CUList *ulist;
- switch (status)
- {
- case '@':
- ulist = chan->GetOppedUsers();
- break;
- case '%':
- ulist = chan->GetHalfoppedUsers();
- break;
- case '+':
- ulist = chan->GetVoicedUsers();
- break;
- default:
- ulist = chan->GetUsers();
- break;
- }
-
- for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
- {
- if ((IS_LOCAL(i->second)) && (user != i->second))
- {
- if (MatchPattern(i->second, user, SILENCE_CHANNEL) == 1)
- {
- exempt_list[i->second] = i->second;
- }
- }
- }
+ this->OnBuildExemptList((silence_type == SILENCE_PRIVATE ? MSG_PRIVMSG : MSG_NOTICE), chan, user, status, exempt_list);
}
}
return 0;
{
for (silencelist::const_iterator c = sl->begin(); c != sl->end(); c++)
{
- if ((match(source->GetFullHost(), c->first.c_str())) && ( ((c->second & pattern) > 0)) || ((c->second & SILENCE_ALL) > 0))
- {
- if (((c->second & SILENCE_EXCLUDE) > 0))
- {
- return 0;
- }
- else {
- return 1;
- }
- }
+ if (((((c->second & pattern) > 0)) || ((c->second & SILENCE_ALL) > 0)) && (ServerInstance->MatchText(source->GetFullHost(), c->first)))
+ return !(((c->second & SILENCE_EXCLUDE) > 0));
}
}
return 0;