]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanserv_grep.c
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / chanserv / chanserv_grep.c
index dadc0e79fa15f3f3fa056dfb490f2eaa1ce79749..8e71a2a829ece808bde3bdfdd77afcec1d74a3b5 100644 (file)
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
+#include "../lib/version.h"
+
+MODULE_VERSION(QVERSION)
 
 #define CSG_BUFSIZE    1024
-#define CSG_MAXSTARTPOINT    21
+#define CSG_MAXSTARTPOINT    30
 
 pcre           *csg_curpat;        /* Compiled pattern from pcre */
 int             csg_curfile;       /* Which logfile is being searched */
@@ -36,8 +39,8 @@ extern ssize_t pread(int fd, void *buf, size_t count, off_t offset);
 #endif
 
 void _init() {
-  chanservaddcommand("grep",   QCMD_OPER, 1, csg_dogrep,   "Searches the logs.","");
-  chanservaddcommand("rgrep",  QCMD_OPER, 1, csg_dorgrep,  "Searches the logs in reverse order.","");
+  chanservaddcommand("grep",   QCMD_OPER, 1, csg_dogrep,   "Searches the logs.","Usage: GREP <regex>\nSearches the logs.  The current logfile will be specified first, followed by\nall older logfiles found.  This will shuffle the order of results slightly.  Where:\nregex  - regular expression to search for.\nNote: For a case insensitive search, prepend (?i) to the regex.");
+  chanservaddcommand("rgrep",  QCMD_OPER, 2, csg_dorgrep,  "Searches the logs in reverse order.","Usage: RGREP <days> <regex>\nSearches the logs.  The oldest specified log will be specified first meaning\nthat all events returned will be in strict chronological order. Where:\ndays  - number of days of history to search\nregex - regex to search for\nNote: For a case insensitive search, prepend (?i) to the regex.");
 }
 
 void _fini() {
@@ -47,6 +50,10 @@ void _fini() {
 
 int csg_dogrep(void *source, int cargc, char **cargv) {
   nick *sender=source;
+  reguser *rup=getreguserfromnick(sender);
+
+  if (!rup)
+    return CMD_ERROR;
 
   if (cargc<1) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "grep");
@@ -55,12 +62,20 @@ int csg_dogrep(void *source, int cargc, char **cargv) {
 
   csg_curfile=0;
   csg_direction=0;
+
+  chanservwallmessage("%s (%s) used GREP %s", sender->nick, rup->username, cargv[0]);
+  cs_log(sender, "GREP %s", cargv[0]);
+
   return csg_execgrep(sender, cargv[0]);
 }
 
 int csg_dorgrep(void *source, int cargc, char **cargv) {
   int startpoint;
   nick *sender=source;
+  reguser *rup=getreguserfromnick(sender);
+
+  if (!rup)
+    return CMD_ERROR;
 
   if (cargc<2) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rgrep");
@@ -82,6 +97,9 @@ int csg_dorgrep(void *source, int cargc, char **cargv) {
     return CMD_ERROR;
   }
 
+  chanservwallmessage("%s (%s) used RGREP %s %s", sender->nick, rup->username, cargv[0], cargv[1]);
+  cs_log(sender, "RGREP %s %s", cargv[0], cargv[1]);
+
   csg_curfile=startpoint;
   csg_direction=1;
   return csg_execgrep(sender, cargv[1]);
@@ -159,6 +177,8 @@ retry:
       csg_curfile--;
       if (csg_curfile<0) {
         chanservstdmessage(np, QM_ENDOFLIST);
+        free(csg_curpat);
+        csg_maxmatches=0;
         return;
       } else if (csg_curfile==0) {
         sprintf(filename,"chanservlog");
@@ -193,6 +213,7 @@ retry:
        if (!pcre_exec(csg_curpat, NULL, linestart, strlen(linestart), 0, 0, NULL, 0)) {
          chanservsendmessage(np, "%s", linestart);
          if (++csg_matches >= csg_maxmatches) {
+           chanservstdmessage(np, QM_TRUNCATED, csg_maxmatches);
            chanservstdmessage(np, QM_ENDOFLIST);
            free(csg_curpat);
            deregisterhandler(fd, 1);