From: Chris Porter Date: Wed, 12 Feb 2014 00:35:24 +0000 (+0000) Subject: CHANSERV: add ADDCHAN relay command. X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/commitdiff_plain/bdeb548fe5327b8ff0cda877d98ce0c8dd3be384 CHANSERV: add ADDCHAN relay command. --HG-- branch : chanserv-live --- diff --git a/chanserv/chancmds/addchan.c b/chanserv/chancmds/addchan.c index a77e2258..b01a8012 100644 --- a/chanserv/chancmds/addchan.c +++ b/chanserv/chancmds/addchan.c @@ -37,8 +37,7 @@ int csc_doaddchan(void *source, int cargc, char **cargv) { reguser *founder; flag_t flags; short type=0; - unsigned int i, count; - void *args[3]; + unsigned int count; if (!rup) return CMD_ERROR; @@ -96,13 +95,6 @@ int csc_doaddchan(void *source, int cargc, char **cargv) { return CMD_ERROR; } - if (cip->exts[chanservext]) { - chanservstdmessage(sender, QM_ALREADYREGISTERED, cip->name->content); - if (notify) - chanservstdmessage(notify, QM_ALREADYREGISTERED, cip->name->content); - return CMD_ERROR; - } - count = 0; for (rcup=founder->knownon;rcup;rcup=rcup->nextbyuser) @@ -115,87 +107,12 @@ int csc_doaddchan(void *source, int cargc, char **cargv) { return CMD_ERROR; } - /* Initialise the channel */ - rcp=getregchan(); - - /* ID, index */ - rcp->ID=++lastchannelID; - rcp->index=cip; - cip->exts[chanservext]=rcp; - - rcp->chantype=type; - rcp->flags=flags; - rcp->status=0; - rcp->bans=NULL; - rcp->lastcountersync=0; - - rcp->limit=0; - rcp->forcemodes=CHANMODE_DEFAULT; - rcp->denymodes=0; - - if (CIsAutoLimit(rcp)) { - rcp->forcemodes |= CHANMODE_LIMIT; - } - - rcp->autolimit=5; - rcp->banstyle=0; - - rcp->created=rcp->lastactive=rcp->statsreset=rcp->ostatsreset=time(NULL); - rcp->banduration=0; - rcp->autoupdate=0; - rcp->lastbancheck=0; - - /* Added by */ - rcp->addedby=rup->ID; - - /* Founder */ - rcp->founder=founder->ID; - - /* Suspend by */ - rcp->suspendby=0; - rcp->suspendtime=0; - - rcp->totaljoins=rcp->tripjoins=rcp->otripjoins=rcp->maxusers=rcp->tripusers=rcp->otripusers=0; - rcp->welcome=rcp->topic=rcp->key=rcp->suspendreason=rcp->comment=NULL; - - /* Users */ - memset(rcp->regusers,0,REGCHANUSERHASHSIZE*sizeof(reguser *)); - - rcp->checksched=NULL; - rcp->ltimestamp=0; - for (i=0;ichanopnicks[i][0]='\0'; - rcp->chanopaccts[i]=0; - } - rcp->chanoppos=0; - - /* Add new channel to db.. */ - csdb_createchannel(rcp); - - /* Add the founder as +ano */ - rcup=getregchanuser(); - rcup->chan=rcp; - rcup->user=founder; - rcup->flags=(QCUFLAG_OWNER | QCUFLAG_OP | QCUFLAG_AUTOOP); - rcup->usetime=0; - rcup->info=NULL; - rcup->changetime=time(NULL); - - addregusertochannel(rcup); - csdb_createchanuser(rcup); - csdb_chanlevhistory_insert(rcp, sender, rcup->user, 0, rcup->flags); - - args[0]=sender; - args[1]=rcup; - args[2]=(void *)0; - - triggerhook(HOOK_CHANSERV_CHANLEVMOD, args); - - /* If the channel exists, get the ball rolling */ - if (cip->channel) { - chanservjoinchan(cip->channel); - rcp->status |= QCSTAT_MODECHECK | QCSTAT_OPCHECK | QCSTAT_BANCHECK; - cs_timerfunc(cip); + rcp=cs_addchan(cip, sender, rup, founder, flags, type); + if(rcp == NULL) { + chanservstdmessage(sender, QM_ALREADYREGISTERED, cip->name->content); + if (notify) + chanservstdmessage(notify, QM_ALREADYREGISTERED, cip->name->content); + return CMD_ERROR; } cs_log(sender, "ADDCHAN %s #%s %s %s",cip->name->content,founder->username,printflags(rcp->flags,rcflags), chantypes[type]->content); diff --git a/chanserv/chanserv.c b/chanserv/chanserv.c index 08ad07bd..bbddf82e 100644 --- a/chanserv/chanserv.c +++ b/chanserv/chanserv.c @@ -48,6 +48,7 @@ void _init() { chantypes[5]=getsstring("gamesite",20); chantypes[6]=getsstring("game",20); chantypes[7]=getsstring("upgrade",20); + chantypes[8]=getsstring("partner",20); /* And the log system */ cs_initlog(); diff --git a/chanserv/chanserv.h b/chanserv/chanserv.h index fbd0452a..81d96a85 100644 --- a/chanserv/chanserv.h +++ b/chanserv/chanserv.h @@ -68,7 +68,7 @@ #define LINGERTIME 300 #define DUMPINTERVAL 300 #define EMAILLEN 60 -#define CHANTYPES 8 +#define CHANTYPES 9 #define CHANOPHISTORY 10 /* Suspension and g-line hit count limits */ @@ -879,6 +879,7 @@ flag_t cs_sanitisechanlev(flag_t flags); int cs_unbanfn(nick *sender, chanindex *cip, int (*fn)(void *arg, struct chanban *ban), void *arg, int removepermbans, int abortonfailure); void cs_logchanop(regchan *rcp, char *nick, reguser *rup); int checkreason(nick *np, char *reason); +regchan *cs_addchan(chanindex *cip, nick *sender, reguser *addedby, reguser *founder, flag_t flags, short type); /* chanservstdcmds.c */ int cs_doshowcommands(void *source, int cargc, char **cargv); diff --git a/chanserv/chanserv_relay.c b/chanserv/chanserv_relay.c index f3c082bf..99a2e36e 100644 --- a/chanserv/chanserv_relay.c +++ b/chanserv/chanserv_relay.c @@ -22,6 +22,7 @@ int csa_dosettempemail(void *source, int cargc, char **cargv); int csa_dosetemail(void *source, int cargc, char **cargv); int csa_doresendemail(void *source, int cargc, char **cargv); int csa_doactivateuser(void *source, int cargc, char **cargv); +int csa_doaddchan(void *source, int argc, char **argv); static int decrypt_password(unsigned char *secret, int keybits, char *buf, int bufsize, char *encrypted); static int hex_to_int(char *input, unsigned char *buf, int buflen); @@ -65,6 +66,7 @@ void _init(void) { registercontrolhelpcmd("setemail", NO_RELAY, 3, csa_dosetemail, "Usage: setmail "); registercontrolhelpcmd("resendemail", NO_RELAY, 1, csa_doresendemail, "Usage: resendemail "); registercontrolhelpcmd("activateuser", NO_RELAY, 1, csa_doactivateuser, "Usage: activateuser "); + registercontrolhelpcmd("addchan", NO_RELAY, 3, csa_doaddchan, "Usage: addchan "); s=getcopyconfigitem("chanserv","createaccountsecret","",128); if(!s || !s->content || !s->content[0]) { @@ -85,6 +87,7 @@ void _fini(void) { deregistercontrolcmd("setemail", csa_dosetemail); deregistercontrolcmd("resendemail", csa_doresendemail); deregistercontrolcmd("activateuser", csa_doactivateuser); + deregistercontrolcmd("addchan", csa_doaddchan); if(createaccountsecret_ok) deregistercontrolcmd("createaccount", csa_docreateaccount); @@ -424,6 +427,59 @@ int csa_doactivateuser(void *source, int cargc, char **cargv) { return CMD_OK; } +int csa_doaddchan(void *source, int cargc, char **cargv) { + nick *sender=(nick *)source; + reguser *rup = getreguserfromnick(sender), *founder; + chanindex *cip; + short type; + regchan *rcp; + + if(cargc<3) { + controlreply(sender, "ADDCHAN FALSE args"); + return CMD_ERROR; + } + + if (*cargv[0] != '#' || strlen(cargv[0]) > CHANNELLEN) { + controlreply(sender, "ADDCHAN FALSE invalidchannel"); + return CMD_ERROR; + } + + if (!(cip=findorcreatechanindex(cargv[0]))) { + controlreply(sender, "ADDCHAN FALSE invalidchannel"); + return CMD_ERROR; + } + + founder = findreguserbyID(atoi(cargv[1])); + if(founder == NULL) { + controlreply(sender, "ADDCHAN FALSE useridnotexist"); + return CMD_ERROR; + } + + if(UIsInactive(founder)) { + controlreply(sender, "ADDCHAN FALSE accountinactive"); + return CMD_ERROR; + } + + for(type=CHANTYPES-1;type;type--) + if(!ircd_strcmp(chantypes[type]->content, cargv[2])) + break; + + if(!type) { + controlreply(sender, "ADDCHAN FALSE invalidchantype"); + return CMD_ERROR; + } + + rcp = cs_addchan(cip, sender, rup, founder, QCFLAG_JOINED, type); + if(!rcp) { + controlreply(sender, "ADDCHAN FALSE alreadyregistered"); + return CMD_ERROR; + } + + cs_log(sender, "ADDCHAN %s #%s %s %s", cip->name->content, founder->username, printflags(rcp->flags, rcflags), chantypes[type]->content); + controlreply(sender, "ADDCHAN TRUE"); + return CMD_OK; +} + static int hex_to_int(char *input, unsigned char *buf, int buflen) { int i; for(i=0;iexts[chanservext]) + return NULL; + + /* Initialise the channel */ + rcp=getregchan(); + + /* ID, index */ + rcp->ID=++lastchannelID; + rcp->index=cip; + cip->exts[chanservext]=rcp; + + rcp->chantype=type; + rcp->flags=flags; + rcp->status=0; + rcp->bans=NULL; + rcp->lastcountersync=0; + + rcp->limit=0; + rcp->forcemodes=CHANMODE_DEFAULT; + rcp->denymodes=0; + + if (CIsAutoLimit(rcp)) { + rcp->forcemodes |= CHANMODE_LIMIT; + } + + rcp->autolimit=5; + rcp->banstyle=0; + + rcp->created=rcp->lastactive=rcp->statsreset=rcp->ostatsreset=time(NULL); + rcp->banduration=0; + rcp->autoupdate=0; + rcp->lastbancheck=0; + + /* Added by */ + rcp->addedby=addedby->ID; + + /* Founder */ + rcp->founder=founder->ID; + + /* Suspend by */ + rcp->suspendby=0; + rcp->suspendtime=0; + + rcp->totaljoins=rcp->tripjoins=rcp->otripjoins=rcp->maxusers=rcp->tripusers=rcp->otripusers=0; + rcp->welcome=rcp->topic=rcp->key=rcp->suspendreason=rcp->comment=NULL; + + /* Users */ + memset(rcp->regusers,0,REGCHANUSERHASHSIZE*sizeof(reguser *)); + + rcp->checksched=NULL; + rcp->ltimestamp=0; + for (i=0;ichanopnicks[i][0]='\0'; + rcp->chanopaccts[i]=0; + } + rcp->chanoppos=0; + + /* Add new channel to db.. */ + csdb_createchannel(rcp); + + /* Add the founder as +ano */ + rcup=getregchanuser(); + rcup->chan=rcp; + rcup->user=founder; + rcup->flags=(QCUFLAG_OWNER | QCUFLAG_OP | QCUFLAG_AUTOOP); + rcup->usetime=0; + rcup->info=NULL; + rcup->changetime=time(NULL); + + addregusertochannel(rcup); + csdb_createchanuser(rcup); + csdb_chanlevhistory_insert(rcp, sender, rcup->user, 0, rcup->flags); + + args[0]=sender; + args[1]=rcup; + args[2]=(void *)0; + + triggerhook(HOOK_CHANSERV_CHANLEVMOD, args); + + /* If the channel exists, get the ball rolling */ + if (cip->channel) { + chanservjoinchan(cip->channel); + rcp->status |= QCSTAT_MODECHECK | QCSTAT_OPCHECK | QCSTAT_BANCHECK; + cs_timerfunc(cip); + } + + return rcp; +}