/******************************************************************
 * PTlink Services is (C) CopyRight PTlink IRC Software 1999-2005 *
 *                http://software.pt-link.net                     *
 * This program is distributed under GNU Public License           *
 * Please read the file COPYING for copyright information.        *
 ******************************************************************
                                                                                
  File: cs_show.c
  Description: chanserv list command
                                                                                
 *  $Id: cs_show.c,v 1.6 2005/10/18 16:25:06 jpinto Exp $
*/

#include "module.h"
#include "chanserv.h"
#include "chanrecord.h"
#include "cs_role.h"
#include "my_sql.h"
#include "nsmacros.h"
#include "nickserv.h"
#include "dbconf.h"
/* laang files */
#include "lang/cs_role.lh"
#include "lang/cs_show.lh"

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

/* Change Log
  2.1 - #17: CS SHOW shoud display the pending status
  2.0 - 0000265: remove nickserv cache system
      - 0000281: no auth nick can't use chanserv
*/

/* external functions we need */
ServiceUser* (*chanserv_suser)(void);

MOD_REQUIRES
  MOD_FUNC(dbconf_get)
  MOD_FUNC(chanserv_suser)
MOD_END

/* internal functions */

/* available commands from module */
void cs_show(IRC_User *s, IRC_User *u);

/* Remote config */
static int NeedsAuth;
DBCONF_REQUIRES
  DBCONF_GET("chanserv", NeedsAuth)
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;
}

/* Local variables */
ServiceUser* csu;

int mod_load(void)
{
  csu = chanserv_suser();  
  suser_add_cmd(csu, "SHOW", cs_show, SHOW_SUMMARY, SHOW_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_show(IRC_User *s, IRC_User *u)
{
  MYSQL_RES* res;
  MYSQL_ROW row;
  u_int32_t source_snid;
  int rowc = 0;
  
  CHECK_IF_IDENTIFIED_NICK
  if(NeedsAuth && !IsAuthenticated(u))
    send_lang(u, s, NEEDS_AUTH_NICK);
  else
  {
  /* List channels you are founder at */
    res = sql_query("SELECT name FROM chanserv WHERE founder=%d", 
	source_snid);
     row = sql_next_row(res);
     if(row) 
     {
      send_lang(u, s, SHOW_FOUNDER_HEADER);
      do 
      {
        ++rowc;
        send_lang(u, s, SHOW_ITEM_X, row[0]);
      } while((row = sql_next_row(res)));
      send_lang(u, s, SHOW_TAIL_X, rowc);
    }
    else
	send_lang(u, s, SHOW_FOUNDER_EMPTY);
    sql_free(res);  
    rowc = 0;
    /* List channels you are successor at */
    res = sql_query("SELECT name FROM chanserv WHERE successor=%d", 
	source_snid);
    row = sql_next_row(res);
    if(row) 
    {
      send_lang(u, s, SHOW_SUCCESSOR_HEADER);
      do 
      {
        ++rowc;
        send_lang(u, s, SHOW_ITEM_X, row[0]);
      } while((row = sql_next_row(res)));
      send_lang(u, s, SHOW_TAIL_X, rowc);
    }
    sql_free(res);

    rowc = 0;

    /* List channels you are successor at */
    res = sql_query("SELECT r.name, c.name, cr.message, cr.flags "
	"FROM cs_role r, chanserv c, cs_role_users cr "
	"WHERE cr.snid=%d AND r.rid=cr.rid AND c.scid=cr.scid", 
	source_snid);
    
    row = sql_next_row(res);
     if(row) 
     {
      send_lang(u, s, SHOW_ROLES_HEADER);
      do 
      {
        char flagstr[64];
        u_int32_t flags = atoi(row[3]);
        if(flags & CRF_REJECTED)
          snprintf(flagstr, sizeof(flagstr),
            " %s", lang_str(u, REJECTED_ROLE));
        else if(flags & CRF_PENDING)
          snprintf(flagstr, sizeof(flagstr),
            " %s", lang_str(u, PENDING_ROLE));        
        else
          flagstr[0] = '\0';
        ++rowc;
        if(row[2])
          send_lang(u, s, SHOW_ROLES_ITEM_X_X_X_X, row[0], row[1], flagstr, row[2]);
        else
          send_lang(u, s, SHOW_ROLES_ITEM_X_X_X, row[0], row[1], flagstr);
      } while((row = sql_next_row(res)));
      send_lang(u, s, SHOW_ROLES_TAIL_X, rowc);
     }
     sql_free(res);  
  }
}
/* End of Module */


syntax highlighted by Code2HTML, v. 0.9.1