/******************************************************************
 * PTlink Services is (C) CopyRight PTlink IRC Software 1999-2004 *
 *                http://software.pt-link.net                     *
 * This program is distributed under GNU Public License           *
 * Please read the file COPYING for copyright information.        *
 ******************************************************************

  File: cs_register.c
  Description: chanserv register command

 *  $Id: cs_register.c,v 1.6 2005/10/18 16:25:06 jpinto Exp $
*/

#include "module.h"
#include "nickserv.h"
#include "chanserv.h"
#include "my_sql.h"
#include "chanrecord.h"
#include "nsmacros.h"
#include "dbconf.h"
/* lang files */
#include "lang/cscommon.lh"
#include "lang/cs_register.lh"

SVS_Module mod_info =
/* module, version, description */
{"cs_register", "2.1","chanserv register command" };

/* Change Log
   2.1 - 0000302: DefaultMlock add
   2.0 - 0000265: remove nickserv cache system
*/
/* functions and events we require */
ServiceUser*  (*chanserv_suser)(void);
int e_chan_register;

MOD_REQUIRES
  MOD_FUNC(dbconf_get)
  MOD_FUNC(chanserv_suser)
  MOD_FUNC(e_chan_register)  
MOD_END

/* internal functions */
int chans_count(u_int32_t snid);

void cs_register(IRC_User *s, IRC_User *u);


/* Local variables */
static ServiceUser* csu;
int cs_log;

/* Remote config */
static int NeedsAuth;
static int NickSecurityCode;
static int MaxChansPerUser;
static char* DefaultMlock;
DBCONF_REQUIRES
  DBCONF_GET("chanserv", NeedsAuth)
  DBCONF_GET("nickserv", NickSecurityCode)
  DBCONF_GET("chanserv", MaxChansPerUser)
  DBCONF_GET("chanserv", DefaultMlock)
DBCONF_END

/* this is called before load and at services rehash */
int mod_rehash(void)
{
  if(dbconf_get(dbconf_requires) < 0 )
  {
    errlog("Error reading dbconf!");
    return -1;
  }
  return 0;
}    
int mod_load(void)
{
  cs_log = log_handle("chanserv");
  csu = chanserv_suser();

  suser_add_cmd(csu,
    "REGISTER", cs_register, REGISTER_SUMMARY, REGISTER_HELP);  

  return 0;
}

void mod_unload(void)
{
  suser_del_mod_cmds(csu, &mod_info);
}
 
/* s = service the command was sent to
   u = user the command was sent from */
void cs_register(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  ChanRecord* cr = NULL;
  IRC_Chan *chan;
  char *cname;
  cname = strtok(NULL, " ");

  CHECK_IF_IDENTIFIED_NICK
  
  if(NickSecurityCode  && !IsAuthenticated(u))
    send_lang(u, s, NEEDS_AUTH_NICK);
  else if(IsNull(cname))
    send_lang(u, s, CHAN_REGISTER_SYNTAX);    
  else if((chan = irc_FindChan(cname)) == NULL)
    send_lang(u, s, CHAN_X_IS_EMPTY, cname);      
  else if((cr = OpenCR(cname)))
    send_lang(u, s, CHAN_X_ALREADY_REGISTERED, cname);
  else if(!irc_IsChanOp(u, chan))
    send_lang(u, s, CHAN_NOT_OP);
  else if(chans_count(source_snid) >= MaxChansPerUser)
    send_lang(u, s, REACHED_MAX_CHANS_X, MaxChansPerUser);
  else /* everything is valid lets do the registraion */
    {
      log_log(cs_log, mod_info.name, "Channel %s registered by %s",
        cname, u->nick);
        
      cr = CreateCR(cname);
      if(IsNull(cr))
        {
          send_lang(u, s, UPDATE_FAIL);
          return;
        }
      cr->flags = 0;
      cr->t_reg = irc_CurrentTime;
      cr->t_last_use = irc_CurrentTime;
      cr->t_ltopic = irc_CurrentTime;
      cr->t_maxusers = irc_CurrentTime;
      cr->maxusers = chan->users_count;
      if(DefaultMlock)
        cr->mlock = strdup(DefaultMlock);
      cr->founder = u->snid;
      if(UpdateCR(cr) == 0)
        send_lang(u, s, UPDATE_FAIL);
      else 
        {
          irc_ChanMode(csu->u, chan, "+r");
          irc_ChanUMode(csu->u, chan, "+a" , u);
          send_lang(u, s, CHAN_X_REGISTER_SUCCESS, cname);
          mod_do_event(e_chan_register, u, cr);
        }
      chan->sdata = cr;
      if(cr->mlock)
      {
        irc_ChanMLockSet(s, chan, cr->mlock);
        irc_ChanMLockApply(s, chan);
      }
    }
}

int chans_count(u_int32_t snid)
{
  MYSQL_RES* res;
  MYSQL_ROW row;
  int count = 0;
  res = sql_query("SELECT COUNT(*) FROM chanserv WHERE founder=%d", snid);
  row = sql_next_row(res);
  if(row)
    count = atoi(row[0]);
  sql_free(res);
  return count;
}

/* MODULE FORMAT VERSION */


syntax highlighted by Code2HTML, v. 0.9.1