#include "config.h" #include "struct.h" #include "common.h" #include "sys.h" #include "numeric.h" #include "msg.h" #include "channel.h" #include #include #include #include #include #define DelHook(x) if (x) HookDel(x); x = NULL static char *cb_chanmsg2(aClient *, aClient *, aChannel *, char *, int); int is_silenced(aClient *, aClient *); static Hook *HookChanMsg2 = NULL; ModuleHeader MOD_HEADER(m_csilence) = { "m_csilence", "$Id: m_csilence.c,v 1.0 2004/07/23 DukePyrolator Exp $", "silence extension", "3.2.2", NULL }; DLLFUNC int MOD_INIT(m_csilence)(ModuleInfo *modinfo) { HookChanMsg2 = HookAddPCharEx(modinfo->handle, HOOKTYPE_CHANMSG2, cb_chanmsg2); return MOD_SUCCESS; } DLLFUNC int MOD_LOAD(m_csilence)(int module_load) { return MOD_SUCCESS; } DLLFUNC int MOD_UNLOAD(m_csilence)(int module_unload) { DelHook(HookChanMsg2); return MOD_SUCCESS; } static char *cb_chanmsg2(aClient *cptr, aClient *from, aChannel *to, char *str, int prefix) { /* return NULL if sender is in silence list */ return is_silenced(from, cptr) ? 0 : 1; } /* copied from m_message.c */ int is_silenced(aClient *sptr, aClient *acptr) { Link *lp; anUser *user; static char sender[HOSTLEN + NICKLEN + USERLEN + 5]; static char senderx[HOSTLEN + NICKLEN + USERLEN + 5]; char checkv = 0; if (!(acptr->user) || !(lp = acptr->user->silence) || !(user = sptr->user)) return 0; ircsprintf(sender, "%s!%s@%s", sptr->name, user->username,user->realhost); if (sptr->user->virthost) { ircsprintf(senderx, "%s!%s@%s", sptr->name, user->username,sptr->user->virthost); checkv = 1; } for (; lp; lp = lp->next) { if (!match(lp->value.cp, sender) || (checkv && !match(lp->value.cp, senderx))) { if (!MyConnect(sptr)) { sendto_one(sptr->from, ":%s SILENCE %s :%s", acptr->name, sptr->name, lp->value.cp); lp->flags = 1; } return 1; } } return 0; }