/************************************************************************
 *   IRC - Internet Relay Chat, modules/m_services.c
 *
 *   Copyright (C) 2000-2003 TR-IRCD Development
 *
 *   Copyright (C) 1990 Jarkko Oikarinen and
 *                      University of Oulu, Co Center
 *
 *   See file AUTHORS in IRC package for additional names of
 *   the programmers.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 * $Id: m_services.c,v 1.3 2003/06/14 13:55:51 tr-ircd Exp $ 
 */

#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "channel.h"
#include "h.h"
#include "s_conf.h"

static struct Message cs1_msgtab[] = {
    {MSG_CHANSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_chanserv, m_chanserv, m_ignore, m_ignore}
};
static struct Message cs2_msgtab[] = {
    {MSG_CS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_chanserv, m_chanserv, m_ignore, m_ignore}
};
static struct Message ns1_msgtab[] = {
    {MSG_NICKSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_nickserv, m_nickserv, m_ignore, m_ignore}
};
static struct Message ns2_msgtab[] = {
    {MSG_NS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_nickserv, m_nickserv, m_ignore, m_ignore}
};
static struct Message ms1_msgtab[] = {
    {MSG_MEMOSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_memoserv, m_memoserv, m_ignore, m_ignore}
};
static struct Message ms2_msgtab[] = {
    {MSG_MS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_memoserv, m_memoserv, m_ignore, m_ignore}
};
static struct Message os1_msgtab[] = {
    {MSG_OPERSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_operserv, m_operserv, m_ignore, m_ignore}
};
static struct Message os2_msgtab[] = {
    {MSG_OS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_operserv, m_operserv, m_ignore, m_ignore}
};
static struct Message ss1_msgtab[] = {
    {MSG_STATSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_statserv, m_statserv, m_ignore, m_ignore}
};
static struct Message ss2_msgtab[] = {
    {MSG_SS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_statserv, m_statserv, m_ignore, m_ignore}
};
static struct Message hs1_msgtab[] = {
    {MSG_HELPSERV, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_helpserv, m_helpserv, m_ignore, m_ignore}
};
static struct Message hs2_msgtab[] = {
    {MSG_HS, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_helpserv, m_helpserv, m_ignore, m_ignore}
};
static struct Message id_msgtab[] = {
    {MSG_IDENTIFY, 0, 1, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_identify, m_identify, m_ignore, m_ignore}
};
static struct Message s_msgtab[] = {
    {MSG_SERVICES, 0, 2, M_SLOW | M_IDLE_RESET, 0L,
     m_unregistered, m_services, m_services, m_ignore, m_ignore}
};

#ifndef STATIC_MODULES

char *_version = "$Revision: 1.3 $";

void _modinit(void)
{
    mod_add_cmd(cs1_msgtab);
    mod_add_cmd(cs2_msgtab);
    mod_add_cmd(ns1_msgtab);
    mod_add_cmd(ns2_msgtab);
    mod_add_cmd(ms1_msgtab);
    mod_add_cmd(ms2_msgtab);
    mod_add_cmd(os1_msgtab);
    mod_add_cmd(os2_msgtab);
    mod_add_cmd(ss1_msgtab);
    mod_add_cmd(ss2_msgtab);
    mod_add_cmd(hs1_msgtab);
    mod_add_cmd(hs2_msgtab);
    mod_add_cmd(id_msgtab);
    mod_add_cmd(s_msgtab);
}

void _moddeinit(void)
{
    mod_del_cmd(cs1_msgtab);
    mod_del_cmd(cs2_msgtab);
    mod_del_cmd(ns1_msgtab);
    mod_del_cmd(ns2_msgtab);
    mod_del_cmd(ms1_msgtab);
    mod_del_cmd(ms2_msgtab);
    mod_del_cmd(os1_msgtab);
    mod_del_cmd(os2_msgtab);
    mod_del_cmd(ss1_msgtab);
    mod_del_cmd(ss2_msgtab);
    mod_del_cmd(hs1_msgtab);
    mod_del_cmd(hs2_msgtab);
    mod_del_cmd(id_msgtab);
    mod_del_cmd(s_msgtab);
}

#else
void m_services_init(void)
{
    mod_add_cmd(cs1_msgtab);
    mod_add_cmd(cs2_msgtab);
    mod_add_cmd(ns1_msgtab);
    mod_add_cmd(ns2_msgtab);
    mod_add_cmd(ms1_msgtab);
    mod_add_cmd(ms2_msgtab);
    mod_add_cmd(os1_msgtab);
    mod_add_cmd(os2_msgtab);
    mod_add_cmd(ss1_msgtab); 
    mod_add_cmd(ss2_msgtab);
    mod_add_cmd(hs1_msgtab);
    mod_add_cmd(hs2_msgtab);
    mod_add_cmd(id_msgtab);
    mod_add_cmd(s_msgtab);
}
#endif

int m_chanserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo(cptr, sptr, ServicesConf.chanserv, ServicesConf.services_name, parc, parv);
}

int m_nickserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo(cptr, sptr, ServicesConf.nickserv, ServicesConf.services_name, parc, parv);
}

int m_memoserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo(cptr, sptr, ServicesConf.memoserv, ServicesConf.services_name, parc, parv);
}

int m_operserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo(cptr, sptr, ServicesConf.operserv, ServicesConf.services_name, parc, parv);
}

int m_statserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo(cptr, sptr, ServicesConf.statserv, ServicesConf.services_name, parc, parv);
}

int m_helpserv(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    return m_pseudo_help(cptr, sptr, ServicesConf.helpserv, ServicesConf.services_name, parc, parv);
}

/* m_services | m_identify -- see df465+taz */

int m_services(aClient *cptr, aClient *sptr, int parc, char *parv[]) {
    if (parc < 2 || *parv[1] == '\0') {
	send_me_numeric(sptr, ERR_NOTEXTTOSEND);
	return -1;
    }
    if (irc_strncmp(parv[1], "help", 4) == 0) {
	send_me_notice(sptr, ":For ChanServ help use: /chanserv help");
	send_me_notice(sptr, ":For NickServ help use: /nickserv help");
	send_me_notice(sptr, ":For MemoServ help use: /memoserv help");
	return 0;
    }
    if (parc > 2) {
	if (*parv[2] == '#')
	    return m_chanserv(cptr, sptr, parc, parv);
	else
    	    return m_nickserv(cptr, sptr, parc, parv);
    }	
    return 0;
}

int m_identify(aClient *cptr, aClient *sptr, int parc, char *parv[]) {
aClient *acptr;

    if (parc < 2 || *parv[1] == '\0') {
	send_me_numeric(sptr, ERR_NOTEXTTOSEND);
	return -1;
    }
    if (*parv[1]) {
	if ((*parv[1] == '#') && ((char *) strchr(parv[1], ' '))) {
	    if ((acptr = find_person(ServicesConf.chanserv)))
		sendto_one_person(acptr, sptr, TOK1_PRIVMSG, "%s@%s :IDENTIFY %s ",
			   ServicesConf.chanserv, ServicesConf.services_name, parv[1]);
	    else
		send_me_numeric(sptr, ERR_SERVICESDOWN, ServicesConf.chanserv);
	} else {
	    if ((acptr = find_person(ServicesConf.nickserv)))
		sendto_one_person(acptr, sptr, TOK1_PRIVMSG, "%s@%s :IDENTIFY %s", 
			   ServicesConf.nickserv, ServicesConf.services_name, parv[1]);
	    else
		send_me_numeric(sptr, ERR_SERVICESDOWN, ServicesConf.nickserv);
	}
    }
    return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1