/**********************************************************************
 * 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: memoserv set command

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

#include "module.h"
#include "memoserv.h"
#include "dbconf.h"
#include "my_sql.h"
#include "nsmacros.h"
#include "ns_group.h"	/* is_sadmin */
#include "lang/common.lh"
#include "lang/ms_set.lh"

SVS_Module mod_info =
/* module, version, description */
{"ms_set", "1.0", "memoserv set/sset command" };
/* Change Log
  1.0 - #5: split memoserv with a memoserv options table
*/

/* external functions we need */
ServiceUser* (*memoserv_suser)(void);
u_int32_t (*find_group)(char *name);

MOD_REQUIRES 
  DBCONF_FUNCTIONS
  MOD_FUNC(memoserv_suser)
  MOD_FUNC(is_sadmin)
  MOD_FUNC(find_group)
  MOD_FUNC(memoserv_get_options)    
MOD_END

/* internal functions */
void set_command(IRC_User *u, IRC_User *s, char* tnick, u_int32_t tsnid, char *option, char *value, int is_sset);
void ms_set(IRC_User *s, IRC_User *u);
void ms_sset(IRC_User *s, IRC_User *u); /* sadmin set */

ServiceUser* msu;
int ms_log;

int mod_load(void)
{
  msu = memoserv_suser();
  ms_log = log_handle("memoserv");

  suser_add_cmd(msu, "SET", ms_set, MS_SET_SUMMARY, MS_SET_HELP);
  suser_add_cmd_g(msu, "SSET", ms_sset, MS_SSET_SUMMARY, MS_SSET_HELP,
    find_group("Admin"));      
  return 0;
}

void
mod_unload(void)
{
  suser_del_mod_cmds(msu, &mod_info);
}

#define FLAG_SET(x,y) \
  { \
    if(IsNull(value)) \
      send_lang(u, s, VALUE_ON_OR_OFF); \
    else \
    if(strcasecmp(value,"on") == 0) \
      { \
        log_log(ms_log, mod_info.name, "%s %s %s %s %s", \
          u->nick, is_sset ? "SSET" : "SET", tnick, y, value); \
        if(u->snid == tsnid) u->flags |= (x); \
        send_lang(u, s, OPTION_X_ON, (y)); \
        sql_execute("UPDATE memoserv_options SET flags=(flags | %d) "\
          "WHERE snid=%d", (x), tsnid);\
      } else \
    if(strcasecmp(value,"off")  == 0) \
      { \
        log_log(ms_log, mod_info.name, "%s %s %s %s %s", \
          u->nick, is_sset ? "SSET" : "SET", tnick, y, value); \
        if(u->snid == tsnid) u->flags &= ~(x); \
        send_lang(u, s, OPTION_X_OFF, (y)); \
        sql_execute("UPDATE memoserv_options SET flags=(flags & ~%d) " \
          "WHERE snid=%d", (x), tsnid);\
      } else \
        send_lang(u, s, VALUE_ON_OR_OFF); \
  }
  
/* handles a set command */
void set_command(IRC_User *u, IRC_User *s, char* tnick, u_int32_t tsnid, char *option, char *value, int is_sset)
{
  int maxmemos;
  int bquota;
  u_int32_t flags;
  
  /* we need to read memo options first*/
  if(memoserv_get_options(tsnid, &maxmemos, &bquota, &flags) == 0)
  {
    /* we could had some problem to insert the options row, 
    if it's the case lets abort operation */
    send_lang(u, s, UPDATE_FAIL);
    return;
  }    
  if(strcasecmp(option,"AUTOSAVE") == 0)
    FLAG_SET(MOFL_AUTOSAVE, "AUTOSAVE")
  else
  if(strcasecmp(option,"FORWARD") == 0)
    FLAG_SET(MOFL_FORWARD, "FORWARD")
  else
  if(strcasecmp(option,"NOMEMOS") == 0)
    FLAG_SET(MOFL_NOMEMOS, "NOMEMOS")
  else
  if(is_sset == 0)
    send_lang(u, s, UNKNOWN_OPTION_X, option);
/** MS SSET commands start here **/
  else
  if(strcasecmp(option,"MAXMEMOS") == 0)
  {
    int new_maxmemos = atoi(value);
    if(sql_execute("UPDATE memoserv_options SET maxmemos=%d "
      "WHERE snid=%d", new_maxmemos, tsnid) > 0)
      send_lang(u, s, MS_SET_MAXMEMOS_TO_X, new_maxmemos);
    else
      send_lang(u, s, UPDATE_FAIL);
  }
  else
    send_lang(u, s, UNKNOWN_OPTION_X, option);
}

#undef STRING_SET
#undef FLAG_SET
 
/* s = service the command was sent to
   u = user the command was sent from */
void ms_set(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  char *option, *value;

  CHECK_IF_IDENTIFIED_NICK
  
  option = strtok(NULL, " ");
  value = strtok(NULL, " ");
            
  if(IsNull(option) || IsNull(value))
  {
    send_lang(u, s, MS_SET_SYNTAX);
    return;
  }
    
  set_command(u, s, u->nick, u->snid, option, value, 0);
}

/* s = service the command was sent to
   u = user the command was sent from */
void ms_sset(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  u_int32_t tsnid;
  char *nick, *option = NULL, *value = NULL;
  
  nick = strtok(NULL, " ");
  if(nick)
    option = strtok(NULL, " ");  

  CHECK_IF_IDENTIFIED_NICK    
  
  value = strtok(NULL, " ");

  if(IsNull(nick) || IsNull(option))
    send_lang(u, s, MS_SSET_SYNTAX);
  else
  if(!is_sadmin(source_snid))
    send_lang(u, s, ONLY_FOR_SADMINS);
  else 
  if( (tsnid = nick2snid(nick)) == 0 )
    send_lang(u, s, NICK_X_NOT_REGISTERED, nick);
  else
    {
      set_command(u, s, nick,tsnid, option, value, 1);
    }
}


syntax highlighted by Code2HTML, v. 0.9.1