/**********************************************************************
 * 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 send command

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

#include "module.h"
#include "memoserv.h"
#include "nickserv.h" /* need IsAuthenticated() */
#include "my_sql.h"
#include "dbconf.h"
#include "email.h"
#include "nsmacros.h"
/* lang files */
#include "lang/common.lh"
#include "lang/ms_send.lh"

SVS_Module mod_info =
 /* module, version, description */
{"ms_send", "3.0",  "memoserv send command" };

/* Change Log
  3.0 - #69: memoserv expiration with save option
        #5: split memoserv with a memoserv options table
  2.0 - 0000265: remove nickserv cache system
*/

/** functions and events we require **/
/* void (*FunctionPointer)(void);*/
ServiceUser* (*memoserv_suser)(void);

MOD_REQUIRES
  DBCONF_FUNCTIONS
  MEMOSERV_FUNCTIONS
  EMAIL_FUNCTIONS
MOD_END

/** Internal functions declaration **/
/* void internal_function(void); */
void ms_send(IRC_User *s, IRC_User *u);
u_int32_t insert_memo(char* sender_name, u_int32_t sender_snid, u_int32_t owner_snid, char* message, u_int32_t flags);

const static char* c_forward_email = \
  "From: \"\%from_name\%\" <\%from\%>\n" \
  "To: \"\%nick\%\" <\%email\%>\n" \
  "Subject: \%subject\%\n\n" \
  "\%message\%";
  
int NickSecurityCode;


DBCONF_REQUIRES
  DBCONF_GET("nickserv", NickSecurityCode)
DBCONF_END

int mod_rehash(void)
{
  if(dbconf_get(dbconf_requires) < 0 )
  {
    errlog("Error reading dbconf!");
    return -1;
  }
  return 0;
} 

/** Local variables **/
/* int my_local_variable; */
ServiceUser* msu;
static int ms_log = -1;
static char* forward_email;

/** load code **/
int mod_load(void)
{
  msu = memoserv_suser();
  ms_log = log_handle("memoserv");
  suser_add_cmd(msu, "SEND", ms_send, SEND_SUMMARY, SEND_HELP);
  forward_email = strdup(c_forward_email);
  return 0;
}
    
/** unload code **/
void mod_unload(void)
{
  suser_del_mod_cmds(msu, &mod_info);
}

/** internal functions implementation starts here **/
void ms_send(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  u_int32_t snid;
  u_int32_t id;
  char* target;
  char* message;
  int mcount = 0;
  int maxmemos;
  int bquota;
  u_int32_t flags;
  u_int32_t memo_flags = 0;
  
  /* status validation */
  CHECK_IF_IDENTIFIED_NICK
  
  target = strtok(NULL, " ");
  message =  strtok(NULL, "");
  
  if(target && (snid = nick2snid(target)) == 0)
  {
    send_lang(u, s, NICK_X_NOT_REGISTERED, target);
    return;
  }
  
  /* we need to read memo options first */
  memoserv_get_options(snid, &maxmemos, &bquota, &flags);
  if(flags && MOFL_AUTOSAVE)
    memo_flags = MFL_SAVED;
  if(NickSecurityCode  && !IsAuthenticated(u))
    send_lang(u, s, NEEDS_AUTH_NICK);
  else 
  /* syntax validation */  
  if(IsNull(target) || IsNull(message))
    send_lang(u, s, SEND_SYNTAX);
  /* check maxmemos */
  else 
  if(flags & MOFL_NOMEMOS)
    send_lang(u, s, MS_SEND_NOMEMOS);
  else
  if((mcount = memos_count(snid)) >= maxmemos)
    send_lang(u, s, MAX_MEMOS_REACHED_X_X, target, maxmemos);  
#if 0
  /* check buddy quota for non buddies */
  else 
  if(is_buddy && (maxmemos-mcount <= bquota) && !is_buddy(snid, source_snid))
    send_lang(u, s, MAX_MEMOS_REACHED_X_X, target, maxmemos-bquota);
#endif  
  /* execute operation */
  else 
  if((id = insert_memo(u->nick, source_snid, snid, message, memo_flags)) > 0)
  {
    IRC_User* tu;
    send_lang(u, s, SENT_MEMO_TO_X, target);
    tu = irc_FindUser(target);
    if(tu && tu->snid) /* target is online and identified */
    {
      char memoprev[MEMOPREVMAX+1];
      snprintf(memoprev, MEMOPREVMAX, "%s", message);
      send_lang(tu, s, YOU_GOT_MEMO_FROM_X_X_NUM_X,
        u->nick, memoprev, id);
    }
    if(flags &  MOFL_FORWARD)
    {
      MYSQL_RES *res;
      MYSQL_ROW row;
      res = sql_query("SELECT email, lang FROM nickserv WHERE snid=%d", snid);
      if(res && (row = sql_next_row(res)))
      {
        char* email = row[0];
        int lang = atoi(row[1]);
        email_init_symbols();
        email_add_symbol("nick",target);
        email_add_symbol("email", email);
        email_add_symbol("message", message);
        email_add_symbol("subject",
          lang_str_l(lang, MS_SEND_SUBJECT_X, u->nick));
        if(email_send(forward_email) < 0)
        {
          log_log(ms_log, mod_info.name, "Error sending forward email to %s by %s",
            email, irc_UserMask(u));
        }
      }
      sql_free(res);
    }
  }
  else
    send_lang(u, s, UPDATE_FAIL);
}

/* inserts a memo on the memoserv table */
u_int32_t insert_memo(char* sender_name, u_int32_t sender_snid, u_int32_t owner_snid, char* message, u_int32_t flags)
{
  int r;
  u_int32_t max = 1;
  if((sql_singlequery("SELECT MAX(id) FROM memoserv"
    " WHERE owner_snid=%d ORDER BY id DESC LIMIT 1", owner_snid)  > 0) && sql_field(0))
      max = atoi(sql_field(0))+1;
  r = sql_execute("INSERT INTO memoserv VALUES(%d,"
    "%d, %d, %s, %d, %d, %s)",
    max, owner_snid, sender_snid, sql_str(sender_name), flags | MFL_UNREAD, 
    time(NULL), sql_str(message));
  return r ? max : 0;
}


/* End of module */



syntax highlighted by Code2HTML, v. 0.9.1