* 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");
/* 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");
chanservstdmessage(sender, QM_NOFLAGSPECIFIED);
return CMD_ERROR;
}
-
- i++;
} else {
addflags=QCUFLAG_OP | QCUFLAG_AUTOOP | QCUFLAG_TOPIC;
}
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;
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;
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;
}