#define HOOK_NICK_KILL 308 /* Argument is void*[2] (nick, reason) */
#define HOOK_NICK_MASKPRIVMSG 309 /* Argument is void*[3] (nick, target, message) ** NICK COULD BE NULL ** */
#define HOOK_NICK_MODECHANGE 310 /* Argument is void*[2] (nick *, oldmodes) */
+#define HOOK_NICK_MESSAGE 311 /* Argument is void*[3] (nick *, message, isnotice) */
#define HOOK_CHANNEL_BURST 400 /* Argument is channel pointer */
#define HOOK_CHANNEL_CREATE 401 /* Argument is void*[2] (channel, nick) */
char *ch;
char targetnick[NICKLEN+1];
int foundat;
- void *nargs[2];
+ void *nargs[3];
int i;
/* Should have target and message */
return CMD_OK;
}
- if (cargv[0][0]=='#' || cargv[0][0]=='+') {
- /* Channel message/notice */
- return CMD_OK;
- }
-
if ((sender=getnickbynumericstr((char *)source))==NULL) {
Error("localuser",ERR_WARNING,"PRIVMSG from non existant user %s",(char *)source);
return CMD_OK;
}
+
+ freesstring(sender->message);
+ sender->message = getsstring(cargv[1], 512);
+
+ nargs[0] = sender;
+ nargs[1] = cargv[1];
+ nargs[2] = (void *)(uintptr_t)isnotice;
+ triggerhook(HOOK_NICK_MESSAGE, nargs);
+
+ if (cargv[0][0]=='#' || cargv[0][0]=='+') {
+ /* Channel message/notice */
+ return CMD_OK;
+ }
/* Check for a "secure" message (foo@bar) */
foundat=0;
.PHONY: all clean distclean
all: newsearch.so
-NSCOMMANDS=ns-not.o ns-and.o ns-or.o ns-eq.o ns-match.o ns-hostmask.o ns-realname.o ns-away.o ns-modes.o ns-nick.o ns-ident.o ns-regex.o ns-host.o ns-channel.o ns-lt.o ns-gt.o ns-timestamp.o ns-country.o ns-authname.o ns-ip.o ns-kill.o ns-gline.o ns-exists.o ns-services.o ns-size.o ns-name.o ns-topic.o ns-oppct.o ns-cumodecount.o ns-cumodepct.o ns-hostpct.o ns-authedpct.o ns-length.o ns-kick.o ns-authts.o ns-channels.o ns-server.o ns-authid.o ns-notice.o newsearch_ast.o ns-any.o ns-channeliter.o ns-var.o ns-all.o ns-cumodes.o ns-cidr.o ns-nickiter.o ns-ipv6.o ns-away.o ns-quit.o ns-killed.o ns-renamed.o ns-age.o ns-newnick.o ns-reason.o
+NSCOMMANDS=ns-not.o ns-and.o ns-or.o ns-eq.o ns-match.o ns-hostmask.o ns-realname.o ns-away.o ns-modes.o ns-nick.o ns-ident.o ns-regex.o ns-host.o ns-channel.o ns-lt.o ns-gt.o ns-timestamp.o ns-country.o ns-authname.o ns-ip.o ns-kill.o ns-gline.o ns-exists.o ns-services.o ns-size.o ns-name.o ns-topic.o ns-oppct.o ns-cumodecount.o ns-cumodepct.o ns-hostpct.o ns-authedpct.o ns-length.o ns-kick.o ns-authts.o ns-channels.o ns-server.o ns-authid.o ns-notice.o newsearch_ast.o ns-any.o ns-channeliter.o ns-var.o ns-all.o ns-cumodes.o ns-cidr.o ns-nickiter.o ns-ipv6.o ns-away.o ns-quit.o ns-killed.o ns-renamed.o ns-age.o ns-newnick.o ns-reason.o ns-message.o
newsearch.so: newsearch.o formats.o y.tab.o lex.yy.o parser.o ${NSCOMMANDS}
registersearchterm(reg_whowassearch, "cidr",cidr_parse, 0, "CIDR matching");
registersearchterm(reg_nicksearch, "ipvsix",ipv6_parse, 0, "IPv6 user");
registersearchterm(reg_whowassearch, "ipvsix",ipv6_parse, 0, "IPv6 user");
+ registersearchterm(reg_nicksearch, "message",message_parse, 0, "Last message");
/* Whowas operations */
registersearchterm(reg_whowassearch, "quit",quit_parse, 0, "User quit");
struct searchNode *authid_parse(searchCtx *ctx, int argc, char **argv);
struct searchNode *cidr_parse(searchCtx *ctx, int argc, char **argv);
struct searchNode *ipv6_parse(searchCtx *ctx, int argc, char **argv);
+struct searchNode *message_parse(searchCtx *ctx, int argc, char **argv);
/* Whowas functions (various types) */
struct searchNode *quit_parse(searchCtx *ctx, int argc, char **argv);
freesstring(np->shident); /* freesstring(NULL) is OK */
freesstring(np->sethost);
freesstring(np->opername);
+ freesstring(np->message);
node_decrement_usercount(np->ipnode);
derefnode(iptree, np->ipnode);
struct nick *nextbyauthname;
/* These are extensions only used by other modules */
array *channels;
+ sstring *message;
void *exts[MAXNICKEXTS];
} nick;
scheduleoneshot(0, nw_sched_processevent, nwe);
}
+static void nw_hook_message(int hooknum, void *arg) {
+ void **args = arg;
+ nick *np = args[0];
+ int isnotice = (uintptr_t)args[2];
+ nickwatchevent *nwe = nwe_new(np, isnotice ? "notice" : "message");
+ scheduleoneshot(0, nw_sched_processevent, nwe);
+}
+
static void nw_hook_joinchannel(int hooknum, void *arg) {
void **args = arg;
channel *cp = args[0];
registerhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
registerhook(HOOK_NICK_RENAME, &nw_hook_rename);
registerhook(HOOK_NICK_MODECHANGE, &nw_hook_umodechange);
+ registerhook(HOOK_NICK_MESSAGE, &nw_hook_message);
registerhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
registerhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);
}
deregisterhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
deregisterhook(HOOK_NICK_RENAME, &nw_hook_rename);
deregisterhook(HOOK_NICK_MODECHANGE, &nw_hook_umodechange);
+ deregisterhook(HOOK_NICK_MESSAGE, &nw_hook_message);
deregisterhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
deregisterhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);