reguser *founder;
flag_t flags;
short type=0;
- unsigned int i, count;
- void *args[3];
+ unsigned int count;
if (!rup)
return CMD_ERROR;
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)
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;i<CHANOPHISTORY;i++) {
- rcp->chanopnicks[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);
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();
#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 */
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);
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);
registercontrolhelpcmd("setemail", NO_RELAY, 3, csa_dosetemail, "Usage: setmail <userid> <timestamp> <email address>");
registercontrolhelpcmd("resendemail", NO_RELAY, 1, csa_doresendemail, "Usage: resendemail <userid>");
registercontrolhelpcmd("activateuser", NO_RELAY, 1, csa_doactivateuser, "Usage: activateuser <userid>");
+ registercontrolhelpcmd("addchan", NO_RELAY, 3, csa_doaddchan, "Usage: addchan <channel> <userid> <channel type>");
s=getcopyconfigitem("chanserv","createaccountsecret","",128);
if(!s || !s->content || !s->content[0]) {
deregistercontrolcmd("setemail", csa_dosetemail);
deregistercontrolcmd("resendemail", csa_doresendemail);
deregistercontrolcmd("activateuser", csa_doactivateuser);
+ deregistercontrolcmd("addchan", csa_doaddchan);
if(createaccountsecret_ok)
deregistercontrolcmd("createaccount", csa_docreateaccount);
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;i<buflen;i++) {
return 1;
}
+
+regchan *cs_addchan(chanindex *cip, nick *sender, reguser *addedby, reguser *founder, flag_t flags, short type) {
+ regchan *rcp;
+ regchanuser *rcup;
+ void *args[3];
+ int i;
+
+ if (cip->exts[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;i<CHANOPHISTORY;i++) {
+ rcp->chanopnicks[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;
+}