]> jfr.im git - irc/quakenet/newserv.git/blobdiff - newsearch/ns-cumodes.c
merge
[irc/quakenet/newserv.git] / newsearch / ns-cumodes.c
index b109322b56ab1b30bdaa3e696c11c76f83747f55..d21bf5ee316de3bd9700b944a703c17107197686 100644 (file)
@@ -23,18 +23,25 @@ const flag cumodelist[] = {
   { '\0', 0 }
 };
 
-void *cumodes_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
+void *cumodes_nick_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
+void *cumodes_chan_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
 void cumodes_free(searchCtx *ctx, struct searchNode *thenode);
 
 struct searchNode *cumodes_parse(searchCtx *ctx, int argc, char **argv) {
   struct cumodes_localdata *localdata;
-  struct searchNode *thenode;
+  struct searchNode *thenode, *flagstr;
   flag_t fset, fclear;
-
+  char *p;
+  
   if (argc!=2) {
     parseError="cumodes: usage: cumodes (string) (mode string)";
     return NULL;
   }
+
+  if (!(ctx->searchcmd == reg_nicksearch) && !(ctx->searchcmd == reg_chansearch)) {
+    parseError="cumodes: cannot be used outside of nicksearch or chansearch";
+    return NULL;
+  }
     
   if (!(localdata=(struct cumodes_localdata *)malloc(sizeof(struct cumodes_localdata)))) {
     parseError = "malloc: could not allocate memory for this search.";
@@ -50,9 +57,15 @@ struct searchNode *cumodes_parse(searchCtx *ctx, int argc, char **argv) {
   fset=0;
   fclear=~0;
   
-  setflags(&(fset), CU_ALL, argv[1], cumodelist, REJECT_NONE);
-  setflags(&(fclear), CU_ALL, argv[1], cumodelist, REJECT_NONE);
-
+  if (!(flagstr=argtoconststr("cumodes", ctx, argv[0], &p))) {
+    localdata->xnode->free(ctx, localdata->xnode);
+    free(localdata);
+    return NULL;
+  }
+  setflags(&(fset), CU_ALL, p, cumodelist, REJECT_NONE);
+  setflags(&(fclear), CU_ALL, p, cumodelist, REJECT_NONE);
+  flagstr->free(ctx, flagstr);
+  
   localdata->setmodes=0;
   localdata->clearmodes=~0;
 
@@ -77,13 +90,25 @@ struct searchNode *cumodes_parse(searchCtx *ctx, int argc, char **argv) {
   
   thenode->returntype  = RETURNTYPE_BOOL;
   thenode->localdata   = (void *)localdata;
-  thenode->exe         = cumodes_exe;
+  
+  if (ctx->searchcmd == reg_nicksearch) {
+    thenode->exe       = cumodes_nick_exe;
+  } else if (ctx->searchcmd == reg_chansearch) {
+    thenode->exe       = cumodes_chan_exe;
+  } else { /* We really shouldn't get here */
+    parseError = "cumodes: internal code error.";
+    free(thenode);
+    (localdata->xnode->free)(ctx, localdata->xnode);
+    free(localdata);
+    return NULL;
+  }
+  
   thenode->free        = cumodes_free;
 
   return thenode;
 }
 
-void *cumodes_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
+void *cumodes_nick_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
   struct cumodes_localdata *localdata;
   nick *np = (nick *)value;
   channel *cp;
@@ -113,6 +138,39 @@ void *cumodes_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
   return (void *)1;
 }
 
+void *cumodes_chan_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
+  struct cumodes_localdata *localdata;
+  chanindex *cip = (chanindex *)value;
+  nick *np;
+  char *nickname;
+  unsigned long *lp, flags;
+
+  if(!cip->channel || !cip->channel->users)
+    return (void *)0;
+
+  localdata = (struct cumodes_localdata *)thenode->localdata;
+
+  /* MEGA SLOW */
+  nickname = (char *)(localdata->xnode->exe) (ctx, localdata->xnode, value);
+  np = getnickbynick(nickname);
+  if(!np)
+    return (void *)0;
+
+  lp = getnumerichandlefromchanhash(cip->channel->users,np->numeric);
+  if(!lp)
+    return (void *)0;
+
+  flags = *lp;
+
+  if (~flags & (localdata->setmodes))
+    return (void *)0;
+
+  if (flags & (localdata->clearmodes))
+    return (void *)0;
+  
+  return (void *)1;
+}
+
 void cumodes_free(searchCtx *ctx, struct searchNode *thenode) {
   struct cumodes_localdata *localdata = (struct cumodes_localdata *)thenode->localdata;
   (localdata->xnode->free)(ctx, localdata->xnode);