]> 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 1b65bdd0c89d3c456be552fe570fbbbbdbc1b9b9..b5e544f13c0bb6c50be79c7b914512fb28ac35ff 100644 (file)
 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;
+  unsigned int chanlevcount=0, channelcount=0;
   int added=0;
   int i, foundflags=0;
+  void *args[3];
 
   if (cargc<2) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "adduser");
@@ -81,9 +82,9 @@ 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++;
 
   /* If we found flags don't try to add them as a user as well.. */
   for (i=1+foundflags;i<cargc;i++) {
@@ -95,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;
@@ -108,6 +118,12 @@ 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);