]> jfr.im git - irc/quakenet/newserv.git/commitdiff
CHANSERV: add ADDCHAN relay command.
authorChris Porter <redacted>
Wed, 12 Feb 2014 00:35:24 +0000 (00:35 +0000)
committerChris Porter <redacted>
Wed, 12 Feb 2014 00:35:24 +0000 (00:35 +0000)
--HG--
branch : chanserv-live

chanserv/chancmds/addchan.c
chanserv/chanserv.c
chanserv/chanserv.h
chanserv/chanserv_relay.c
chanserv/chanservuser.c

index a77e2258505883a801a529a55f30737dbeb102ba..b01a80127eadb4fd6e25819f3155b2f4557efa98 100644 (file)
@@ -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;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);
index 08ad07bd251a166b94e4a3edb92cf7fa40a65f10..bbddf82e086b6466a718cc916bede5d9be901536 100644 (file)
@@ -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();
index fbd0452ab688d1dea3f86a582bcfa8fc9b938ad6..81d96a856ce66c243e2b741aac59b2b083170d35 100644 (file)
@@ -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);
index f3c082bf9c00eb24a38090a17a1ef79a844cca9d..99a2e36ec65eac18d629ed4ccf61cde376e1b3ab 100644 (file)
@@ -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 <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]) {
@@ -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;i<buflen;i++) {
index 078a0acdb4108f24e296e88524b45b4343f56389..db70abd4ee388180be68820069c404652396e8ed 100644 (file)
@@ -1444,3 +1444,98 @@ int checkreason(nick *np, char *reason) {
 
   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;
+}