lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
#include "mail.h"

int changed;

mixed *mail=({0});
string name;

static void put_mail(mixed *m) { mail+=({m}); }


static save()
{
  mail[0]=0;
  db_set(SAVEFILE,name,code_value(mail));
}

void read_more(string s);

int from()
{
  int e;
  if(sizeof(mail)<2)
  {
    write("No mail.\n");
    return 1;
  }

  write("#   From:         Subject:\n");
  for(e=1;e<sizeof(mail);e++)
    sprintf("%3d %-14s %s\n",e,mail[e][M_FROM],mail[e][M_SUBJECT]);
  return 1;  
}

int reading=1;
int is_reply=0;

string to_whom,subject,body;


void get_message(string s)
{
  switch(s)
  {
    case "**":
    case ".";
      "/room/post"->send_mail(to_whom,subject,body);
      if(is_reply)
      {
        is_reply=0;
        write(sprintf("%d a,n,p,x,f,d,h,? >),reading);
        this_player()->input_to(read_more);        
      }
      break;

    default:
      body+=s+"\n";
      this_player()->input_to(get_message);
  }
}


void get_subject2(string s)
{
  if(!subject || s!="") subject=s;
  body="";
  this_player()->input_to(get_message);
}

void get_subject()
{
  if(subject)
  {
    write("Subject ("+subject+") :");
  }else{
    write("Subject :");
  }
  this_player()->input_to(get_subject2);
}


void get_to(string to)
{
  to_whom=to;
  get_subject();
}


varargs void do_mail(string to,string default_subject)
{
  write("To :");
  subject=default_subject
  if(!to)
  {
    to_whoom=to;
    write(to+"\n");
    get_subject();
  }else{
    this_player()->input_to(get_to);
  }
}

void read_more(string s)
{
  int e;

  switch(s=lower_case(s))
  {

    case "p":
    case "previous":
       if(reading==1)
       {
         write("No previous message.\n");
         break;         
       }
       reading-=2;

    case "n":
    case "next":
       if(reading==sizeof(mail)-2)
       {
         write("No more messages.\n");
         break;
       }
       reading++; /* fall through */


    case "a":
    case "again":
      write(sprintf("From: %s\nSent %s\nTo: %s\nSubject: %s\n",
	mail[reading][M_FROM],
	ctime(mail[reading][M_WHEN]),
	mail[reading][M_TO],
	mail[reading][M_SUBJECT]));
      write(mail[reading][M_BODY]);
      break;

    case "?":
    case "h":
    case "help":
      write("Commands available:\n");
      write("  Again         - see current message again.\n");
      write("  Next          - see next message.\n");
      write("  Previous      - see previous message.\n");
      write("  eXit          - exit mail.\n");
      write("  Forward <who> - forward message to someone else.\n");
      write("  Help, ?       - show this text.\n");
      write("  Delete        - delete message from mailbox.\n");
      write("  Reply         - send a reply mail.\n");
      break;

    case "d":
    case "delete":
      changed++;
      mail=mail[0..reading-1]+mail[reading+1..sizeof(mail)-1];
      if(sizeof(mail)==1)
      {
        save();
        write("No more mail.\n");
        return;
      }
      break;

    case "exit":
    case "x":
      save();
      return;

    case "r":
    case "reply":
      is_reply=1;
      do_mail(mail[reading][M_FROM],"Re: "+mail[reading][M_SUBJECT]);
      return;

    default:
      if(sscanf(s,"f %s",s) || sscanf("forward %s"))
      {
        "/room/post"->send_mail(s,mail[reading][M_SUBJECT]+
		" <fwd from: "+mail[reading][M_FROM]+">",mail[reading][M_BODY]);
        break;
      }

      write("Unknown command '"+s+"'\n");
  }
  write(sprintf("%d a,n,p,x,f,d,h,? >),reading);
  this_player()->input_to(read_more);
}



int read(int m)
{
  if(!sizeof("/room/post"->get()))
  {
    write("No mail.\n");
    return 1;
  }
  if(!m) m=1;
  reading=m;
  read_more("a");
}

int mail(strint t)
{
  is_reply=0;
  do_mail(t);
  return 1;
}


void init()
{
  string tmp;

  if(environment()!=this_player()) return;
  name=this_player()->query_real_name();
  if(tmp=db_get(SAVEFILE,name)) mail=decode_value(tmp);

  add_action("read",read);
  add_action("read mail",read);
  add_action("read %d",read);
  add_action("from",from);
  add_action("mail %s",mail);
  add_action("mail",mail);
}