]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chancmds/adduser.c
newsearch: (server) shouldn't return NULL.
[irc/quakenet/newserv.git] / chanserv / chancmds / adduser.c
index 0fb3778fe8ee4bbdab30c31012aace4b85035541..b5e544f13c0bb6c50be79c7b914512fb28ac35ff 100644 (file)
@@ -4,7 +4,7 @@
  * CMDNAME: adduser
  * CMDLEVEL: QCMD_AUTHED
  * CMDARGS: 20
- * CMDDESC: Adds one or more users to a channel as +aot.
+ * CMDDESC: Adds one or more users to a channel.
  * CMDFUNC: csc_doadduser
  * CMDPROTO: int csc_doadduser(void *source, int cargc, char **cargv);
  * CMDHELP: Usage: ADDUSER <channel> [<flags>] <user1> [<user2> [<user3> [...]]]
 int csc_doadduser(void *source, int cargc, char **cargv) {
   nick *sender=source;
   chanindex *cip;
-  regchanuser *rcup, *rcuplist;
+  regchanuser *rcup, *trcup, *rcuplist;
   regchan *rcp;
   reguser *rup;
   flag_t addflags;
   char *flagbuf;
-  unsigned int count=0;  
-  int i;
+  unsigned int chanlevcount=0, channelcount=0;
+  int added=0;
+  int i, foundflags=0;
+  void *args[3];
 
   if (cargc<2) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "adduser");
@@ -53,6 +55,8 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
 
   /* See if there are flags defined */
   if (*cargv[1] == '+') {
+    foundflags=1;
+    
     /* If there are we now need at least 3 parameters */
     if (cargc<3) {
       chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "adduser");
@@ -71,8 +75,6 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
       chanservstdmessage(sender, QM_NOFLAGSPECIFIED);
       return CMD_ERROR;
     }
-    
-    i++;
   } else {
     addflags=QCUFLAG_OP | QCUFLAG_AUTOOP | QCUFLAG_TOPIC;
   }
@@ -80,11 +82,12 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
   flagbuf=printflags(addflags, rcuflags);  
 
   /* ugh */
-  for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+  for (chanlevcount=i=0;i<REGCHANUSERHASHSIZE;i++)
     for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
-      count++;
+      chanlevcount++;
 
-  for (i=1;i<cargc;i++) {
+  /* If we found flags don't try to add them as a user as well.. */
+  for (i=1+foundflags;i<cargc;i++) {
     if (!(rup=findreguser(sender, cargv[i])))
       continue;
 
@@ -93,12 +96,21 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
       continue;
     }
 
-    if(count++ >= MAXCHANLEVS) {
+    if(chanlevcount++ >= MAXCHANLEVS) {
       chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
       chanservstdmessage(sender, QM_DONE);
       return CMD_OK;
     }
 
+    channelcount=0;
+    for (trcup=rup->knownon;trcup;trcup=trcup->nextbyuser)
+      channelcount++;
+
+    if(channelcount >= MAXCHANNELS) {
+      chanservstdmessage(sender, QM_TOOMANYCHANNELS);
+      return CMD_ERROR;
+    }
+
     rcup=getregchanuser();
     rcup->chan=rcp;
     rcup->user=rup;
@@ -106,17 +118,25 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
     rcup->changetime=time(NULL);
     rcup->usetime=0;
     rcup->info=NULL;
+    
+    args[0]=sender;
+    args[1]=rcup;
+    args[2]=(void *)0;
+    
+    triggerhook(HOOK_CHANSERV_CHANLEVMOD, args);
    
     cs_log(sender,"CHANLEV %s #%s %s (+ -> %s)",cip->name->content,rup->username, flagbuf, flagbuf);
     addregusertochannel(rcup);
     csdb_createchanuser(rcup);
     csdb_chanlevhistory_insert(rcp, sender, rcup->user, 0, rcup->flags);
+    added++;
   }
 
   rcp->status |= QCSTAT_OPCHECK;
   cs_timerfunc(cip);
 
-  chanservstdmessage(sender, QM_DONE);
+  if (added)
+    chanservstdmessage(sender, QM_DONE);
 
   return CMD_OK;
 }