]> jfr.im git - irc/quakenet/newserv.git/blobdiff - newsearch/ns-modes.c
LUA: add function for channel chanop notice
[irc/quakenet/newserv.git] / newsearch / ns-modes.c
index fae58a0bd0af56eb4f91a20d8a3acc06774d786f..f26218ab300808493be228b447f4ada536e65aa4 100644 (file)
@@ -8,7 +8,6 @@
 #include <stdlib.h>
 
 struct modes_localdata {
-  int         type;
   flag_t      setmodes;
   flag_t      clearmodes;
 }; 
@@ -16,28 +15,21 @@ struct modes_localdata {
 void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
 void modes_free(searchCtx *ctx, struct searchNode *thenode);
 
-struct searchNode *modes_parse(searchCtx *ctx, int type, int argc, char **argv) {
+struct searchNode *modes_parse(searchCtx *ctx, int argc, char **argv) {
   struct modes_localdata *localdata;
-  struct searchNode *thenode;
+  struct searchNode *thenode, *modestring;
   const flag *flaglist;
-
+  char *p;
+  
   if (argc!=1) {
     parseError="modes: usage: modes (mode string)";
     return NULL;
   }
     
-  switch (type) {
-  case SEARCHTYPE_CHANNEL:
+  if (ctx->searchcmd == reg_chansearch) {
     flaglist=cmodeflags;
-    break;
-
-  case SEARCHTYPE_NICK:
+  } else {
     flaglist=umodeflags;
-    break;
-
-  default:
-    parseError="modes: unsupported search type";
-    return NULL;
   }
 
   if (!(localdata=(struct modes_localdata *)malloc(sizeof(struct modes_localdata)))) {
@@ -45,13 +37,18 @@ struct searchNode *modes_parse(searchCtx *ctx, int type, int argc, char **argv)
     return NULL;
   }
   
-  localdata->type=type;
   localdata->setmodes=0;
   localdata->clearmodes = ~0;
   
-  setflags(&(localdata->setmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
-  setflags(&(localdata->clearmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
-
+  if (!(modestring=argtoconststr("modes", ctx, argv[0], &p))) {
+    free(localdata);
+    return NULL;
+  }
+  
+  setflags(&(localdata->setmodes), 0xFFFF, p, flaglist, REJECT_NONE);
+  setflags(&(localdata->clearmodes), 0xFFFF, p, flaglist, REJECT_NONE);
+  (modestring->free)(ctx, modestring);
+  
   localdata->clearmodes = ~(localdata->clearmodes);
   
   if (!(thenode=(struct searchNode *)malloc(sizeof(struct searchNode)))) {
@@ -77,21 +74,14 @@ void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
   
   localdata = (struct modes_localdata *)thenode->localdata;
 
-  switch (localdata->type) {
-  case SEARCHTYPE_CHANNEL:
+  if (ctx->searchcmd == reg_chansearch) {
     cip=(chanindex *)value;
     if (!cip->channel)
       return NULL;
     flags=cip->channel->flags;
-    break;
-
-  case SEARCHTYPE_NICK:
+  } else {
     np=(nick *)value;
     flags=np->umodes;
-    break;
-
-  default:
-    return NULL;
   }
 
   if (~flags & (localdata->setmodes))