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

  Description: record statistics gathering module

 *  $Id: recordstats.c,v 1.4 2005/10/11 16:13:06 jpinto Exp $
*/

#include "module.h"
#include "my_sql.h"

SVS_Module mod_info =
 /* module, version, description */
{"recordstats", "1.0",  "record statistics module" };

#define	DB_VERSION 1.0

/* Change Log
  1.0	- 0000331: recordstats module to save daly nick/chan records balance
*/

/** functions/events we require **/
/* void (*FunctionPointer)(void);*/
int e_nick_register = -1;
int e_nick_delete = -1;
int e_chan_register = -1;
int e_chan_delete = -1;

MOD_REQUIRES
  MOD_FUNC(e_nick_register)
  MOD_FUNC(e_nick_delete)
  MOD_FUNC(e_chan_register)
  MOD_FUNC(e_chan_delete)
MOD_END

/** functions/events we provide **/

/** Internal functions declaration **/
/* void internal_function(void); */
void insert_today_stats();
int ev_recordstats_nick_register(IRC_User *u, u_int32_t *snid);
int ev_recordstats_nick_delete(u_int32_t *snid, void *dummy);
int ev_recordstats_chan_register(IRC_User *u, ChanRecord *cr);
int ev_recordstats_chan_delete(u_int32_t *snid, void *dummy);

/** Local variables **/
/* int my_local_variable; */

/** load code **/
int mod_load(void)
{
  int r;
  
  if(sql_check_inst_upgrade(mod_info.name, DB_VERSION, NULL) < 0)
    return -1;
    
  /* firs lets check if this is our first day run */    
  r = sql_singlequery("SELECT count(*) FROM recordstats WHERE day=CURDATE()");
  if( r < 1 || (sql_field_i(0) == 0)) /* first run  */
    insert_today_stats();

  /* setup the actions for the updates */
  mod_add_event_action(e_nick_register, 
    (ActionHandler) ev_recordstats_nick_register);
  mod_add_event_action(e_nick_delete, 
    (ActionHandler) ev_recordstats_nick_delete);
  mod_add_event_action(e_chan_register, 
    (ActionHandler) ev_recordstats_chan_register);
  mod_add_event_action(e_chan_delete, 
    (ActionHandler) ev_recordstats_chan_delete);    
  
  return 0;
}
    
/** unload code **/
void mod_unload(void)
{
  return;
}
    
/** internal functions implementation starts here **/
void insert_today_stats()
{
  u_int32_t ns_total = 0;
  u_int32_t ns_today = 0;
  u_int32_t cs_total = 0;
  u_int32_t cs_today = 0;
  sql_singlequery("SELECT count(*) FROM nickserv");
  ns_total = sql_field_i(0);
  sql_singlequery("SELECT count(*) FROM nickserv WHERE "
    "DATE_FORMAT(FROM_UNIXTIME(t_reg), '%s')=CURDATE()", "%Y-%m-%d");
  ns_today = sql_field_i(0);
  sql_singlequery("SELECT count(*) FROM chanserv");
  cs_total = sql_field_i(0);
  sql_singlequery("SELECT count(*) FROM chanserv WHERE "
    "DATE_FORMAT(FROM_UNIXTIME(t_reg), '%s')=CURDATE()", "%Y-%m-%d");
  cs_today = sql_field_i(0);
  sqlb_init("recordstats");
  
  sqlb_add_func("day", "CURDATE()");
  sqlb_add_int("ns_total", ns_total);
  sqlb_add_int("ns_new_irc", ns_today);
  sqlb_add_int("ns_new_web", 0);
  sqlb_add_int("ns_lost", 0);
  sqlb_add_int("cs_total", cs_total);
  sqlb_add_int("cs_new_irc", cs_today);
  sqlb_add_int("cs_new_web", 0);
  sqlb_add_int("cs_lost", 0);
  
  sql_execute("%s", sqlb_insert());    
}

int ev_recordstats_nick_register(IRC_User *u, u_int32_t *snid)
{
  sql_execute("UPDATE recordstats SET ns_new_irc=ns_new_irc+1, ns_total=ns_total+1"
    " WHERE day=CURDATE()");
  return 0;
}

int ev_recordstats_chan_register(IRC_User *u, ChanRecord *cr)
{
  sql_execute("UPDATE recordstats SET cs_new_irc=cs_new_irc+1, cs_total=cs_total+1"
    " WHERE day=CURDATE()");
  return 0;
}

int ev_recordstats_nick_delete(u_int32_t *snid, void *dummy)
{  
  sql_execute("UPDATE recordstats SET ns_lost=ns_lost+1, ns_total=ns_total-1"
    " WHERE day=CURDATE()");
  return 0;
}

int ev_recordstats_chan_delete(u_int32_t *snid, void *dummy)
{  
  int r = sql_execute("UPDATE recordstats SET cs_lost=cs_lost+1, cs_total=cs_total-1"
    " WHERE day=CURDATE()");
  if(r == 0) /* this should only happen when we have a nick change */
    insert_today_stats();
  return 0;
}
    
/* End of module */


syntax highlighted by Code2HTML, v. 0.9.1